-rw-r--r-- | libopie/ofileselector.cc | 168 | ||||
-rw-r--r-- | libopie/ofileselector.h | 100 |
2 files changed, 220 insertions, 48 deletions
diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc index b911d37..61ab2c4 100644 --- a/libopie/ofileselector.cc +++ b/libopie/ofileselector.cc @@ -35,21 +35,24 @@ #include <qwidgetstack.h> #include <qlineedit.h> #include <qcheckbox.h> #include <qlabel.h> #include <qheader.h> #include <qdir.h> +#include <qpainter.h> #include <qpe/qpeapplication.h> #include <qpe/fileselector.h> #include <qpe/applnk.h> #include <qpe/global.h> #include <qpe/mimetype.h> +#include <qpe/resource.h> #include "ofileselector.h" +QMap<QString,QPixmap> *OFileSelector::m_pixmaps = 0; OFileSelector::OFileSelector(QWidget *wid, int mode, int selector, const QString &dirName, const QString &fileName, const QStringList mimetypes ) : QWidget( wid ) { m_selector = selector; m_currentDir = dirName; @@ -86,17 +89,33 @@ OFileSelector::OFileSelector(QWidget *wid, int mode, int selector, const QString m_fnLabel = 0; m_checkPerm = 0; m_mimeCheck = 0; m_viewCheck = 0; + m_dir = true; + m_files = true; + + if(m_pixmaps == 0 ) // init the pixmaps + initPics(); + m_lay = new QVBoxLayout(this); init(); m_edit->setText( fileName ); } +void OFileSelector::initPics() +{ + m_pixmaps = new QMap<QString,QPixmap>; + QPixmap pm = Resource::loadPixmap( "folder " ); + QPixmap lnk = Resource::loadPixmap( "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 ); +}; // let's initialize the gui /** -------------------- | cmbBox Button | -------------------- | FileSlector | @@ -146,13 +165,13 @@ void OFileSelector::init() if(m_shYesNo ) initializeYes(); }; -void OFileSelector::setShowYesCancel( bool show ) +void OFileSelector::setYesCancelVisible( bool show ) { if ( show == m_shYesNo ) return; m_shYesNo = show; if( !show ){ delete m_ok; @@ -161,33 +180,33 @@ void OFileSelector::setShowYesCancel( bool show ) m_cancel = 0; // delete m_boxOk; all ready deleted in delItems } updateLay(); // recreate it and save the other states } -void OFileSelector::setShowToolbar( bool show ) +void OFileSelector::setToolbarVisible( bool show ) { if ( m_shTool == show ) return; /* if( show ){ }else { }*/ } -void OFileSelector::setShowPermissionBar( bool show ) +void OFileSelector::setPermissionBarVisible( bool show ) { if( show == m_shPerm ) return; m_shPerm = show; updateLay(); } -void OFileSelector::setShowLineEdit( bool show ) +void OFileSelector::setLineEditVisible( bool show ) { if( show == m_shLne ) return; m_shLne = show; if( !show ){ @@ -196,13 +215,13 @@ void OFileSelector::setShowLineEdit( bool show ) m_edit = 0; m_fnLabel = 0; //delete m_boxName; will be deleted } updateLay(); } -void OFileSelector::setShowChooser( bool show ) +void OFileSelector::setChooserVisible( bool show ) { if( show = m_shChooser ) return; m_shChooser = show; if( !show ){ delete m_mimeCheck; @@ -213,12 +232,26 @@ void OFileSelector::setShowChooser( bool show ) updateLay(); } QCheckBox* OFileSelector::permissionCheckbox( ) { return m_checkPerm; } +void OFileSelector::setCaseSensetive( bool caSe ) +{ + m_case = caSe; + reparse(); +} +void OFileSelector::setShowFiles(bool files ){ + m_files = files; + reparse(); +} +void OFileSelector::setPopupMenu(const QPopupMenu * ) +{ + //delete oldpopup; + +} bool OFileSelector::setPermission( ) const { if( m_checkPerm == 0 ) return false; else return m_checkPerm->isChecked(); @@ -226,20 +259,35 @@ bool OFileSelector::setPermission( ) const void OFileSelector::setPermissionChecked( bool check ) { if( m_checkPerm == 0 ) return; m_checkPerm->setChecked( check ); } -QString OFileSelector::selectedName( ) +QString OFileSelector::selectedName( )const { QString string; + if( m_selector == NORMAL ){ + const DocLnk *lnk = m_select->selected(); + string = lnk->file(); + }else if(m_selector == EXTENDED || m_selector == EXTENDED_ALL ) { + QListViewItem *item = m_View->currentItem(); + if(item != 0 ){ + string = item->text( 1 ); + } + } return string; } -const DocLnk* OFileSelector::selectedDocument( )const +QStringList OFileSelector::selectedNames()const { - return 0; + QStringList list; + +} +DocLnk OFileSelector::selectedDocument( )const +{ + DocLnk lnk; + return lnk; } void OFileSelector::updateLay() { /* if( m_shTool ) // else @@ -283,21 +331,22 @@ bool OFileSelector::compliesMime(const QString &path, const QString &mime ) return true; return false; } void OFileSelector::reparse() { - if(m_View== 0) + if(m_View== 0 || m_selector == NORMAL) return; m_View->clear(); - QDir dir( m_currentDir ); + QString currMime =m_mimeCheck->currentText(); // update the mimetype now if( m_autoMime ) { + QDir dir( m_currentDir ); m_mimetypes.clear(); m_mimeCheck->clear(); dir.setFilter( QDir::Files | QDir::Readable ); dir.setSorting(QDir::Size ); const QFileInfoList *list = dir.entryInfoList(); QFileInfoListIterator it( *list ); @@ -310,51 +359,66 @@ void OFileSelector::reparse() MimeType type(fi->filePath() ); if( !m_mimetypes.contains( type.id() ) ) m_mimetypes.append( type.id() ); ++it; } + m_mimetypes.prepend("All" ); m_mimeCheck->insertStringList(m_mimetypes ); // set it to the current mimetype }; - dir.setFilter(QDir::All ); - dir.setSorting(QDir::Name | QDir::DirsFirst ); + QDir dir( m_currentDir ); + //dir.setFilter(-1 ); + dir.setSorting(QDir::Name | QDir::DirsFirst | QDir::Reversed | QDir::IgnoreCase ); const QFileInfoList *list = dir.entryInfoList(); QFileInfoListIterator it( *list ); QFileInfo *fi; while( (fi=it.current()) ){ + if(fi->fileName() == ".." || fi->fileName() == "." ){ + ++it; + continue; + } + qWarning("Test: %s", fi->fileName().latin1() ); if(fi->isSymLink() ){ + qWarning("Symlink %s", fi->fileName().latin1() ); QString file = fi->readLink(); + qWarning("File ->%s", file.latin1() ); for(int i=0; i<=4; i++ ){ // prepend from dos - QFileInfo info( file ); + QFileInfo info( fi->dirPath()+ "/"+file ); if( !info.exists() ){ - addSymlink(m_currentDir, info.fileName(), TRUE ); + qWarning("does not exist" ); + addSymlink(currMime, fi, TRUE ); break; }else if( info.isDir() ){ - //addDir( ); + qWarning("isDir" ); + addDir(currMime, fi, TRUE ); + break; }else if( info.isFile() ){ - + qWarning("isFile" ); + addFile(currMime, fi, TRUE ); + break; }else if( info.isSymLink() ){ file = info.readLink(); + qWarning("isSymlink again %s", file.latin1() ); }else if( i == 4 ){ // just insert it and have the symlink symbol - addSymlink(m_currentDir, info.fileName() ); + addSymlink(currMime, fi ); + qWarning("level too deep" ); } } }else if( fi->isDir() ){ - + addDir(currMime, fi ); }else if( fi->isFile() ) { // file ? - - + addFile(currMime, fi ); } ++it; } + m_View->sort(); } -QString OFileSelector::directory() +QString OFileSelector::directory()const { - QString string; - return string; + return m_currentDir; } int OFileSelector::fileCount() { return 0; } void OFileSelector::slotOk( ) @@ -445,14 +509,18 @@ void OFileSelector::slotViewCheck(const QString &view ){ delete m_View; m_View = 0; delete m_select; m_select = new FileSelector( currMime == "All" ? QString::null : currMime, m_stack,"fileselector", FALSE, FALSE ); m_stack->addWidget( m_select, NORMAL ); - m_stack->raiseWidget( NORMAL ); + m_mimeCheck->clear(); m_selector = NORMAL; + updateMimes(); + m_mimeCheck->insertStringList( m_mimetypes ); + m_stack->raiseWidget( NORMAL ); + }else if(view == QString::fromLatin1("Files") ){ // remove from the stack delete m_select; m_select = 0; delete m_View; @@ -507,15 +575,63 @@ void OFileSelector::initializeListView() m_View->addColumn(tr("Name") ); m_View->addColumn(tr("Size") ); m_View->addColumn(tr("Date"), 60 ); m_View->addColumn(tr("Mime Type") ); QHeader *header = m_View->header(); header->hide(); + m_View->setSorting(1 ); }; +void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink ){ + qWarning("Add Files" ); + if( !m_files ){ + qWarning("not mfiles" ); + return; + } + MimeType type( info->filePath() ); + if(mime == "All" ){ + ; + }else if( type.id() != mime ) { + return; + } + QPixmap pix = type.pixmap(); + if(pix.isNull() ) + pix = Resource::loadPixmap( "UnknownDocument-14" ); + if( symlink ) // have a blended pic sometime + new OFileSelectorItem( m_View, pix, info->fileName(), + info->lastModified().toString(), + QString::number(info->size() ), + info->dirPath(true) ); + else + new OFileSelectorItem( m_View, pix, info->fileName(), + info->lastModified().toString(), + QString::number(info->size() ), + info->dirPath(true) ); +} +void OFileSelector::addDir(const QString &mime, QFileInfo *info, bool symlink ) +{ + if(!m_dir ) + return; + //if( showDirs ) + { + if( symlink){ + QPixmap map = (*m_pixmaps)["dirsymlink" ]; + qWarning("Symlink" ); + new OFileSelectorItem(m_View, map, + info->fileName(), info->lastModified().toString() , + QString::number(info->size() ),info->dirPath(true), true ); + }else + new OFileSelectorItem(m_View, Resource::loadPixmap("folder" ), + info->fileName(), info->lastModified().toString(), + QString::number(info->size() ),info->dirPath(true), true ); - - + } +} +void OFileSelector::setShowDirs(bool dir ) +{ + m_dir = dir; + reparse(); +} diff --git a/libopie/ofileselector.h b/libopie/ofileselector.h index a90219f..73674e2 100644 --- a/libopie/ofileselector.h +++ b/libopie/ofileselector.h @@ -35,13 +35,16 @@ #define opiefileselector_h #include <qwidget.h> #include <qstring.h> #include <qpixmap.h> #include <qstringlist.h> +#include <qmap.h> +#include <qvaluelist.h> +#include <qpe/applnk.h> #include <qlistview.h> /** 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 @@ -56,72 +59,121 @@ class QGridLayout; class QLineEdit; class QLabel; class QWidgetStack; class QHBoxLayout; class QVBoxLayout; class QPopupMenu; - - +class QFileInfo; +// class OFileSelectorItem : public QListViewItem { public: OFileSelectorItem(QListView *view, const QPixmap &pixmap, const QString &path, - const QString &date, const QString &size, + const QString &date, const QString &size, const QString &mDir, 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; } + 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 dir:1; + QString m_dir; }; class OFileSelector : public QWidget { Q_OBJECT public: enum Mode {OPEN=1, SAVE, FILESELECTOR }; enum Selector{NORMAL=1, EXTENDED = 2, EXTENDED_ALL =4 }; enum View { DIRS = 1, FILES = 2, TREE = 4, ICON = 8 }; OFileSelector(QWidget *wid, int mode, int selector, const QString &dirName, const QString &fileName = QString::null, const QStringList mimetypes = QStringList() ); - bool showToolbar() const { return m_shTool; }; - bool showPermissionBar() const { return m_shPerm; }; - bool showLineEdit()const { return m_shLne; }; - bool showChooser( )const { return m_shChooser; }; - bool showYesCancel()const { return m_shYesNo; }; - void setShowYesCancel( bool show ); - void setShowToolbar( bool show ); - void setShowPermissionBar( bool show ); - void setShowLineEdit(bool show) ; - void setShowChooser( bool chooser ); + 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 ); - void setShowDirs(bool dir ) { }; - bool showDirs() {bool turn; return turn; } + + 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 ); + + + int mode()const { return m_mode; }; int selector()const { return m_selector; }; void setSelector( int ); - QString selectedName( ); + + void setPopupMenu( const QPopupMenu * ); - const DocLnk* selectedDocument()const; void updateLay(); void reparse(); // re reads the dir - QString directory(); + + QString selectedName( )const; + QStringList selectedNames()const; + + QString selectedPath() const; + QStringList selectedPaths() const; + + QString directory()const; int fileCount(); + /* the user needs to delete it */ + DocLnk selectedDocument()const; + /* the user needs to delete it */ + QValueList<DocLnk> selectedDocuments(); + signals: void fileSelected( const DocLnk & ); void fileSelected( const QString & ); void closeMe(); void ok(); void cancel(); @@ -161,28 +213,32 @@ class OFileSelector : public QWidget { 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; protected: private: // implementation todo - virtual void addFile(const QString &path, const QString &name, bool symlink = FALSE ) {}; - virtual void addDir( const QString &path, const QString &dir , bool symlink = FALSE ){}; - virtual void addSymlink(const QString &path, const QString &name, bool broken = FALSE ){}; + 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 &mime, QFileInfo *info, bool broken = FALSE ){}; void delItems(); void initializeName(); void initializeYes(); void initializeChooser(); void initializeListView(); + void initPics(); bool compliesMime(const QString &path, const QString &mime); class OFileSelectorPrivate; OFileSelectorPrivate *d; - + static QMap<QString,QPixmap> *m_pixmaps; }; #endif |