author | eilers <eilers> | 2003-08-08 15:09:29 (UTC) |
---|---|---|
committer | eilers <eilers> | 2003-08-08 15:09:29 (UTC) |
commit | b87b33dc1f6e8e1276a7035ab7a3e53b8ed4bd16 (patch) (side-by-side diff) | |
tree | b0f96db67cfb1b9d2476530ecec9a2ba6eacbab1 /libopie | |
parent | 14d394e6c107b037a09a31a92605034fe50f7813 (diff) | |
download | opie-b87b33dc1f6e8e1276a7035ab7a3e53b8ed4bd16.zip opie-b87b33dc1f6e8e1276a7035ab7a3e53b8ed4bd16.tar.gz opie-b87b33dc1f6e8e1276a7035ab7a3e53b8ed4bd16.tar.bz2 |
Merging all changes from BRANCH_1_0.
-rw-r--r-- | libopie/libopie.pro | 3 | ||||
-rw-r--r-- | libopie/libopie1.control | 4 | ||||
-rw-r--r-- | libopie/odevice.cpp | 103 | ||||
-rw-r--r-- | libopie/ofiledialog.cc | 81 | ||||
-rw-r--r-- | libopie/ofiledialog.h | 3 | ||||
-rw-r--r-- | libopie/ofileselector.cc | 1310 | ||||
-rw-r--r-- | libopie/ofileselector.cpp | 856 | ||||
-rw-r--r-- | libopie/ofileselector.h | 308 | ||||
-rw-r--r-- | libopie/ofileselector_p.h | 151 | ||||
-rw-r--r-- | libopie/orecurrancewidget.cpp | 50 | ||||
-rw-r--r-- | libopie/oticker.h | 4 | ||||
-rw-r--r-- | libopie/todayplugininterface.h | 42 |
12 files changed, 1285 insertions, 1630 deletions
diff --git a/libopie/libopie.pro b/libopie/libopie.pro index 4535c4e..6fbd449 100644 --- a/libopie/libopie.pro +++ b/libopie/libopie.pro @@ -1,84 +1,85 @@ TEMPLATE = lib CONFIG += qte warn_on release HEADERS = ofontmenu.h \ ocolorbutton.h \ ofiledialog.h ofileselector.h \ + ofileselector_p.h \ ocheckitem.h \ xmltree.h \ colordialog.h colorpopupmenu.h \ oclickablelabel.h oprocctrl.h \ oprocess.h odevice.h odevicebutton.h \ otimepicker.h otabwidget.h \ otabbar.h otabinfo.h \ ofontselector.h \ pim/opimrecord.h \ pim/otodo.h \ pim/orecordlist.h \ pim/opimaccesstemplate.h \ pim/opimaccessbackend.h \ pim/otodoaccess.h \ pim/otodoaccessbackend.h \ pim/oconversion.h \ pim/ocontact.h \ pim/ocontactaccess.h \ pim/ocontactaccessbackend.h \ pim/ocontactaccessbackend_xml.h \ pim/ocontactaccessbackend_vcard.h \ pim/obackendfactory.h \ pim/opimcache.h \ pim/otodoaccessvcal.h \ pim/orecur.h \ pim/opimstate.h \ pim/opimxrefpartner.h \ pim/opimxref.h \ pim/opimxrefmanager.h \ pim/opimmaintainer.h \ pim/opimnotify.h \ pim/opimnotifymanager.h \ pim/opimmainwindow.h \ pim/opimresolver.h \ pim/oevent.h \ pim/otimezone.h \ pim/odatebookaccess.h \ pim/odatebookaccessbackend.h \ pim/odatebookaccessbackend_xml.h \ orecurrancewidget.h \ oticker.h owait.h SOURCES = ofontmenu.cc \ ocolorbutton.cpp \ sharp_compat.cpp \ xmltree.cc \ - ofiledialog.cc ofileselector.cc \ + ofiledialog.cc ofileselector.cpp \ ocheckitem.cpp \ colordialog.cpp \ colorpopupmenu.cpp oclickablelabel.cpp \ oprocctrl.cpp oprocess.cpp \ odevice.cpp odevicebutton.cpp otimepicker.cpp \ otabwidget.cpp otabbar.cpp \ ofontselector.cpp \ pim/otodo.cpp \ pim/opimrecord.cpp \ pim/otodoaccess.cpp \ pim/otodoaccessbackend.cpp \ pim/otodoaccessxml.cpp \ pim/oconversion.cpp \ pim/ocontact.cpp \ pim/ocontactaccess.cpp \ pim/ocontactaccessbackend_vcard.cpp \ pim/ocontactaccessbackend_xml.cpp \ pim/otodoaccessvcal.cpp \ pim/orecur.cpp \ pim/opimstate.cpp \ pim/opimxrefpartner.cpp \ pim/opimxref.cpp \ pim/opimxrefmanager.cpp \ pim/opimmaintainer.cpp \ pim/opimnotify.cpp \ pim/opimnotifymanager.cpp \ pim/opimmainwindow.cpp \ pim/opimresolver.cpp \ pim/oevent.cpp \ pim/otimezone.cpp \ pim/odatebookaccess.cpp \ pim/odatebookaccessbackend.cpp \ diff --git a/libopie/libopie1.control b/libopie/libopie1.control index 1e75df3..76e4c7a 100644 --- a/libopie/libopie1.control +++ b/libopie/libopie1.control @@ -1,11 +1,11 @@ Package: libopie1 Files: $OPIEDIR/lib/libopie.so.1.0.0 $OPIEDIR/lib/libopie.so.1.0 $OPIEDIR/lib/libopie.so.1 Priority: optional Section: opie/system Maintainer: Opie Team <opie@handhelds.org> Architecture: arm -Version: $QPE_VERSION-$SUB_VERSION.1 -Depends: libqte2 (>=$QTE_VERSION), libqpe1 +Depends: libqte2 (>=$QTE_VERSION), libqpe1, opie-pics Provides: libopie Replaces: libopie Description: Opie library +Version: $QPE_VERSION$EXTRAVERSION diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index 62dc9d4..17ae389 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -443,64 +443,67 @@ void ODevice::init ( ) */ void ODevice::initButtons ( ) { if ( d-> m_buttons ) return; // Simulation uses iPAQ 3660 device buttons qDebug ( "init Buttons" ); d-> m_buttons = new QValueList <ODeviceButton>; for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) { i_button *ib = ipaq_buttons + i; ODeviceButton b; if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) { b. setKeycode ( ib-> code ); b. setUserText ( QObject::tr ( "Button", ib-> utext )); b. setPixmap ( Resource::loadPixmap ( ib-> pix )); b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction )); b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction )); d-> m_buttons-> append ( b ); } } reloadButtonMapping ( ); QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); } ODevice::~ODevice ( ) { +// we leak m_devicebuttons and m_cpu_frequency +// but it's a singleton and it is not so importantant +// -zecke delete d; } bool ODevice::setSoftSuspend ( bool /*soft*/ ) { return false; } //#include <linux/apm_bios.h> #define APM_IOC_SUSPEND OD_IO( 'A', 2 ) /** * This method will try to suspend the device * It only works if the user is the QWS Server and the apm application * is installed. * It tries to suspend and then waits some time cause some distributions * do have asynchronus apm implementations. * This method will either fail and return false or it'll suspend the * device and return once the device got woken up * * @return if the device got suspended */ bool ODevice::suspend ( ) { qDebug("ODevice::suspend"); if ( !isQWS( ) ) // only qwsserver is allowed to suspend return false; if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices return false; @@ -891,69 +894,67 @@ void ODevice::remapPressedAction ( int button, const OQCopMessage &action ) mb_chan=b. pressedAction ( ). channel ( ); Config buttonFile ( "ButtonSettings" ); buttonFile. setGroup ( "Button" + QString::number ( button )); buttonFile. writeEntry ( "PressedActionChannel", (const char*) mb_chan); buttonFile. writeEntry ( "PressedActionMessage", (const char*) b. pressedAction ( ). message ( )); // buttonFile. writeEntry ( "PressedActionArgs", encodeBase64 ( b. pressedAction ( ). data ( ))); QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); } void ODevice::remapHeldAction ( int button, const OQCopMessage &action ) { initButtons ( ); if ( button >= (int) d-> m_buttons-> count ( )) return; ODeviceButton &b = ( *d-> m_buttons ) [button]; b. setHeldAction ( action ); Config buttonFile ( "ButtonSettings" ); buttonFile. setGroup ( "Button" + QString::number ( button )); buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction ( ). channel ( )); buttonFile. writeEntry ( "HeldActionMessage", (const char *) b. heldAction ( ). message ( )); // buttonFile. writeEntry ( "HeldActionArgs", decodeBase64 ( b. heldAction ( ). data ( ))); QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); } -void ODevice::virtual_hook( int id, void* data ) { - Q_UNUSED(id); - Q_UNUSED(data); -} +void ODevice::virtual_hook(int, void* ){ +} /************************************************** * * iPAQ * **************************************************/ void iPAQ::init ( ) { d-> m_vendorstr = "HP"; d-> m_vendor = Vendor_HP; QFile f ( "/proc/hal/model" ); if ( f. open ( IO_ReadOnly )) { QTextStream ts ( &f ); d-> m_modelstr = "H" + ts. readLine ( ); if ( d-> m_modelstr == "H3100" ) d-> m_model = Model_iPAQ_H31xx; else if ( d-> m_modelstr == "H3600" ) d-> m_model = Model_iPAQ_H36xx; else if ( d-> m_modelstr == "H3700" ) d-> m_model = Model_iPAQ_H37xx; else if ( d-> m_modelstr == "H3800" ) d-> m_model = Model_iPAQ_H38xx; else if ( d-> m_modelstr == "H3900" ) d-> m_model = Model_iPAQ_H39xx; else d-> m_model = Model_Unknown; @@ -1619,65 +1620,64 @@ bool Zaurus::setSoftSuspend ( bool soft ) perror ( "/dev/apm_bios or /dev/misc/apm_bios" ); return res; } bool Zaurus::setDisplayBrightness ( int bright ) { bool res = false; int fd; if ( bright > 255 ) bright = 255; if ( bright < 0 ) bright = 0; if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus if ( bright && !bl ) bl = 1; res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); ::close ( fd ); } return res; } int Zaurus::displayBrightnessResolution ( ) const { return 5; } - /************************************************** * * SIMpad * **************************************************/ void SIMpad::init ( ) { d-> m_vendorstr = "SIEMENS"; d-> m_vendor = Vendor_SIEMENS; QFile f ( "/proc/hal/model" ); //TODO Implement model checking //FIXME For now we assume an SL4 d-> m_modelstr = "SL4"; d-> m_model = Model_SIMpad_SL4; switch ( d-> m_model ) { default: d-> m_rotation = Rot0; d-> m_direction = CCW; d-> m_holdtime = 1000; // 1000ms break; } f. setName ( "/etc/familiar-version" ); if ( f. open ( IO_ReadOnly )) { d-> m_systemstr = "Familiar"; d-> m_system = System_Familiar; @@ -1860,284 +1860,299 @@ void SIMpad::alarmSound ( ) volalarm |= ( volalarm << 8 ); if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 ) vol_reset = true; } } snd. play ( ); while ( !snd. isFinished ( )) qApp-> processEvents ( ); if ( fd >= 0 ) { if ( vol_reset ) ::ioctl ( fd, MIXER_WRITE( 0 ), &vol ); ::close ( fd ); } #endif } bool SIMpad::suspend ( ) // Must override because SIMpad does NOT have apm { qDebug( "ODevice for SIMpad: suspend()" ); if ( !isQWS( ) ) // only qwsserver is allowed to suspend return false; bool res = false; struct timeval tvs, tvn; ::gettimeofday ( &tvs, 0 ); ::sync ( ); // flush fs caches - res = ( ::system ( "echo > /proc/sys/pm/suspend" ) == 0 ); //TODO make better :) + res = ( ::system ( "cat /dev/fb/0 >/tmp/.buffer; echo > /proc/sys/pm/suspend; cat /tmp/.buffer >/dev/fb/0" ) == 0 ); //TODO make better :) return res; } bool SIMpad::setSoftSuspend ( bool soft ) { qDebug( "ODevice for SIMpad: UNHANDLED setSoftSuspend(%s)", soft? "on" : "off" ); return false; } bool SIMpad::setDisplayStatus ( bool on ) { qDebug( "ODevice for SIMpad: setDisplayStatus(%s)", on? "on" : "off" ); bool res = false; int fd; QString cmdline = QString().sprintf( "echo %s > /proc/cs3", on ? "0xd41a" : "0xd40a" ); //TODO make better :) - if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { res = ( ::system( (const char*) cmdline ) == 0 ); - ::close ( fd ); - } + return res; } bool SIMpad::setDisplayBrightness ( int bright ) { qDebug( "ODevice for SIMpad: setDisplayBrightness( %d )", bright ); bool res = false; int fd; if ( bright > 255 ) bright = 255; - if ( bright < 0 ) + if ( bright < 1 ) bright = 0; if (( fd = ::open ( SIMPAD_BACKLIGHT_CONTROL, O_WRONLY )) >= 0 ) { int value = 255 - bright; const int mask = SIMPAD_BACKLIGHT_MASK; value = value << 8; value += mask; char writeCommand[100]; const int count = sprintf( writeCommand, "0x%x\n", value ); res = ( ::write ( fd, writeCommand, count ) != -1 ); ::close ( fd ); } return res; } int SIMpad::displayBrightnessResolution ( ) const { - switch ( model ( )) { - case Model_SIMpad_CL4: - case Model_SIMpad_SL4: - case Model_SIMpad_SLC: - case Model_SIMpad_TSinus: - return 255; //TODO find out if this is save - - default: - return 2; - } + return 255; // All SIMpad models share the same display } /************************************************** * * Ramses * **************************************************/ void Ramses::init() { d->m_vendorstr = "M und N"; d->m_vendor = Vendor_MundN; QFile f("/proc/sys/board/ramses"); d->m_modelstr = "Ramses"; d->m_model = Model_Ramses_MNCI; - d->m_rotation = Rot180; - d->m_direction = CW; + d->m_rotation = Rot0; d->m_holdtime = 1000; f.setName("/etc/oz_version"); if (f.open(IO_ReadOnly)) { d->m_systemstr = "OpenEmbedded/Ramses"; d->m_system = System_OpenZaurus; QTextStream ts(&f); ts.setDevice(&f); d->m_sysverstr = ts.readLine(); f.close(); } m_power_timer = 0; #ifdef QT_QWS_ALLOW_OVERCLOCK #warning *** Overclocking enabled - this may fry your hardware - you have been warned *** #define OC(x...) x #else #define OC(x...) #endif // This table is true for a Intel XScale PXA 255 d->m_cpu_frequencies->append("99000"); // mem= 99, run= 99, turbo= 99, PXbus= 50 OC( d->m_cpu_frequencies->append("118000"); ) // mem=118, run=118, turbo=118, PXbus= 59 OC'd mem d->m_cpu_frequencies->append("199100"); // mem= 99, run=199, turbo=199, PXbus= 99 OC( d->m_cpu_frequencies->append("236000"); ) // mem=118, run=236, turbo=236, PXbus=118 OC'd mem d->m_cpu_frequencies->append("298600"); // mem= 99, run=199, turbo=298, PXbus= 99 OC( d->m_cpu_frequencies->append("354000"); ) // mem=118, run=236, turbo=354, PXbus=118 OC'd mem d->m_cpu_frequencies->append("398099"); // mem= 99, run=199, turbo=398, PXbus= 99 d->m_cpu_frequencies->append("398100"); // mem= 99, run=398, turbo=398, PXbus=196 OC( d->m_cpu_frequencies->append("471000"); ) // mem=118, run=471, turbo=471, PXbus=236 OC'd mem/core/bus } bool Ramses::filter(int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat) { Q_UNUSED( keycode ); Q_UNUSED( modifiers ); Q_UNUSED( isPress ); Q_UNUSED( autoRepeat ); return false; } void Ramses::timerEvent(QTimerEvent *) { killTimer(m_power_timer); m_power_timer = 0; QWSServer::sendKeyEvent(-1, HardKey_Backlight, 0, true, false); QWSServer::sendKeyEvent(-1, HardKey_Backlight, 0, false, false); } bool Ramses::setSoftSuspend(bool soft) { - Q_UNUSED(soft); - return true; -} - -bool Ramses::suspend() -{ - //qDebug("Ramses::suspend()"); - if ( !isQWS() ) // only qwsserver is allowed to suspend - return false; - + qDebug("Ramses::setSoftSuspend(%d)", soft); +#if 0 bool res = false; int fd; - if ((fd = ::open("/proc/sys/pm/suspend", O_WRONLY)) >= 0) { - res = ( ::write ( fd, "1", 1 ) != -1 ); + if (((fd = ::open("/dev/apm_bios", O_RDWR)) >= 0) || + ((fd = ::open("/dev/misc/apm_bios",O_RDWR)) >= 0)) { + + int sources = ::ioctl(fd, APM_IOCGEVTSRC, 0); // get current event sources + + if (sources >= 0) { + if (soft) + sources &= ~APM_EVT_POWER_BUTTON; + else + sources |= APM_EVT_POWER_BUTTON; + + if (::ioctl(fd, APM_IOCSEVTSRC, sources) >= 0) // set new event sources + res = true; + else + perror("APM_IOCGEVTSRC"); + } + else + perror("APM_IOCGEVTSRC"); + ::close(fd); } + else + perror("/dev/apm_bios or /dev/misc/apm_bios"); + return res; +#else + return true; +#endif +} + +bool Ramses::suspend ( ) +{ + qDebug("Ramses::suspend"); + return false; } /** * This sets the display on or off */ bool Ramses::setDisplayStatus(bool on) { - //qDebug("Ramses::setDisplayStatus(%d)", on); + qDebug("Ramses::setDisplayStatus(%d)", on); +#if 0 bool res = false; int fd; - if ((fd = ::open ("/dev/fb/1", O_RDWR)) >= 0) { + if ((fd = ::open ("/dev/fb/0", O_RDWR)) >= 0) { res = (::ioctl(fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN) == 0); ::close(fd); } return res; +#else + return true; +#endif } /* * We get something between 0..255 into us */ bool Ramses::setDisplayBrightness(int bright) { - //qDebug("Ramses::setDisplayBrightness(%d)", bright); + qDebug("Ramses::setDisplayBrightness(%d)", bright); bool res = false; int fd; // pwm1 brighness: 20 steps 500..0 (dunkel->hell) if (bright > 255 ) bright = 255; if (bright < 0) bright = 0; // Turn backlight completely off if ((fd = ::open("/proc/sys/board/lcd_backlight", O_WRONLY)) >= 0) { char writeCommand[10]; const int count = sprintf(writeCommand, "%d\n", bright ? 1 : 0); res = (::write(fd, writeCommand, count) != -1); ::close(fd); } // scale backlight brightness to hardware - if ((fd = ::open("/proc/sys/board/lcd_brightness", O_WRONLY)) >= 0) { - //qDebug(" %d -> pwm1", bright); + bright = 500-(bright * 500 / 255); + if ((fd = ::open("/proc/sys/board/pwm1", O_WRONLY)) >= 0) { + qDebug(" %d -> pwm1", bright); char writeCommand[100]; const int count = sprintf(writeCommand, "%d\n", bright); res = (::write(fd, writeCommand, count) != -1); ::close(fd); } return res; } int Ramses::displayBrightnessResolution() const { - return 256; + return 32; } bool Ramses::setDisplayContrast(int contr) { - //qDebug("Ramses::setDisplayContrast(%d)", contr); + qDebug("Ramses::setDisplayContrast(%d)", contr); bool res = false; int fd; // pwm0 contrast: 20 steps 79..90 (dunkel->hell) if (contr > 255 ) contr = 255; if (contr < 0) contr = 0; + contr = 90 - (contr * 20 / 255); - if ((fd = ::open("/proc/sys/board/lcd_contrast", O_WRONLY)) >= 0) { - //qDebug(" %d -> pwm0", contr); + if ((fd = ::open("/proc/sys/board/pwm0", O_WRONLY)) >= 0) { + qDebug(" %d -> pwm0", contr); char writeCommand[100]; const int count = sprintf(writeCommand, "%d\n", contr); res = (::write(fd, writeCommand, count) != -1); res = true; ::close(fd); } return res; } int Ramses::displayContrastResolution() const { - return 256; + return 20; } diff --git a/libopie/ofiledialog.cc b/libopie/ofiledialog.cc index 9e725c2..5511b24 100644 --- a/libopie/ofiledialog.cc +++ b/libopie/ofiledialog.cc @@ -1,156 +1,215 @@ /* =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 <> + .=l. Copyright (c) 2002,2003 <zecke@handhelds.org> .>+-= _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. This library is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qpe/applnk.h> +#include <qpe/config.h> +#include <qpe/qpeapplication.h> + +#include <qfileinfo.h> #include <qstring.h> #include <qapplication.h> #include <qlayout.h> + #include "ofiledialog.h" + +namespace { + /* + * helper functions to load the start dir + * and to save it + * helper to extract the dir out of a file name + */ + /** + * This method will use Config( argv[0] ); + * @param key The group key used + */ + QString lastUsedDir( const QString& key ) { + if ( qApp->argc() < 1 ) + return QString::null; + + Config cfg( QFileInfo(qApp->argv()[0]).fileName() ); // appname + cfg.setGroup( key ); + return cfg.readEntry("LastDir", QPEApplication::documentDir() ); + } + + void saveLastDir( const QString& key, const QString& file ) { + if ( qApp->argc() < 1 ) + return; + + Config cfg( QFileInfo(qApp->argv()[0]).fileName() ); + cfg.setGroup( key ); + QFileInfo inf( file ); + cfg.writeEntry("LastDir", inf.dirPath( true ) ); + } +}; + /** * This constructs a modal dialog * * @param caption The caption of the dialog * @param wid The parent widget * @param mode The mode of the OFileSelector @see OFileSelector * @param selector The selector of the OFileSelector * @param dirName the dir or resource to start from * @param fileName a proposed or existing filename * @param mimetypes The mimeTypes */ OFileDialog::OFileDialog(const QString &caption, QWidget *wid, int mode, int selector, const QString &dirName, const QString &fileName, const QMap<QString,QStringList>& mimetypes ) : QDialog( wid, "OFileDialog", true ) { // QVBoxLayout *lay = new QVBoxLayout(this); //showMaximized(); QVBoxLayout *lay = new QVBoxLayout(this ); file = new OFileSelector(this , mode, selector, dirName, fileName, mimetypes ); lay->addWidget( file ); //lay->addWidget( file ); //showFullScreen(); setCaption( caption.isEmpty() ? tr("FileDialog") : caption ); connect(file, SIGNAL(fileSelected(const QString&) ), this, SLOT(slotFileSelected(const QString&) ) ); + connect(file, SIGNAL(ok() ), + this, SLOT(slotSelectorOk()) ) ; + connect(file, SIGNAL(dirSelected(const QString&) ), this, SLOT(slotDirSelected(const QString&) ) ); + +#if 0 connect(file, SIGNAL(dirSelected(const QString &) ), this, SLOT(slotDirSelected(const QString &) ) ); - - - file->setYesCancelVisible( false ); // relayout +#endif } /** * @returns the mimetype of the selected * currently it return QString::null */ QString OFileDialog::mimetype()const { return QString::null; } /** * @return the fileName */ QString OFileDialog::fileName()const { return file->selectedName(); } /** * return a DocLnk to the current file */ DocLnk OFileDialog::selectedDocument()const { return file->selectedDocument(); } /** * This opens up a filedialog in Open mode * * @param selector the Selector Mode * @param startDir Where to start from * @param file A proposed filename * @param mimes A list of MimeTypes * @param wid the parent * @param caption of the dialog if QString::null tr("Open") will be used * @return the fileName or QString::null */ QString OFileDialog::getOpenFileName(int selector, - const QString &startDir, + const QString &_startDir, const QString &file, const MimeTypes &mimes, QWidget *wid, const QString &caption ) { QString ret; + QString startDir = _startDir; + if (startDir.isEmpty() ) + startDir = lastUsedDir( "FileDialog-OPEN" ); + + OFileDialog dlg( caption.isEmpty() ? tr("Open") : caption, - wid, OFileSelector::OPEN, selector, startDir, file, mimes); + wid, OFileSelector::Open, selector, startDir, file, mimes); dlg.showMaximized(); - if( dlg.exec() ) + if( dlg.exec() ) { ret = dlg.fileName(); + saveLastDir( "FileDialog-OPEN", ret ); + } return ret; } /** * This opens up a file dialog in save mode * @see getOpenFileName */ QString OFileDialog::getSaveFileName(int selector, - const QString &startDir, + const QString &_startDir, const QString &file, const MimeTypes &mimes, QWidget *wid, const QString &caption ) { QString ret; + QString startDir = _startDir; + if (startDir.isEmpty() ) + startDir = lastUsedDir( "FileDialog-SAVE" ); + OFileDialog dlg( caption.isEmpty() ? tr("Save") : caption, - wid, OFileSelector::SAVE, selector, startDir, file, mimes); + wid, OFileSelector::Save, selector, startDir, file, mimes); dlg.showMaximized(); - if( dlg.exec() ) + if( dlg.exec() ) { ret = dlg.fileName(); + saveLastDir( "FileDialog-SAVE", ret ); + } return ret; } void OFileDialog::slotFileSelected(const QString & ) { accept(); } -void OFileDialog::slotDirSelected(const QString & ) + +void OFileDialog::slotSelectorOk( ) +{ + accept(); +} + +void OFileDialog::slotDirSelected(const QString &dir ) { + setCaption( dir ); // if mode //accept(); } diff --git a/libopie/ofiledialog.h b/libopie/ofiledialog.h index 309086b..91e0586 100644 --- a/libopie/ofiledialog.h +++ b/libopie/ofiledialog.h @@ -15,86 +15,87 @@ =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OpieFileDialog_h #define OpieFileDialog_h #include <qdialog.h> #include <opie/ofileselector.h> /** * This class places a OFileSelector inside a QDialog. * It provides static method for letting a user chose * a file for either opening or saving. * Most of the time the c'tor will not be used instead using * the static member functions is prefered. * * <pre> * QMap<QString, QStringList> mimeTypes; * QStringList types; - * types << "text/* "; + * types << "text[slash]* "; * mimeTypes.insert( tr("Text"), types ); * mimeTypes.insert( tr("All"), " * / * " ); // remove the spaces in the 2nd comment * QString fileName= OFileDialog::getOpenFileName( OFileSelector::EXTENDED_ALL, * "foo","bar", mimeTypes); * </pre> * * @short A small QDialog swalloing a FileSelector * @see QDialog * @see OFileSelector * @version 0.1-unfinished * @author Holger Freyther ( zecke@handhelds.org ) */ class OFileDialog : public QDialog { Q_OBJECT public: OFileDialog(const QString &caption, QWidget *, int mode, int selector, const QString &dirName, const QString &fileName = QString::null, const MimeTypes &mimetypes = MimeTypes() ); QString mimetype() const; QString fileName() const; DocLnk selectedDocument()const; // static methods static QString getOpenFileName(int selector, const QString& startDir = QString::null, const QString &fileName = QString::null, const MimeTypes& mime = MimeTypes(), QWidget *wid = 0, const QString &caption = QString::null ); static QString getSaveFileName(int selector, const QString& startDir = QString::null, const QString& fileName = QString::null, const MimeTypes& mimefilter = MimeTypes(), QWidget *wid = 0, const QString &caption = QString::null ); //let's OFileSelector catch up first //static QString getExistingDirectory(const QString& startDir = QString::null, // QWidget *parent = 0, // const QString& caption = QString::null ); private: class OFileDialogPrivate; OFileDialogPrivate *d; OFileSelector *file; private slots: void slotFileSelected( const QString & ); void slotDirSelected(const QString & ); + void slotSelectorOk(); }; #endif diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc deleted file mode 100644 index 6748bec..0000000 --- a/libopie/ofileselector.cc +++ b/dev/null @@ -1,1310 +0,0 @@ - - -#include <qwmatrix.h> -#include <qcheckbox.h> -#include <qcombobox.h> -#include <qheader.h> -#include <qlabel.h> -#include <qabstractlayout.h> -#include <qlayout.h> -#include <qlineedit.h> -#include <qlistview.h> -#include <qmessagebox.h> -#include <qpainter.h> -#include <qpushbutton.h> -#include <qwidgetstack.h> -#include <qpopupmenu.h> -#include <qdir.h> -#include <qfile.h> -#include <qfileinfo.h> -#include <qtimer.h> - -#include <qpe/qpeapplication.h> -#include <qpe/applnk.h> -#include <qpe/fileselector.h> -#include <qpe/global.h> -#include <qpe/mimetype.h> -#include <qpe/resource.h> -#include <qpe/storage.h> - -#include <unistd.h> -#include <stdlib.h> -#include <sys/stat.h> - -#include "ofileselector.h" - - -QMap<QString,QPixmap> *OFileSelector::m_pixmaps = 0; - -namespace { - int indexByString( const QComboBox *box, const QString &str ){ - int index= 0; - for(int i= 0; i < box->count(); i++ ){ - if( str == box->text(i ) ){ - index= i; - break; - } - } - return index; - } - class OFileSelectorItem : public QListViewItem { - public: - OFileSelectorItem(QListView *view, const QPixmap &pixmap, const QString &path, - const QString &date, const QString &size, const QString &mDir, - bool isLocked=false, bool isDir=false ): QListViewItem(view) { - setPixmap(0, pixmap ); - setText(1, path ); - setText(2, size ); - setText(3, date ); - //setText(4, mDir ); - m_dir = mDir; - dir = isDir; - mLocked = isLocked; - } - bool isLocked() const{ - return mLocked; - } - QString directory()const{ - return m_dir; - } - bool isDir()const{ - return dir; - } - QString path()const{ - return text(1 ); - } - QString key(int id, bool )const { - QString ke; - if( id == 0 || id == 1 ){ // name - if( dir ){ - ke.append("0" ); - ke.append( text(1) ); - }else{ - ke.append("1" ); - ke.append( text(1) ); - } - }else if( id == 2 ){ // size - return text(2); - }else if( id == 3 ){ // date - return text(3); - } - return ke; - }; - private: - bool mLocked:1; - bool dir:1; - QString m_dir; - }; -}; - - -OFileSelector::OFileSelector( QWidget *wid, int mode, int selector, - const QString &dirName, - const QString &fileName, - const QMap<QString,QStringList>& mimeTypes) - : QWidget( wid, "OFileSelector") -{ - m_mimetypes = mimeTypes; - if (mode == SAVE ) - m_name = fileName; - initVars(); - m_mode = mode; - m_selector = selector; - m_currentDir = dirName; - init(); - //QTimer::singleShot(6*1000, this, SLOT( slotTest() ) ); -} - -OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, - const char *name, bool newVisible, - bool closeVisible ) - : QWidget( parent, name ) -{ - if (!mimeFilter.isEmpty() ) { - QStringList list = QStringList::split(";", mimeFilter ); - m_mimetypes.insert(mimeFilter, list ); - } - initVars(); - m_currentDir = QPEApplication::documentDir(); - m_mode = FILESELECTOR; - m_selector = NORMAL; - m_shClose = closeVisible; - m_shNew = newVisible; - m_shLne = false; - m_shPerm = false; - m_shYesNo = false; - init(); - -} - -OFileSelector::~OFileSelector() -{ - - -} - -void OFileSelector::setNewVisible( bool visible ) -{ - m_shNew = visible; - if( m_selector == NORMAL ){ - delete m_select; - // we need to initialize but keep the selected mimetype - QString mime = currentMimeType(); - m_select = new FileSelector( mime , - m_stack, "fileselector", - m_shNew, m_shClose); - connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), - this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); - connect(m_select, SIGNAL(closeMe() ), - this, SIGNAL(closeMe() ) ); - //connect to close me and other signals as well - m_stack->addWidget( m_select, NORMAL ); - }else{ - m_new->show(); - } -} -void OFileSelector::setCloseVisible( bool visible ) -{ - m_shClose = visible; - if( m_selector == NORMAL ){ - setNewVisible( m_shNew ); // yeah baby - }else{ - m_close->show(); - } -} -void OFileSelector::reread() -{ - if( m_selector == NORMAL ){ - setNewVisible( m_shNew ); // make it a initializeSelector - }else if ( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ - reparse(); - //}else{ - //; - } -} - -const DocLnk *OFileSelector::selected() -{ - DocLnk *lnk = new DocLnk(selectedDocument() ); - return lnk; -} - -void OFileSelector::setYesCancelVisible( bool show ) -{ - initializeYes(); // FIXME if YesCancel is not shown we will initialize it to hide it :( - m_shYesNo = show; - if( m_shYesNo ) - m_boxOk->show(); - else - m_boxOk->hide(); - -} -void OFileSelector::setToolbarVisible( bool show ) -{ - m_shTool = show; - initializeListView(); // FIXME see above waste of memory - if(!m_shTool ){ - m_location->hide(); - m_up->hide(); - m_homeButton->hide(); - m_docButton->hide(); - }else{ - m_location->show(); - m_up->show(); - m_homeButton->show(); - m_docButton->show(); - } -} -void OFileSelector::setPermissionBarVisible( bool show ) -{ - m_shPerm = show; - initializePerm(); - if( m_shPerm ) - m_checkPerm->show(); - else - m_checkPerm->hide(); -} -void OFileSelector::setLineEditVisible( bool show ) -{ - if( show ){ - initializeName(); - m_boxName->show(); - }else{ - if( m_shLne && m_boxName != 0 ){ // check if we showed before this is the way to go - m_boxName->hide(); - } - } - m_shLne = show; -} - -void OFileSelector::setChooserVisible( bool show ) -{ - m_shChooser = show; - initializeChooser(); - if( m_shChooser ){ - m_boxView->hide(); - }else{ - m_boxView->show(); - } -} - -QCheckBox* OFileSelector::permissionCheckbox() -{ - if( m_selector == NORMAL ) - return 0l; - else - return m_checkPerm; -} -bool OFileSelector::setPermission()const -{ - return m_checkPerm == 0 ? false : m_checkPerm->isChecked(); -} -void OFileSelector::setPermissionChecked( bool check ) -{ - if( m_checkPerm ) - m_checkPerm->setChecked( check ); -} - -void OFileSelector::setMode(int mode) // FIXME do direct raising -{ - m_mode = mode; - if( m_selector == NORMAL ) - return; -} -void OFileSelector::setShowDirs(bool ) -{ - m_dir = true; - reparse(); -} -void OFileSelector::setCaseSensetive(bool caSe ) -{ - m_case = caSe; - reparse(); -} -void OFileSelector::setShowFiles(bool show ) -{ - m_files = show; - reparse(); -} -/// -bool OFileSelector::cd(const QString &path ) -{ - m_currentDir = path; - reparse(); - return true; -} -void OFileSelector::setSelector(int mode ) -{ -QString text; - switch( mode ){ - case NORMAL: - text = tr("Documents"); - break; - case EXTENDED: - text = tr("Files"); - break; - case EXTENDED_ALL: - text = tr("All Files"); - break; - } - slotViewCheck( text ); -} - -void OFileSelector::setPopupMenu(QPopupMenu *popup ) -{ - m_custom = popup; - m_showPopup = true; -} - -//void OFileSelector::updateL - -QString OFileSelector::selectedName() const -{ - QString name; - if( m_selector == NORMAL ){ - DocLnk lnk = m_select->selectedDocument(); - name = lnk.file(); - }else if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ - if ( m_shLne ) { - name = m_currentDir + "/" +m_edit->text(); - }else{ - QListViewItem *item = m_View->currentItem(); - if( item != 0 ) - name = m_currentDir + "/" + item->text( 1 ); - } - }else { // installed view - ; - } - return name; -} -QStringList OFileSelector::selectedNames()const -{ - QStringList list; - if( m_selector == NORMAL ){ - list << selectedName(); - }else if ( m_selector == EXTENDED || m_selector == EXTENDED_ALL ) { - list << selectedName(); // FIXME implement multiple Selections - } - return list; -} -/** If mode is set to the Dir selection this will return the selected path. - * - * - */ -QString OFileSelector::selectedPath()const -{ - QString path; - if( m_selector == NORMAL ){ - path = QPEApplication::documentDir(); - }else if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ - ; - } - return path; -} -QStringList OFileSelector::selectedPaths() const -{ - QStringList list; - list << selectedPath(); - return list; -} -QString OFileSelector::directory()const -{ - if( m_selector == NORMAL ) - return QPEApplication::documentDir(); - - return QDir(m_currentDir).absPath(); -} - -int OFileSelector::fileCount() const -{ - int count; - switch( m_selector ){ - case NORMAL: - count = m_select->fileCount(); - break; - //case CUSTOM: - case EXTENDED: - case EXTENDED_ALL: - default: - count = m_View->childCount(); - break; - } - return count; -} -DocLnk OFileSelector::selectedDocument() const -{ - DocLnk lnk; - switch( m_selector ){ - case NORMAL:{ - lnk = m_select->selectedDocument(); - break; - } - case EXTENDED: - case EXTENDED_ALL: - default: - lnk = DocLnk( selectedName() ); // new DocLnk - break; - } - return lnk; -} -QValueList<DocLnk> OFileSelector::selectedDocuments() const -{ - QValueList<DocLnk> docs; - docs.append( selectedDocument() ); - return docs; -} - - -// slots internal - -void OFileSelector::slotOk() -{ - emit ok(); -} -void OFileSelector::slotCancel() -{ - emit cancel(); -} -void OFileSelector::slotViewCheck(const QString &sel) -{ - if( sel == tr("Documents" ) ){ - if( m_select == 0 ){ - // autMime? fix cause now we use All and not the current - // yes currentMime fixes that for us - QString mime = currentMimeType(); - m_select = new FileSelector(mime, - m_stack, "fileselector", - m_shNew, m_shClose); - connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), - this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); - connect(m_select, SIGNAL(closeMe() ), - this, SIGNAL(closeMe() ) ); - //connect to close me and other signals as well - - m_stack->addWidget( m_select, NORMAL ); - } - m_stack->raiseWidget( NORMAL ); - m_selector = NORMAL; - }else if( sel == tr("Files") ){ - m_selector = EXTENDED; - initializeListView(); - reparse(); - m_stack->raiseWidget( EXTENDED ); - }else if( sel == tr("All Files") ){ - m_selector = EXTENDED_ALL; - initializeListView(); - reparse(); - m_stack->raiseWidget( EXTENDED ); // same widget other QFileFilter - } -} -// not yet finished..... -QString OFileSelector::currentMimeType() const{ - QString mime; - QString currentText; - if (m_shChooser ) - currentText = m_mimeCheck->currentText(); - - if (tr("All") == currentText ) return QString::null; - else if (currentText.isEmpty() ) { - ; - }else { - QMap<QString, QStringList>::ConstIterator it; - it = m_mimetypes.find( currentText ); - if ( it == m_mimetypes.end() ) { - mime = it.data().join(";"); - }else{ - mime = currentText; - } - } - return mime; -} -void OFileSelector::slotMimeCheck(const QString &mime) -{ - if( m_selector == NORMAL ){ - //if( m_autoMime ){ - QString newMimeType; - if (mime != tr("All") ) { - QMap<QString, QStringList>::Iterator it; - it = m_mimetypes.find(mime); - if ( it != m_mimetypes.end() ) { - newMimeType = it.data().join(";"); - }else{ - newMimeType = mime; - } - } - delete m_select; - m_select = new FileSelector( newMimeType, - m_stack, "fileselector", - m_shNew, m_shClose); - - connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), - this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); - connect(m_select, SIGNAL(closeMe() ), - this, SIGNAL(closeMe() ) ); - //connect to close me and other signals as well - m_stack->addWidget( m_select, NORMAL ); - m_stack->raiseWidget( NORMAL ); - updateMimes(); - updateMimeCheck(); - m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); - //} - }else{ // others - qWarning("Mime %s", mime.latin1() ); - if(m_shChooser ){ - qWarning("Current Text %s", m_mimeCheck->currentText().latin1() ); - //m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); - } - reparse(); - } - -} -/* - * Ok if a non dir gets inserted into this combobox - * we need to change it - * QFileInfo and dirPath will give us the right Dir - */ -void OFileSelector::slotLocationActivated(const QString &file) -{ - qWarning("slotLocationActivated"); - QString name = file.left( file.find("<-", 0, TRUE ) ); - QFileInfo info( name ); - if ( info.isFile() ) - cd(info.dirPath( TRUE ) ); //absolute - else - cd(name ); - reparse(); -} -void OFileSelector::slotInsertLocationPath(const QString ¤tPath, int count) -{ - QStringList pathList; - bool underDog = FALSE; - for(int i=0;i<count;i++) { - pathList << m_location->text(i); - if( m_location->text(i) == currentPath) - underDog = TRUE; - } - if( !underDog) { - m_location->clear(); - if( currentPath.left(2)=="//") - pathList.append( currentPath.right(currentPath.length()-1) ); - else - pathList.append( currentPath ); - m_location->insertStringList( pathList,-1); - } -} -/* - * Do not crash anymore - * don't try to change dir to a file - */ -void OFileSelector::locationComboChanged() -{ - QFileInfo info( m_location->lineEdit()->text() ); - qWarning("info %s %s", info.dirPath(true).latin1(), m_location->lineEdit()->text().latin1() ); - if (info.isFile() ) - cd(info.dirPath(TRUE) ); //absolute path - else - cd( m_location->lineEdit()->text() ); - - reparse(); -} -void OFileSelector::init() -{ - m_lay = new QVBoxLayout( this ); - m_lay->setSpacing(0 ); - - m_stack = new QWidgetStack( this ); - if( m_selector == NORMAL ){ - QString mime; - if (!m_autoMime) { - if (!m_mimetypes.isEmpty() ) { - QMap<QString, QStringList>::Iterator it; - it = m_mimetypes.begin(); // cause we're in the init - mime = it.data().join(";"); - } - } - m_select = new FileSelector(mime, - m_stack, "fileselector", - m_shNew, m_shClose); - - connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), - this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); - connect(m_select, SIGNAL(closeMe() ), - this, SIGNAL( closeMe() ) ); - //connect to close me and other signals as well - - m_stack->addWidget( m_select, NORMAL ); - m_stack->raiseWidget( NORMAL ); - }else{ // we're in init so it will be EXTENDED or EXTENDED_ALL - // and initializeListview will take care of those - // toolbar get's generade in initializeListView - initializeListView( ); // will raise the widget as well - m_stack->raiseWidget( EXTENDED ); - } - m_lay->addWidget( m_stack, 100 ); // add to the layout 10 = stretch - - if( m_shLne ) // the LineEdit with the current FileName - initializeName(); - - if( m_shPerm ) // the Permission QCheckBox - initializePerm(); - - if( m_shChooser ) // the Chooser for the view and Mimetypes - initializeChooser(); - - if( m_shYesNo ) // the Yes No button row - initializeYes( ); - - if (m_selector != NORMAL ) - reparse(); -} -void OFileSelector::updateMimes() -{ - if( m_autoMime ){ - m_mimetypes.clear(); - m_mimetypes.insert( tr("All"), QString::null ); - if( m_selector == NORMAL ){ - DocLnkSet set; - Global::findDocuments(&set, QString::null ); - QListIterator<DocLnk> dit( set.children() ); - for( ; dit.current(); ++dit ){ - if( !m_mimetypes.contains( (*dit)->type() ) ) - m_mimetypes.insert( (*dit)->type(), (*dit)->type() ); - } - }// else done in reparse - } -} -void OFileSelector::initVars() -{ - if( m_mimetypes.isEmpty() ) - m_autoMime = true; - else - m_autoMime = false; - m_shClose = false; - m_shNew = false; - m_shTool = true; - m_shPerm = false; - m_shLne = true; - m_shChooser = true; - m_shYesNo = true; - m_case = false; - m_dir = true; - m_files = true; - m_showPopup = false; - if(m_pixmaps == 0 ) // init the pixmaps - initPics(); - - // pointers - m_location = 0; - m_mimeCheck = 0; - m_viewCheck = 0; - m_homeButton = 0; - m_docButton = 0; - m_hideButton = 0; - m_ok = 0; - m_cancel = 0; - m_reread = 0; - m_up = 0; - m_View = 0; - m_checkPerm = 0; - m_pseudo = 0; - m_pseudoLayout = 0; - m_select = 0; - m_stack = 0; - m_lay = 0; - m_Oselector = 0; - m_boxToolbar = 0; - m_boxOk = 0; - m_boxName = 0; - m_boxView = 0; - m_custom = 0; - m_edit = 0; - m_fnLabel = 0; - m_new = 0; - m_close = 0; -} -void OFileSelector::addFile(const QString &/*mime*/, QFileInfo *info, bool symlink) -{ - if(!m_files) - return; - // if( !compliesMime(info->absFilePath(), mime ) ) - // return; - MimeType type( info->absFilePath() ); - if (!compliesMime( type.id() ) ) - return; - - QPixmap pix = type.pixmap(); - QString dir; - QString name; - bool locked; - if( pix.isNull() ) { - //TODO make this scaled pixmap global, so we dont have to keep doing this - QWMatrix matrix; - QPixmap pixer(Resource::loadPixmap( "UnknownDocument" )); - matrix.scale( .4, .4); - pix = pixer.xForm(matrix); -// pix = Resource::loadPixmap( "UnknownDocument-14"); - } - dir = info->dirPath( true ); - if( symlink ) - name = info->fileName() + " -> " +info->dirPath() + "/" + info->readLink(); - else { - name = info->fileName(); - if( ( m_mode == OPEN && !info->isReadable() )|| - ( m_mode == SAVE && !info->isWritable() ) ){ - - locked = true; pix = Resource::loadPixmap("locked"); - } - } - new OFileSelectorItem( m_View, pix, name, - info->lastModified().toString(), - QString::number( info->size() ), - dir, locked ); -} -void OFileSelector::addDir(const QString &/*mime*/, QFileInfo *info, bool symlink ) -{ - if(!m_dir) - return; - if( m_selector == EXTENDED_ALL || m_selector == EXTENDED ){ - bool locked = false; - QString name; - QPixmap pix; - if( ( m_mode == OPEN && !info->isReadable() ) || ( m_mode == SAVE && !info->isWritable() ) ){ - locked = true; - if( symlink ) - pix = (*m_pixmaps)["symlinkedlocked"]; - else - pix = Resource::loadPixmap("lockedfolder"); - }else { // readable - pix = symlink ? (*m_pixmaps)["dirsymlink"] : Resource::loadPixmap("folder") ; - } - name = symlink ? info->fileName() + "->" + info->dirPath(true) + "/" +info->readLink() : info->fileName() ; - new OFileSelectorItem( m_View, pix, name, - info->lastModified().toString(), - QString::number( info->size() ), - info->dirPath( true ), locked, - true ); - - }// else CUSTOM View -} -void OFileSelector::delItems() -{ - -} -void OFileSelector::initializeName() -{ - /** Name Layout Line - * This is the Layout line arranged in - * horizontal way each components - * are next to each other - * but we will only do this if - * we didn't initialize a while ago. - */ - if( m_boxName == 0 ){ - m_boxName = new QHBox( this ); // remove this this? or use a QHBox - m_fnLabel = new QLabel( m_boxName ); - m_fnLabel->setText( tr("Name:") ); - m_edit = new QLineEdit( m_boxName ); - m_edit->setText( m_name ); - //m_boxName->addWidget( m_fnLabel ); - m_boxName->setMargin( 5 ); - m_boxName->setSpacing( 8 ); - //m_boxName->setStretchFactor(m_edit, 100 ); // 100 is stretch factor - - m_lay->addWidget( m_boxName, 0 ); // add it to the topLevel layout - }// else we already initialized - // maybe show the components? - // -} -void OFileSelector::initializeYes() -{ - /** The Save Cancel bar - * - */ - if( m_boxOk == 0 ){ - m_boxOk = new QHBox( this ); - m_ok = new QPushButton( tr("&Save"),m_boxOk , "save" ); - m_cancel = new QPushButton( tr("C&ancel"), m_boxOk, "cancel" ); - - //m_boxOk->addWidget( m_ok ); - //m_boxOk->addWidget( m_cancel ); - m_boxOk->setMargin( 5 ); - m_boxOk->setSpacing( 10 ); - m_lay->addWidget( m_boxOk, 0 ); - - connect( m_ok, SIGNAL( clicked() ), - this, SLOT(slotOk() ) ); - connect( m_cancel, SIGNAL( clicked() ), - this, SLOT( slotCancel() ) ); - } -} -/* - * OK m_mimeCheck is a QComboBox we now want to fill - * out that combobox - * if automime we need to update the mimetypes - */ -void OFileSelector::updateMimeCheck() { - m_mimeCheck->clear(); - if (m_autoMime ) { - //m_mimeCheck->insertItem( tr("All") ); - updateMimes(); - } - - QMap<QString, QStringList>::Iterator it; - for (it = m_mimetypes.begin(); it != m_mimetypes.end(); ++it ) { - m_mimeCheck->insertItem( it.key() ); - } -} - -void OFileSelector::initializeChooser() -{ - if( m_boxView == 0 ){ - m_boxView = new QHBox( this ); - m_viewCheck = new QComboBox( m_boxView, "view check"); - m_mimeCheck = new QComboBox( m_boxView, "mime check"); - m_boxView->setSpacing( 8 ); - m_lay->addWidget(m_boxView, 0 ); - - m_viewCheck->insertItem( tr("Documents") ); - m_viewCheck->insertItem( tr("Files") ); - m_viewCheck->insertItem( tr("All Files") ); - updateMimeCheck(); - - connect( m_viewCheck, SIGNAL( activated(const QString & ) ), - this, SLOT( slotViewCheck(const QString & ) ) ); - connect( m_mimeCheck, SIGNAL( activated(const QString & ) ), - this, SLOT( slotMimeCheck( const QString & ) ) ); - } -} -void OFileSelector::initializeListView() -{ - qWarning("initializeListView"); - if( m_pseudo == 0 ){ - qWarning("init"); - m_pseudo = new QWidget( m_stack, "Pseudo Widget"); - m_pseudoLayout = new QVBoxLayout( m_pseudo ); - // toolbar - m_boxToolbar = new QHBox( m_pseudo ); - m_boxToolbar->setSpacing(0 ); // next to each other please - - // toolbar members - { - // location QComboBox - m_location = new QComboBox( m_boxToolbar ); - m_location->setEditable( TRUE ); - m_location->setDuplicatesEnabled( FALSE ); - connect( m_location, SIGNAL(activated(const QString &) ), - this, SLOT( slotLocationActivated(const QString &) ) ); - connect( m_location->lineEdit(), SIGNAL(returnPressed() ), - this, SLOT(locationComboChanged() ) ); - // UP Button - m_up = new QPushButton(Resource::loadIconSet("up"),"", - m_boxToolbar,"cdUpButton"); - m_up->setFixedSize( QSize( 20, 20 ) ); - connect(m_up ,SIGNAL(clicked()),this,SLOT(cdUP() ) ); - m_up->setFlat(TRUE); - - // Home Button - m_homeButton = new QPushButton(Resource::loadIconSet("home") , - "", m_boxToolbar); - m_homeButton->setFixedSize( QSize( 20, 20 ) ); - connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotHome() ) ); - m_homeButton->setFlat(TRUE); - // Documents Button - m_docButton = new QPushButton(Resource::loadIconSet("DocsIcon"),"", - m_boxToolbar,"docsButton"); - m_docButton->setFixedSize( QSize( 20, 20 ) ); - connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotDoc() ) ); - m_docButton->setFlat(TRUE); - - // Close button - m_close = new QPushButton( Resource::loadIconSet( "close"), "", - m_boxToolbar ); - connect( m_close, SIGNAL(clicked() ), this, SIGNAL(closeMe() ) ); - m_close->setFixedSize( 20, 20 ); - - m_boxToolbar->setFixedHeight( 20 ); - m_pseudoLayout->addWidget(m_boxToolbar ); - - // let;s fill the Location ComboBox - StorageInfo storage; - const QList<FileSystem> &fs = storage.fileSystems(); - QListIterator<FileSystem> it ( fs ); - for( ; it.current(); ++it ){ - const QString disk = (*it)->name(); - const QString path = (*it)->path(); - m_location->insertItem(path+ "<-"+disk ); - } - int count = m_location->count(); - m_location->insertItem( m_currentDir ); - m_location->setCurrentItem( count ); - // due to the New and Close button we can not simply hide m_boxToolBar to not show it - if( !m_shTool ){ - m_location->hide( ); - m_up->hide( ); - m_homeButton->hide( ); - m_docButton->hide( ); - } - if(!m_shClose ) - m_close->hide(); - //if(!m_shNew) - //m_close->hide(); - - } // off toolbar - // the Main ListView - // make a QWidgetStack first so Views can share the Toolbar - m_View = new QListView( m_pseudo, "Extended view"); - QPEApplication::setStylusOperation( m_View->viewport(), - QPEApplication::RightOnHold); - m_View->addColumn(" " ); - m_View->addColumn(tr("Name"), 135 ); - m_View->addColumn(tr("Size"), -1 ); - m_View->addColumn(tr("Date"), 60 ); - m_View->addColumn(tr("Mime Type"), -1 ); - QHeader *header = m_View->header(); - header->hide(); - m_View->setSorting( 1 ); - m_View->setAllColumnsShowFocus( TRUE ); - - connect(m_View, SIGNAL(selectionChanged() ), - this, SLOT(slotSelectionChanged() ) ); - - connect(m_View, SIGNAL(clicked(QListViewItem *) ), -// connect(m_View, SIGNAL(currentChanged(QListViewItem *) ), - this, SLOT(slotCurrentChanged(QListViewItem * ) ) ); - - connect(m_View, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int) ), - this, SLOT(slotClicked( int, QListViewItem *, const QPoint &, int) ) ); - - connect(m_View, SIGNAL(mouseButtonPressed(int, QListViewItem *, const QPoint &, int )), - this, SLOT(slotRightButton(int, QListViewItem *, const QPoint &, int ) ) ); - - m_pseudoLayout->addWidget( m_View, 288 ); - m_stack->addWidget( m_pseudo, EXTENDED ); - } -} -void OFileSelector::initializePerm() -{ - if( m_checkPerm == 0 ){ - m_checkPerm = new QCheckBox(tr("Ser Permission"), this, "perm"); - m_checkPerm->setChecked( false ); - m_lay->addWidget( m_checkPerm ); - - } -} -void OFileSelector::initPics() -{ - m_pixmaps = new QMap<QString,QPixmap>; - QPixmap pm = Resource::loadPixmap( "folder" ); - QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); - QPainter painter( &pm ); - painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); - pm.setMask( pm.createHeuristicMask( FALSE ) ); - m_pixmaps->insert("dirsymlink", pm ); - - QPixmap pm2 = Resource::loadPixmap( "lockedfolder" ); - QPainter pen(&pm2 ); - pen.drawPixmap(pm2.width()-lnk.width(), pm2.height()-lnk.height(), lnk ); - pm2.setMask( pm2.createHeuristicMask( FALSE ) ); - m_pixmaps->insert("symlinkedlocked", pm2 ); -} -// if a mime complies with the m_mimeCheck->currentItem -bool OFileSelector::compliesMime( const QString &path, const QString &mime ) -{ - if( mime == "All" ) - return true; - MimeType type( path ); - if( type.id() == mime ) - return true; - return false; -} -/* check if the mimetype in mime - * complies with the one which is current - */ -/* - * We've the mimetype of the file - * We need to get the stringlist of the current mimetype - * - * mime = image/jpeg - * QStringList = 'image/*' - * or QStringList = image/jpeg;image/png;application/x-ogg - * or QStringList = application/x-ogg;image/*; - * with all these mime filters it should get acceptes - * to do so we need to look if mime is contained inside - * the stringlist - * if it's contained return true - * if not ( I'm no RegExp expert at all ) we'll look if a '/*' - * is contained in the mimefilter and then we will - * look if both are equal until the '/' - */ -bool OFileSelector::compliesMime( const QString& mime ) { - qWarning("mimetype is %s", mime.latin1() ); - QString currentText; - if (m_shChooser ) - currentText = m_mimeCheck->currentText(); - - qWarning("current text is %s", currentText.latin1() ); - QMap<QString, QStringList>::Iterator it; - QStringList list; - if ( currentText == tr("All") ) return true; - else if ( currentText.isEmpty() && !m_mimetypes.isEmpty() ) { - it = m_mimetypes.begin(); - list = it.data(); - }else if ( currentText.isEmpty() ) return true; - else{ - it = m_mimetypes.find(currentText ); - if ( it == m_mimetypes.end() ) qWarning("not there"), list << currentText; - else qWarning("found"), list = it.data(); - } - // dump it now - //for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { - // qWarning( "%s", (*it).latin1() ); - //} - - - if ( list.contains(mime) ) return true; - qWarning("list doesn't contain it "); - QStringList::Iterator it2; - int pos; - for ( it2 = list.begin(); it2 != list.end(); ++it2 ) { - pos = (*it2).findRev("/*"); - if ( pos >= 0 ) { - if ( mime.contains( (*it2).left(pos) ) ) return true; - } - } - return false; -} -void OFileSelector::slotFileSelected( const QString &string ) -{ - if( m_shLne ) - m_edit->setText( string ); - emit fileSelected( string ); -} -void OFileSelector::slotFileBridgeSelected( const DocLnk &lnk ) -{ - slotFileSelected( lnk.name() ); - emit fileSelected( lnk ); -} -void OFileSelector::slotSelectionChanged() -{ - -} -void OFileSelector::slotCurrentChanged(QListViewItem* item ) -{ - if( item == 0 ) - return; - if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ) { - OFileSelectorItem *sel = (OFileSelectorItem*) item; // start to use the C++ casts ;) - qWarning("current changed"); - if(!sel->isDir() ){ - if( m_shLne ) - m_edit->setText( sel->text(1) ); - - if (m_mode == FILESELECTOR ) { - QStringList str = QStringList::split("->", sel->text(1) ); - QString path =sel->directory() + "/" + str[0].stripWhiteSpace(); - emit fileSelected(path ); - DocLnk lnk( path ); - emit fileSelected(lnk ); - } - } - } -} -void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &, int) -{ - if ( item == 0 ) - return; - - if( button != Qt::LeftButton ) - return; - - switch( m_selector ){ - default: - break; - case EXTENDED: // fall through - case EXTENDED_ALL:{ - OFileSelectorItem *sel = (OFileSelectorItem*)item; - if(!sel->isLocked() ){ - QStringList str = QStringList::split("->", sel->text(1) ); - if( sel->isDir() ){ - cd( sel->directory() + "/" + str[0].stripWhiteSpace() ); - // if MODE Dir m_shLne set the Text - }else{ - if( m_shLne ) - m_edit->setText( str[0].stripWhiteSpace() ); - qWarning("selected here in slot clicked"); - emit fileSelected( sel->directory() + "/" + str[0].stripWhiteSpace() ); - DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() ); - qWarning("file selected"); - emit fileSelected( lnk ); - } - } - break; - } - } -} -void OFileSelector::slotRightButton(int button, QListViewItem *item, const QPoint &, int ) -{ - if( item == 0 ) - return; - - if( button != Qt::RightButton ) - return; - slotContextMenu( item ); -} -void OFileSelector::slotContextMenu( QListViewItem * /*item*/) -{ - -} -void OFileSelector::slotChangedDir() -{ - OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); - if(sel->isDir() ){ - QStringList str = QStringList::split("->", sel->text(1) ); - cd( sel->directory() + "/" + str[0].stripWhiteSpace() ); - } -} -void OFileSelector::slotOpen() -{ - OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); - if(!sel->isDir() ){ - QStringList str = QStringList::split("->", sel->text(1) ); - slotFileSelected( sel->directory() +"/" +str[0].stripWhiteSpace() ); - qWarning("slot open"); - // DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() ); - //emit fileSelected( lnk ); - } -} -void OFileSelector::slotRescan() -{ - -} -void OFileSelector::slotRename() -{ - reparse(); -} -void OFileSelector::slotDelete() -{ - OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); - QStringList list = QStringList::split("->", sel->text(1) ); - if( sel->isDir() ){ - QString str = QString::fromLatin1("rm -rf ") + sel->directory() +"/" + list[0]; //better safe than sorry - switch ( QMessageBox::warning(this,tr("Delete"),tr("Do you really want to delete\n")+list[0], - tr("Yes"),tr("No"),0,1,1) ) { - case 0: - ::system(str.utf8().data() ); - break; - } - } else { - QFile::remove( list[0] ); - } - m_View->takeItem( sel ); - delete sel; -} -void OFileSelector::cdUP() -{ - QDir dir( m_currentDir ); - dir.cdUp(); - if(dir.exists() ){ - m_currentDir = dir.absPath(); - reparse(); - int count = m_location->count(); - slotInsertLocationPath( m_currentDir, count); - m_location->setCurrentItem( indexByString( m_location, m_currentDir)); - //this wont work in all instances - // FIXME - } -} -void OFileSelector::slotHome() -{ - cd(QDir::homeDirPath() ); -} -void OFileSelector::slotDoc() -{ - cd(QPEApplication::documentDir() ); -} -void OFileSelector::slotNavigate( ) -{ - -} -// fill the View with life -void OFileSelector::reparse() -{ - if( m_selector == NORMAL ) - return; - if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ) - m_View->clear(); - else // custom view - ; // currentView()->clear(); - if( m_shChooser) - qWarning("reparse %s", m_mimeCheck->currentText().latin1() ); - - QString currentMimeType; - // let's update the mimetype - if( m_autoMime ){ - m_mimetypes.clear(); - // ok we can change mimetype so we need to be able to give a selection - if( m_shChooser ) { - currentMimeType = m_mimeCheck->currentText(); - m_mimeCheck->clear(); - - // let's find possible mimetypes - QDir dir( m_currentDir ); - if( dir.exists() ){ - dir.setFilter( QDir::Files | QDir::Readable ); - dir.setSorting( QDir::Size ); - const QFileInfoList *list = dir.entryInfoList(); - QFileInfoListIterator it( *list ); - QFileInfo *fi; - while( (fi=it.current() ) ) { - if( fi->extension() == QString::fromLatin1("desktop") ){ - ++it; - continue; - } - MimeType type( fi->absFilePath() ); - if( !m_mimetypes.contains( type.id() ) ){ - //qWarning("Type %s", type.id().latin1() ); - m_mimetypes.insert( type.id(), type.id() ); - } - - ++it; - } - // add them to the chooser - updateMimeCheck(); - m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) ); - currentMimeType = m_mimeCheck->currentText(); - } - } - }else { // no autoMime - // let the mimetype be set from out side the m_mimeCheck FEATURE - - if( m_shChooser ){ - currentMimeType = m_mimeCheck->currentText(); -// updateMimeCheck(); - } - } - // now we got our mimetypes we can add the files - - QDir dir( m_currentDir ); - - if( dir.exists() ){ - int sort; - if ( m_case ) - sort = (QDir::IgnoreCase | QDir::Name | QDir::DirsFirst | QDir::Reversed); - else - sort = (QDir::Name | QDir::DirsFirst | QDir::Reversed); - dir.setSorting( sort ); - - int filter; - if( m_selector == EXTENDED_ALL /*|| m_selector ==CUSTOM_ALL */ ){ - filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All; - }else - filter = QDir::Files | QDir::Dirs | QDir::All; - dir.setFilter( filter ); - - // now go through all files - const QFileInfoList *list = dir.entryInfoList(); - QFileInfoListIterator it( *list ); - QFileInfo *fi; - while( (fi=it.current() ) ){ - //qWarning("True and only" ); - if( fi->fileName() == QString::fromLatin1("..") || fi->fileName() == QString::fromLatin1(".") ){ - //qWarning(".. or ." ); - ++it; - continue; - } - if( fi->isSymLink() ){ - QString file = fi->dirPath( true ) + "/" + fi->readLink(); - for( int i = 0; i<=4; i++) { // 5 tries to prevent dos - QFileInfo info( file ); - if( !info.exists() ){ - addSymlink( currentMimeType, fi, TRUE ); - break; - }else if( info.isDir() ){ - addDir( currentMimeType, fi, TRUE ); - break; - }else if( info.isFile() ){ - addFile( currentMimeType, fi, TRUE ); - break; - }else if( info.isSymLink() ){ - file = info.dirPath(true ) + "/" + info.readLink() ; - break; - }else if( i == 4){ - addSymlink( currentMimeType, fi ); - } - } // off for loop - }else if( fi->isDir() ){ - addDir( currentMimeType, fi ); - }else if( fi->isFile() ){ - addFile( currentMimeType, fi ); - } - //qWarning( "%s", fi->fileName().latin1() ); - ++it; - } // of while loop - } // if ( dir.exists() ) - m_View->sort(); - if( m_shTool ){ - m_location->insertItem( m_currentDir ); - - } - // reenable painting and updates -} diff --git a/libopie/ofileselector.cpp b/libopie/ofileselector.cpp new file mode 100644 index 0000000..577e916 --- a/dev/null +++ b/libopie/ofileselector.cpp @@ -0,0 +1,856 @@ +#include <qcombobox.h> +#include <qdir.h> +#include <qhbox.h> +#include <qheader.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qlistview.h> +#include <qpopupmenu.h> +#include <qwidgetstack.h> +#include <qregexp.h> +#include <qobjectlist.h> + +/* hacky but we need to get FileSelector::filter */ +#define private public +#include <qpe/fileselector.h> +#undef private + +#include <qpe/qpeapplication.h> +#include <qpe/mimetype.h> +#include <qpe/resource.h> +#include <qpe/storage.h> + +#include "ofileselector_p.h" +#include "ofileselector.h" + + + +OFileViewInterface::OFileViewInterface( OFileSelector* selector ) + : m_selector( selector ) { +} +OFileViewInterface::~OFileViewInterface() { +} +QString OFileViewInterface::name()const{ + return m_name; +} +void OFileViewInterface::setName( const QString& name ) { + m_name = name; +} +OFileSelector* OFileViewInterface::selector()const { + return m_selector; +} +DocLnk OFileViewInterface::selectedDocument()const { + return DocLnk( selectedName() ); +} +bool OFileViewInterface::showNew()const { + return selector()->showNew(); +} +bool OFileViewInterface::showClose()const { + return selector()->showClose(); +} +MimeTypes OFileViewInterface::mimeTypes()const { + return selector()->mimeTypes(); +} +QStringList OFileViewInterface::currentMimeType()const { + return selector()->currentMimeType(); +} +void OFileViewInterface::activate( const QString& ) { + // not implemented here +} +void OFileViewInterface::ok() { + emit selector()->ok(); +} +void OFileViewInterface::cancel() { + emit selector()->cancel(); +} +void OFileViewInterface::closeMe() { + emit selector()->closeMe(); +} +void OFileViewInterface::fileSelected( const QString& str) { + emit selector()->fileSelected( str); +} +void OFileViewInterface::fileSelected( const DocLnk& lnk) { + emit selector()->fileSelected( lnk ); +} +void OFileViewInterface::setCurrentFileName( const QString& str ) { + selector()->m_lneEdit->setText( str ); +} +QString OFileViewInterface::currentFileName()const{ + return selector()->m_lneEdit->text(); +} +QString OFileViewInterface::startDirectory()const{ + return selector()->m_startDir; +} + + +ODocumentFileView::ODocumentFileView( OFileSelector* selector ) + : OFileViewInterface( selector ) { + m_selector = 0; + setName( QObject::tr("Documents") ); +} +ODocumentFileView::~ODocumentFileView() { + +} +QString ODocumentFileView::selectedName()const { + if (!m_selector) + return QString::null; + + return m_selector->selectedDocument().file(); +} +QString ODocumentFileView::selectedPath()const { + return QPEApplication::documentDir(); +} +QString ODocumentFileView::directory()const { + return selectedPath(); +} +void ODocumentFileView::reread() { + if (!m_selector) + return; + + m_selector->setNewVisible( showNew() ); + m_selector->setCloseVisible( showClose() ); + m_selector->filter = currentMimeType().join(";"); + m_selector->reread(); +} +int ODocumentFileView::fileCount()const { + if (!m_selector) + return -1; + + return m_selector->fileCount(); +} +DocLnk ODocumentFileView::selectedDocument()const { + if (!m_selector) + return DocLnk(); + + return m_selector->selectedDocument(); +} +QWidget* ODocumentFileView::widget( QWidget* parent ) { + if (!m_selector ) { + m_selector = new FileSelector(currentMimeType().join(";"), parent, "fileselector", showNew(), showClose() ); + QObject::connect(m_selector, SIGNAL(fileSelected( const DocLnk& ) ), + selector(), SLOT(slotDocLnkBridge(const DocLnk&) ) ); + QObject::connect(m_selector, SIGNAL(closeMe() ), + selector(), SIGNAL(closeMe() ) ); + QObject::connect(m_selector, SIGNAL(newSelected(const DocLnk& ) ), + selector(), SIGNAL(newSelected(const DocLnk& ) ) ); + } + + return m_selector; +} + +/* + * This is the file system view used + * we use a QListView + QListViewItems for it + */ + +OFileSelectorItem::OFileSelectorItem( QListView* view, const QPixmap& pixmap, + const QString& path, const QString& date, + const QString& size, const QString& dir, + bool isLocked, bool isDir ) + : QListViewItem( view ) +{ + setPixmap(0, pixmap ); + setText(1, path ); + setText(2, size ); + setText(3, date ); + m_isDir = isDir; + m_dir = dir; + m_locked = isLocked; +} +OFileSelectorItem::~OFileSelectorItem() { + +} +bool OFileSelectorItem::isLocked()const { + return m_locked; +} +QString OFileSelectorItem::directory()const { + return m_dir; +} +bool OFileSelectorItem::isDir()const { + return m_isDir; +} +QString OFileSelectorItem::path()const { + return text( 1 ); +} +QString OFileSelectorItem::key( int id, bool )const { + QString ke; + if( id == 0 || id == 1 ){ // name + if( m_isDir ){ + ke.append("0" ); + ke.append( text(1) ); + }else{ + ke.append("1" ); + ke.append( text(1) ); + } + return ke; + }else + return text( id ); + +} + +OFileViewFileListView::OFileViewFileListView( QWidget* parent, const QString& startDir, + OFileSelector* sel) + : QWidget( parent ), m_sel( sel ) { + m_all = false; + QVBoxLayout* lay = new QVBoxLayout( this ); + m_currentDir = startDir; + + /* + * now we add a special bar + * One Button For Up + * Home + * Doc + * And a dropdown menu with FileSystems + * FUTURE: one to change dir with lineedit + * Bookmarks + * Create Dir + */ + QHBox* box = new QHBox(this ); + box->setBackgroundMode( PaletteButton ); + box->setSpacing( 0 ); + + QToolButton *btn = new QToolButton( box ); + btn->setIconSet( Resource::loadIconSet("up") ); + connect(btn, SIGNAL(clicked() ), + this, SLOT( cdUP() ) ); + + btn = new QToolButton( box ); + btn->setIconSet( Resource::loadIconSet("home") ); + connect(btn, SIGNAL(clicked() ), + this, SLOT( cdHome() ) ); + + btn = new QToolButton( box ); + btn->setIconSet( Resource::loadIconSet("DocsIcon") ); + connect(btn, SIGNAL(clicked() ), + this, SLOT(cdDoc() ) ); + + m_btnNew = new QToolButton( box ); + m_btnNew->setIconSet( Resource::loadIconSet("new") ); + connect(m_btnNew, SIGNAL(clicked() ), + this, SLOT(slotNew() ) ); + + + m_btnClose = new QToolButton( box ); + m_btnClose->setIconSet( Resource::loadIconSet("close") ); + connect(m_btnClose, SIGNAL(clicked() ), + selector(), SIGNAL(closeMe() ) ); + + btn = new QToolButton( box ); + btn->setIconSet( Resource::loadIconSet("cardmon/pcmcia") ); + + /* let's fill device parts */ + QPopupMenu* pop = new QPopupMenu(this); + connect(pop, SIGNAL( activated(int) ), + this, SLOT(slotFSActivated(int) ) ); + + StorageInfo storage; + const QList<FileSystem> &fs = storage.fileSystems(); + QListIterator<FileSystem> it(fs); + for ( ; it.current(); ++it ) { + const QString disk = (*it)->name(); + const QString path = (*it)->path(); + m_dev.insert( disk, path ); + pop->insertItem( disk ); + } + m_fsPop = pop; + + + btn->setPopup( pop ); + + lay->addWidget( box ); + + m_view = new QListView( this ); + + m_view->installEventFilter(this); + + QPEApplication::setStylusOperation( m_view->viewport(), + QPEApplication::RightOnHold); + m_view->addColumn(" " ); + m_view->addColumn(tr("Name"), 135 ); + m_view->addColumn(tr("Size"), -1 ); + m_view->addColumn(tr("Date"), 60 ); + m_view->addColumn(tr("Mime Type"), -1 ); + + + m_view->setSorting( 1 ); + m_view->setAllColumnsShowFocus( TRUE ); + + lay->addWidget( m_view, 1000 ); + connectSlots(); +} +OFileViewFileListView::~OFileViewFileListView() { +} +void OFileViewFileListView::slotNew() { + DocLnk lnk; + emit selector()->newSelected( lnk ); +} +OFileSelectorItem* OFileViewFileListView::currentItem()const{ + QListViewItem* item = m_view->currentItem(); + if (!item ) + return 0l; + + return static_cast<OFileSelectorItem*>(item); +} +void OFileViewFileListView::reread( bool all ) { + m_view->clear(); + + if (selector()->showClose() ) + m_btnClose->show(); + else + m_btnClose->hide(); + + if (selector()->showNew() ) + m_btnNew->show(); + else + m_btnNew->hide(); + + m_mimes = selector()->currentMimeType(); + m_all = all; + + QDir dir( m_currentDir ); + if (!dir.exists() ) + return; + + dir.setSorting( QDir::Name | QDir::DirsFirst | QDir::Reversed ); + int filter; + if (m_all ) + filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All; + else + filter = QDir::Files | QDir::Dirs | QDir::All; + dir.setFilter( filter ); + + // now go through all files + const QFileInfoList *list = dir.entryInfoList(); + if (!list) { + cdUP(); + return; + } + QFileInfoListIterator it( *list ); + QFileInfo *fi; + while( (fi=it.current() ) ){ + if( fi->fileName() == QString::fromLatin1("..") || fi->fileName() == QString::fromLatin1(".") ){ + ++it; + continue; + } + + /* + * It is a symlink we try to resolve it now but don't let us attack by DOS + * + */ + if( fi->isSymLink() ){ + QString file = fi->dirPath( true ) + "/" + fi->readLink(); + for( int i = 0; i<=4; i++) { // 5 tries to prevent dos + QFileInfo info( file ); + if( !info.exists() ){ + addSymlink( fi, TRUE ); + break; + }else if( info.isDir() ){ + addDir( fi, TRUE ); + break; + }else if( info.isFile() ){ + addFile( fi, TRUE ); + break; + }else if( info.isSymLink() ){ + file = info.dirPath(true ) + "/" + info.readLink() ; + break; + }else if( i == 4){ // couldn't resolve symlink add it as symlink + addSymlink( fi ); + } + } // off for loop for symlink resolving + }else if( fi->isDir() ) + addDir( fi ); + else if( fi->isFile() ) + addFile( fi ); + + ++it; + } // of while loop + m_view->sort(); + +} +int OFileViewFileListView::fileCount()const{ + return m_view->childCount(); +} +QString OFileViewFileListView::currentDir()const{ + return m_currentDir; +} +OFileSelector* OFileViewFileListView::selector() { + return m_sel; +} + +bool OFileViewFileListView::eventFilter (QObject *o, QEvent *e) { + if ( e->type() == QEvent::KeyPress ) { + QKeyEvent *k = (QKeyEvent *)e; + if ( (k->key()==Key_Enter) || (k->key()==Key_Return)) { + slotClicked( Qt::LeftButton,m_view->currentItem(),QPoint(0,0),0); + return true; + } + } + return false; +} + + +void OFileViewFileListView::connectSlots() { + connect(m_view, SIGNAL(clicked(QListViewItem*) ), + this, SLOT(slotCurrentChanged(QListViewItem*) ) ); + connect(m_view, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint&, int ) ), + this, SLOT(slotClicked(int, QListViewItem*, const QPoint&, int ) ) ); +} +void OFileViewFileListView::slotCurrentChanged( QListViewItem* item) { + if (!item) + return; +#if 0 + + OFileSelectorItem *sel = static_cast<OFileSelectorItem*>(item); + + if (!sel->isDir() ) { + selector()->m_lneEdit->setText( sel->text(1) ); + // if in fileselector mode we will emit selected + if ( selector()->mode() == OFileSelector::FileSelector ) { + qWarning("slot Current Changed"); + QStringList str = QStringList::split("->", sel->text(1) ); + QString path = sel->directory() + "/" + str[0].stripWhiteSpace(); + emit selector()->fileSelected( path ); + DocLnk lnk( path ); + emit selector()->fileSelected( lnk ); + } + } +#endif +} +void OFileViewFileListView::slotClicked(int button , QListViewItem* item, const QPoint&, int ) { + if (!item || ( button != Qt::LeftButton) ) + return; + + OFileSelectorItem *sel = static_cast<OFileSelectorItem*>(item); + if (!sel->isLocked() ) { + QStringList str = QStringList::split("->", sel->text(1) ); + if (sel->isDir() ) { + m_currentDir = sel->directory() + "/" + str[0].stripWhiteSpace(); + emit selector()->dirSelected( m_currentDir ); + reread( m_all ); + }else { // file + qWarning("slot Clicked"); + selector()->m_lneEdit->setText( str[0].stripWhiteSpace() ); + QString path = sel->directory() + "/" + str[0].stripWhiteSpace(); + emit selector()->fileSelected( path ); + DocLnk lnk( path ); + emit selector()->fileSelected( lnk ); + } + } // not locked +} +void OFileViewFileListView::addFile( QFileInfo* info, bool symlink ) { + MimeType type( info->absFilePath() ); + if (!compliesMime( type.id() ) ) + return; + + QPixmap pix = type.pixmap(); + QString dir, name; bool locked; + if ( pix.isNull() ) { + QWMatrix matrix; + QPixmap pixer(Resource::loadPixmap("UnknownDocument") ); + matrix.scale( .4, .4 ); + pix = pixer.xForm( matrix ); + } + dir = info->dirPath( true ); + locked = false; + if ( symlink ) + name = info->fileName() + " -> " + info->dirPath() + "/" + info->readLink(); + else{ + name = info->fileName(); + if ( ( (selector()->mode() == OFileSelector::Open)&& !info->isReadable() ) || + ( (selector()->mode() == OFileSelector::Save)&& !info->isWritable() ) ) { + locked = true; pix = Resource::loadPixmap("locked"); + } + } + (void)new OFileSelectorItem( m_view, pix, name, + info->lastModified().toString(), QString::number( info->size() ), + dir, locked ); +} +void OFileViewFileListView::addDir( QFileInfo* info, bool symlink ) { + bool locked = false; QString name; QPixmap pix; + + if ( ( ( selector()->mode() == OFileSelector::Open ) && !info->isReadable() ) || + ( ( selector()->mode() == OFileSelector::Save ) && !info->isWritable() ) ) { + locked = true; + if ( symlink ) + pix = Resource::loadPixmap( "opie/symlink" ); + else + pix = Resource::loadPixmap( "lockedfolder" ); + }else + pix = symlink ? Resource::loadPixmap( "opie/symlink") : Resource::loadPixmap("folder"); + + name = symlink ? info->fileName() + " -> " + info->dirPath(true) + "/" + info->readLink() : + info->fileName(); + + (void)new OFileSelectorItem( m_view, pix, name, + info->lastModified().toString(), + QString::number( info->size() ), + info->dirPath( true ), locked, true ); + + +} +void OFileViewFileListView::addSymlink( QFileInfo* , bool ) { + +} +void OFileViewFileListView::cdUP() { + QDir dir( m_currentDir ); + dir.cdUp(); + + if (!dir.exists() ) + m_currentDir = "/"; + else + m_currentDir = dir.absPath(); + + emit selector()->dirSelected( m_currentDir ); + reread( m_all ); +} +void OFileViewFileListView::cdHome() { + m_currentDir = QDir::homeDirPath(); + emit selector()->dirSelected( m_currentDir ); + reread( m_all ); +} +void OFileViewFileListView::cdDoc() { + m_currentDir = QPEApplication::documentDir(); + emit selector()->dirSelected( m_currentDir ); + reread( m_all ); +} +void OFileViewFileListView::changeDir( const QString& dir ) { + m_currentDir = dir; + emit selector()->dirSelected( m_currentDir ); + reread( m_all ); +} +void OFileViewFileListView::slotFSActivated( int id ) { + changeDir ( m_dev[m_fsPop->text(id)] ); +} + +/* check if the mimetype in mime + * complies with the one which is current + */ +/* + * We've the mimetype of the file + * We need to get the stringlist of the current mimetype + * + * mime = image@slashjpeg + * QStringList = 'image@slash*' + * or QStringList = image/jpeg;image/png;application/x-ogg + * or QStringList = application/x-ogg;image@slash*; + * with all these mime filters it should get acceptes + * to do so we need to look if mime is contained inside + * the stringlist + * if it's contained return true + * if not ( I'm no RegExp expert at all ) we'll look if a '@slash*' + * is contained in the mimefilter and then we will + * look if both are equal until the '/' + */ +bool OFileViewFileListView::compliesMime( const QString& str) { + if (str.isEmpty() || m_mimes.isEmpty() || str.stripWhiteSpace().isEmpty() ) + return true; + + for (QStringList::Iterator it = m_mimes.begin(); it != m_mimes.end(); ++it ) { + QRegExp reg( (*it) ); + reg.setWildcard( true ); + if ( str.find( reg ) != -1 ) + return true; + + } + return false; +} +/* + * The listView giving access to the file system! + */ +class OFileViewFileSystem : public OFileViewInterface { +public: + OFileViewFileSystem( OFileSelector* ); + ~OFileViewFileSystem(); + + QString selectedName() const; + QString selectedPath() const; + + QString directory()const; + void reread(); + int fileCount()const; + + QWidget* widget( QWidget* parent ); + void activate( const QString& ); +private: + OFileViewFileListView* m_view; + bool m_all : 1; +}; +OFileViewFileSystem::OFileViewFileSystem( OFileSelector* sel) + : OFileViewInterface( sel ) { + m_view = 0; + m_all = false; +} +OFileViewFileSystem::~OFileViewFileSystem() { +} +QString OFileViewFileSystem::selectedName()const{ + if (!m_view ) + return QString::null; + + QString cFN=currentFileName(); + if (cFN.startsWith("/")) return cFN; + return m_view->currentDir() + "/" + cFN; +} +QString OFileViewFileSystem::selectedPath()const{ + return QString::null; +} +QString OFileViewFileSystem::directory()const{ + if (!m_view) + return QString::null; + + OFileSelectorItem* item = m_view->currentItem(); + if (!item ) + return QString::null; + + return QDir(item->directory() ).absPath(); +} +void OFileViewFileSystem::reread() { + if (!m_view) + return; + + m_view->reread( m_all ); +} +int OFileViewFileSystem::fileCount()const{ + if (!m_view ) + return -1; + return m_view->fileCount(); +} +QWidget* OFileViewFileSystem::widget( QWidget* parent ) { + if (!m_view ) { + m_view = new OFileViewFileListView( parent, startDirectory(), selector() ); + } + return m_view; +} +void OFileViewFileSystem::activate( const QString& str) { + m_all = (str != QObject::tr("Files") ); + + +} + +/* Selector */ +OFileSelector::OFileSelector( QWidget* parent, int mode, int sel, + const QString& dirName, const QString& fileName, + const MimeTypes& mimetypes, + bool showNew, bool showClose) + : QWidget( parent, "OFileSelector" ) +{ + m_current = 0; + m_shNew = showNew; + m_shClose = showClose; + m_mimeType = mimetypes; + m_startDir = dirName; + + m_mode = mode; + m_selector = sel; + + initUI(); + m_lneEdit->setText( fileName ); + initMime(); + initViews(); + + QString str; + switch ( m_selector ) { + default: + case Normal: + str = QObject::tr("Documents"); + m_cmbView->setCurrentItem( 0 ); + break; + case Extended: + str = QObject::tr("Files"); + m_cmbView->setCurrentItem( 1 ); + break; + case ExtendedAll: + str = QObject::tr("All Files"); + m_cmbView->setCurrentItem( 2 ); + break; + } + slotViewChange( str ); + +} +OFileSelector::OFileSelector( const QString& mimeFilter, QWidget* parent, const char* name, + bool showNew, bool showClose ) + : QWidget( parent, name ) +{ + m_current = 0; + m_shNew = showNew; + m_shClose = showClose; + m_startDir = QPEApplication::documentDir(); + + if (!mimeFilter.isEmpty() ) + m_mimeType.insert(mimeFilter, QStringList::split(";", mimeFilter ) ); + + m_mode = OFileSelector::FileSelector; + m_selector = OFileSelector::Normal; + + initUI(); + initMime(); + initViews(); + m_cmbView->setCurrentItem( 0 ); + slotViewChange( QObject::tr("Documents") ); +} +/* + * INIT UI will set up the basic GUI + * Layout: Simple VBoxLayout + * On top a WidgetStack containing the Views... + * - List View + * - Document View + * Below we will have a Label + LineEdit + * Below we will have two ComoBoxes one for choosing the view one for + * choosing the mimetype + */ +void OFileSelector::initUI() { + QVBoxLayout* lay = new QVBoxLayout( this ); + + m_stack = new QWidgetStack( this ); + lay->addWidget( m_stack, 1000 ); + + m_nameBox = new QHBox( this ); + (void)new QLabel( tr("Name:"), m_nameBox ); + m_lneEdit = new QLineEdit( m_nameBox ); + m_lneEdit ->installEventFilter(this); + lay->addWidget( m_nameBox ); + + m_cmbBox = new QHBox( this ); + m_cmbView = new QComboBox( m_cmbBox ); + m_cmbMime = new QComboBox( m_cmbBox ); + lay->addWidget( m_cmbBox ); +} + +/* + * This will make sure that the return key in the name edit causes dialogs to close + */ + +bool OFileSelector::eventFilter (QObject *o, QEvent *e) { + if ( e->type() == QEvent::KeyPress ) { + QKeyEvent *k = (QKeyEvent *)e; + if ( (k->key()==Key_Enter) || (k->key()==Key_Return)) { + emit ok(); + return true; + } + } + return false; +} + +/* + * This will insert the MimeTypes into the Combo Box + * And also connect the changed signal + * + * AutoMimeTyping is disabled for now. It used to reparse a dir and then set available mimetypes + */ +void OFileSelector::initMime() { + MimeTypes::Iterator it; + for ( it = m_mimeType.begin(); it != m_mimeType.end(); ++it ) { + m_cmbMime->insertItem( it.key() ); + } + m_cmbMime->setCurrentItem( 0 ); + + connect( m_cmbMime, SIGNAL(activated(int) ), + this, SLOT(slotMimeTypeChanged() ) ); + +} +void OFileSelector::initViews() { + m_cmbView->insertItem( QObject::tr("Documents") ); + m_cmbView->insertItem( QObject::tr("Files") ); + m_cmbView->insertItem( QObject::tr("All Files") ); + connect(m_cmbView, SIGNAL(activated( const QString& ) ), + this, SLOT(slotViewChange( const QString& ) ) ); + + + m_views.insert( QObject::tr("Documents"), new ODocumentFileView(this) ); + + /* see above why add both */ + OFileViewInterface* in = new OFileViewFileSystem( this ); + m_views.insert( QObject::tr("Files"), in ); + m_views.insert( QObject::tr("All Files"), in ); +} +OFileSelector::~OFileSelector() { + +} +const DocLnk* OFileSelector::selected() { + DocLnk* lnk = new DocLnk( currentView()->selectedDocument() ); + return lnk; +} +QString OFileSelector::selectedName()const{ + return currentView()->selectedName(); +} +QString OFileSelector::selectedPath()const { + return currentView()->selectedPath(); +} +QString OFileSelector::directory()const { + return currentView()->directory(); +} +DocLnk OFileSelector::selectedDocument()const { + return currentView()->selectedDocument(); +} +int OFileSelector::fileCount()const { + return currentView()->fileCount(); +} +void OFileSelector::reread() { + return currentView()->reread(); +} +OFileViewInterface* OFileSelector::currentView()const{ + return m_current; +} +bool OFileSelector::showNew()const { + return m_shNew; +} +bool OFileSelector::showClose()const { + return m_shClose; +} +MimeTypes OFileSelector::mimeTypes()const { + return m_mimeType; +} +int OFileSelector::mode()const{ + return m_mode; +} +int OFileSelector::selector()const{ + return m_selector; +} +QStringList OFileSelector::currentMimeType()const { + return m_mimeType[m_cmbMime->currentText()]; +} +void OFileSelector::slotMimeTypeChanged() { + reread(); +} +void OFileSelector::slotDocLnkBridge( const DocLnk& lnk) { + m_lneEdit->setText( lnk.name() ); + emit fileSelected( lnk ); + emit fileSelected( lnk.name() ); +} +void OFileSelector::slotFileBridge( const QString& str) { + DocLnk lnk( str ); + emit fileSelected( lnk ); +} +void OFileSelector::slotViewChange( const QString& view ) { + OFileViewInterface* interface = m_views[view]; + if (!interface) + return; + + interface->activate( view ); + if (m_current) + m_stack->removeWidget( m_current->widget( m_stack ) ); + + static int id = 1; + + m_stack->addWidget( interface->widget(m_stack), id ); + m_stack->raiseWidget( id ); + + interface->reread(); + m_current = interface; + + id++; +} +void OFileSelector::setNewVisible( bool b ) { + m_shNew = b; + currentView()->reread(); +} +void OFileSelector::setCloseVisible( bool b ) { + m_shClose = b; + currentView()->reread(); +} +void OFileSelector::setNameVisible( bool b ) { + if ( b ) + m_nameBox->show(); + else + m_nameBox->hide(); +} diff --git a/libopie/ofileselector.h b/libopie/ofileselector.h index d06aa0a..bdb3e56 100644 --- a/libopie/ofileselector.h +++ b/libopie/ofileselector.h @@ -1,314 +1,150 @@ /* This is based on code and ideas of L. J. Potter ljp@llornkcor.com Thanks a lot =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> + .=l. Copyright (c) 2002,2003 Holger Freyther <zecke@handhelds.org> .>+-= _;:, .> :=|. This library is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. This library is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef opiefileselector_h -#define opiefileselector_h +#ifndef OPIE_OFILESELECTOR_FOO_H +#define OPIE_OFILESELECTOR_FOO_H + +#include <qlist.h> #include <qwidget.h> -#include <qstring.h> -#include <qpixmap.h> -#include <qstringlist.h> #include <qmap.h> #include <qvaluelist.h> +#include <qstringlist.h> #include <qpe/applnk.h> -#include <qlistview.h> +typedef QMap<QString, QStringList> MimeTypes; -class DocLnk; -class QCheckBox; -class QComboBox; -class QPushButton; -class FileSelector; -class QGridLayout; +class OFileViewInterface; +class OFileViewFileListView; class QLineEdit; -class QLabel; +class QComboBox; class QWidgetStack; -class QHBoxLayout; -class QVBoxLayout; -class QPopupMenu; -class QFileInfo; class QHBox; -// - -typedef QMap< QString, QStringList> MimeTypes; - -/** - * This is OPIEs FileDialog Widget. You can use it - * as a dropin replacement of the fileselector and - * or use any of the new features. - * This is also a complete FileSave and FileLoad widget - * If you look for a Dialog check OFileDialog - * - * NOTE THAT the API will change to be more extendable! - */ class OFileSelector : public QWidget { Q_OBJECT + friend class OFileViewInterface; + friend class OFileViewFileListView; public: - /** - * The mode of the file selector - * Either open, save, fileselector or dir browsing mode - * - */ - enum Mode {OPEN=1, SAVE=2, FILESELECTOR=4, DIR=8 }; - - /** - * Selector. Either NORMAL for the one shipped with - * libqpe or EXTENDED. for the EXTENDED - * EXTENDED_ALL also shows 'hidden' files - */ - enum Selector{NORMAL=0, EXTENDED = 1, EXTENDED_ALL =2 }; - - /** - * This is reserved for futrue views - */ - enum View { DIRS = 1, FILES = 2, TREE = 4, ICON = 8 }; + enum Mode { Open=1, Save=2, FileSelector=4, OPEN=1, SAVE=2, FILESELECTOR=4 }; +// enum OldMode { OPEN=1, SAVE=2, FILESELECTOR = 4 }; + enum Selector { Normal = 0, Extended=1, ExtendedAll =2, Default=3, NORMAL=0,EXTENDED=1, EXTENDED_ALL =2, DEFAULT=3 }; +// enum OldSelector { NORMAL = 0, EXTENDED =1, EXTENDED_ALL = 2}; - /** - * A c'tor which should be used for advanced mode - * @param wid the parent - * @param mode the Mode of the Selector - * @param selector the current View of the Selector - * @param dirName in which dir to start - * @param fileName a proposed filename - * @param mimetypes A list of mimetypes \ - * QString is for a identifier name like "Text files" - * the coresponding QStringList is used for the mimetypes - * if empty it'll fill the list of mimetypes depending - * on the content of the current directory - */ - - OFileSelector(QWidget *wid, int mode, int selector, + OFileSelector(QWidget* parent, int mode, int selector, const QString &dirName, - const QString &fileName = QString::null, - const MimeTypes &mimetypes = MimeTypes() ); + const QString& fileName, + const MimeTypes& mimetypes = MimeTypes(), + bool newVisible = FALSE, bool closeVisible = FALSE ); - - /** - * This is a QPE compatible c'tor - */ OFileSelector(const QString &mimeFilter, QWidget *parent, - const char *name, bool newVisible = TRUE, - bool closeVisible = FALSE ); - + const char* name = 0, bool newVisible = TRUE, bool closeVisible = FALSE ); ~OFileSelector(); - // currently only for the FILESELECTOR Mode - /** - */ - void setNewVisible( bool /*b*/ ); - void setCloseVisible(bool /*b*/ ); - - // end file selector mode - // deprecated - void reread(); - // make sure not to leak please const DocLnk *selected(); - // end deprecated - - bool isToolbarVisible() const { return m_shTool; }; - bool isPermissionBarVisible() const { return m_shPerm; }; - bool isLineEditVisible()const { return m_shLne; }; - bool isChooserVisible( )const { return m_shChooser; }; - bool isYesCancelVisible()const { return m_shYesNo; }; - void setYesCancelVisible( bool show ); - void setToolbarVisible( bool show ); - void setPermissionBarVisible( bool show ); - void setLineEditVisible(bool show) ; - void setChooserVisible( bool chooser ); - - QCheckBox* permissionCheckbox(); - bool setPermission() const; - void setPermissionChecked( bool check ); - - void setMode( int ); - - bool showDirs()const { return m_dir; } - void setShowDirs(bool ); - - const QListView* listView() { return m_View; }; - - bool isCaseSensetive()const { return m_case; } - void setCaseSensetive(bool caSe ); - - bool showFiles()const { return m_files; }; - void setShowFiles(bool ); - bool cd(const QString &path ); - - - int mode()const { return m_mode; }; - int selector()const { return m_selector; }; - void setSelector( int ); - - bool showPopup()const { return m_showPopup; }; - void setShowPopup( bool pop ) { m_showPopup = pop; }; - void setPopupMenu( QPopupMenu * ); - - // void updateLay(); - - void reparse(); // re reads the dir QString selectedName( )const; - QStringList selectedNames()const; - QString selectedPath() const; - QStringList selectedPaths() const; - QString directory()const; - int fileCount() const; - /* the user needs to delete it */ DocLnk selectedDocument()const; - /* the user needs to delete it */ - QValueList<DocLnk> selectedDocuments()const; + + int fileCount()const; + void reread(); + + int mode()const; + int selector()const; + + + void setNewVisible( bool b ); + void setCloseVisible( bool b ); + void setNameVisible( bool b ); signals: + void dirSelected( const QString& ); void fileSelected( const DocLnk & ); void fileSelected( const QString & ); - void dirSelected(const QString &dir ); + void newSelected( const DocLnk& ); void closeMe(); void ok(); void cancel(); - void contextMenu(); - - private slots: - void slotTest() { qWarning("slotTest" ); setLineEditVisible(false ); }; - void slotOk(); - void slotCancel(); - void slotViewCheck(const QString & ); - void slotMimeCheck(const QString & ); - void slotLocationActivated(const QString & ); - void slotInsertLocationPath(const QString &, int); - void locationComboChanged(); +/* used by the ViewInterface */ private: - void init(); - void updateMimes(); - - protected: + bool showNew()const; + bool showClose()const; + MimeTypes mimeTypes()const; + QStringList currentMimeType()const; private: - int m_mode, m_selector; - QComboBox *m_location, *m_mimeCheck, *m_viewCheck; - QPushButton *m_homeButton, *m_docButton, *m_hideButton, *m_ok, *m_cancel; - QPushButton *m_reread, *m_up, *m_new, *m_close; - QListView *m_View; - QCheckBox *m_checkPerm; - QWidget *m_pseudo; - QVBoxLayout *m_pseudoLayout; - - QString m_currentDir; - QString m_name; -// QStringList m_mimetypes; - QMap<QString, QStringList> m_mimetypes; - - FileSelector *m_select; - QWidgetStack *m_stack; - QVBoxLayout *m_lay; - QGridLayout *m_Oselector; - - QHBox *m_boxToolbar; - QHBox *m_boxOk; // (no layout anymore) wait - QHBox *m_boxName; // (no Layout anymore) wait - QHBox *m_boxView; - - QPopupMenu *m_custom; + /* inits the Widgets */ + void initUI(); + /* inits the MimeType ComboBox content + connects signals and slots */ + void initMime(); + /* init the Views :) */ + void initViews(); - QLineEdit *m_edit; - QLabel *m_fnLabel; +private: + QLineEdit* m_lneEdit; // the LineEdit for the Name + QComboBox *m_cmbView, *m_cmbMime; // two ComboBoxes to select the View and MimeType + QWidgetStack* m_stack; // our widget stack which will contain the views + OFileViewInterface* currentView()const; // returns the currentView + OFileViewInterface* m_current; // here is the view saved + bool m_shNew : 1; // should we show New? + bool m_shClose : 1; // should we show Close? + MimeTypes m_mimeType; // list of mimetypes + + QMap<QString, OFileViewInterface*> m_views; // QString translated view name + ViewInterface Ptr + QHBox* m_nameBox; // the LineEdit + Label is hold here + QHBox* m_cmbBox; // this holds the two combo boxes + + QString m_startDir; + int m_mode; + int m_selector; + + struct Data; // used for future versions + Data *d; - bool m_shClose : 1; - bool m_shNew : 1; - bool m_shTool : 1; - bool m_shPerm : 1; - bool m_shLne : 1; - bool m_shChooser : 1; - bool m_shYesNo : 1; - bool m_boCheckPerm : 1; - bool m_autoMime : 1; - bool m_case : 1; - bool m_dir : 1; - bool m_files : 1; - bool m_showPopup : 1; +private slots: + void slotMimeTypeChanged(); - void initVars(); - virtual void addFile(const QString &mime, QFileInfo *info, bool symlink = FALSE ); - virtual void addDir( const QString &mime, QFileInfo *info , bool symlink = FALSE ); - virtual void addSymlink(const QString &, QFileInfo *, bool = FALSE ){}; - void delItems(); - void initializeName(); - void initializeYes(); - void initializeChooser(); - void initializeListView(); - void initializePerm(); - void initPics(); - bool compliesMime(const QString &path, - const QString &mime); - bool compliesMime(const QString& mime ); - /** - * Updates the QComboBox with the current mimetypes - */ - void updateMimeCheck(); + /* will set the text of the lineedit and emit a fileChanged signal */ + void slotDocLnkBridge( const DocLnk& ); + void slotFileBridge( const QString& ); + void slotViewChange( const QString& ); - /** - * Returns the current mimetype - */ - QString currentMimeType()const; - class OFileSelectorPrivate; - OFileSelectorPrivate *d; - static QMap<QString,QPixmap> *m_pixmaps; + bool eventFilter (QObject *o, QEvent *e); -private slots: - void slotFileSelected(const QString & ); // not really meant to be a slot - void slotFileBridgeSelected( const DocLnk & ); - virtual void slotSelectionChanged(); - virtual void slotCurrentChanged(QListViewItem* ); - virtual void slotClicked( int, QListViewItem *item, const QPoint &, int); - virtual void slotRightButton(int, QListViewItem *, const QPoint &, int ); - virtual void slotContextMenu( QListViewItem *item); - // listview above - // popup below - virtual void slotChangedDir(); - virtual void slotOpen(); - virtual void slotRescan(); - virtual void slotRename(); - virtual void slotDelete(); - virtual void cdUP(); - virtual void slotHome(); - virtual void slotDoc(); - virtual void slotNavigate( ); }; - #endif - diff --git a/libopie/ofileselector_p.h b/libopie/ofileselector_p.h new file mode 100644 index 0000000..7fd0c50 --- a/dev/null +++ b/libopie/ofileselector_p.h @@ -0,0 +1,151 @@ +#ifndef OPIE_OFILE_SELECTOR_PRIVATE_H +#define OPIE_OFILE_SELECTOR_PRIVATE_H + +#include <qmap.h> +#include <qstringlist.h> +#include <qwidget.h> +#include <qlistview.h> + +#include <qpe/applnk.h> +#include <qpe/fileselector.h> + + +/* + * How to avoid having really two different objects + * for Extended and ExtendedAll + * The only difference is the Lister... + * a) static object? + * b) leave some object inside the OFileSelector which can be used? + * c) when switching views tell which view we want o have.. internally we can switch then + * + * I'll take c) -zecke + */ + + +/* the View Interface */ +class OFileSelector; +typedef QMap<QString, QStringList> MimeTypes; +class QFileInfo; +class QToolButton; +class OFileViewInterface { +public: + OFileViewInterface( OFileSelector* selector ); + virtual ~OFileViewInterface(); + virtual QString selectedName()const = 0; + virtual QString selectedPath()const = 0; + virtual QString directory()const = 0; + virtual void reread() = 0; + virtual int fileCount()const = 0; + virtual DocLnk selectedDocument()const; + virtual QWidget* widget( QWidget* parent) = 0; + virtual void activate( const QString& ); + QString name()const; +protected: + OFileSelector* selector()const; + void setName( const QString& ); + bool showNew()const; + bool showClose()const; + MimeTypes mimeTypes()const; + QStringList currentMimeType()const; + QString startDirectory()const; +protected: + void ok(); + void cancel(); + void closeMe(); + void fileSelected( const QString& ); + void fileSelected( const DocLnk& ); + void setCurrentFileName( const QString& ); + QString currentFileName()const; + +private: + QString m_name; + OFileSelector* m_selector; +}; + + +/* THE Document View hosting a FileSelector*/ +class ODocumentFileView : public OFileViewInterface { +public: + ODocumentFileView( OFileSelector* selector ); + ~ODocumentFileView(); + + QString selectedName() const; + QString selectedPath() const; + + QString directory() const; + void reread(); + int fileCount()const; + DocLnk selectedDocument()const; + + QWidget* widget( QWidget* parent ); + +private: + mutable FileSelector* m_selector; + +}; + +class OFileSelectorItem : public QListViewItem { +public: + OFileSelectorItem( QListView* view, const QPixmap& pixmap, + const QString& path, const QString& date, + const QString& size, const QString& mDir, + bool isLocked = false, bool isDir = false ); + ~OFileSelectorItem(); + bool isLocked()const; + bool isDir()const; + QString directory()const; + QString path()const; + QString key(int id, bool )const; + +private: + bool m_locked : 1; + bool m_isDir : 1; + QString m_dir; +}; + +class OFileViewFileListView : public QWidget { + Q_OBJECT +public: + OFileViewFileListView( QWidget* parent, const QString& dir, OFileSelector* selector ); + ~OFileViewFileListView(); + + OFileSelectorItem* currentItem()const; + void reread( bool all = false ); + int fileCount()const; + QString currentDir()const; +protected: + bool eventFilter (QObject *o, QEvent *e); +private slots: + void slotNew(); // will emit newSelected + void cdUP(); + void cdHome(); + void cdDoc(); + void changeDir( const QString& ); + void slotCurrentChanged( QListViewItem* ); + void slotClicked(int, QListViewItem*, const QPoint&, int ); + void slotFSActivated(int); + +protected: + + OFileSelector* selector(); + +private: + QMap<QString, QString> m_dev; + bool m_all : 1; + OFileSelector* m_sel; + QPopupMenu* m_fsPop; + bool compliesMime( const QString& ); + QStringList m_mimes; // used in compy mime + QString m_currentDir; + QToolButton *m_btnNew, *m_btnClose; + void connectSlots(); + void addFile( QFileInfo* info, bool symlink = FALSE ); + void addDir ( QFileInfo* info, bool symlink = FALSE ); + void addSymlink( QFileInfo* info, bool = FALSE ); + + +private: + QListView* m_view; +}; + +#endif diff --git a/libopie/orecurrancewidget.cpp b/libopie/orecurrancewidget.cpp index 471249d..be8ec30 100644 --- a/libopie/orecurrancewidget.cpp +++ b/libopie/orecurrancewidget.cpp @@ -1,119 +1,140 @@ #include <qapplication.h> #include <qlabel.h> #include <qpopupmenu.h> #include <qspinbox.h> #include <qpe/timestring.h> #include "orecurrancewidget.h" // Global Templates for use in setting up the repeat label... -const QString strDayTemplate = QObject::tr("Every"); -const QString strYearTemplate = QObject::tr("%1 %2 every "); -const QString strMonthDateTemplate = QObject::tr("The %1 every "); -const QString strMonthDayTemplate = QObject::tr("The %1 %1 of every"); -const QString strWeekTemplate = QObject::tr("Every "); -const QString dayLabel[] = { QObject::tr("Monday"), - QObject::tr("Tuesday"), - QObject::tr("Wednesday"), - QObject::tr("Thursday"), - QObject::tr("Friday"), - QObject::tr("Saturday"), - QObject::tr("Sunday") }; +// the problem is these strings get initialized before QPEApplication can install the translator -zecke +namespace { +QString strDayTemplate; +QString strYearTemplate; +QString strMonthDateTemplate; +QString strMonthDayTemplate; +QString strWeekTemplate; +QString dayLabel[7]; +} +/* + * static linkage to not polute the symbol table... + * The problem is that const and static linkage are resolved prior to installing a translator + * leading to that the above strings are translted but to the original we delay the init of these strings... + * -zecke + */ +static void fillStrings() { + strDayTemplate = QObject::tr("Every"); + strYearTemplate = QObject::tr("%1 %2 every "); + strMonthDateTemplate = QObject::tr("The %1 every "); + strMonthDayTemplate = QObject::tr("The %1 %2 of every"); + strWeekTemplate = QObject::tr("Every "); + dayLabel[0] = QObject::tr("Monday"); + dayLabel[1] = QObject::tr("Tuesday"); + dayLabel[2] = QObject::tr("Wednesday"); + dayLabel[3] = QObject::tr("Thursday"); + dayLabel[4] = QObject::tr("Friday"); + dayLabel[5] = QObject::tr("Saturday"); + dayLabel[6] = QObject::tr("Sunday"); +} static QString numberPlacing( int x ); // return the proper word format for // x (1st, 2nd, etc) static int week( const QDate &dt ); // what week in the month is dt? /** * Constructs the Widget * @param startOnMonday Does the week start on monday * @param newStart The start date of the recurrence * @param parent The parent widget * @param name the name of object * @param modal if the dialog should be modal * @param fl Additional window flags */ ORecurranceWidget::ORecurranceWidget( bool startOnMonday, const QDate& newStart, QWidget* parent, const char* name, bool modal, WFlags fl ) : ORecurranceBase( parent, name, modal, fl ), start( newStart ), currInterval( None ), startWeekOnMonday( startOnMonday ) { + if (strDayTemplate.isEmpty() ) + fillStrings(); + init(); fraType->setButton( currInterval ); chkNoEnd->setChecked( TRUE ); setupNone(); } /** * Different constructor * @param startOnMonday Does the week start on monday? * @param rp Already set ORecur object * @param startDate The start date * @param parent The parent widget * @param name The name of the object * @param modal * @param fl The flags for window */ ORecurranceWidget::ORecurranceWidget( bool startOnMonday, const ORecur& rp, const QDate& startDate, QWidget* parent, const char* name, bool modal, WFlags fl) : ORecurranceBase( parent, name, modal, fl ), start( startDate ), end( rp.endDate() ), startWeekOnMonday( startOnMonday ) { + if (strDayTemplate.isEmpty() ) + fillStrings(); // do some stuff with the repeat pattern init(); setRecurrence( rp ); } ORecurranceWidget::~ORecurranceWidget() { } /** * set the start date * @param date the new start date */ void ORecurranceWidget::setStartDate( const QDate& date ) { - qWarning("ORecurranceWidget::setStartDate"); setRecurrence( recurrence(), date ); } /** * set the recurrence * @param rp The ORecur object with the new recurrence rules */ void ORecurranceWidget::setRecurrence( const ORecur& rp ) { setRecurrence( rp, start ); } /** * overloaded method taking ORecur and a new start date * @param rp Recurrence rule * @param date The new start date */ void ORecurranceWidget::setRecurrence( const ORecur& rp, const QDate& date ) { start = date; end = rp.endDate(); switch ( rp.type() ) { default: case ORecur::NoRepeat: currInterval = None; setupNone(); break; case ORecur::Daily: currInterval = Day; setupDaily(); break; case ORecur::Weekly: currInterval = Week; setupWeekly(); int day, buttons; @@ -338,65 +359,66 @@ void ORecurranceWidget::slotWeekLabel() { else { if ( i == 0 ) list.append( dayLabel[6] ); else list.append( dayLabel[i - 1] ); } } } QStringList::Iterator itStr; for ( i = 0, itStr = list.begin(); itStr != list.end(); ++itStr, i++ ) { if ( i == 3 ) bNeedCarriage = TRUE; else bNeedCarriage = FALSE; if ( str.isNull() ) str = *itStr; else if ( i == list.count() - 1 ) { if ( i < 2 ) str += tr(" and ") + *itStr; else { if ( bNeedCarriage ) str += tr( ",\nand " ) + *itStr; else str += tr( ", and " ) + *itStr; } } else { if ( bNeedCarriage ) str += ",\n" + *itStr; else str += ", " + *itStr; } } - str = str.prepend( "on " ); + str = str.prepend( tr("on ") ); + lblWeekVar->setText( str ); } void ORecurranceWidget::slotMonthLabel(int type) { QString str; if ( currInterval != Month || type > 1 ) return; if ( type == 1 ) str = strMonthDateTemplate.arg( numberPlacing(start.day()) ); else str = strMonthDayTemplate.arg( numberPlacing(week(start))) .arg( dayLabel[start.dayOfWeek() - 1] ); lblRepeat->setText( str ); } void ORecurranceWidget::slotChangeStartOfWeek( bool onMonday ) { startWeekOnMonday = onMonday; // we need to make this unintrusive as possible... int saveSpin = spinFreq->value(); char days = 0; int day; QListIterator<QToolButton> itExtra( listExtra ); for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) { if ( (*itExtra)->isOn() ) { if ( !startWeekOnMonday ) days |= day; else { if ( day == 1 ) days |= ORecur::SUN; else days |= day >> 1; } } } diff --git a/libopie/oticker.h b/libopie/oticker.h index 0b88919..4026eb5 100644 --- a/libopie/oticker.h +++ b/libopie/oticker.h @@ -44,72 +44,72 @@ /** * @class OTicker * @brief The OTicker class provides a QLabel widget that scroll its contents * */ class OTicker : public QLabel { Q_OBJECT public: /*! * @fn OTicker( QWidget* parent = 0 ) * @brief Object constructor. * * @param parent Pointer to parent of this control. * Constructs a new OTicker control with parent */ OTicker( QWidget* parent=0 ); /*! * @fn ~OTicker() * @brief Object destructor. */ ~OTicker(); /*! * @fn setText(const QString& ) * @brief sets text to be displayed * @param text QString text to be displayed. * */ void setText( const QString& text ) ; /*! - * @fn setBackgroundColor(QColor color) + * @fn setBackgroundColor(const QColor& color) * @brief sets color of the ticker's background * @param color QColor color to be set. * */ void setBackgroundColor(const QColor& color); /*! - * @fn setForegroundColor(QColor color) + * @fn setForegroundColor(const QColor& color) * @brief sets color of text * @param color QColor color of text * */ void setForegroundColor(const QColor& color); /*! * @fn setFrame(int style) * @brief sets frame style * @param style int Frame style to be see. See Qt::WidgetFlags. * */ void setFrame(int style); /*! * @fn setUpdateTime(int timeout) * @brief sets time of update * @param timeout int time in milliseconds between updates. * */ void setUpdateTime(int timeout); /*! * @fn setScrollLength(int length) * @brief sets amount of scrolling default is 1 * @param length int scroll length. * */ void setScrollLength(int length); signals: /*! * @fn mousePressed() * @brief signal mouse press event * */ diff --git a/libopie/todayplugininterface.h b/libopie/todayplugininterface.h index 532f492..5dfeaa8 100644 --- a/libopie/todayplugininterface.h +++ b/libopie/todayplugininterface.h @@ -1,32 +1,62 @@ +/* + This file is part of the Opie Project + Copyright (c) 2002 Maximilian Reiss <max.reiss@gmx.de> + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + #ifndef TODAY_PLUGIN_INTERFACE #define TODAY_PLUGIN_INTERFACE #include <qpe/qcom.h> #include "todayconfigwidget.h" class QString; class QWidget; #ifndef IID_TodayPluginInterface #define IID_TodayPluginInterface QUuid( 0x70481804, 0x2b50, 0x4fba, 0x80, 0xbb, 0x0b, 0xf8, 0xdc, 0x72, 0x04, 0x14) #endif /** * * A TodayPluginObject is the base for all Today Plugins. * A plugin author needs to inherit this class and implement * the pure virtual methods * * @short base class for today plugins * @author Maximilian Reiss * */ class TodayPluginObject { public: virtual ~TodayPluginObject() {}; /** * The name if the plugin @@ -51,59 +81,53 @@ public: * It _needs_ a parent here. * Plugin authors need to take parent as parent! */ virtual QWidget* widget( QWidget *parent ) = 0; /** * Pixmap used in the config widget */ virtual QString pixmapNameConfig() const = 0; /** * Config plugin widget - optional * If the plugin has a config widget, it _needs_ a parent here. * may return 0 if no config widget is needed */ virtual TodayConfigWidget* configWidget( QWidget * ) = 0; /** * The application that should be assigned to the button (pixmap) * Today will show the plugin icon. On click it tries to execute the * plugin related application. */ virtual QString appName() const = 0; /** * If the plugin should take part in the periodic refresh */ virtual bool excludeFromRefresh() const = 0; /** * Refresh that plugins view. For updating the plugins - * */ virtual void refresh() {}; /** - * minimum height the plugin at least should have + * reread the plugins config and act apropiate + * This is for example used when returning from the config dialog */ - // virtual int minHeight() const = 0; - - /** - * maximum height that should be used before starting scrolling - */ - // virtual int maxHeight() const = 0; - + virtual void reinitialize() {}; }; /** * This is part of the QCOM works. See example plugins how to do it right */ struct TodayPluginInterface : public QUnknownInterface { /** * return the TodayPluginObject implementation */ virtual TodayPluginObject *guiPart() = 0; }; #endif |