-rw-r--r-- | libopie/ofileselector.cc | 191 |
1 files changed, 187 insertions, 4 deletions
diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc index 128292f..b583125 100644 --- a/libopie/ofileselector.cc +++ b/libopie/ofileselector.cc @@ -18,56 +18,63 @@ ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qnamespace.h> #include <qpushbutton.h> #include <qcombobox.h> #include <qhbox.h> #include <qvbox.h> #include <qlayout.h> #include <qwidgetstack.h> #include <qlineedit.h> #include <qcheckbox.h> #include <qlabel.h> #include <qheader.h> #include <qdir.h> #include <qpainter.h> +#include <qaction.h> +#include <qpopupmenu.h> +#include <qcursor.h> #include <qpe/qpeapplication.h> #include <qpe/fileselector.h> #include <qpe/applnk.h> #include <qpe/global.h> #include <qpe/mimetype.h> #include <qpe/resource.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/stat.h> + #include "ofileselector.h" QMap<QString,QPixmap> *OFileSelector::m_pixmaps = 0; namespace { int indexByString( const QComboBox *box, const QString &str ){ int index= -1; for(int i= 0; i < box->count(); i++ ){ qWarning("str T%sT boxT%sT", str.latin1(), box->text(i).latin1() ); if( str == box->text(i ) ){ index= i; break; } } return index; } }; OFileSelector::OFileSelector(QWidget *wid, int mode, int selector, const QString &dirName, const QString &fileName, const QStringList mimetypes ) : QWidget( wid ) { @@ -90,48 +97,49 @@ OFileSelector::OFileSelector(QWidget *wid, int mode, int selector, const QString m_docButton = 0; m_hideButton = 0; m_ok = 0; m_cancel = 0; m_reread = 0; m_up = 0; m_View = 0; m_select = 0; m_stack = 0; m_select = 0; m_stack = 0; m_lay = 0; m_boxToolbar = 0; m_boxOk = 0; m_edit = 0; m_fnLabel = 0; m_checkPerm = 0; m_mimeCheck = 0; m_viewCheck = 0; m_dir = true; m_files = true; + m_custom = 0; if(m_pixmaps == 0 ) // init the pixmaps initPics(); m_lay = new QVBoxLayout(this); init(); m_edit->setText( fileName ); } void OFileSelector::initPics() { qWarning("init pics" ); m_pixmaps = new QMap<QString,QPixmap>; QPixmap pm = Resource::loadPixmap( "folder" ); QPixmap lnk = Resource::loadPixmap( "symlink" ); QPainter painter( &pm ); painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); pm.setMask( pm.createHeuristicMask( FALSE ) ); m_pixmaps->insert("dirsymlink", pm ); QPixmap pm2 = Resource::loadPixmap( "lockedfolder" ); QPainter pen(&pm2 ); pen.drawPixmap(pm2.width()-lnk.width(), pm2.height()-lnk.height(), lnk ); pm2.setMask( pm2.createHeuristicMask( FALSE ) ); m_pixmaps->insert("symlinkedlocked", pm2 ); @@ -157,48 +165,49 @@ void OFileSelector::initPics() | Save Cancel| ____________________ */ void OFileSelector::delItems() { QLayoutIterator it = m_lay->iterator(); while ( it.current() != 0 ){ it.deleteCurrent(); } } void OFileSelector::init() { m_stack = new QWidgetStack(this, "wstack" ); if( m_selector == NORMAL ){ QString currMime; if( m_mimeCheck != 0 ) currMime = m_mimeCheck->currentText(); updateMimes(); m_select = new FileSelector( currMime == "All" ? QString::null : currMime , m_stack, "fileselector", FALSE, FALSE ); m_stack->addWidget(m_select, NORMAL ); m_lay->addWidget(m_stack ); m_stack->raiseWidget(NORMAL ); + connect(m_select, SIGNAL(fileSelected( const DocLnk &) ), this, SLOT(slotFileBridgeSelected(const DocLnk &) ) ); }else { initializeListView(); } if(m_shLne ){ initializeName(); } if(m_shPerm ){ m_checkPerm = new QCheckBox(tr("Set Permission"), this, "Permission" ); m_checkPerm->setChecked( false ); m_lay->addWidget(m_checkPerm ); } if( m_shChooser ) initializeChooser(); if(m_shYesNo ) initializeYes(); }; void OFileSelector::setYesCancelVisible( bool show ) @@ -256,52 +265,52 @@ void OFileSelector::setChooserVisible( bool show ) if( show = m_shChooser ) return; m_shChooser = show; if( !show ){ delete m_mimeCheck; delete m_viewCheck; m_mimeCheck = 0; m_viewCheck = 0; } updateLay(); } QCheckBox* OFileSelector::permissionCheckbox( ) { return m_checkPerm; } void OFileSelector::setCaseSensetive( bool caSe ) { m_case = caSe; reparse(); } void OFileSelector::setShowFiles(bool files ){ m_files = files; reparse(); } -void OFileSelector::setPopupMenu(const QPopupMenu * ) +void OFileSelector::setPopupMenu(QPopupMenu *pop ) { //delete oldpopup; - + m_custom = pop; } bool OFileSelector::setPermission( ) const { if( m_checkPerm == 0 ) return false; else return m_checkPerm->isChecked(); } void OFileSelector::setPermissionChecked( bool check ) { if( m_checkPerm == 0 ) return; m_checkPerm->setChecked( check ); } QString OFileSelector::selectedName( )const { QString string; if( m_selector == NORMAL ){ const DocLnk *lnk = m_select->selected(); string = lnk->file(); }else if(m_selector == EXTENDED || m_selector == EXTENDED_ALL ) { QListViewItem *item = m_View->currentItem(); if(item != 0 ){ string = item->text( 1 ); @@ -536,49 +545,49 @@ void OFileSelector::slotMimeCheck(const QString &view ){ }else{ reparse(); } } void OFileSelector::slotViewCheck(const QString &view ){ qWarning("changed: show %s", view.latin1() ); // if the current view is the one QString currMime = m_mimeCheck->currentText(); if( view == QString::fromLatin1("Documents") ){ // get the mimetype now // check if we're the current widget and return if( m_View != 0) // delete 0 shouldn't crash but it did :( delete m_View; m_View = 0; delete m_select; m_select = new FileSelector( currMime == "All" ? QString::null : currMime, m_stack,"fileselector", FALSE, FALSE ); m_stack->addWidget( m_select, NORMAL ); m_mimeCheck->clear(); m_selector = NORMAL; updateMimes(); m_mimeCheck->insertStringList( m_mimetypes ); m_stack->raiseWidget( NORMAL ); - + connect(m_select, SIGNAL(fileSelected( const DocLnk &) ), this, SLOT(slotFileBridgeSelected(const DocLnk &) ) ); }else if(view == QString::fromLatin1("Files") ){ // remove from the stack delete m_select; m_select = 0; delete m_View; m_View = 0; m_selector = EXTENDED; // create the ListView or IconView initializeListView(); reparse(); }else if(view == QString::fromLatin1("All Files") ) { // remove from the stack delete m_select; m_select = 0; delete m_View; m_View = 0; m_selector = EXTENDED_ALL; initializeListView(); reparse(); }; }; @@ -598,48 +607,55 @@ void OFileSelector::updateMimes() // lets check which mode is active } }else{ // should be allreday updatet ; } }; void OFileSelector::initializeListView() { m_View = new QListView(m_stack, "Extended view" ); m_stack->addWidget( m_View, EXTENDED ); m_stack->raiseWidget( EXTENDED ); QPEApplication::setStylusOperation( m_View->viewport(),QPEApplication::RightOnHold); // set up the stuff // Pixmap Name Date Size mime //(m_View->header() )->hide(); //m_View->setRootIsDecorated(false); m_View->addColumn(" "); m_View->addColumn(tr("Name") ); m_View->addColumn(tr("Size") ); m_View->addColumn(tr("Date"), 60 ); m_View->addColumn(tr("Mime Type") ); QHeader *header = m_View->header(); header->hide(); m_View->setSorting(1 ); + // connect now + connect(m_View, SIGNAL(selectionChanged() ), this, SLOT(slotSelectionChanged() ) ); + connect(m_View, SIGNAL(currentChanged(QListViewItem *) ), this, SLOT(slotCurrentChanged(QListViewItem * ) ) ); + connect(m_View, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int) ), + this, SLOT(slotClicked( int, QListViewItem *, const QPoint &, int) ) ); + connect(m_View, SIGNAL(mouseButtonPressed(int, QListViewItem *, const QPoint &, int )), + this, SLOT(slotRightButton(int, QListViewItem *, const QPoint &, int ) ) ); }; /* If a item is locked depends on the mode if we're in OPEN !isReadable is locked if we're in SAVE !isWriteable is locked */ void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink ){ qWarning("Add Files" ); if( !m_files ){ qWarning("not mfiles" ); return; } MimeType type( info->filePath() ); QString name; QString dir; bool locked= false; if(mime == "All" ){ ; }else if( type.id() != mime ) { return; @@ -655,63 +671,230 @@ void OFileSelector::addFile(const QString &mime, QFileInfo *info, bool symlink ) name = info->fileName(); if( m_mode == OPEN ){ if( !info->isReadable() ){ locked = true; pix = Resource::loadPixmap("locked" ); } }else if( m_mode == SAVE ){ if( !info->isWritable() ){ locked = true; pix = Resource::loadPixmap("locked" ); } } } new OFileSelectorItem( m_View, pix, name, info->lastModified().toString(), QString::number( info->size() ), dir, locked ); } void OFileSelector::addDir(const QString &mime, QFileInfo *info, bool symlink ) { if(!m_dir ) return; //if( showDirs ) { - bool locked; + bool locked=false; QString name; QPixmap pix; if( ( m_mode == OPEN && !info->isReadable() ) || ( m_mode == SAVE && !info->isWritable() ) ){ locked = true; if( symlink ){ pix = (*m_pixmaps)["symlinkedlocked"]; }else{ pix = Resource::loadPixmap("lockedfolder" ); } }else{ if( symlink ){ pix = (*m_pixmaps)["dirsymlink" ]; }else{ pix = Resource::loadPixmap("folder" ); } } if( symlink){ name = info->fileName()+ "->"+ info->dirPath(true) +"/" +info->readLink(); }else{ //if(info->isReadable() ) name = info->fileName(); } new OFileSelectorItem(m_View, pix, name, info->lastModified().toString(), QString::number(info->size() ),info->dirPath(true), locked, true ); } } void OFileSelector::setShowDirs(bool dir ) { m_dir = dir; reparse(); } +void OFileSelector::slotFileSelected(const QString &string ) +{ + if(m_shLne ) + m_edit->setText( string ); + + emit fileSelected( string ); + // do AppLnk stuff +} +void OFileSelector::slotFileBridgeSelected( const DocLnk &lnk ) +{ + slotFileSelected(lnk.name() ); + emit fileSelected( lnk ); +} +void OFileSelector::slotSelectionChanged() // get the current items + // fixme +{ + qWarning("selection changed" ); +} +void OFileSelector::slotCurrentChanged(QListViewItem *item ) +{ + qWarning("current changed" ); + if( item == 0 ) + return; + + if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ + OFileSelectorItem *sel = (OFileSelectorItem*)item; + if(!sel->isDir() ){ + qWarning("is not dir" ); + if(m_shLne ){ + m_edit->setText(sel->text(1) ); + qWarning("setTexy" ); + } + } + }else { + qWarning("mode not extended" ); + } +} +// either select or change dir +void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &point, int ) +{ + if( item == 0 ) + return; + + if( button != Qt::LeftButton ) + return; + + qWarning("clicked" ); + if(m_selector == EXTENDED || m_selector == EXTENDED_ALL ){ + qWarning("inside" ); + OFileSelectorItem *sel = (OFileSelectorItem*)item; + if(!sel->isLocked() ){ // not locked either changedir or open + QStringList str = QStringList::split("->", sel->text(1) ); + if(sel->isDir() ){ + cd( sel->directory() + "/" + str[0] ); + }else{ + qWarning("file" ); + if(m_shLne ) + m_edit->setText(str[0] ); + emit fileSelected(str[0] ); + // emit DocLnk need to do it + } + }else{ + qWarning( "locked" ); + } + }; +} +void OFileSelector::slotRightButton(int button, QListViewItem *item, const QPoint &, int ) +{ + if( button != Qt::RightButton ) + return; + qWarning("right button" ); + slotContextMenu(item); +} +void OFileSelector::slotContextMenu(QListViewItem *item) +{ + qWarning("context menu" ); + if( m_custom !=0){ + m_custom->exec(); + }else{ + QPopupMenu menu; + QAction act; + OFileSelectorItem *sel = (OFileSelectorItem*)item; + if(sel->isDir() ){ + act.setText( tr("Change Directory") ); + act.addTo(&menu ); + connect(&act, SIGNAL(activated() ), + this, SLOT(slotChangedDir() ) ); + }else{ + act.setText( tr("Open file" ) ); + act.addTo( &menu ); + connect(&act, SIGNAL(activated() ), + this, SLOT(slotOpen() ) ); + } + QAction rescan; + rescan.setText( tr("Rescan") ); + rescan.addTo( &menu ); + connect(&act, SIGNAL(activated() ), + this, SLOT(slotRescan() ) ); + + QAction rename; + rename.setText( tr("Rename") ); + rename.addTo( &menu ); + connect(&act, SIGNAL(activated() ), + this, SLOT(slotRename() ) ); + + menu.insertSeparator(); + QAction delItem; + delItem.setText( tr("Delete") ); + delItem.addTo(&menu ); + connect(&act, SIGNAL(activated() ), + this, SLOT(slotDelete() ) ); + + menu.exec(QCursor::pos() ); + } +} +bool OFileSelector::cd(const QString &str ) +{ + qWarning(" dir %s", str.latin1() ); + QDir dir( str); + if(dir.exists() ){ + m_currentDir = str; + reparse(); + return true; + } + return false; +} + +void OFileSelector::slotChangedDir() +{ + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + if(sel->isDir() ){ + QStringList str = QStringList::split("->", sel->text(1) ); + cd( sel->directory() + "/" + str[0] ); + } +} +void OFileSelector::slotOpen() +{ + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + if(!sel->isDir() ){ + QStringList str = QStringList::split("->", sel->text(1) ); + slotFileSelected( str[0] ); + } +} +void OFileSelector::slotRescan() +{ + reparse(); +} +void OFileSelector::slotRename() +{ + // rename inline +} +void OFileSelector::slotDelete() +{ + qWarning("delete slot" ); + OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem(); + QStringList list = QStringList::split("->", sel->text(1) ); + if( sel->isDir() ){ + QString str = QString::fromLatin1("rm -rf ") + list[0]; + ::system(str.utf8().data() ); + }else{ + QFile::remove( list[0] ); + } + m_View->takeItem( sel ); + delete sel; +} + + |