From 76f87a51800511fe108edbcd14d4dd40ead6f391 Mon Sep 17 00:00:00 2001 From: zecke Date: Wed, 26 Jun 2002 18:01:53 +0000 Subject: Improve mimetype handling API is now fixed 2 Bugs outstanding though --- (limited to 'libopie') diff --git a/libopie/ofiledialog.cc b/libopie/ofiledialog.cc index 164fadd..4783004 100644 --- a/libopie/ofiledialog.cc +++ b/libopie/ofiledialog.cc @@ -2,24 +2,24 @@                =. This file is part of the OPIE Project              .=l. Copyright (c) 2002 <>            .>+-= - _;:,     .>    :=|. This library is free software; you can + _;:,     .>    :=|. 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_,=:_.      -       _;_. +    .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. +    --        :-=` 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. @@ -37,7 +37,7 @@ OFileDialog::OFileDialog(const QString &caption, QWidget *wid, int mode, int selector, const QString &dirName, const QString &fileName, - const QStringList &mimetypes ) + const QMap& mimetypes ) : QDialog( wid, "OFileDialog", true ) { // QVBoxLayout *lay = new QVBoxLayout(this); @@ -57,7 +57,7 @@ OFileDialog::OFileDialog(const QString &caption, connect(file, SIGNAL(dirSelected(const QString &) ), this, SLOT(slotDirSelected(const QString &) ) ); - + file->setYesCancelVisible( false ); // relayout } QString OFileDialog::mimetype()const @@ -75,7 +75,7 @@ DocLnk OFileDialog::selectedDocument()const QString OFileDialog::getOpenFileName(int selector, const QString &startDir, const QString &file, - const QStringList &mimes, + const MimeTypes &mimes, QWidget *wid, const QString &caption ) { @@ -91,7 +91,7 @@ QString OFileDialog::getOpenFileName(int selector, QString OFileDialog::getSaveFileName(int selector, const QString &startDir, const QString &file, - const QStringList &mimes, + const MimeTypes &mimes, QWidget *wid, const QString &caption ) { diff --git a/libopie/ofiledialog.h b/libopie/ofiledialog.h index 40d147e..e14253c 100644 --- a/libopie/ofiledialog.h +++ b/libopie/ofiledialog.h @@ -2,24 +2,24 @@                =. This file is part of the OPIE Project              .=l. Copyright (c) 2002 zecke            .>+-= - _;:,     .>    :=|. This library is free software; you can + _;:,     .>    :=|. 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_,=:_.      -       _;_. +    .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. +    --        :-=` 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. @@ -39,9 +39,9 @@ class OFileDialog : public QDialog { public: OFileDialog(const QString &caption, QWidget *, int mode, int selector, - const QString &dirName, + const QString &dirName, const QString &fileName = QString::null, - const QStringList &mimetypes = QStringList() ); + const MimeTypes &mimetypes = MimeTypes() ); QString mimetype() const; QString fileName() const; DocLnk selectedDocument()const; @@ -50,14 +50,14 @@ class OFileDialog : public QDialog { static QString getOpenFileName(int selector, const QString& startDir = QString::null, const QString &fileName = QString::null, - const QStringList& mimefilter = QStringList(), + 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 QStringList& mimefilter = QStringList(), + const MimeTypes& mimefilter = MimeTypes(), QWidget *wid = 0, const QString &caption = QString::null ); diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc index 7a67ab2..6c59f89 100644 --- a/libopie/ofileselector.cc +++ b/libopie/ofileselector.cc @@ -99,17 +99,19 @@ namespace { OFileSelector::OFileSelector( QWidget *wid, int mode, int selector, const QString &dirName, - const QString &fileName, - const QStringList &mimeTypes ) + 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() ) ); + //QTimer::singleShot(6*1000, this, SLOT( slotTest() ) ); } OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, @@ -117,9 +119,12 @@ OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, bool closeVisible ) : QWidget( parent, name ) { - m_mimetypes = QStringList::split(";", mimeFilter ); + if (!mimeFilter.isEmpty() ) { + QStringList list = QStringList::split(";", mimeFilter ); + m_mimetypes.insert(mimeFilter, list ); + } initVars(); - m_currentDir = QPEApplication::documentDir(); + m_currentDir = QPEApplication::documentDir(); m_mode = OPEN; m_selector = NORMAL; m_shClose = closeVisible; @@ -129,12 +134,13 @@ OFileSelector::OFileSelector(const QString &mimeFilter, QWidget *parent, m_shYesNo = false; init(); - + } OFileSelector::~OFileSelector() { + } void OFileSelector::setNewVisible( bool visible ) @@ -143,8 +149,8 @@ void OFileSelector::setNewVisible( bool visible ) if( m_selector == NORMAL ){ delete m_select; // we need to initialize but keep the selected mimetype - QString mime = m_mimeCheck == 0 ? QString::null : m_mimeCheck->currentText() ; - m_select = new FileSelector( m_autoMime ? mime : m_mimetypes.join(";") , + QString mime = currentMimeType(); + m_select = new FileSelector( mime , m_stack, "fileselector", m_shNew, m_shClose); connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), @@ -341,7 +347,7 @@ QStringList OFileSelector::selectedNames()const return list; } /** If mode is set to the Dir selection this will return the selected path. - * + * * */ QString OFileSelector::selectedPath()const @@ -364,7 +370,7 @@ QString OFileSelector::directory()const { if( m_selector == NORMAL ) return QPEApplication::documentDir(); - + return QDir(m_currentDir).absPath(); } @@ -425,13 +431,15 @@ 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 - m_select = new FileSelector(m_autoMime ? QString::null : m_mimetypes.join(";"), + // yes currentMime fixes that for us + QString mime = currentMimeType(); + m_select = new FileSelector(mime, m_stack, "fileselector", FALSE, FALSE); connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); //connect to close me and other signals as well - + m_stack->addWidget( m_select, NORMAL ); } m_stack->raiseWidget( NORMAL ); @@ -445,17 +453,48 @@ void OFileSelector::slotViewCheck(const QString &sel) m_selector = EXTENDED_ALL; initializeListView(); reparse(); - m_stack->raiseWidget( EXTENDED ); // same widget other QFileFilter + 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 ){ + //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( mime == tr("All") ? QString::null : mime, - m_stack, "fileselector", - FALSE, FALSE); + m_select = new FileSelector( newMimeType, + m_stack, "fileselector", + FALSE, FALSE); connect(m_select, SIGNAL(fileSelected( const DocLnk & ) ), this, SLOT( slotFileBridgeSelected(const DocLnk & ) ) ); @@ -463,10 +502,9 @@ void OFileSelector::slotMimeCheck(const QString &mime) m_stack->addWidget( m_select, NORMAL ); m_stack->raiseWidget( NORMAL ); updateMimes(); - m_mimeCheck->clear(); - m_mimeCheck->insertStringList(m_mimetypes ); + updateMimeCheck(); m_mimeCheck->setCurrentItem(indexByString( m_mimeCheck, mime) ); - } + //} }else{ // others qWarning("Mime %s", mime.latin1() ); if(m_shChooser ){ @@ -512,7 +550,15 @@ void OFileSelector::init() m_stack = new QWidgetStack( this ); if( m_selector == NORMAL ){ - m_select = new FileSelector(m_autoMime ? QString::null : m_mimetypes.join(";"), + 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", FALSE, FALSE); @@ -545,14 +591,14 @@ void OFileSelector::updateMimes() { if( m_autoMime ){ m_mimetypes.clear(); - m_mimetypes.append( tr("All") ); + 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.append( (*dit)->type() ); + m_mimetypes.insert( (*dit)->type(), (*dit)->type() ); } }// else done in reparse } @@ -628,7 +674,7 @@ void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink) name = info->fileName(); if( ( m_mode == OPEN && !info->isReadable() )|| ( m_mode == SAVE && !info->isWritable() ) ){ - + locked = true; pix = Resource::loadPixmap("locked"); } } @@ -657,7 +703,7 @@ void OFileSelector::addDir(const QString &mime, QFileInfo *info, bool symlink ) name = symlink ? info->fileName() + "->" + info->dirPath(true) + "/" +info->readLink() : info->fileName() ; new OFileSelectorItem( m_View, pix, name, info->lastModified().toString(), - QString::number( info->size() ), + QString::number( info->size() ), info->dirPath( true ), locked, true ); @@ -670,8 +716,8 @@ void OFileSelector::delItems() void OFileSelector::initializeName() { /** Name Layout Line - * This is the Layout line arranged in - * horizontal way each components + * 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. @@ -681,6 +727,7 @@ void OFileSelector::initializeName() 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 ); @@ -688,7 +735,7 @@ void OFileSelector::initializeName() m_lay->addWidget( m_boxName, 0 ); // add it to the topLevel layout }// else we already initialized - // maybe show the components? + // maybe show the components? // } void OFileSelector::initializeYes() @@ -713,6 +760,24 @@ void OFileSelector::initializeYes() 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 ){ @@ -725,12 +790,8 @@ void OFileSelector::initializeChooser() m_viewCheck->insertItem( tr("Documents") ); m_viewCheck->insertItem( tr("Files") ); m_viewCheck->insertItem( tr("All Files") ); - if(!m_autoMime ) - m_mimeCheck->insertItem(m_mimetypes.join(",") ); - else{ - updateMimes(); - m_mimeCheck->insertStringList( m_mimetypes ); - } + updateMimeCheck(); + connect( m_viewCheck, SIGNAL( activated(const QString & ) ), this, SLOT( slotViewCheck(const QString & ) ) ); connect( m_mimeCheck, SIGNAL( activated(const QString & ) ), @@ -746,11 +807,11 @@ void OFileSelector::initializeListView() m_boxToolbar = new QHBox( m_pseudo ); m_boxToolbar->setSpacing(0 ); // next to each other please - // toolbar members + // toolbar members { // location QComboBox m_location = new QComboBox( m_boxToolbar ); - m_location->setEditable( TRUE ); + m_location->setEditable( TRUE ); m_location->setDuplicatesEnabled( FALSE ); connect( m_location, SIGNAL(activated(const QString &) ), this, SLOT( slotLocationActivated(const QString &) ) ); @@ -831,13 +892,13 @@ void OFileSelector::initializeListView() connect(m_View, SIGNAL(currentChanged(QListViewItem *) ), this, SLOT(slotCurrentChanged(QListViewItem * ) ) ); - connect(m_View, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int) ), + 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 )), + 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_pseudoLayout->addWidget( m_View, 288 ); m_stack->addWidget( m_pseudo, EXTENDED ); } } @@ -876,7 +937,12 @@ bool OFileSelector::compliesMime( const QString &path, const QString &mime ) return true; return false; } +/* check if the mimetype in mime + * complies with the one which is current + */ +bool OFileSelector::compliesMime( const QString& mime ) { +} void OFileSelector::slotFileSelected( const QString &string ) { if( m_shLne ) @@ -1050,22 +1116,22 @@ void OFileSelector::reparse() MimeType type( fi->absFilePath() ); if( !m_mimetypes.contains( type.id() ) ){ //qWarning("Type %s", type.id().latin1() ); - m_mimetypes.append( type.id() ); + m_mimetypes.insert( type.id(), type.id() ); } ++it; } // add them to the chooser - m_mimeCheck->insertItem( tr("All") ); - m_mimeCheck->insertStringList( m_mimetypes ); + updateMimeCheck(); m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) ); currentMimeType = m_mimeCheck->currentText(); } }else { // no autoMime - currentMimeType = m_mimetypes.join(";"); + // let the mimetype be set from out side the m_mimeCheck FEATURE + if( m_shChooser ){ - m_mimeCheck->clear(); - m_mimeCheck->insertItem(m_mimetypes.join(",") ); + currentMimeType = m_mimeCheck->currentText(); + updateMimeCheck(); } } // now we got our mimetypes we can add the files @@ -1075,7 +1141,7 @@ void OFileSelector::reparse() int sort; if ( m_case ) sort = (QDir::IgnoreCase | QDir::Name | QDir::DirsFirst | QDir::Reversed); - else + else sort = (QDir::Name | QDir::DirsFirst | QDir::Reversed); dir.setSorting( sort ); @@ -1125,7 +1191,7 @@ void OFileSelector::reparse() //qWarning( "%s", fi->fileName().latin1() ); ++it; } // of while loop - m_View->sort(); + m_View->sort(); if( m_shTool ){ m_location->insertItem( m_currentDir ); diff --git a/libopie/ofileselector.h b/libopie/ofileselector.h index 47697b9..f2d5f84 100644 --- a/libopie/ofileselector.h +++ b/libopie/ofileselector.h @@ -1,5 +1,5 @@ /* - This is based on code and idea of + This is based on code and ideas of L. J. Potter ljp@llornkcor.com Thanks a lot @@ -7,24 +7,24 @@                =. This file is part of the OPIE Project              .=l. Copyright (c) 2002 Holger Freyther            .>+-= - _;:,     .>    :=|. This library is free software; you can + _;:,     .>    :=|. 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_,=:_.      -       _;_. +    .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. +    --        :-=` 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. @@ -43,11 +43,12 @@ #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 + * If you look for a Dialog check OFileDialog * */ class DocLnk; @@ -64,22 +65,55 @@ class QVBoxLayout; class QPopupMenu; class QFileInfo; class QHBox; -// +// +typedef QMap< QString, QStringList> MimeTypes; class OFileSelector : public QWidget { Q_OBJECT 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 + * EXTENDED_ALL also shows 'hidden' files + */ enum Selector{NORMAL=0, EXTENDED = 1, EXTENDED_ALL =2 }; + + /** + * This is reserved for futrue views + */ enum View { DIRS = 1, FILES = 2, TREE = 4, ICON = 8 }; - OFileSelector(QWidget *wid, int mode, int selector, + /** + * 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 QStringList &mimetypes = QStringList() ); + 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 ); @@ -130,7 +164,7 @@ class OFileSelector : public QWidget { int mode()const { return m_mode; }; int selector()const { return m_selector; }; void setSelector( int ); - + bool showPopup()const { return m_showPopup; }; void setShowPopup( bool pop ) { m_showPopup = pop; }; void setPopupMenu( QPopupMenu * ); @@ -175,7 +209,7 @@ class OFileSelector : public QWidget { private: void init(); void updateMimes(); - + protected: private: @@ -190,7 +224,8 @@ class OFileSelector : public QWidget { QString m_currentDir; QString m_name; - QStringList m_mimetypes; +// QStringList m_mimetypes; + QMap m_mimetypes; FileSelector *m_select; QWidgetStack *m_stack; @@ -232,12 +267,22 @@ class OFileSelector : public QWidget { void initializeListView(); void initializePerm(); void initPics(); - bool compliesMime(const QString &path, const QString &mime); - + 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 & ); -- cgit v0.9.0.2