-rw-r--r-- | libopie/ofileselector.cc | 134 | ||||
-rw-r--r-- | libopie/ofileselector.h | 11 |
2 files changed, 111 insertions, 34 deletions
diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc index 61ab2c4..1807575 100644 --- a/libopie/ofileselector.cc +++ b/libopie/ofileselector.cc @@ -22,161 +22,193 @@ -- :-=` 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 <qnamespace.h> #include <qpushbutton.h> #include <qcombobox.h> #include <qhbox.h> #include <qvbox.h> #include <qlayout.h> #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; +namespace { + + int indexByString( const QComboBox *box, const QString &str ){ + int index= -1; + for(int i= 0; i < box->count(); i++ ){ + qWarning("str T%sT boxT%sT", str.latin1(), box->text(i).latin1() ); + if( str == box->text(i ) ){ + index= i; + break; + } + } + return index; + } + +}; + + 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; m_name = fileName; m_mimetypes = mimetypes; if( mimetypes.isEmpty() ) m_autoMime = true; m_mode = mode; m_shTool = true; m_shPerm = true; m_shLne = true; m_shChooser = true; m_shYesNo = true; // for FILESELECTOR only view is interesting m_location = 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_select = 0; m_stack = 0; m_select = 0; m_stack = 0; m_lay = 0; m_boxToolbar = 0; m_boxOk = 0; m_edit = 0; 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() { + qWarning("init pics" ); m_pixmaps = new QMap<QString,QPixmap>; - QPixmap pm = Resource::loadPixmap( "folder " ); + 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 ); + 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 ); + }; // let's initialize the gui /** -------------------- | cmbBox Button | -------------------- | FileSlector | | or | | OSelector | | | | | ____________________ | LineEdit | ____________________ | Permission Bar | ____________________ | ViewChoose | ____________________ | Save Cancel| ____________________ */ void OFileSelector::delItems() { QLayoutIterator it = m_lay->iterator(); while ( it.current() != 0 ){ it.deleteCurrent(); } } void OFileSelector::init() { m_stack = new QWidgetStack(this, "wstack" ); - m_select = new FileSelector(m_mimetypes.join(";"), m_stack, "fileselector", FALSE, FALSE ); - m_stack->addWidget(m_select, NORMAL ); - m_lay->addWidget(m_stack ); - m_stack->raiseWidget(NORMAL ); + if( m_selector == NORMAL ){ + QString currMime; + if( m_mimeCheck != 0 ) + currMime = m_mimeCheck->currentText(); + updateMimes(); + m_select = new FileSelector( currMime == "All" ? QString::null : currMime , m_stack, "fileselector", FALSE, FALSE ); + m_stack->addWidget(m_select, NORMAL ); + m_lay->addWidget(m_stack ); + m_stack->raiseWidget(NORMAL ); + }else { + initializeListView(); + } if(m_shLne ){ initializeName(); } if(m_shPerm ){ m_checkPerm = new QCheckBox(tr("Set Permission"), this, "Permission" ); m_checkPerm->setChecked( false ); m_lay->addWidget(m_checkPerm ); } if( m_shChooser ) initializeChooser(); if(m_shYesNo ) initializeYes(); }; void OFileSelector::setYesCancelVisible( bool show ) { if ( show == m_shYesNo ) return; m_shYesNo = show; if( !show ){ delete m_ok; delete m_cancel; m_ok = 0; m_cancel = 0; // delete m_boxOk; all ready deleted in delItems } @@ -250,65 +282,65 @@ void OFileSelector::setPopupMenu(const QPopupMenu * ) } bool OFileSelector::setPermission( ) const { if( m_checkPerm == 0 ) return false; else return m_checkPerm->isChecked(); } void OFileSelector::setPermissionChecked( bool check ) { if( m_checkPerm == 0 ) return; m_checkPerm->setChecked( check ); } 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; } QStringList OFileSelector::selectedNames()const { QStringList list; - + return list; } DocLnk OFileSelector::selectedDocument( )const { DocLnk lnk; return lnk; } void OFileSelector::updateLay() { /* if( m_shTool ) // else // hide */ // save the state bool check = false; if( m_checkPerm != 0 ) check = m_checkPerm->isChecked(); QString text; if( m_edit != 0 ) text = m_edit->text(); // save current mimetype delItems(); delete m_checkPerm; delete m_edit; delete m_fnLabel; delete m_ok; delete m_cancel; delete m_mimeCheck; delete m_viewCheck; delete m_select; // test @@ -336,97 +368,98 @@ void OFileSelector::reparse() { if(m_View== 0 || m_selector == NORMAL) return; m_View->clear(); 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 ); QFileInfo *fi; while( (fi=it.current()) ){ if(fi->extension() == QString::fromLatin1("desktop") ){ ++it; continue; } 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 + m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currMime ) ); }; 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(); + QString file = fi->dirPath(true)+"/"+ fi->readLink(); qWarning("File ->%s", file.latin1() ); for(int i=0; i<=4; i++ ){ // prepend from dos - QFileInfo info( fi->dirPath()+ "/"+file ); + QFileInfo info( file ); if( !info.exists() ){ qWarning("does not exist" ); addSymlink(currMime, fi, TRUE ); break; }else if( info.isDir() ){ 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(); + file = info.dirPath(true)+ "/"+ info.readLink(); qWarning("isSymlink again %s", file.latin1() ); }else if( i == 4 ){ // just insert it and have the symlink symbol 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()const { return m_currentDir; } int OFileSelector::fileCount() { return 0; } void OFileSelector::slotOk( ) { emit ok(); } void OFileSelector::slotCancel( ) { emit cancel(); } @@ -464,174 +497,213 @@ void OFileSelector::initializeChooser() m_mimeCheck = new QComboBox(this, "mime check"); m_viewCheck = new QComboBox(this, "view check"); m_boxView->addWidget(m_viewCheck, 0 ); m_boxView->insertSpacing(1, 8 ); m_boxView->addWidget(m_mimeCheck, 0 ); m_lay->addLayout(m_boxView ); m_viewCheck->insertItem(tr("Documents") ); m_viewCheck->insertItem(tr("Files") ); m_viewCheck->insertItem(tr("All Files") ); if(!m_autoMime ) m_mimeCheck->insertItem(m_mimetypes.join("," ) ); else{ // check updateMimes(); m_mimeCheck->insertStringList( m_mimetypes ); } 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::slotMimeCheck(const QString &view ){ if(m_selector == NORMAL ){ delete m_select; m_select = new FileSelector(view == "All" ? QString::null : view , m_stack, "fileselector", FALSE, FALSE ); m_stack->addWidget( m_select, NORMAL ); m_stack->raiseWidget( NORMAL ); }else{ - - + reparse(); } } void OFileSelector::slotViewCheck(const QString &view ){ qWarning("changed: show %s", view.latin1() ); // if the current view is the one QString currMime = m_mimeCheck->currentText(); if( view == QString::fromLatin1("Documents") ){ // get the mimetype now // check if we're the current widget and return if( m_View != 0) // delete 0 shouldn't crash but it did :( 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_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; m_View = 0; m_selector = EXTENDED; // create the ListView or IconView initializeListView(); reparse(); }else if(view == QString::fromLatin1("All Files") ) { // remove from the stack delete m_select; m_select = 0; delete m_View; m_View = 0; m_selector = EXTENDED_ALL; initializeListView(); reparse(); }; }; void OFileSelector::updateMimes() // lets check which mode is active // check the current dir for items then { m_mimetypes.clear(); m_mimetypes.append("All" ); 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.append( (*dit)->type() ); } }else{ // should be allreday updatet - + ; } }; void OFileSelector::initializeListView() { m_View = new QListView(m_stack, "Extended view" ); m_stack->addWidget( m_View, EXTENDED ); m_stack->raiseWidget( EXTENDED ); QPEApplication::setStylusOperation( m_View->viewport(),QPEApplication::RightOnHold); // set up the stuff // Pixmap Name Date Size mime //(m_View->header() )->hide(); //m_View->setRootIsDecorated(false); m_View->addColumn(" "); 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 ); }; +/* If a item is locked depends on the mode + if we're in OPEN !isReadable is locked + if we're in SAVE !isWriteable is locked + + + */ + void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink ){ qWarning("Add Files" ); if( !m_files ){ qWarning("not mfiles" ); return; } MimeType type( info->filePath() ); + QString name; + QString dir; + bool locked= false; 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) ); + dir = info->dirPath( true ); + if( symlink ) { // check if the readLink is readable + // do it right later + name = info->fileName() + " -> " + info->dirPath() + "/" + info->readLink(); + }else{ // keep track of the icons + name = info->fileName(); + if( m_mode == OPEN ){ + if( !info->isReadable() ){ + locked = true; + pix = Resource::loadPixmap("locked" ); + } + }else if( m_mode == SAVE ){ + if( !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( showDirs ) { + bool locked; + 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{ + if( symlink ){ + pix = (*m_pixmaps)["dirsymlink" ]; + }else{ + pix = Resource::loadPixmap("folder" ); + } + } 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 ); + name = info->fileName()+ "->"+ info->dirPath(true) +"/" +info->readLink(); + + }else{ + //if(info->isReadable() ) + name = info->fileName(); + } + + new OFileSelectorItem(m_View, pix, + name, info->lastModified().toString(), + QString::number(info->size() ),info->dirPath(true), locked, true ); } } void OFileSelector::setShowDirs(bool dir ) { m_dir = dir; reparse(); } diff --git a/libopie/ofileselector.h b/libopie/ofileselector.h index 73674e2..6936773 100644 --- a/libopie/ofileselector.h +++ b/libopie/ofileselector.h @@ -39,166 +39,171 @@ #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 * */ class DocLnk; class QCheckBox; class QComboBox; class QPushButton; class FileSelector; 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 &mDir, - bool isDir=false ): QListViewItem(view) { + 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 locked() 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; }; 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 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; }; + 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 ); void setPopupMenu( const 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(); /* the user needs to delete it */ DocLnk selectedDocument()const; /* the user needs to delete it */ - QValueList<DocLnk> selectedDocuments(); + QValueList<DocLnk> selectedDocuments()const; signals: void fileSelected( const DocLnk & ); void fileSelected( const QString & ); void closeMe(); void ok(); void cancel(); protected slots: void slotOk(); void slotCancel(); void slotViewCheck(const QString & ); void slotMimeCheck(const QString & ); protected: void init(); void updateMimes(); 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; QListView *m_View; QCheckBox *m_checkPerm; QString m_currentDir; QString m_name; QStringList m_mimetypes; FileSelector *m_select; QWidgetStack *m_stack; QVBoxLayout *m_lay; QGridLayout *m_Oselector; |