From 1c5780f34ec9b4dc004714488b46997fe1a0909b Mon Sep 17 00:00:00 2001 From: zecke Date: Sun, 15 Sep 2002 17:52:30 +0000 Subject: Ok the demand for filters, listers and views were great so I'm currently implementing it This OFileSelector will be in a different subdir but it'll be still linked into libopie. This makes it more easy to find all files which belong to the OFileSelector an OLister is able to list for example files and dirs ( OLocalLister ) a ftp lister a bluetooth lister whcich would show available devices a DocLnkSet lister for the Documents Tab a CrossReference lister a View is responsible for showing files to the user... and I renamed *.cc to *.cpp --- (limited to 'libopie') diff --git a/libopie/ofileselector/ofiledialog.cpp b/libopie/ofileselector/ofiledialog.cpp new file mode 100644 index 0000000..4783004 --- a/dev/null +++ b/libopie/ofileselector/ofiledialog.cpp @@ -0,0 +1,116 @@ +/* +               =. This file is part of the OPIE Project +             .=l. Copyright (c) 2002 <> +           .>+-= + _;:,     .>    :=|. 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_,=:_.      -`: 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 +#include +#include +#include + +#include "ofiledialog.h" + +OFileDialog::OFileDialog(const QString &caption, + QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName, + const QMap& mimetypes ) + : QDialog( wid, "OFileDialog", true ) +{ + // QVBoxLayout *lay = new QVBoxLayout(this); + //showMaximized(); + QVBoxLayout *lay = new QVBoxLayout(this ); + file = new OFileSelector(this , mode, selector, + dirName, fileName, + mimetypes ); + lay->addWidget( file ); + + //lay->addWidget( file ); + //showFullScreen(); + setCaption( caption.isEmpty() ? tr("FileDialog") : caption ); + connect(file, SIGNAL(fileSelected(const QString&) ), + this, SLOT(slotFileSelected(const QString&) ) ); + + connect(file, SIGNAL(dirSelected(const QString &) ), + this, SLOT(slotDirSelected(const QString &) ) ); + + + file->setYesCancelVisible( false ); // relayout +} +QString OFileDialog::mimetype()const +{ + return QString::null; +} +QString OFileDialog::fileName()const +{ + return file->selectedName(); +} +DocLnk OFileDialog::selectedDocument()const +{ + return file->selectedDocument(); +} +QString OFileDialog::getOpenFileName(int selector, + const QString &startDir, + const QString &file, + const MimeTypes &mimes, + QWidget *wid, + const QString &caption ) +{ + QString ret; + OFileDialog dlg( caption.isEmpty() ? tr("Open") : caption, + wid, OFileSelector::OPEN, selector, startDir, file, mimes); + dlg.showMaximized(); + if( dlg.exec() ) + ret = dlg.fileName(); + + return ret; +} +QString OFileDialog::getSaveFileName(int selector, + const QString &startDir, + const QString &file, + const MimeTypes &mimes, + QWidget *wid, + const QString &caption ) +{ + QString ret; + OFileDialog dlg( caption.isEmpty() ? tr("Save") : caption, + wid, OFileSelector::SAVE, selector, startDir, file, mimes); + dlg.showMaximized(); + if( dlg.exec() ) + ret = dlg.fileName(); + + return ret; +} + +void OFileDialog::slotFileSelected(const QString & ) +{ + accept(); +} +void OFileDialog::slotDirSelected(const QString & ) +{ + // if mode + //accept(); +} diff --git a/libopie/ofileselector/ofiledialog.h b/libopie/ofileselector/ofiledialog.h new file mode 100644 index 0000000..e14253c --- a/dev/null +++ b/libopie/ofileselector/ofiledialog.h @@ -0,0 +1,77 @@ +/* +               =. This file is part of the OPIE Project +             .=l. Copyright (c) 2002 zecke +           .>+-= + _;:,     .>    :=|. 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_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + + +#ifndef OpieFileDialog_h +#define OpieFileDialog_h + +#include + +#include + +class OFileDialog : public QDialog { + Q_OBJECT + public: + OFileDialog(const QString &caption, + QWidget *, int mode, int selector, + const QString &dirName, + const QString &fileName = QString::null, + const MimeTypes &mimetypes = MimeTypes() ); + QString mimetype() const; + QString fileName() const; + DocLnk selectedDocument()const; + + // static methods + static QString getOpenFileName(int selector, + const QString& startDir = QString::null, + const QString &fileName = QString::null, + const MimeTypes& mime = MimeTypes(), + QWidget *wid = 0, + const QString &caption = QString::null ); + + static QString getSaveFileName(int selector, + const QString& startDir = QString::null, + const QString& fileName = QString::null, + const MimeTypes& mimefilter = MimeTypes(), + QWidget *wid = 0, + const QString &caption = QString::null ); + + //let's OFileSelector catch up first + //static QString getExistingDirectory(const QString& startDir = QString::null, + // QWidget *parent = 0, + // const QString& caption = QString::null ); + private: + class OFileDialogPrivate; + OFileDialogPrivate *d; + OFileSelector *file; + + private slots: + void slotFileSelected( const QString & ); + void slotDirSelected(const QString & ); +}; +#endif diff --git a/libopie/ofileselector/ofilelistview.cpp b/libopie/ofileselector/ofilelistview.cpp new file mode 100644 index 0000000..0c7d45b --- a/dev/null +++ b/libopie/ofileselector/ofilelistview.cpp @@ -0,0 +1,118 @@ + +#include "ofileselector.h" +#include "ofileselectoritem.h" +#include "ofilelistview.h" + + +OFileListView::OFileListView( QWidget* parent, OFileSelector* sel) + : QListView( parent ), OFileView( sel ) +{ + +} +OFileListView::~OFileListView() { + +} +void OFileListView::clear() { + QListView::clear(); +} +void OFileListView::addFile( const QString& mime, + QFileInfo* info, + bool isSymlink ) { + MimeType type( info->absFilePath() ); + QPixmap pix = type.pixmap(); + QString dir; + QString name; + bool locked = false; + + if( pix.isNull() ) + pix = Resource::loadPixmap( "UnknownDocument-14"); + + dir = info->dirPath( true ); + + if( isSymlink ) + name = info->fileName() + " -> " +info->dirPath() + "/" + info->readLink(); + else { + name = info->fileName(); + if( ( selector()->mode() == Open && !info->isReadable() )|| + ( selector()->mode() == Save && !info->isWritable() ) ){ + + locked = true; pix = Resource::loadPixmap("locked"); + } + } + new OFileSelectorItem( this, pix, name, + info->lastModified().toString(), + QString::number( info->size() ), + dir, locked ); +} +void OFileListView::addFile( const QString& /*mime*/, const QString& /*dir*/, + const QString& /*file*/, bool /*isSyml*/ ) { + +} +void OFileListView::addDir( const QString& mime, + QFileInfo* info, bool isSym ) { + + bool locked = false; + QString name; + QPixmap pix; + + if( ( selector()->mode() == Open && !info->isReadable() ) || + ( selector()->mode() == Save && !info->isWritable() ) ){ + + locked = true; + + if( symlink ) + pix = selector()->pixmap("symlinkedlocked"); + else + pix = Resource::loadPixmap("lockedfolder"); + + }else { // readable + pix = symlink ? selector()->pixmap("dirsymlink") : Resource::loadPixmap("folder") ; + } + + name = symlink ? info->fileName() + "->" + info->dirPath(true) + "/" +info->readLink() : info->fileName() ; + + new OFileSelectorItem( this, pix, name, + info->lastModified().toString(), + QString::number( info->size() ), + info->dirPath( true ), locked, + true ); + +} +void OFileListView::addDir( const QString& mime, const QString& dir, + const QString& file, bool ) { + +} +void OFileListView::addSymlink( const QString& mime, + QFileInfo* info, + bool isSym ) { + +} +void OFileListView::addSymlink( const QString& mime, const QString& path, + const QString& file, bool isSym ) { + +} +void OFileListView::cd( const QString& ) { + +} +QWidget* OFileListView::widget() { + return this; +} +QString OFileListView::selectedName()const{ + QListViewItem *item = currentItem(); + if (!item ) + return QString::null; + + return item->text( 1 ); +} +QStringList OFileListView::selectedNames()const { + +} +QString OFileListView::selectedPath()const { + +} +QString OFileListView::selectedPaths()const { + +} +int OFileListView::fileCount() { + return childCount(); +} diff --git a/libopie/ofileselector/ofilelistview.h b/libopie/ofileselector/ofilelistview.h new file mode 100644 index 0000000..c7e9223 --- a/dev/null +++ b/libopie/ofileselector/ofilelistview.h @@ -0,0 +1,45 @@ +#ifndef OPIE_FILE_LIST_VIEW_H +#define OPIE_FILE_LIST_VIEW_H + +#include + +#include "ofileview.h" + +class OFileListView : public QListView, public OFileView { + Q_OBJECT +public: + OFileListView( QWidget* parent, OFileSelector* ); + ~OFileListView(); + + void clear(); + void addFile( const QString& mine, + QFileInfo* info, + bool isSymlink = FALSE ); + + void addFile( const QString& mime, + const QString& dir, + const QString& file, + bool = false ); + + void addDir( const QString& mime, + QFileInfo* info, bool = FALSE ); + void addDir( const QString& mime, const QString& dir, + const QString& file, bool = FALSE ); + + void addSymlink( const QString& mime, + QFileInfo* info, bool = FALSE ); + void addSymlink( const QString& mine, const QString& path, + const QString& file, bool isSymlink = FALSE ); + void cd( const QString& path ); + QWidget* widget(); + + QString selectedName()const ; + QStringList selectedNames()const; + + QString selectedPath()const; + QStringList selectedPaths()const; + int fileCount(); + +}; + +#endif diff --git a/libopie/ofileselector/ofileselector.cpp b/libopie/ofileselector/ofileselector.cpp new file mode 100644 index 0000000..f655606 --- a/dev/null +++ b/libopie/ofileselector/ofileselector.cpp @@ -0,0 +1,1246 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "ofileview.h" +#include "ofileselector.h" + + +QMap *OFileSelector::m_pixmaps = 0; + +namespace { + int indexByString( const QComboBox *box, const QString &str ){ + int index= 0; + for(int i= 0; i < box->count(); i++ ){ + if( str == box->text(i ) ){ + index= i; + break; + } + } + return index; + } + +} + +OFileSelector::OFileSelector( QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName, + const QMap& mimeTypes) + : QWidget( wid, "OFileSelector") +{ + m_mimetypes = mimeTypes; + if (mode == Save ) + m_name = fileName; + initVars(); + m_mode = mode; + m_selector = selector; + m_currentDir = dirName; + init(); + //QTimer::singleShot(6*1000, this, SLOT( slotTest() ) ); +} + +OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, + const char *name, bool newVisible, + bool closeVisible ) + : QWidget( parent, name ) +{ + if (!mimeFilter.isEmpty() ) { + QStringList list = QStringList::split(";", mimeFilter ); + m_mimetypes.insert(mimeFilter, list ); + } + initVars(); + m_currentDir = QPEApplication::documentDir(); + m_mode = Fileselector; + m_selector = Normal; + m_shClose = closeVisible; + m_shNew = newVisible; + m_shLne = false; + m_shPerm = false; + m_shYesNo = false; + init(); + + +} + +OFileSelector::~OFileSelector() +{ + + +} + +void OFileSelector::setNewVisible( bool visible ) +{ + m_shNew = visible; + if( m_selector == Normal ){ + delete m_select; + // we need to initialize but keep the selected mimetype + QString mime = currentMimeType(); + m_select = new FileSelector( mime , + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, Normal ); + }else{ + m_new->show(); + } +} +void OFileSelector::setCloseVisible( bool visible ) +{ + m_shClose = visible; + if( m_selector == Normal ){ + setNewVisible( m_shNew ); // yeah baby + }else{ + m_close->show(); + } +} +void OFileSelector::reread() +{ + if( m_selector == Normal ){ + setNewVisible( m_shNew ); // make it a initializeSelector + }else { + reparse(); + } +} + +const DocLnk *OFileSelector::selected() +{ + DocLnk *lnk = new DocLnk(selectedDocument() ); + return lnk; +} + +void OFileSelector::setYesCancelVisible( bool show ) +{ + initializeYes(); // FIXME if YesCancel is not shown we will initialize it to hide it :( + m_shYesNo = show; + if( m_shYesNo ) + m_boxOk->show(); + else + m_boxOk->hide(); + +} +void OFileSelector::setToolbarVisible( bool show ) +{ + m_shTool = show; + initializeListView(); // FIXME see above waste of memory + if(!m_shTool ){ + m_location->hide(); + m_up->hide(); + m_homeButton->hide(); + m_docButton->hide(); + }else{ + m_location->show(); + m_up->show(); + m_homeButton->show(); + m_docButton->show(); + } +} +void OFileSelector::setPermissionBarVisible( bool show ) +{ + m_shPerm = show; + initializePerm(); + if( m_shPerm ) + m_checkPerm->show(); + else + m_checkPerm->hide(); +} +void OFileSelector::setLineEditVisible( bool show ) +{ + if( show ){ + initializeName(); + m_boxName->show(); + }else{ + if( m_shLne && m_boxName != 0 ){ // check if we showed before this is the way to go + m_boxName->hide(); + } + } + m_shLne = show; +} + +void OFileSelector::setChooserVisible( bool show ) +{ + m_shChooser = show; + initializeChooser(); + if( m_shChooser ){ + m_boxView->hide(); + }else{ + m_boxView->show(); + } +} + +QCheckBox* OFileSelector::permissionCheckbox() +{ + if( m_selector == Normal ) + return 0l; + else + return m_checkPerm; +} +bool OFileSelector::setPermission()const +{ + return m_checkPerm == 0 ? false : m_checkPerm->isChecked(); +} +void OFileSelector::setPermissionChecked( bool check ) +{ + if( m_checkPerm ) + m_checkPerm->setChecked( check ); +} + +void OFileSelector::setMode(int mode) // FIXME do direct raising +{ + m_mode = mode; + if( m_selector == Normal ) + return; +} +void OFileSelector::setShowDirs(bool ) +{ + m_dir = true; + reparse(); +} +void OFileSelector::setCaseSensetive(bool caSe ) +{ + m_case = caSe; + reparse(); +} +void OFileSelector::setShowFiles(bool show ) +{ + m_files = show; + reparse(); +} +/// +bool OFileSelector::cd(const QString &path ) +{ + m_currentDir = path; + reparse(); + return true; +} +void OFileSelector::setSelector(int mode ) +{ +QString text; + switch( mode ){ + case Normal: + text = tr("Documents"); + break; + case Extended: + text = tr("Files"); + break; + case ExtendedAll: + text = tr("All Files"); + break; + } + slotViewCheck( text ); +} + +void OFileSelector::setPopupFactory(OPopupMenuFactory *popup ) +{ +/* m_custom = popup; + m_showPopup = true; +*/ +} + +//void OFileSelector::updateL + +QString OFileSelector::selectedName() const +{ + QString name; + if( m_selector == Normal ){ + DocLnk lnk = m_select->selectedDocument(); + name = lnk.file(); + }else if( m_selector == Extended || m_selector == ExtendedAll ){ + if ( m_shLne ) { + name = m_currentDir + "/" +m_edit->text(); + }else{ + name = m_currentDir + "/" + currentView()->selectedName(); + } + } + return name; +} +QStringList OFileSelector::selectedNames()const +{ + QStringList list; + if( m_selector == Normal ){ + list << selectedName(); + }else { + list << selectedName(); // FIXME implement multiple Selections + } + return list; +} +/** If mode is set to the Dir selection this will return the selected path. + * + * + */ +QString OFileSelector::selectedPath()const +{ + QString path; + if( m_selector == Normal ){ + path = QPEApplication::documentDir(); + }else if( m_selector == Extended || m_selector == ExtendedAll ){ + ; //FIXME + } + return path; +} +QStringList OFileSelector::selectedPaths() const +{ + QStringList list; + list << selectedPath(); + return list; +} +QString OFileSelector::directory()const +{ + if( m_selector == Normal ) + return QPEApplication::documentDir(); + + return QDir(m_currentDir).absPath(); +} + +int OFileSelector::fileCount() +{ + int count; + switch( m_selector ){ + case Normal: + count = m_select->fileCount(); + break; + case Extended: + case ExtendedAll: + default: + count = currentView()->childCount(); + break; + } + return count; +} +DocLnk OFileSelector::selectedDocument() const +{ + DocLnk lnk; + switch( m_selector ){ + case Normal:{ + lnk = m_select->selectedDocument(); + break; + } + case Extended: + case ExtendedAll: + default: + lnk = DocLnk( selectedName() ); // new DocLnk + break; + } + return lnk; +} +QValueList OFileSelector::selectedDocuments() const +{ + QValueList docs; + docs.append( selectedDocument() ); + return docs; +} + + +// slots internal + +void OFileSelector::slotOk() +{ + emit ok(); +} +void OFileSelector::slotCancel() +{ + emit cancel(); +} +void OFileSelector::slotViewCheck(const QString &sel) +{ + if( sel == tr("Documents" ) ){ + if( m_select == 0 ){ + // autMime? fix cause now we use All and not the current + // yes currentMime fixes that for us + QString mime = currentMimeType(); + m_select = new FileSelector(mime, + m_stack, "fileselector", + m_shNew, m_shClose); + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + + m_stack->addWidget( m_select, Normal ); + } + m_stack->raiseWidget( Normal ); + m_selector = Normal; + }else if( sel == tr("Files") ){ + m_selector = Extended; + initializeListView(); + reparse(); + m_stack->raiseWidget( Extended ); + }else if( sel == tr("All Files") ){ + m_selector = ExtendedAll; + initializeListView(); + reparse(); + m_stack->raiseWidget( Extended ); // same widget other QFileFilter + } +} +// not yet finished..... +QString OFileSelector::currentMimeType() const{ + QString mime; + QString currentText; + if (m_shChooser ) + currentText = m_mimeCheck->currentText(); + + if (tr("All") == currentText ) return QString::null; + else if (currentText.isEmpty() ) { + ; + }else { + QMap::ConstIterator it; + it = m_mimetypes.find( currentText ); + if ( it == m_mimetypes.end() ) { + mime = it.data().join(";"); + }else{ + mime = currentText; + } + } + return mime; +} +void OFileSelector::slotMimeCheck(const QString &mime) +{ + if( m_selector == Normal ){ + //if( m_autoMime ){ + QString newMimeType; + if (mime != tr("All") ) { + QMap::Iterator it; + it = m_mimetypes.find(mime); + if ( it != m_mimetypes.end() ) { + newMimeType = it.data().join(";"); + }else{ + newMimeType = mime; + } + } + delete m_select; + m_select = new FileSelector( newMimeType, + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, Normal ); + m_stack->raiseWidget( Normal ); + updateMimes(); + updateMimeCheck(); + m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); + //} + }else{ // others + qWarning("Mime %s", mime.latin1() ); + if(m_shChooser ){ + qWarning("Current Text %s", m_mimeCheck->currentText().latin1() ); + //m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); + } + reparse(); + } + +} +/* + * Ok if a non dir gets inserted into this combobox + * we need to change it + * QFileInfo and dirPath will give us the right Dir + */ +void OFileSelector::slotLocationActivated(const QString &file) +{ + qWarning("slotLocationActivated"); + QString name = file.left( file.find("<-", 0, TRUE ) ); + QFileInfo info( name ); + if ( info.isFile() ) + cd(info.dirPath( TRUE ) ); //absolute + else + cd(name ); + reparse(); +} +void OFileSelector::slotInsertLocationPath(const QString ¤tPath, int count) +{ + QStringList pathList; + bool underDog = FALSE; + for(int i=0;itext(i); + if( m_location->text(i) == currentPath) + underDog = TRUE; + } + if( !underDog) { + m_location->clear(); + if( currentPath.left(2)=="//") + pathList.append( currentPath.right(currentPath.length()-1) ); + else + pathList.append( currentPath ); + m_location->insertStringList( pathList,-1); + } +} +/* + * Do not crash anymore + * don't try to change dir to a file + */ +void OFileSelector::locationComboChanged() +{ + QFileInfo info( m_location->lineEdit()->text() ); + qWarning("info %s %s", info.dirPath(true).latin1(), m_location->lineEdit()->text().latin1() ); + if (info.isFile() ) + cd(info.dirPath(TRUE) ); //absolute path + else + cd( m_location->lineEdit()->text() ); + + reparse(); +} +void OFileSelector::init() +{ + m_lay = new QVBoxLayout( this ); + m_lay->setSpacing(0 ); + + m_stack = new QWidgetStack( this ); + if( m_selector == Normal ){ + QString mime; + if (!m_autoMime) { + if (!m_mimetypes.isEmpty() ) { + QMap::Iterator it; + it = m_mimetypes.begin(); // cause we're in the init + mime = it.data().join(";"); + } + } + m_select = new FileSelector(mime, + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL( closeMe() ) ); + //connect to close me and other signals as well + + m_stack->addWidget( m_select, Normal ); + m_stack->raiseWidget( Normal ); + }else{ // we're in init so it will be EXTENDED or EXTENDED_ALL + // and initializeListview will take care of those + // toolbar get's generade in initializeListView + initializeListView( ); // will raise the widget as well + m_stack->raiseWidget( Extended ); + } + m_lay->addWidget( m_stack, 100 ); // add to the layout 10 = stretch + + if( m_shLne ) // the LineEdit with the current FileName + initializeName(); + + if( m_shPerm ) // the Permission QCheckBox + initializePerm(); + + if( m_shChooser ) // the Chooser for the view and Mimetypes + initializeChooser(); + + if( m_shYesNo ) // the Yes No button row + initializeYes( ); + + if (m_selector != Normal ) + reparse(); +} +void OFileSelector::updateMimes() +{ + if( m_autoMime ){ + m_mimetypes.clear(); + m_mimetypes.insert( tr("All"), QString::null ); + if( m_selector == Normal ){ + DocLnkSet set; + Global::findDocuments(&set, QString::null ); + QListIterator dit( set.children() ); + for( ; dit.current(); ++dit ){ + if( !m_mimetypes.contains( (*dit)->type() ) ) + m_mimetypes.insert( (*dit)->type(), (*dit)->type() ); + } + }// else done in reparse + } +} +void OFileSelector::initVars() +{ + if( m_mimetypes.isEmpty() ) + m_autoMime = true; + else + m_autoMime = false; + + m_shClose = false; + m_shNew = false; + m_shTool = true; + m_shPerm = false; + m_shLne = true; + m_shChooser = true; + m_shYesNo = true; + m_case = false; + m_dir = true; + m_files = true; + m_showPopup = false; + + if(m_pixmaps == 0 ) // init the pixmaps + initPics(); + + // pointers + m_location = 0; + m_mimeCheck = 0; + m_viewCheck = 0; + m_homeButton = 0; + m_docButton = 0; + m_hideButton = 0; + m_ok = 0; + m_cancel = 0; + m_reread = 0; + m_up = 0; + m_View = 0; + m_checkPerm = 0; + m_pseudo = 0; + m_pseudoLayout = 0; + m_select = 0; + m_stack = 0; + m_lay = 0; + m_Oselector = 0; + m_boxToolbar = 0; + m_boxOk = 0; + m_boxName = 0; + m_boxView = 0; + m_custom = 0; + m_edit = 0; + m_fnLabel = 0; + m_new = 0; + m_close = 0; +} +void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink) +{ + if(!m_files) + return; + // if( !compliesMime(info->absFilePath(), mime ) ) + // return; + MimeType type( info->absFilePath() ); + if (!compliesMime( type.id() ) ) + return; + +} +void OFileSelector::addDir(const QString &mime, QFileInfo *info, bool symlink ) +{ + if(!m_dir) + return; +} +void OFileSelector::delItems() +{ + +} +void OFileSelector::initializeName() +{ + /** Name Layout Line + * This is the Layout line arranged in + * horizontal way each components + * are next to each other + * but we will only do this if + * we didn't initialize a while ago. + */ + if( m_boxName == 0 ){ + m_boxName = new QHBox( this ); // remove this this? or use a QHBox + m_fnLabel = new QLabel( m_boxName ); + m_fnLabel->setText( tr("Name:") ); + m_edit = new QLineEdit( m_boxName ); + m_edit->setText( m_name ); + //m_boxName->addWidget( m_fnLabel ); + m_boxName->setMargin( 5 ); + m_boxName->setSpacing( 8 ); + //m_boxName->setStretchFactor(m_edit, 100 ); // 100 is stretch factor + + m_lay->addWidget( m_boxName, 0 ); // add it to the topLevel layout + }// else we already initialized + // maybe show the components? + // +} +void OFileSelector::initializeYes() +{ + /** The Save Cancel bar + * + */ + if( m_boxOk == 0 ){ + m_boxOk = new QHBox( this ); + m_ok = new QPushButton( tr("&Save"),m_boxOk , "save" ); + m_cancel = new QPushButton( tr("C&ancel"), m_boxOk, "cancel" ); + + //m_boxOk->addWidget( m_ok ); + //m_boxOk->addWidget( m_cancel ); + m_boxOk->setMargin( 5 ); + m_boxOk->setSpacing( 10 ); + m_lay->addWidget( m_boxOk, 0 ); + + connect( m_ok, SIGNAL( clicked() ), + this, SLOT(slotOk() ) ); + connect( m_cancel, SIGNAL( clicked() ), + this, SLOT( slotCancel() ) ); + } +} +/* + * OK m_mimeCheck is a QComboBox we now want to fill + * out that combobox + * if automime we need to update the mimetypes + */ +void OFileSelector::updateMimeCheck() { + m_mimeCheck->clear(); + if (m_autoMime ) { + //m_mimeCheck->insertItem( tr("All") ); + updateMimes(); + } + + QMap::Iterator it; + for (it = m_mimetypes.begin(); it != m_mimetypes.end(); ++it ) { + m_mimeCheck->insertItem( it.key() ); + } +} + +void OFileSelector::initializeChooser() +{ + if( m_boxView == 0 ){ + m_boxView = new QHBox( this ); + m_viewCheck = new QComboBox( m_boxView, "view check"); + m_mimeCheck = new QComboBox( m_boxView, "mime check"); + m_boxView->setSpacing( 8 ); + m_lay->addWidget(m_boxView, 0 ); + + m_viewCheck->insertItem( tr("Documents") ); + m_viewCheck->insertItem( tr("Files") ); + m_viewCheck->insertItem( tr("All Files") ); + updateMimeCheck(); + + connect( m_viewCheck, SIGNAL( activated(const QString & ) ), + this, SLOT( slotViewCheck(const QString & ) ) ); + connect( m_mimeCheck, SIGNAL( activated(const QString & ) ), + this, SLOT( slotMimeCheck( const QString & ) ) ); + } +} +void OFileSelector::initializeListView() +{ + qWarning("initializeListView"); + if( m_pseudo == 0 ){ + qWarning("init"); + m_pseudo = new QWidget( m_stack, "Pseudo Widget"); + m_pseudoLayout = new QVBoxLayout( m_pseudo ); + // toolbar + m_boxToolbar = new QHBox( m_pseudo ); + m_boxToolbar->setSpacing(0 ); // next to each other please + + // toolbar members + { + // location QComboBox + m_location = new QComboBox( m_boxToolbar ); + m_location->setEditable( TRUE ); + m_location->setDuplicatesEnabled( FALSE ); + connect( m_location, SIGNAL(activated(const QString &) ), + this, SLOT( slotLocationActivated(const QString &) ) ); + connect( m_location->lineEdit(), SIGNAL(returnPressed() ), + this, SLOT(locationComboChanged() ) ); + // UP Button + m_up = new QPushButton(Resource::loadIconSet("up"),"", + m_boxToolbar,"cdUpButton"); + m_up->setFixedSize( QSize( 20, 20 ) ); + connect(m_up ,SIGNAL(clicked()),this,SLOT(cdUP() ) ); + m_up->setFlat(TRUE); + + // Home Button + m_homeButton = new QPushButton(Resource::loadIconSet("home") , + "", m_boxToolbar); + m_homeButton->setFixedSize( QSize( 20, 20 ) ); + connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotHome() ) ); + m_homeButton->setFlat(TRUE); + // Documents Button + m_docButton = new QPushButton(Resource::loadIconSet("DocsIcon"),"", + m_boxToolbar,"docsButton"); + m_docButton->setFixedSize( QSize( 20, 20 ) ); + connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotDoc() ) ); + m_docButton->setFlat(TRUE); + + // Close button + m_close = new QPushButton( Resource::loadIconSet( "close"), "", + m_boxToolbar ); + connect( m_close, SIGNAL(clicked() ), this, SIGNAL(closeMe() ) ); + m_close->setFixedSize( 20, 20 ); + + m_boxToolbar->setFixedHeight( 20 ); + m_pseudoLayout->addWidget(m_boxToolbar ); + + // let;s fill the Location ComboBox + StorageInfo storage; + const QList &fs = storage.fileSystems(); + QListIterator 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("Set Permission"), this, "perm"); + m_checkPerm->setChecked( false ); + m_lay->addWidget( m_checkPerm ); + + } +} +void OFileSelector::initPics() +{ + m_pixmaps = new QMap; + QPixmap pm = Resource::loadPixmap( "folder" ); + QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); + QPainter painter( &pm ); + painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); + pm.setMask( pm.createHeuristicMask( FALSE ) ); + m_pixmaps->insert("dirsymlink", pm ); + + QPixmap pm2 = Resource::loadPixmap( "lockedfolder" ); + QPainter pen(&pm2 ); + pen.drawPixmap(pm2.width()-lnk.width(), pm2.height()-lnk.height(), lnk ); + pm2.setMask( pm2.createHeuristicMask( FALSE ) ); + m_pixmaps->insert("symlinkedlocked", pm2 ); +} +// if a mime complies with the m_mimeCheck->currentItem +bool OFileSelector::compliesMime( const QString &path, const QString &mime ) +{ + if( mime == "All" ) + return true; + MimeType type( path ); + if( type.id() == mime ) + return true; + return false; +} +/* check if the mimetype in mime + * complies with the one which is current + */ +/* + * We've the mimetype of the file + * We need to get the stringlist of the current mimetype + * + * mime = image/jpeg + * QStringList = 'image/*' + * or QStringList = image/jpeg;image/png;application/x-ogg + * or QStringList = application/x-ogg;image/*; + * with all these mime filters it should get acceptes + * to do so we need to look if mime is contained inside + * the stringlist + * if it's contained return true + * if not ( I'm no RegExp expert at all ) we'll look if a '/*' + * is contained in the mimefilter and then we will + * look if both are equal until the '/' + */ +bool OFileSelector::compliesMime( const QString& mime ) { + qWarning("mimetype is %s", mime.latin1() ); + QString currentText; + if (m_shChooser ) + currentText = m_mimeCheck->currentText(); + + qWarning("current text is %s", currentText.latin1() ); + QMap::Iterator it; + QStringList list; + if ( currentText == tr("All") ) return true; + else if ( currentText.isEmpty() && !m_mimetypes.isEmpty() ) { + it = m_mimetypes.begin(); + list = it.data(); + }else if ( currentText.isEmpty() ) return true; + else{ + it = m_mimetypes.find(currentText ); + if ( it == m_mimetypes.end() ) qWarning("not there"), list << currentText; + else qWarning("found"), list = it.data(); + } + // dump it now + //for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + // qWarning( "%s", (*it).latin1() ); + //} + + + if ( list.contains(mime) ) return true; + qWarning("list doesn't contain it "); + QStringList::Iterator it2; + int pos; + int pos2; + for ( it2 = list.begin(); it2 != list.end(); ++it2 ) { + pos = (*it2).findRev("/*"); + if ( pos >= 0 ) { + if ( mime.contains( (*it2).left(pos) ) ) return true; + } + } + return false; +} +void OFileSelector::slotFileSelected( const QString &string ) +{ + if( m_shLne ) + m_edit->setText( string ); + emit fileSelected( string ); +} +void OFileSelector::slotFileBridgeSelected( const DocLnk &lnk ) +{ + slotFileSelected( lnk.name() ); + // emit fileSelected( lnk ); +} +void OFileSelector::slotSelectionChanged() +{ + +} +void OFileSelector::slotCurrentChanged(QListViewItem* item ) +{ + if( item == 0 ) + return; + if( m_selector == Extended || m_selector == ExtendedAll ) { + OFileSelectorItem *sel = (OFileSelectorItem*) item; // start to use the C++ casts ;) + qWarning("current changed"); + if(!sel->isDir() ){ + if( m_shLne ) + m_edit->setText( sel->text(1) ); + + if (m_mode == Fileselector ) { + QStringList str = QStringList::split("->", sel->text(1) ); + QString path =sel->directory() + "/" + str[0].stripWhiteSpace(); + emit fileSelected(path ); + DocLnk lnk( path ); + emit fileSelected(lnk ); + } + } + } +} +void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &, int) +{ + if ( item == 0 ) + return; + + if( button != Qt::LeftButton ) + return; + + switch( m_selector ){ + default: + break; + case Extended: // fall through + case ExtendedAll:{ + OFileSelectorItem *sel = (OFileSelectorItem*)item; + if(!sel->isLocked() ){ + QStringList str = QStringList::split("->", sel->text(1) ); + if( sel->isDir() ){ + cd( sel->directory() + "/" + str[0].stripWhiteSpace() ); + // if MODE Dir m_shLne set the Text + }else{ + if( m_shLne ) + m_edit->setText( str[0].stripWhiteSpace() ); + qWarning("selected here in slot clicked"); + emit fileSelected( sel->directory() + "/" + str[0].stripWhiteSpace() ); + DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() ); + qWarning("file selected"); + emit fileSelected( lnk ); + } + } + break; + } + } +} +void OFileSelector::slotRightButton(int button, QListViewItem *item, const QPoint &, int ) +{ + if( item == 0 ) + return; + + if( button != Qt::RightButton ) + return; + slotContextMenu( item ); +} +void OFileSelector::slotContextMenu( QListViewItem *item) +{ + +} +void OFileSelector::slotChangedDir() +{ + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + if(sel->isDir() ){ + QStringList str = QStringList::split("->", sel->text(1) ); + cd( sel->directory() + "/" + str[0].stripWhiteSpace() ); + } +} +void OFileSelector::slotOpen() +{ + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + if(!sel->isDir() ){ + QStringList str = QStringList::split("->", sel->text(1) ); + slotFileSelected( sel->directory() +"/" +str[0].stripWhiteSpace() ); + qWarning("slot open"); + // DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() ); + //emit fileSelected( lnk ); + } +} +void OFileSelector::slotRescan() +{ + +} +void OFileSelector::slotRename() +{ + reparse(); +} +void OFileSelector::slotDelete() +{ + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + QStringList list = QStringList::split("->", sel->text(1) ); + if( sel->isDir() ){ + QString str = QString::fromLatin1("rm -rf ") + sel->directory() +"/" + list[0]; //better safe than sorry + switch ( QMessageBox::warning(this,tr("Delete"),tr("Do you really want to delete\n")+list[0], + tr("Yes"),tr("No"),0,1,1) ) { + case 0: + ::system(str.utf8().data() ); + break; + } + } else { + QFile::remove( list[0] ); + } + m_View->takeItem( sel ); + delete sel; +} +void OFileSelector::cdUP() +{ + QDir dir( m_currentDir ); + dir.cdUp(); + if(dir.exists() ){ + m_currentDir = dir.absPath(); + reparse(); + int count = m_location->count(); + slotInsertLocationPath( m_currentDir, count); + m_location->setCurrentItem( indexByString( m_location, m_currentDir)); + //this wont work in all instances + // FIXME + } +} +void OFileSelector::slotHome() +{ + cd(QDir::homeDirPath() ); +} +void OFileSelector::slotDoc() +{ + cd(QPEApplication::documentDir() ); +} +void OFileSelector::slotNavigate( ) +{ + +} +// fill the View with life +void OFileSelector::reparse() +{ + if( m_selector == Normal ) + return; + if( m_selector == Extended || m_selector == ExtendedAll ) + 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.insert( type.id(), type.id() ); + } + + ++it; + } + // add them to the chooser + updateMimeCheck(); + m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) ); + currentMimeType = m_mimeCheck->currentText(); + } + }else { // no autoMime + // let the mimetype be set from out side the m_mimeCheck FEATURE + + if( m_shChooser ){ + currentMimeType = m_mimeCheck->currentText(); +// updateMimeCheck(); + } + } + // now we got our mimetypes we can add the files + + QDir dir( m_currentDir ); + + 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 == ExtendedAll /*|| 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 +} + + +OFileView* OFileSelector::currentView() { + return 0l; +} +int OFileSelector::filter() { + int filter; + if ( m_selector == ExtendedAll ) + filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All; + else + filter = QDir::Files | QDir::Dirs | QDir::All ; + + return filter; +} +int OFileSelector::sorting() { + int sort; + + if (m_case ) + sort = ( QDir::IgnoreCase | QDir::Name | QDir::DirsFirst | QDir::Reversed ); + else + sort = ( QDir::Name | QDir::DirsFirst | QDir::Reversed ); + + return sort; +} +void OFileSelector::internFileSelected( const QString& s) { + emit fileSelected( s ); +} +void OFileSelector::internFileSelected( const DocLnk& d ) { + emit fileSelected( d ); +} +void OFileSelector::internContextMenu() { + emit contextMenu(); +} +void OFileSelector::internChangedDir( const QString& s) { + emit dirSelected( s ); +} +void OFileSelector::internChangedDir( const QDir& s) { + emit dirSelected( s ); +} diff --git a/libopie/ofileselector/ofileselector.h b/libopie/ofileselector/ofileselector.h new file mode 100644 index 0000000..937569d --- a/dev/null +++ b/libopie/ofileselector/ofileselector.h @@ -0,0 +1,474 @@ +/* + This is based on code and ideas of + L. J. Potter ljp@llornkcor.com + Thanks a lot + + +               =. This file is part of the OPIE Project +             .=l. Copyright (c) 2002 Holger Freyther +           .>+-= + _;:,     .>    :=|. 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_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef opiefileselector_h +#define opiefileselector_h + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/** 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 QGridLayout; +class QLineEdit; +class QLabel; +class QWidgetStack; +class QHBoxLayout; +class QVBoxLayout; +class QPopupMenu; +class QFileInfo; +class QHBox; +class OFileView; +// + +/* the mimetypes one name and a list of mimetypes */ +typedef QMap< QString, QStringList> MimeTypes; + +/** + * FIXME later + */ +struct OPopupMenuFactory { + OPopupMenuFactory() {} + +}; + + +/** + * Opie the default OFileSelector + * It features multiple views. + */ +class OFileSelector : public QWidget { + Q_OBJECT + + /* friends are evil but I don't want to make the + * methods public + */ + friend class OLister; + friend class OFileView; + public: + /** + * The mode of the file selector + * Either open, save, fileselector or dir browsing mode + * + */ + enum Mode {Open = 1, Save = 2, Fileselector = 4, Dir = 8 }; + + /** + * Selector. Either Normal for the one shipped with + * libqpe or Extended. for the Extended + * ExtendedAll also shows 'hidden' files + */ + enum Selector{Normal=0, Extended = 1, ExtendedAll =2 }; + + /** + * This is reserved for futrue views + */ + enum View { Dirs = 1, Files = 2, Tree = 4, Icon = 8 }; + + /** + * A c'tor which should be used for advanced mode + * @param wid the parent + * @param mode the Mode of the Selector + * @param selector the current View of the Selector + * @param dirName in which dir to start + * @param fileName a proposed filename + * @param mimetypes A list of mimetypes \ + * QString is for a identifier name like "Text files" + * the coresponding QStringList is used for the mimetypes + * if empty it'll fill the list of mimetypes depending + * on the content of the current directory + */ + + OFileSelector(QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName = QString::null, + const MimeTypes &mimetypes = MimeTypes() ); + + + /** + * This is a QPE compatible c'tor + */ + OFileSelector(const QString &mimeFilter, QWidget *parent, + const char *name, bool newVisible = TRUE, + bool closeVisible = FALSE ); + + ~OFileSelector(); + + // currently only for the FileSelector Mode + /* compability mode but only work + * with FileSelector + */ + void setNewVisible( bool /*b*/ ); + void setCloseVisible(bool /*b*/ ); + + // end file selector mode + // deprecated + void reread(); + // make sure not to leak please + const DocLnk *selected(); + // end deprecated + + /** + * @return if the toolbar is visible + */ + bool isToolbarVisible() const { return m_shTool; }; + + /** + * @return if the permissionBas is visible + */ + bool isPermissionBarVisible() const { return m_shPerm; }; + + /** + * @return if the lineEdit is visible + */ + bool isLineEditVisible()const { return m_shLne; }; + + /** + * if the chooser is visible + */ + bool isChooserVisible( )const { return m_shChooser; }; + + /** + * @return if the yesCancel Bar is visible + */ + bool isYesCancelVisible()const { return m_shYesNo; }; + + /** + * set Yes/Cancel visible + */ + void setYesCancelVisible( bool show ); + + /** + * set the toolbar visible + */ + void setToolbarVisible( bool show ); + + /** + * set the permissionBar to be visible + */ + void setPermissionBarVisible( bool show ); + + /** + * set the lineedit for file entering visible + */ + void setLineEditVisible(bool show) ; + + /** + * set the chooser is visible + */ + void setChooserVisible( bool chooser ); + + /** + * The permissionCheckbox + * + */ + QCheckBox* permissionCheckbox(); + + /** + * setPermission + */ + bool setPermission() const; + + /** + * set ther permission to bool + */ + void setPermissionChecked( bool check ); + + /** + * set the Selector Mode + */ + void setMode( int ); + + /** + * whether or not to show dirs + */ + bool showDirs()const { return m_dir; } + + /** + * setShowDirs + */ + void setShowDirs(bool ); + + /** + * set CaseSensetive + */ + bool isCaseSensetive()const { return m_case; } + + /** + * set if to be case sensetive + */ + void setCaseSensetive(bool caSe ); + + /** + * @return if to show files + */ + bool showFiles()const { return m_files; }; + + /** + * set if files should be shown + */ + void setShowFiles(bool ); + + /** + * change dir to path + */ + bool cd(const QString &path ); + + + /** + * return the mode of the fileselector + */ + int mode()const { return m_mode; }; + + /** + * return the selector + */ + int selector()const { return m_selector; }; + + /** + * set the Selector + */ + void setSelector( int ); + + /** + * wether or not to show popups + */ + bool showPopup()const { return m_showPopup; }; + + /** + * set show popups + */ + void setShowPopup( bool pop ) { m_showPopup = pop; } + + /** + * set the popup factory + */ + void setPopupFactory( OPopupMenuFactory * ); + + /** + * reparse the current directory and updates + * the views + mimetypes + */ + void reparse(); // re reads the dir + + /** + * return the selected name + */ + QString selectedName( )const; + + /** + * for multiple selections return multiple + * filenames + */ + QStringList selectedNames()const; + + /** + * return the complete to the file + */ + QString selectedPath() const; + + /** + * return the completed paths + */ + QStringList selectedPaths() const; + + /** + * the current directory + */ + QString directory()const; + + /** + * fileCount + */ + int fileCount(); + + DocLnk selectedDocument()const; + + QValueList selectedDocuments()const; + + OFileView* currentView(); + int filter(); + int sorting(); + + signals: + void fileSelected( const DocLnk & ); + void fileSelected( const QString & ); + void dirSelected(const QString &dir ); + void dirSelected( const QDir& ); + void closeMe(); + void ok(); + void cancel(); + void contextMenu(); + + private slots: + void slotOk(); + void slotCancel(); + void slotViewCheck(const QString & ); + void slotMimeCheck(const QString & ); + void slotLocationActivated(const QString & ); + void slotInsertLocationPath(const QString &, int); + void locationComboChanged(); + + private: + void init(); + void updateMimes(); + + + private: + + FileSelector* m_select; + int m_mode, m_selector; + QComboBox *m_location, *m_mimeCheck, *m_viewCheck; + QPushButton *m_homeButton, *m_docButton, *m_hideButton, *m_ok, *m_cancel; + QPushButton *m_reread, *m_up, *m_new, *m_close; + QListView *m_View; + QCheckBox *m_checkPerm; + QWidget *m_pseudo; + QVBoxLayout *m_pseudoLayout; + + QString m_currentDir; + QString m_name; +// QStringList m_mimetypes; + QMap m_mimetypes; + + + QWidgetStack *m_stack; + QVBoxLayout *m_lay; + QGridLayout *m_Oselector; + + QHBox *m_boxToolbar; + QHBox *m_boxOk; // (no layout anymore) wait + QHBox *m_boxName; // (no Layout anymore) wait + QHBox *m_boxView; + + QPopupMenu *m_custom; + + 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; + + void initVars(); + virtual void addFile(const QString &mime, QFileInfo *info, bool symlink = FALSE ); + virtual void addDir( const QString &mime, QFileInfo *info , bool symlink = FALSE ); + virtual void addSymlink(const QString &, QFileInfo *, bool = FALSE ){}; + void delItems(); + void initializeName(); + void initializeYes(); + void initializeChooser(); + void initializeListView(); + void initializePerm(); + void initPics(); + bool compliesMime(const QString &path, + const QString &mime); + bool compliesMime(const QString& mime ); + /** + * Updates the QComboBox with the current mimetypes + */ + void updateMimeCheck(); + + /** + * Returns the current mimetype + */ + QString currentMimeType()const; + class OFileSelectorPrivate; + OFileSelectorPrivate *d; + static QMap *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( ); + + /* for OLister */ +private: + + /* for OFileView */ +private: + void internFileSelected( const QString& ); + void internFileSelected( const DocLnk& ); + void internContextMenu(); + void internChangedDir( const QString& ); + void internChangedDir( const QDir& ) ; + +}; + + +#endif + diff --git a/libopie/ofileselector/ofileselectoritem.cpp b/libopie/ofileselector/ofileselectoritem.cpp new file mode 100644 index 0000000..1e745a1 --- a/dev/null +++ b/libopie/ofileselector/ofileselectoritem.cpp @@ -0,0 +1,53 @@ +#include "ofileselectoritem.h" + +OFileSelectorItem::OFileSelectorItem( QListView*view, + const QPixmap& pix, + const QString& path, + const QString& date, + const QString& size, + const QString& dir, + bool isLocked, + bool isDir ) + : QListViewItem( view ) +{ + setPixmap( 0, pix ); + setText( 1, path ); + setText( 2, size ); + setText( 3, date ); + m_dir = isDir; + m_locked = isLocked; + m_dirStr = dir; +} +OFileSelectorItem::~OFileSelectorItem() { +} +bool OFileSelectorItem::isLocked()const { + return m_locked; +} +QString OFileSelectorItem::directory()const { + return m_dirStr; +} +bool OFileSelectorItem::isDir()const { + return m_dir; +} +QString OFileSelectorItem::path() const { + return text(1); +} +QString OFileSelectorItem::key( int id, bool ) { + QString ke; + + if( id == 0 || id == 1 ){ // name + if( m_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; +} diff --git a/libopie/ofileselector/ofileselectoritem.h b/libopie/ofileselector/ofileselectoritem.h new file mode 100644 index 0000000..21460c4 --- a/dev/null +++ b/libopie/ofileselector/ofileselectoritem.h @@ -0,0 +1,30 @@ +#ifndef OPIE_FILE_SELECTOR_ITEM_H +#define OPIE_FILE_SELECTOR_ITEM_H + +#include + +class OFileSelectorItem : public QListViewItem { +public: + OFileSelectorItem( QListView* view, + const QPixmap&, + const QString& path, + const QString& date, + const QString& size, + const QString& dir, + bool isLocked, + bool isDir = false); + ~OFileSelectorItem(); + bool isLocked() const; + QString directory()const; + bool isDir()const; + QString path()const; + QString key(int id, bool ); + +private: + bool m_locked : 1; + bool m_dir : 1; + QString m_dirStr; + +}; + +#endif diff --git a/libopie/ofileselector/ofileview.cpp b/libopie/ofileselector/ofileview.cpp new file mode 100644 index 0000000..71843c1 --- a/dev/null +++ b/libopie/ofileselector/ofileview.cpp @@ -0,0 +1,28 @@ +#include + +#include "ofileselector.h" + +#include "ofileview.h" + + +OFileView::OFileView( OFileSelector* sel) + : m_sel( sel ) +{ +} +OFileView::~OFileView() { +} +void OFileView::fileSelected( const QString& s ) { + m_sel->internFileSelected( s ); +} +void OFileView::fileSelected( const DocLnk& s) { + m_sel->internFileSelected( s ); +} +void OFileView::contextMenu() { + m_sel->internContextMenu(); +} +void OFileView::changedDir( const QString& s) { + m_sel->internChangedDir( s ); +} +void OFileView::changedDir( const QDir& d ) { + m_sel->internChangedDir( d ); +} diff --git a/libopie/ofileselector/ofileview.h b/libopie/ofileselector/ofileview.h new file mode 100644 index 0000000..997266a --- a/dev/null +++ b/libopie/ofileselector/ofileview.h @@ -0,0 +1,109 @@ +/* +               =. This file is part of the OPIE Project +             .=l. Copyright (c) 2002 zecke +           .>+-= + _;:,     .>    :=|. 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_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef ofileview_h +#define ofileview_h + +#include +#include +#include + +class QFileInfo; +class QDir; +class DocLnk; + +/** + * A OFileView is a specialised View for the + * OFileSelector + * With a View you can chage the user visible + * representation of a OFileLister + * OFileView is just a basic interface which helps you to + * write new views + */ +class OFileSelector; +class OFileView { +public: + OFileView( OFileSelector* ); + OFileView(); + virtual ~OFileView(); + + virtual void clear() = 0; + virtual void addFile(const QString &mine, + QFileInfo *info, + bool isSymlink = FALSE ) = 0; + virtual void addFile(const QString& mine, const QString& dir, + const QString& file, bool = FALSE ) = 0; + + virtual void addDir (const QString &mine, + QFileInfo *info, + bool isSymlink = FALSE ) = 0; + virtual void addDir (const QString& mine, const QString& dir, + const QString& file, bool = FALSE) = 0; + + virtual void addSymlink(const QString &mime, + QFileInfo *info, + bool isSymlink = FALSE ) = 0; + virtual void addSymlink(const QString& mine, + const QString& path, + const QString& file, + bool isSymlink = FALSE ) = 0; + + virtual void cd(const QString &path ) = 0; + virtual QWidget* widget() = 0; + + virtual QString selectedName()const = 0; + virtual QStringList selectedNames()const = 0; + virtual QString selectedPath()const = 0; + virtual QStringList selectedPaths()const = 0; + virtual int fileCount() = 0; + +/*signals:*/ +protected: + + void fileSelected(const QString &); + void fileSelected(const DocLnk & ); + void contextMenu(); + void changedDir(const QString &); + void changedDir(const QDir & ); + OFileSelector* selector(); + +private: + OFileSelector* m_sel; +}; + +class OFileViewFactory { + public: + OFileViewFactory() {} ; + virtual ~OFileViewFactory() = 0; + + OFileView* newView(QWidget *parent, const char *name ); + QString name()const; +}; + + +#endif -- cgit v0.9.0.2