-rw-r--r-- | libopie/ofileselector/ofiledialog.cpp | 116 | ||||
-rw-r--r-- | libopie/ofileselector/ofiledialog.h | 77 | ||||
-rw-r--r-- | libopie/ofileselector/ofilelistview.cpp | 118 | ||||
-rw-r--r-- | libopie/ofileselector/ofilelistview.h | 45 | ||||
-rw-r--r-- | libopie/ofileselector/ofileselector.cpp | 1246 | ||||
-rw-r--r-- | libopie/ofileselector/ofileselector.h | 474 | ||||
-rw-r--r-- | libopie/ofileselector/ofileselectoritem.cpp | 53 | ||||
-rw-r--r-- | libopie/ofileselector/ofileselectoritem.h | 30 | ||||
-rw-r--r-- | libopie/ofileselector/ofileview.cpp | 28 | ||||
-rw-r--r-- | libopie/ofileselector/ofileview.h | 109 |
10 files changed, 2296 insertions, 0 deletions
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_,=:_. -<s. This library is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include <qpe/applnk.h> +#include <qstring.h> +#include <qapplication.h> +#include <qlayout.h> + +#include "ofiledialog.h" + +OFileDialog::OFileDialog(const QString &caption, + QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName, + const QMap<QString,QStringList>& mimetypes ) + : QDialog( wid, "OFileDialog", true ) +{ + // QVBoxLayout *lay = new QVBoxLayout(this); + //showMaximized(); + QVBoxLayout *lay = new QVBoxLayout(this ); + file = new OFileSelector(this , mode, selector, + dirName, fileName, + mimetypes ); + lay->addWidget( file ); + + //lay->addWidget( file ); + //showFullScreen(); + setCaption( caption.isEmpty() ? tr("FileDialog") : caption ); + connect(file, SIGNAL(fileSelected(const QString&) ), + this, SLOT(slotFileSelected(const QString&) ) ); + + connect(file, SIGNAL(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 <zecke@handhelds.org> + .>+-= + _;:, .> :=|. This library is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This library is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + + +#ifndef OpieFileDialog_h +#define OpieFileDialog_h + +#include <qdialog.h> + +#include <opie/ofileselector.h> + +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 <qlistview.h> + +#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 <qcheckbox.h> +#include <qcombobox.h> +#include <qheader.h> +#include <qlabel.h> +#include <qabstractlayout.h> +#include <qlayout.h> +#include <qlineedit.h> +#include <qlistview.h> +#include <qmessagebox.h> +#include <qpainter.h> +#include <qpushbutton.h> +#include <qwidgetstack.h> +#include <qpopupmenu.h> +#include <qdir.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qtimer.h> + +#include <qpe/qpeapplication.h> +#include <qpe/applnk.h> +#include <qpe/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 "ofileview.h" +#include "ofileselector.h" + + +QMap<QString,QPixmap> *OFileSelector::m_pixmaps = 0; + +namespace { + int indexByString( const QComboBox *box, const QString &str ){ + int index= 0; + for(int i= 0; i < box->count(); i++ ){ + if( str == box->text(i ) ){ + index= i; + break; + } + } + return index; + } + +} + +OFileSelector::OFileSelector( QWidget *wid, int mode, int selector, + const QString &dirName, + const QString &fileName, + const QMap<QString,QStringList>& mimeTypes) + : QWidget( wid, "OFileSelector") +{ + m_mimetypes = mimeTypes; + if (mode == Save ) + m_name = fileName; + initVars(); + m_mode = mode; + m_selector = selector; + m_currentDir = dirName; + init(); + //QTimer::singleShot(6*1000, this, SLOT( slotTest() ) ); +} + +OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, + const char *name, bool newVisible, + bool closeVisible ) + : QWidget( parent, name ) +{ + if (!mimeFilter.isEmpty() ) { + QStringList list = QStringList::split(";", mimeFilter ); + m_mimetypes.insert(mimeFilter, list ); + } + initVars(); + m_currentDir = QPEApplication::documentDir(); + m_mode = Fileselector; + m_selector = Normal; + m_shClose = closeVisible; + m_shNew = newVisible; + m_shLne = false; + m_shPerm = false; + m_shYesNo = false; + init(); + + +} + +OFileSelector::~OFileSelector() +{ + + +} + +void OFileSelector::setNewVisible( bool visible ) +{ + m_shNew = visible; + if( m_selector == Normal ){ + delete m_select; + // we need to initialize but keep the selected mimetype + QString mime = currentMimeType(); + m_select = new FileSelector( mime , + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, Normal ); + }else{ + m_new->show(); + } +} +void OFileSelector::setCloseVisible( bool visible ) +{ + m_shClose = visible; + if( m_selector == Normal ){ + setNewVisible( m_shNew ); // yeah baby + }else{ + m_close->show(); + } +} +void OFileSelector::reread() +{ + if( m_selector == Normal ){ + setNewVisible( m_shNew ); // make it a initializeSelector + }else { + 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<DocLnk> OFileSelector::selectedDocuments() const +{ + QValueList<DocLnk> docs; + docs.append( selectedDocument() ); + return docs; +} + + +// slots internal + +void OFileSelector::slotOk() +{ + emit ok(); +} +void OFileSelector::slotCancel() +{ + emit cancel(); +} +void OFileSelector::slotViewCheck(const QString &sel) +{ + if( sel == tr("Documents" ) ){ + if( m_select == 0 ){ + // autMime? fix cause now we use All and not the current + // yes currentMime fixes that for us + QString mime = currentMimeType(); + m_select = new FileSelector(mime, + m_stack, "fileselector", + m_shNew, m_shClose); + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + + m_stack->addWidget( m_select, Normal ); + } + m_stack->raiseWidget( Normal ); + m_selector = Normal; + }else if( sel == tr("Files") ){ + m_selector = Extended; + initializeListView(); + reparse(); + m_stack->raiseWidget( Extended ); + }else if( sel == tr("All Files") ){ + m_selector = 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<QString, QStringList>::ConstIterator it; + it = m_mimetypes.find( currentText ); + if ( it == m_mimetypes.end() ) { + mime = it.data().join(";"); + }else{ + mime = currentText; + } + } + return mime; +} +void OFileSelector::slotMimeCheck(const QString &mime) +{ + if( m_selector == Normal ){ + //if( m_autoMime ){ + QString newMimeType; + if (mime != tr("All") ) { + QMap<QString, QStringList>::Iterator it; + it = m_mimetypes.find(mime); + if ( it != m_mimetypes.end() ) { + newMimeType = it.data().join(";"); + }else{ + newMimeType = mime; + } + } + delete m_select; + m_select = new FileSelector( newMimeType, + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL(closeMe() ) ); + //connect to close me and other signals as well + m_stack->addWidget( m_select, Normal ); + m_stack->raiseWidget( Normal ); + updateMimes(); + updateMimeCheck(); + m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); + //} + }else{ // others + qWarning("Mime %s", mime.latin1() ); + if(m_shChooser ){ + qWarning("Current Text %s", m_mimeCheck->currentText().latin1() ); + //m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); + } + reparse(); + } + +} +/* + * Ok if a non dir gets inserted into this combobox + * we need to change it + * QFileInfo and dirPath will give us the right Dir + */ +void OFileSelector::slotLocationActivated(const QString &file) +{ + qWarning("slotLocationActivated"); + QString name = file.left( file.find("<-", 0, TRUE ) ); + QFileInfo info( name ); + if ( info.isFile() ) + cd(info.dirPath( TRUE ) ); //absolute + else + cd(name ); + reparse(); +} +void OFileSelector::slotInsertLocationPath(const QString ¤tPath, int count) +{ + QStringList pathList; + bool underDog = FALSE; + for(int i=0;i<count;i++) { + pathList << m_location->text(i); + if( m_location->text(i) == currentPath) + underDog = TRUE; + } + if( !underDog) { + m_location->clear(); + if( currentPath.left(2)=="//") + pathList.append( currentPath.right(currentPath.length()-1) ); + else + pathList.append( currentPath ); + m_location->insertStringList( pathList,-1); + } +} +/* + * Do not crash anymore + * don't try to change dir to a file + */ +void OFileSelector::locationComboChanged() +{ + QFileInfo info( m_location->lineEdit()->text() ); + qWarning("info %s %s", info.dirPath(true).latin1(), m_location->lineEdit()->text().latin1() ); + if (info.isFile() ) + cd(info.dirPath(TRUE) ); //absolute path + else + cd( m_location->lineEdit()->text() ); + + reparse(); +} +void OFileSelector::init() +{ + m_lay = new QVBoxLayout( this ); + m_lay->setSpacing(0 ); + + m_stack = new QWidgetStack( this ); + if( m_selector == Normal ){ + QString mime; + if (!m_autoMime) { + if (!m_mimetypes.isEmpty() ) { + QMap<QString, QStringList>::Iterator it; + it = m_mimetypes.begin(); // cause we're in the init + mime = it.data().join(";"); + } + } + m_select = new FileSelector(mime, + m_stack, "fileselector", + m_shNew, m_shClose); + + connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), + this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); + connect(m_select, SIGNAL(closeMe() ), + this, SIGNAL( closeMe() ) ); + //connect to close me and other signals as well + + m_stack->addWidget( m_select, Normal ); + m_stack->raiseWidget( Normal ); + }else{ // we're in init so it will be EXTENDED or EXTENDED_ALL + // and initializeListview will take care of those + // toolbar get's generade in initializeListView + initializeListView( ); // will raise the widget as well + m_stack->raiseWidget( Extended ); + } + m_lay->addWidget( m_stack, 100 ); // add to the layout 10 = stretch + + if( m_shLne ) // the LineEdit with the current FileName + initializeName(); + + if( m_shPerm ) // the Permission QCheckBox + initializePerm(); + + if( m_shChooser ) // the Chooser for the view and Mimetypes + initializeChooser(); + + if( m_shYesNo ) // the Yes No button row + initializeYes( ); + + if (m_selector != Normal ) + reparse(); +} +void OFileSelector::updateMimes() +{ + if( m_autoMime ){ + m_mimetypes.clear(); + m_mimetypes.insert( tr("All"), QString::null ); + if( m_selector == Normal ){ + DocLnkSet set; + Global::findDocuments(&set, QString::null ); + QListIterator<DocLnk> dit( set.children() ); + for( ; dit.current(); ++dit ){ + if( !m_mimetypes.contains( (*dit)->type() ) ) + m_mimetypes.insert( (*dit)->type(), (*dit)->type() ); + } + }// else done in reparse + } +} +void OFileSelector::initVars() +{ + if( m_mimetypes.isEmpty() ) + m_autoMime = true; + else + m_autoMime = false; + + m_shClose = false; + m_shNew = false; + m_shTool = true; + m_shPerm = false; + m_shLne = true; + m_shChooser = true; + m_shYesNo = true; + m_case = false; + m_dir = true; + m_files = true; + m_showPopup = false; + + if(m_pixmaps == 0 ) // init the pixmaps + initPics(); + + // pointers + m_location = 0; + m_mimeCheck = 0; + m_viewCheck = 0; + m_homeButton = 0; + m_docButton = 0; + m_hideButton = 0; + m_ok = 0; + m_cancel = 0; + m_reread = 0; + m_up = 0; + m_View = 0; + m_checkPerm = 0; + m_pseudo = 0; + m_pseudoLayout = 0; + m_select = 0; + m_stack = 0; + m_lay = 0; + m_Oselector = 0; + m_boxToolbar = 0; + m_boxOk = 0; + m_boxName = 0; + m_boxView = 0; + m_custom = 0; + m_edit = 0; + m_fnLabel = 0; + m_new = 0; + m_close = 0; +} +void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink) +{ + if(!m_files) + return; + // if( !compliesMime(info->absFilePath(), mime ) ) + // return; + MimeType type( info->absFilePath() ); + if (!compliesMime( type.id() ) ) + return; + +} +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<QString, QStringList>::Iterator it; + for (it = m_mimetypes.begin(); it != m_mimetypes.end(); ++it ) { + m_mimeCheck->insertItem( it.key() ); + } +} + +void OFileSelector::initializeChooser() +{ + if( m_boxView == 0 ){ + m_boxView = new QHBox( this ); + m_viewCheck = new QComboBox( m_boxView, "view check"); + m_mimeCheck = new QComboBox( m_boxView, "mime check"); + m_boxView->setSpacing( 8 ); + m_lay->addWidget(m_boxView, 0 ); + + m_viewCheck->insertItem( tr("Documents") ); + m_viewCheck->insertItem( tr("Files") ); + m_viewCheck->insertItem( tr("All Files") ); + updateMimeCheck(); + + connect( m_viewCheck, SIGNAL( activated(const QString & ) ), + this, SLOT( slotViewCheck(const QString & ) ) ); + connect( m_mimeCheck, SIGNAL( activated(const QString & ) ), + this, SLOT( slotMimeCheck( const QString & ) ) ); + } +} +void OFileSelector::initializeListView() +{ + qWarning("initializeListView"); + if( m_pseudo == 0 ){ + qWarning("init"); + m_pseudo = new QWidget( m_stack, "Pseudo Widget"); + m_pseudoLayout = new QVBoxLayout( m_pseudo ); + // toolbar + m_boxToolbar = new QHBox( m_pseudo ); + m_boxToolbar->setSpacing(0 ); // next to each other please + + // toolbar members + { + // location QComboBox + m_location = new QComboBox( m_boxToolbar ); + m_location->setEditable( TRUE ); + m_location->setDuplicatesEnabled( FALSE ); + connect( m_location, SIGNAL(activated(const QString &) ), + this, SLOT( slotLocationActivated(const QString &) ) ); + connect( m_location->lineEdit(), SIGNAL(returnPressed() ), + this, SLOT(locationComboChanged() ) ); + // UP Button + m_up = new QPushButton(Resource::loadIconSet("up"),"", + m_boxToolbar,"cdUpButton"); + m_up->setFixedSize( QSize( 20, 20 ) ); + connect(m_up ,SIGNAL(clicked()),this,SLOT(cdUP() ) ); + m_up->setFlat(TRUE); + + // Home Button + m_homeButton = new QPushButton(Resource::loadIconSet("home") , + "", m_boxToolbar); + m_homeButton->setFixedSize( QSize( 20, 20 ) ); + connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotHome() ) ); + m_homeButton->setFlat(TRUE); + // Documents Button + m_docButton = new QPushButton(Resource::loadIconSet("DocsIcon"),"", + m_boxToolbar,"docsButton"); + m_docButton->setFixedSize( QSize( 20, 20 ) ); + connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotDoc() ) ); + m_docButton->setFlat(TRUE); + + // Close button + m_close = new QPushButton( Resource::loadIconSet( "close"), "", + m_boxToolbar ); + connect( m_close, SIGNAL(clicked() ), this, SIGNAL(closeMe() ) ); + m_close->setFixedSize( 20, 20 ); + + m_boxToolbar->setFixedHeight( 20 ); + m_pseudoLayout->addWidget(m_boxToolbar ); + + // let;s fill the Location ComboBox + StorageInfo storage; + const QList<FileSystem> &fs = storage.fileSystems(); + QListIterator<FileSystem> it ( fs ); + for( ; it.current(); ++it ){ + const QString disk = (*it)->name(); + const QString path = (*it)->path(); + m_location->insertItem(path+ "<-"+disk ); + } + int count = m_location->count(); + m_location->insertItem( m_currentDir ); + m_location->setCurrentItem( count ); + // due to the New and Close button we can not simply hide m_boxToolBar to not show it + if( !m_shTool ){ + m_location->hide( ); + m_up->hide( ); + m_homeButton->hide( ); + m_docButton->hide( ); + } + if(!m_shClose ) + m_close->hide(); + //if(!m_shNew) + //m_close->hide(); + + } // off toolbar + // the Main ListView + // make a QWidgetStack first so Views can share the Toolbar + m_View = new QListView( m_pseudo, "Extended view"); + QPEApplication::setStylusOperation( m_View->viewport(), + QPEApplication::RightOnHold); + m_View->addColumn(" " ); + m_View->addColumn(tr("Name"), 135 ); + m_View->addColumn(tr("Size"), -1 ); + m_View->addColumn(tr("Date"), 60 ); + m_View->addColumn(tr("Mime Type"), -1 ); + QHeader *header = m_View->header(); + header->hide(); + m_View->setSorting( 1 ); + m_View->setAllColumnsShowFocus( TRUE ); + + connect(m_View, SIGNAL(selectionChanged() ), + this, SLOT(slotSelectionChanged() ) ); + + connect(m_View, SIGNAL(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<QString,QPixmap>; + QPixmap pm = Resource::loadPixmap( "folder" ); + QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); + QPainter painter( &pm ); + painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); + pm.setMask( pm.createHeuristicMask( FALSE ) ); + m_pixmaps->insert("dirsymlink", pm ); + + QPixmap pm2 = Resource::loadPixmap( "lockedfolder" ); + QPainter pen(&pm2 ); + pen.drawPixmap(pm2.width()-lnk.width(), pm2.height()-lnk.height(), lnk ); + pm2.setMask( pm2.createHeuristicMask( FALSE ) ); + m_pixmaps->insert("symlinkedlocked", pm2 ); +} +// if a mime complies with the m_mimeCheck->currentItem +bool OFileSelector::compliesMime( const QString &path, const QString &mime ) +{ + if( mime == "All" ) + return true; + MimeType type( path ); + if( type.id() == mime ) + return true; + return false; +} +/* check if the mimetype in mime + * complies with the one which is current + */ +/* + * We've the mimetype of the file + * We need to get the stringlist of the current mimetype + * + * mime = image/jpeg + * QStringList = 'image/*' + * or QStringList = image/jpeg;image/png;application/x-ogg + * or QStringList = application/x-ogg;image/*; + * with all these mime filters it should get acceptes + * to do so we need to look if mime is contained inside + * the stringlist + * if it's contained return true + * if not ( I'm no RegExp expert at all ) we'll look if a '/*' + * is contained in the mimefilter and then we will + * look if both are equal until the '/' + */ +bool OFileSelector::compliesMime( const QString& mime ) { + qWarning("mimetype is %s", mime.latin1() ); + QString currentText; + if (m_shChooser ) + currentText = m_mimeCheck->currentText(); + + qWarning("current text is %s", currentText.latin1() ); + QMap<QString, QStringList>::Iterator it; + QStringList list; + if ( currentText == tr("All") ) return true; + else if ( currentText.isEmpty() && !m_mimetypes.isEmpty() ) { + it = m_mimetypes.begin(); + list = it.data(); + }else if ( currentText.isEmpty() ) return true; + else{ + it = m_mimetypes.find(currentText ); + if ( it == m_mimetypes.end() ) qWarning("not there"), list << currentText; + else qWarning("found"), list = it.data(); + } + // dump it now + //for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + // qWarning( "%s", (*it).latin1() ); + //} + + + if ( list.contains(mime) ) return true; + qWarning("list doesn't contain it "); + QStringList::Iterator it2; + int pos; + 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 <zecke@handhelds.org> + .>+-= + _;:, .> :=|. This library is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This library is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef opiefileselector_h +#define opiefileselector_h + +#include <qpe/fileselector.h> + +#include <qdir.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 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<DocLnk> 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<QString, QStringList> 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<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( ); + + /* 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 <qlistview.h> + +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 <qpe/applnk.h> + +#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 <zecke@handhelds.org> + .>+-= + _;:, .> :=|. This library is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This library is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef ofileview_h +#define ofileview_h + +#include <qobject.h> +#include <qwidget.h> +#include <qpopupmenu.h> + +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 |