author | zecke <zecke> | 2002-05-02 07:15:29 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-05-02 07:15:29 (UTC) |
commit | 9a3f2b67dab939993a56db83c1d473fc7ae6d57a (patch) (side-by-side diff) | |
tree | b35b8d840400996e270dace0a11648bf361ed31e | |
parent | a52fd4b1995e34963888397587aa2592ea858da6 (diff) | |
download | opie-9a3f2b67dab939993a56db83c1d473fc7ae6d57a.zip opie-9a3f2b67dab939993a56db83c1d473fc7ae6d57a.tar.gz opie-9a3f2b67dab939993a56db83c1d473fc7ae6d57a.tar.bz2 |
Here is the rewrite of ofileselector
Mostly the layout was fixed and it should be much easier to
understand whats going on
It also got more functionality with less code
Next is MultipleSelections, Open Dir mode save dir mode and
installingViews
-rw-r--r-- | libopie/ofileselector.cc | 1699 | ||||
-rw-r--r-- | libopie/ofileselector.h | 39 |
2 files changed, 841 insertions, 897 deletions
diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc index 9cf3f36..d780da9 100644 --- a/libopie/ofileselector.cc +++ b/libopie/ofileselector.cc @@ -1,1194 +1,1133 @@ -/* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 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. - -*/ - -#include <qnamespace.h> -#include <qpushbutton.h> + + +#include <qcheckbox.h> #include <qcombobox.h> -#include <qhbox.h> -#include <qvbox.h> +#include <qheader.h> +#include <qlabel.h> +#include <qabstractlayout.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 <qaction.h> -#include <qpopupmenu.h> -#include <qcursor.h> -#include <qstringlist.h> +#include <qlistview.h> #include <qmessagebox.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/fileselector.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" -//#include "ofileview.h" + QMap<QString,QPixmap> *OFileSelector::m_pixmaps = 0; namespace { - int indexByString( const QComboBox *box, const QString &str ){ - int index= -1; + int index= 0; for(int i= 0; i < box->count(); i++ ){ if( str == box->text(i ) ){ - index= i; - break; + 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 QStringList &mimetypes ) : QWidget( wid ) +OFileSelector::OFileSelector( QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName, + const QStringList &mimeTypes ) + : QWidget( wid, "OFileSelector") { - if(wid!=0) - resize(wid->width(),wid->height()); - m_selector = selector; - m_currentDir = dirName; - m_name = fileName; - m_mimetypes = mimetypes; - - if( mimetypes.isEmpty() ) - m_autoMime = true; - - qWarning("OFileSelector mimetypes %s", mimetypes.join(" ").latin1() ); + m_mimetypes = mimeTypes; + initVars(); 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_pseudo = 0; - m_pseudoLayout = 0; - - m_dir = true; - m_files = true; - m_custom = 0; - m_showPopup = true; - - if(m_pixmaps == 0 ) // init the pixmaps - initPics(); - - m_lay = new QVBoxLayout(this); + m_selector = selector; + m_currentDir = dirName; init(); - m_edit->setText( fileName ); +QTimer::singleShot(6*1000, this, SLOT( slotTest() ) ); } -void OFileSelector::initPics() +OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, + const char *name, bool newVisible = TRUE, + bool closeVisible = FALSE ) + : QWidget( parent, name ) { - qWarning("init pics" ); - 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 ); + m_mimetypes = QStringList::split(";", mimeFilter ); + initVars(); + m_currentDir = QPEApplication::documentDir(); + m_mode = OPEN; + m_selector = NORMAL; + m_shClose = closeVisible; + m_shNew = newVisible; + m_shLne = false; + m_shPerm = false; + m_shYesNo = false; + init(); + } -// let's initialize the gui -/** - -------------------- - | cmbBox Button | - -------------------- - | FileSlector | - | or | - | OSelector | - | | - | | - ____________________ - | LineEdit | - ____________________ - | Permission Bar | - ____________________ - | ViewChoose | - ____________________ - | Save Cancel| - ____________________ - */ -void OFileSelector::delItems() +OFileSelector::~OFileSelector() { - QLayoutIterator it = m_lay->iterator(); - while ( it.current() != 0 ){ - it.deleteCurrent(); - } + } -void OFileSelector::init() +void OFileSelector::setNewVisible( bool visible ) { -// qDebug("init"); - m_stack = new QWidgetStack(this, "wstack" ); + m_shNew = visible; 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 ); - connect(m_select, SIGNAL(fileSelected( const DocLnk &) ), - this, SLOT(slotFileBridgeSelected(const DocLnk &) ) ); - m_pseudoLayout = 0l; - - } else { - initializeListView(); + delete m_select; + // we need to initialize but keep the selected mimetype + QString mime = m_mimeCheck == 0 ? QString::null : m_mimeCheck->currentText() ; + m_select = new FileSelector( m_autoMime ? mime : m_mimetypes.join(";") , + m_stack, "fileselector", + m_shNew, m_shClose); + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, NORMAL ); + }else{ + m_new->show(); } - if(m_shLne ){ - initializeName(); +} +void OFileSelector::setCloseVisible( bool visible ) +{ + m_shClose = visible; + if( m_selector == NORMAL ){ + setNewVisible( m_shNew ); // yeah baby + }else{ + m_close->show(); } - if(m_shPerm ){ - m_checkPerm = new QCheckBox(tr("Set Permission"), this, "Permission" ); - m_checkPerm->setChecked( false ); - m_lay->addWidget(m_checkPerm ); +} +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{ + //; } - if( m_shChooser ) - initializeChooser(); - if(m_shYesNo ) - initializeYes(); +} - // m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, requestedMimeTypesList.first()) ); - // reparse(); - +const DocLnk *OFileSelector::selected() +{ + if( m_selector == NORMAL ){ + return m_select->selected(); + }else{ + DocLnk *lnk = new DocLnk(selectedDocument() ); + return lnk; + } } void OFileSelector::setYesCancelVisible( bool show ) { - if ( show == m_shYesNo ) - return; + initializeYes(); // FIXME if YesCancel is not shown we will initialize it to hide it :( 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 - } - updateLay(); // recreate it and save the other states -} + if( m_shYesNo ) + m_boxOk->show(); + else + m_boxOk->hide(); +} void OFileSelector::setToolbarVisible( bool show ) { - if ( m_shTool == show ) - return; + m_shTool = show; + initializeListView(); // FIXME see above waste of memory if(!m_shTool ){ - delete m_boxToolbar; - delete m_homeButton; - delete m_docButton; - delete m_location; - delete m_up; - m_boxToolbar = 0; - m_homeButton = 0; - m_docButton = 0; - m_location = 0; - m_up = 0; - }; - updateLay();// overkill fix it + 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 ) { - if( show == m_shPerm ) - return; - m_shPerm = show; - - updateLay(); + initializePerm(); + if( m_shPerm ) + m_checkPerm->show(); + else + m_checkPerm->hide(); } - void OFileSelector::setLineEditVisible( bool show ) { - if( show == m_shLne ) - return; - - m_shLne = show; - if( !show ){ - delete m_edit; - delete m_fnLabel; - m_edit = 0; - m_fnLabel = 0; - //delete m_boxName; will be deleted + 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(); + } } - updateLay(); + m_shLne = show; } void OFileSelector::setChooserVisible( bool show ) { - if( show = m_shChooser ) - return; m_shChooser = show; - if( !show ){ - delete m_mimeCheck; - delete m_viewCheck; - m_mimeCheck = 0; - m_viewCheck = 0; + initializeChooser(); + if( m_shChooser ){ + m_boxView->hide(); + }else{ + m_boxView->show(); } - updateLay(); } -QCheckBox* OFileSelector::permissionCheckbox( ) +QCheckBox* OFileSelector::permissionCheckbox() +{ + if( m_selector == NORMAL ) + return 0l; + else + return m_checkPerm; +} +bool OFileSelector::setPermission()const { - return m_checkPerm; + return m_checkPerm == 0 ? false : m_checkPerm->isChecked(); +} +void OFileSelector::setPermissionChecked( bool check ) +{ + if( m_checkPerm ) + m_checkPerm->setChecked( check ); } -void OFileSelector::setCaseSensetive( bool caSe ) +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 files ){ - m_files = files; +void OFileSelector::setShowFiles(bool show ) +{ + m_files = show; reparse(); } - -void OFileSelector::setPopupMenu(QPopupMenu *pop ) +/// +bool OFileSelector::cd(const QString &path ) { - //delete oldpopup; - m_custom = pop; + m_currentDir = path; + reparse(); + return true; } - -bool OFileSelector::setPermission( ) const +void OFileSelector::setSelector(int mode ) { - if( m_checkPerm == 0 ) - return false; - else - return m_checkPerm->isChecked(); +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::setPermissionChecked( bool check ) +void OFileSelector::setPopupMenu(QPopupMenu *popup ) { - if( m_checkPerm == 0 ) - return; - m_checkPerm->setChecked( check ); + m_custom = popup; + m_showPopup = true; } -QString OFileSelector::selectedName( )const +//void OFileSelector::updateL + +QString OFileSelector::selectedName() const { - QString string; + QString name; 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 = m_currentDir + "/" + item->text( 1 ); - } + name = lnk->file(); + delete lnk; + }else if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ + QListViewItem *item = m_View->currentItem(); + if( item != 0 ) + name = m_currentDir + "/" + item->text( 1 ); + }else { // installed view + ; } - return string; + 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; } - -DocLnk OFileSelector::selectedDocument( )const +/** If mode is set to the Dir selection this will return the selected path. + * + * + */ +QString OFileSelector::selectedPath()const { - DocLnk lnk; - return lnk; + QString path; + if( m_selector == NORMAL ){ + path = QPEApplication::documentDir(); + }else if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ + ; + } + return path; } -void OFileSelector::updateLay() +QStringList OFileSelector::selectedPaths() const { - /* 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; - m_checkPerm = 0; - delete m_edit; - m_edit = 0; - delete m_fnLabel; - m_fnLabel = 0; - delete m_ok; - m_ok = 0; - delete m_cancel; - m_cancel = 0; - delete m_mimeCheck; - m_mimeCheck = 0; - delete m_viewCheck; - m_viewCheck = 0; - delete m_select; // test - delete m_stack; - //delete m_list; - init(); - if( m_shLne ) - m_edit->setText(text ); - if( m_shPerm ) - m_checkPerm->setChecked(check ); + QStringList list; + list << selectedPath(); + return list; } - -// let's update the mimetypes. Use the current mimefilter for the 2nd QDir retrieve -// insert QListViewItems with the right options -bool OFileSelector::compliesMime(const QString &path, const QString &mime ) +QString OFileSelector::directory()const { - if( mime == "All" ) - return true; - MimeType type( path ); - if( type.id() == mime ) - return true; - return false; + if( m_selector == NORMAL ) + return QPEApplication::documentDir(); + + return QDir(m_currentDir).absPath(); } -void OFileSelector::reparse() +int OFileSelector::fileCount() { - qDebug("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 ) ); - }else{ - m_mimeCheck->clear(); - m_mimeCheck->insertItem( m_mimetypes.join(";") ); - } - - QDir dir( m_currentDir ); - //dir.setFilter(-1 ); - int sort = QDir::Name | QDir::DirsFirst | QDir::Reversed; - if( m_case ) - sort = QDir::IgnoreCase; - dir.setSorting( sort ); - - int filter; - /* if( m_dir && !m_files) - filter |= QDir::Dirs; - else if( !m_dir && m_files ) - filter |= QDir::Files; - else - filter |= QDir::All; - */ - if( m_selector == EXTENDED_ALL ) - filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All; - else - filter = QDir::Files | QDir::Dirs | QDir::All; - dir.setFilter( filter ); - qDebug("infoList"); - 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->dirPath(true)+"/"+ fi->readLink(); -// qWarning("File ->%s", file.latin1() ); - for(int i=0; i<=4; i++ ){ // prepend from dos - QFileInfo info( file ); - if( !info.exists() ){ -// qWarning("does not exist" ); - addSymlink(currMime, fi, TRUE ); + int count; + switch( m_selector ){ + case NORMAL: + count = m_select->fileCount(); break; - }else if( info.isDir() ){ -// qWarning("isDir" ); - addDir(currMime, fi, TRUE ); + //case CUSTOM: + case EXTENDED: + case EXTENDED_ALL: + default: + count = m_View->childCount(); break; - }else if( info.isFile() ){ -// qWarning("isFile" ); - addFile(currMime, fi, TRUE ); + } + return count; +} +DocLnk OFileSelector::selectedDocument() const +{ + DocLnk lnk; + switch( m_selector ){ + case NORMAL:{ + const DocLnk *lnk2 = m_select->selected(); + lnk = DocLnk(*lnk2 ); // copy + delete lnk2; break; - }else if( info.isSymLink() ){ - 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; + case EXTENDED: + case EXTENDED_ALL: + default: + lnk = DocLnk( selectedName() ); // new DocLnk + break; } - m_View->sort(); -// m_View->ensureItemVisible(); + return lnk; } - -QString OFileSelector::directory()const +QValueList<DocLnk> OFileSelector::selectedDocuments() const { - QDir d( m_currentDir); - return d.absPath(); + QValueList<DocLnk> docs; + docs.append( selectedDocument() ); + return docs; } -int OFileSelector::fileCount() -{ - return 0; -} -void OFileSelector::slotOk( ) +// slots internal + +void OFileSelector::slotOk() { emit ok(); } - -void OFileSelector::slotCancel( ) +void OFileSelector::slotCancel() { emit cancel(); } - -void OFileSelector::initializeName() +void OFileSelector::slotViewCheck(const QString &sel) { - m_boxName = new QHBoxLayout(this ); - m_edit = new QLineEdit(this ); - m_fnLabel = new QLabel(this ); - m_fnLabel->setText(tr("Name:") ); - m_boxName->addWidget(m_fnLabel ); - m_boxName->insertSpacing(1, 8 ); - m_boxName->addWidget(m_edit, 100 ); - - m_lay->addLayout(m_boxName); + if( sel == tr("Documents" ) ){ + if( m_select == 0 ){ + // autMime? fix cause now we use All and not the current + m_select = new FileSelector(m_autoMime ? QString::null : m_mimetypes.join(";"), + m_stack, "fileselector", + FALSE, FALSE); + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + //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 + } } - -void OFileSelector::initializeYes() +void OFileSelector::slotMimeCheck(const QString &mime) { - m_ok = new QPushButton("&Save", this, "save" ); - m_cancel = new QPushButton("C&ancel", this, "cancel" ); - m_boxOk = new QHBoxLayout(this ); - m_boxOk->addWidget( m_ok, Qt::AlignHCenter ); - m_boxOk->insertSpacing(1, 8 ); - m_boxOk->addWidget( m_cancel, Qt::AlignHCenter); - m_lay->addLayout(m_boxOk ); - connect(m_ok, SIGNAL(clicked() ), - this, SLOT(slotOk() ) ); - connect(m_cancel, SIGNAL(clicked() ), - this, SLOT(slotCancel() ) ); + if( m_selector == NORMAL ){ + if( m_autoMime ){ + delete m_select; + m_select = new FileSelector( mime == tr("All") ? QString::null : mime, + m_stack, "fileselector", + FALSE, FALSE); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, NORMAL ); + m_stack->raiseWidget( NORMAL ); + updateMimes(); + m_mimeCheck->clear(); + m_mimeCheck->insertStringList(m_mimetypes ); + 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(); + } } - -void OFileSelector::initializeChooser() +void OFileSelector::slotLocationActivated(const QString &file) { - m_boxView = new QHBoxLayout(this ); - - m_mimeCheck = new QComboBox(this, "mime check"); - m_viewCheck = new QComboBox(this, "view check"); - m_boxView->addWidget(m_viewCheck, 0 ); - m_boxView->insertSpacing(2, 8 ); - m_boxView->addWidget(m_mimeCheck, 0 ); - m_lay->addLayout(m_boxView ); - m_lay->insertSpacing( 4, 8); - - 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 & ) ) ); + cd(file.left(file.find("<-",0,TRUE))); + reparse(); } - -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::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); } } +void OFileSelector::locationComboChanged() +{ + cd( m_location->lineEdit()->text()); + reparse(); +} +void OFileSelector::init() +{ + m_lay = new QVBoxLayout( this ); + m_lay->setSpacing(0 ); -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; - delete m_boxToolbar; - delete m_homeButton; - delete m_docButton; - delete m_location; - delete m_up; - delete m_pseudo; - //if(m_pseudoLayout!=0 ) -// delete m_pseudoLayout; - } - m_View = 0; - m_boxToolbar = 0; - m_homeButton = 0; - m_docButton = 0; - m_location = 0; - m_up = 0; - m_pseudo = 0; - m_pseudoLayout = 0; + m_stack = new QWidgetStack( this ); + if( m_selector == NORMAL ){ + m_select = new FileSelector(m_autoMime ? QString::null : m_mimetypes.join(";"), + m_stack, "fileselector", + FALSE, FALSE); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + //connect to close me and other signals as well - 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 ); - connect(m_select, SIGNAL(fileSelected( const DocLnk &) ), this, SLOT(slotFileBridgeSelected(const DocLnk &) ) ); + }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_lay->addWidget( m_stack, 100 ); // add to the layout 10 = stretch - } else if(view == QString::fromLatin1("Files") ){ - // remove from the stack - delete m_select; - m_select = 0; - delete m_View; - m_View = 0; + if( m_shLne ) // the LineEdit with the current FileName + initializeName(); - m_selector = EXTENDED; - 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(); - } -} + if( m_shPerm ) // the Permission QCheckBox + initializePerm(); + if( m_shChooser ) // the Chooser for the view and Mimetypes + initializeChooser(); -void OFileSelector::updateMimes() // lets check which mode is active - // check the current dir for items then + if( m_shYesNo ) // the Yes No button row + initializeYes( ); +} +void OFileSelector::updateMimes() { - if( m_autoMime ){ - 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 - ; - } - } + if( m_autoMime ){ + m_mimetypes.clear(); + m_mimetypes.append( tr("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 done in reparse + } } - -void OFileSelector::initializeListView() +void OFileSelector::initVars() { - // in the instance that a developer selected the view to be Files or Entended, - // in the initial initialization, you are deleting objects here - // that aren't even existing yet. - - // just to make sure but clean it up better FIXME - delete m_View; - m_View = 0; - delete m_boxToolbar; - delete m_homeButton; - delete m_docButton; - delete m_location; - delete m_up; - delete m_pseudo; + 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(); - m_boxToolbar = 0; + // pointers + m_location = 0; + m_mimeCheck = 0; + m_viewCheck = 0; m_homeButton = 0; m_docButton = 0; - m_location = 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; - qDebug(" time for the toolbar "); - m_pseudo = new QWidget(m_stack, "Pseudo Widget"); - m_pseudoLayout = new QVBoxLayout(m_pseudo ); - if(m_shTool ){ - m_boxToolbar = new QHBoxLayout( ); - m_boxToolbar->setAutoAdd( true ); - m_location = new QComboBox(m_pseudo ); - m_location ->setEditable(TRUE); - connect( m_location, SIGNAL(activated(const QString &) ), this, SLOT( locationComboActivated(const QString & ) ) ); - connect( m_location->lineEdit(),SIGNAL(returnPressed()), this,SLOT( locationComboChanged())); - - m_up = new QPushButton(Resource::loadIconSet("up"),"", m_pseudo,"cdUpButton"); - m_up->setFixedSize( QSize( 20, 20 ) ); - connect(m_up ,SIGNAL(clicked()),this,SLOT(cdUP() ) ); - m_up->setFlat(TRUE); - - m_homeButton = new QPushButton(Resource::loadIconSet("home") , "", m_pseudo); - m_homeButton->setFixedSize( QSize( 20, 20 ) ); - connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotHome() ) ); - m_homeButton->setFlat(TRUE); - - m_docButton = new QPushButton(Resource::loadIconSet("DocsIcon"),"", m_pseudo,"docsButton"); - m_docButton->setFixedSize( QSize( 20, 20 ) ); - connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotDoc() ) ); - m_docButton->setFlat(TRUE); - - m_boxToolbar->addWidget(m_location ); - m_boxToolbar->addWidget(m_up ); - m_boxToolbar->addWidget(m_homeButton ); - m_boxToolbar->addWidget(m_docButton ); - m_pseudoLayout->addLayout(m_boxToolbar ); - qDebug("lets fill the 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 ); - }; - - m_View = new QListView(m_pseudo, "Extended view" ); - m_stack->addWidget( m_pseudo, EXTENDED ); - m_stack->raiseWidget( EXTENDED ); - m_pseudoLayout->addWidget(m_View ); - 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"),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 now - connect(m_View, SIGNAL(selectionChanged() ), this, SLOT(slotSelectionChanged() ) ); - 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 ) ) ); - - -}; - -/* 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" ); + 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; - } - - MimeType type( info->filePath() ); - QString name; - QString dir; - bool locked= false; - if(mime == "All" ){ - ; - }else if( type.id() != mime ) { + // if( !compliesMime(info->absFilePath(), mime ) ) + // return; + MimeType type( info->absFilePath() ); + if( mime != tr("All") && type.id() != mime ) return; - } - QPixmap pix = type.pixmap(); - if(pix.isNull() ) - pix = Resource::loadPixmap( "UnknownDocument-14" ); + QPixmap pix = type.pixmap(); + QString dir; + QString name; + bool locked; + if( pix.isNull() ) + pix = Resource::loadPixmap( "UnknownDocument-14"); 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 + if( symlink ) + name = info->fileName() + " -> " +info->dirPath() + "/" + info->readLink(); + else { 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" ); - } - } + 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 ); + info->lastModified().toString(), + QString::number( info->size() ), + dir, locked ); } - -void OFileSelector::addDir(const QString &/*mime*/, QFileInfo *info, bool symlink ) +void OFileSelector::addDir(const QString &mime, QFileInfo *info, bool symlink ) { - if(!m_dir ) + if(!m_dir) return; - //if( showDirs ) - { - bool locked=false; + 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() ) ){ + 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 ) + pix = (*m_pixmaps)["symlinkedlocked"]; + else + pix = Resource::loadPixmap("lockedfolder"); + }else { // readable + pix = symlink ? (*m_pixmaps)["dirsymlink"] : Resource::loadPixmap("folder") ; } - if( symlink){ - name = info->fileName()+ "->"+ info->dirPath(true) +"/" +info->readLink(); + 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() +{ - }else{ - //if(info->isReadable() ) - name = info->fileName(); +} +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_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() ) ); + } +} +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") ); + if(!m_autoMime ) + m_mimeCheck->insertItem(m_mimetypes.join(",") ); + else{ + updateMimes(); + m_mimeCheck->insertStringList( m_mimetypes ); } - - new OFileSelectorItem(m_View, pix, - name, info->lastModified().toString(), - QString::number(info->size() ),info->dirPath(true), locked, true ); + 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() +{ + if( m_pseudo == 0 ){ + 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(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 ); -void OFileSelector::setShowDirs(bool dir ) + 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 ) { - m_dir = dir; - reparse(); + if( mime == "All" ) + return true; + MimeType type( path ); + if( type.id() == mime ) + return true; + return false; } -void OFileSelector::slotFileSelected(const QString &string ) +void OFileSelector::slotFileSelected( const QString &string ) { - if(m_shLne ) + if( m_shLne ) m_edit->setText( string ); - emit fileSelected( string ); - // do AppLnk stuff -} - +} void OFileSelector::slotFileBridgeSelected( const DocLnk &lnk ) { - slotFileSelected(lnk.name() ); - emit fileSelected( lnk ); + slotFileSelected( lnk.name() ); + // emit fileSelected( lnk ); } - -void OFileSelector::slotSelectionChanged() // get the current items - // fixme +void OFileSelector::slotSelectionChanged() { - qWarning("selection changed" ); -} -void OFileSelector::slotCurrentChanged(QListViewItem *item ) +} +void OFileSelector::slotCurrentChanged(QListViewItem* item ) { -// qWarning("current changed" ); if( item == 0 ) return; - - if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ - OFileSelectorItem *sel = (OFileSelectorItem*)item; + if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ) { + OFileSelectorItem *sel = (OFileSelectorItem*) item; // start to use the C++ casts ;) if(!sel->isDir() ){ -// qWarning("is not dir" ); - if(m_shLne ){ - m_edit->setText(sel->text(1) ); -// qWarning("setTexy" ); - } + if( m_shLne ) + m_edit->setText( sel->text(1) ); } - }else { - qWarning("mode not extended" ); } } - -// either select or change dir -void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &/*point*/, int ) +void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &, int) { - if( item == 0 ) + if ( item == 0 ) return; if( button != Qt::LeftButton ) - return; + return; -// qWarning("clicked" ); - if(m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ -// qWarning("inside" ); + switch( m_selector ){ + default: + break; + case EXTENDED: // fall through + case EXTENDED_ALL:{ OFileSelectorItem *sel = (OFileSelectorItem*)item; - if(!sel->isLocked() ){ // not locked either changedir or open + if(!sel->isLocked() ){ QStringList str = QStringList::split("->", sel->text(1) ); - if(sel->isDir() ){ - cd( sel->directory() + "/" + str[0] ); - } else { -// qWarning("file" ); - if(m_shLne ) - m_edit->setText(str[0] ); - emit fileSelected(str[0] ); - // emit DocLnk need to do it + 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() ); + emit fileSelected( sel->directory() + "/" + str[0].stripWhiteSpace() ); } - } else { - qWarning( "locked" ); } - }; + break; + } + } } - void OFileSelector::slotRightButton(int button, QListViewItem *item, const QPoint &, int ) { - if (item == 0 ) + if( item == 0 ) return; if( button != Qt::RightButton ) - return; -// qWarning("right button" ); - slotContextMenu(item); -} - -void OFileSelector::slotContextMenu(QListViewItem *item) -{ -// qWarning("context menu" ); - if( item ==0 || !m_showPopup ) return; - - if( m_custom !=0){ - m_custom->exec(); - }else{ - QPopupMenu menu; - QAction up; - up.setText("cd up"); - up.addTo( &menu ); - connect(&up, SIGNAL(activated() ), - this, SLOT(cdUP() ) ); - - QAction act; - OFileSelectorItem *sel = (OFileSelectorItem*)item; - if(sel->isDir() ){ - act.setText( tr("Change Directory") ); - act.addTo(&menu ); - connect(&act, SIGNAL(activated() ), - this, SLOT(slotChangedDir() ) ); - }else{ - act.setText( tr("Open file" ) ); - act.addTo( &menu ); - connect(&act, SIGNAL(activated() ), - this, SLOT(slotOpen() ) ); - } - QAction rescan; - rescan.setText( tr("Rescan") ); - rescan.addTo( &menu ); - connect(&rescan, SIGNAL(activated() ), - this, SLOT(slotRescan() ) ); - - QAction rename; - rename.setText( tr("Rename") ); - rename.addTo( &menu ); - connect(&rename, SIGNAL(activated() ), - this, SLOT(slotRename() ) ); - - menu.insertSeparator(); - QAction delItem; - delItem.setText( tr("Delete") ); - delItem.addTo(&menu ); - connect(&delItem, SIGNAL(activated() ), - this, SLOT(slotDelete() ) ); - - menu.exec(QCursor::pos() ); - } + slotContextMenu( item ); } - -bool OFileSelector::cd(const QString &str ) +void OFileSelector::slotContextMenu( QListViewItem *item) { -// qWarning(" dir %s", str.latin1() ); - QDir dir( str); - if(dir.exists() ){ - m_currentDir = dir.absPath(); - reparse(); - if(m_shTool ){ - int count = m_location->count(); - insertLocationPath( str ,count ); - m_location->setCurrentItem( count ); - } - return true; - } - return false; -} -void OFileSelector::insertLocationPath(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); - } } - void OFileSelector::slotChangedDir() { OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); if(sel->isDir() ){ QStringList str = QStringList::split("->", sel->text(1) ); - cd( sel->directory() + "/" + str[0] ); - + 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( str[0] ); + slotFileSelected( sel->directory() +"/" +str[0].stripWhiteSpace() ); } } - void OFileSelector::slotRescan() { - reparse(); -} +} void OFileSelector::slotRename() { - // rename inline + reparse(); } - void OFileSelector::slotDelete() { -// qWarning("delete slot" ); OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); QStringList list = QStringList::split("->", sel->text(1) ); if( sel->isDir() ){ - QString str = QString::fromLatin1("rm -rf ") + list[0]; //better safe than sorry + 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; + 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(); - insertLocationPath( m_currentDir, count); + slotInsertLocationPath( m_currentDir, count); m_location->setCurrentItem( indexByString( m_location, m_currentDir)); -//this wont work in all instances - // FIXME + //this wont work in all instances + // FIXME } } - void OFileSelector::slotHome() { cd(QDir::homeDirPath() ); } - void OFileSelector::slotDoc() { - cd(QDir::homeDirPath() + "/Documents" ); + cd(QPEApplication::documentDir() ); } - -void OFileSelector::slotNavigate() +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 ); + 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.append( type.id() ); + } -void OFileSelector::locationComboActivated(const QString & file ) { - cd(file.left(file.find("<-",0,TRUE))); - reparse(); -} + ++it; + } + // add them to the chooser + m_mimeCheck->insertItem( tr("All") ); + m_mimeCheck->insertStringList( m_mimetypes ); + m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) ); + currentMimeType = m_mimeCheck->currentText(); + } + }else { // no autoMime + currentMimeType = m_mimetypes.join(";"); + if( m_shChooser ){ + m_mimeCheck->clear(); + m_mimeCheck->insertItem(m_mimetypes.join(",") ); + } + } + // now we got our mimetypes we can add the files -void OFileSelector::locationComboChanged() { - cd( m_location->lineEdit()->text()); - reparse(); + QDir dir( m_currentDir ); + + 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 + m_View->sort(); + if( m_shTool ){ + m_location->insertItem( m_currentDir ); + + } + // reenable painting and updates } diff --git a/libopie/ofileselector.h b/libopie/ofileselector.h index 5c38ac4..47697b9 100644 --- a/libopie/ofileselector.h +++ b/libopie/ofileselector.h @@ -34,226 +34,231 @@ #ifndef opiefileselector_h #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 * */ 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 QHBox; // class OFileSelector : public QWidget { Q_OBJECT public: enum Mode {OPEN=1, SAVE=2, FILESELECTOR=4, DIR=8 }; enum Selector{NORMAL=0, EXTENDED = 1, EXTENDED_ALL =2 }; 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() ); OFileSelector(const QString &mimeFilter, QWidget *parent, const char *name, bool newVisible = TRUE, - bool closeVisible = FALSE ) { }; + bool closeVisible = FALSE ); - ~OFileSelector() {}; + ~OFileSelector(); // currently only for the FILESELECTOR Mode - void setNewVisible( bool /*b*/ ) { }; - void setCloseVisible(bool /*b*/ ) { }; + void setNewVisible( bool /*b*/ ); + void setCloseVisible(bool /*b*/ ); // end file selector mode // deprecated - void reread() { reparse(); }; + 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 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()const; signals: void fileSelected( const DocLnk & ); void fileSelected( const QString & ); void dirSelected(const QString &dir ); void closeMe(); void ok(); void cancel(); + void contextMenu(); - protected slots: + private slots: + void slotTest() { qWarning("slotTest" ); setLineEditVisible(false ); }; void slotOk(); void slotCancel(); void slotViewCheck(const QString & ); void slotMimeCheck(const QString & ); - void locationComboActivated(const QString & ); - void insertLocationPath(const QString &, int); + void slotLocationActivated(const QString & ); + void slotInsertLocationPath(const QString &, int); void locationComboChanged(); - protected: + + private: void init(); void updateMimes(); protected: 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; + 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, requestedMimeTypesList; + QStringList m_mimetypes; FileSelector *m_select; QWidgetStack *m_stack; QVBoxLayout *m_lay; QGridLayout *m_Oselector; - QHBoxLayout *m_boxToolbar; - QHBoxLayout *m_boxOk; - QHBoxLayout *m_boxName; - QHBoxLayout *m_boxView; + QHBox *m_boxToolbar; + QHBox *m_boxOk; // (no layout anymore) wait + QHBox *m_boxName; // (no Layout anymore) wait + QHBox *m_boxView; QPopupMenu *m_custom; QLineEdit *m_edit; QLabel *m_fnLabel; 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; - // implementation todo + 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); class OFileSelectorPrivate; OFileSelectorPrivate *d; static QMap<QString,QPixmap> *m_pixmaps; 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 |