📄 fileselector.cpp
字号:
d->typeFilter = new TypeFilter( TypeFilter::ComboBox, hb ); connect( d->typeFilter, SIGNAL(selected(const QString&)), this, SLOT(typeSelected(const QString&)) ); QWhatsThis::add( d->typeFilter, tr("Show documents of this type") ); Categories c; c.load(categoryFileName()); QArray<int> vl( 0 ); d->catSelect = new CategorySelect( hb ); d->catSelect->setRemoveCategoryEdit( TRUE ); d->catSelect->setCategories( vl, "Document View", // No tr tr("Document View") ); d->catSelect->setAllCategories( TRUE ); connect( d->catSelect, SIGNAL(signalSelected(int)), this, SLOT(catSelected(int)) ); QWhatsThis::add( d->catSelect, tr("Show documents in this category") ); setCloseVisible( closeVisible );#else Q_UNUSED(closeVisible); d->filterDlg = new CategorySelectDialog("Document View", this, 0, TRUE); d->filterDlg->setAllCategories(TRUE); connect(d->filterDlg, SIGNAL(selected(int)), this, SLOT(catSelected(int))); d->categoryLabel = new QLabel(d->filterDlg->currentCategoryText(), this); d->categoryLabel->hide(); d->haveContextMenu = FALSE;#endif d->storage = new StorageInfo( this ); connect( d->storage, SIGNAL( disksChanged() ), SLOT( cardChanged() ) ); connect( qApp, SIGNAL(linkChanged(const QString&)), this, SLOT(linkChanged(const QString&)) ); updateWhatsThis();}/*! Destroys the widget.*/FileSelector::~FileSelector(){ delete d;}/*! Returns the number of files in the view. If this is zero, an editor application might bypass the selector and immediately start with a "new" document.*/int FileSelector::fileCount(){ if ( !d->files ) reread(); return d->files->children().count();}/*! Calling this function is the programmatic equivalent of the user pressing the "new" button. \sa newSelected(), closeMe()*/void FileSelector::createNew(){ DocLnk f; emit newSelected( f ); emit closeMe();}void FileSelector::fileClicked( int button, QListViewItem *i, const QPoint &, int ){ if ( !i ) return; if ( button == Qt::LeftButton ) { fileClicked( i ); }}void FileSelector::filePressed( int button, QListViewItem *i, const QPoint &, int ){ if ( !i || i == d->newDocItem ) return; if ( button == Qt::RightButton ) { DocLnk l = ((FileSelectorItem *)i)->file(); QPopupMenu pop( this ); pop.insertItem( tr("Delete"), 1 ); if ( pop.exec(QCursor::pos()) == 1 && QPEMessageBox::confirmDelete( this, tr("Delete"), l.name() ) ) { l.removeFiles(); // We get a linkChanged so rereading happens again } }}void FileSelector::fileClicked( QListViewItem *i ){ if ( !i ) return; if ( i == d->newDocItem ) { createNew(); } else { emit fileSelected( ( (FileSelectorItem*)i )->file() ); emit closeMe(); }}void FileSelector::currentChanged(QListViewItem *item){#ifdef QTOPIA_PHONE if (d->newDocItem) d->deleteAction->setEnabled( item != d->newDocItem );#else Q_UNUSED( item );#endif}void FileSelector::typeSelected( const QString &type ){ d->mimeFilters.clear(); QStringList subFilter = QStringList::split(";", type); for( QStringList::Iterator it = subFilter.begin(); it != subFilter.end(); ++it ) d->mimeFilters.append( QRegExp(*it, FALSE, TRUE) ); updateView(); emit typeChanged();}void FileSelector::catSelected( int c ){ d->catId = c; updateView();#ifdef QTOPIA_PHONE if (d->filterDlg->currentCategory() == -2) { // All categories d->categoryLabel->hide(); } else { d->categoryLabel->setText(tr("Category: %1").arg(d->filterDlg->currentCategoryText())); d->categoryLabel->show(); }#endif emit categoryChanged();}void FileSelector::deleteFile(){ FileSelectorItem *item = (FileSelectorItem *)view->selectedItem(); if (item && item != d->newDocItem) { DocLnk l = item->file(); if (QPEMessageBox::confirmDelete(this, tr("Delete"), l.name())) { l.removeFiles(); } }}void FileSelector::cardChanged(){ if ( isVisible() ) d->initReread( view, 200 ); else d->needReread = TRUE;}void FileSelector::linkChanged( const QString & ){ if ( isVisible() ) d->initReread( view, 200 ); else d->needReread = TRUE;}const DocLnk *FileSelector::selected(){ FileSelectorItem *item = (FileSelectorItem *)view->selectedItem(); if ( item && item != d->newDocItem ) return new DocLnk( item->file() ); return NULL;}/*! \fn void FileSelector::fileSelected( const DocLnk &f ) This signal is emitted when the user selects a document. \a f is the document.*//*! \fn void FileSelector::newSelected( const DocLnk &f ) This signal is emitted when the user selects a "new" document. \a f is a DocLnk for the document. You will need to set the type of the document after copying it.*//*! \fn void FileSelector::closeMe() This signal is emitted when the user no longer needs to view the widget.*//*! If \a b is TRUE a "new document" entry is visible; if \a b is FALSE this entry is not visible and the user is unable to create new documents from the dialog.*/void FileSelector::setNewVisible( bool b ){ if ( d->showNew != b ) { d->showNew = b; updateView(); updateWhatsThis(); }}/*! If \a b is TRUE a "close" or "no document" button is visible; if \a b is FALSE this button is not visible and the user is unable to leave the dialog without creating or selecting a document. This function is deprecated.*/void FileSelector::setCloseVisible( bool b ){#ifndef QTOPIA_PHONE if ( b ) d->toolbar->show(); else d->toolbar->hide();#else Q_UNUSED(b);#endif}/*! Rereads the list of documents.*/void FileSelector::reread(){#ifdef Q_WS_QWS delete d->files; d->files = new DocLnkSet; Global::findDocuments(d->files, filter); if (d->typeFilter) d->typeFilter->reread( *d->files, filter );#endif d->needReread = FALSE; updateView();}void FileSelector::slotReread(){ reread();}void FileSelector::showEvent( QShowEvent *e ){ if ( d->needReread ) d->initReread( view, 0 ); QScrollBar *sb = view->verticalScrollBar(); int sbWidth = sb->isVisible() ? sb->width() : 0; view->setColumnWidth( 0, view->width() - sbWidth ); view->triggerUpdate(); QVBox::showEvent( e );}class AppLnkPriv : public AppLnk {public: inline bool linkFileKnown() const { return !mLinkFile.isNull(); }};static inline bool linkFileKnown(const AppLnk* l){ return ((const AppLnkPriv*)l)->linkFileKnown();}static int compareDocLnk(const void* va, const void* vb){ const DocLnk* docB = *(const DocLnk**)va; const DocLnk* docA = *(const DocLnk**)vb; const QChar *a = docA->name().unicode(); const QChar *b = docB->name().unicode(); int alen = docA->name().length(); int blen = docB->name().length(); int l = alen < blen ? alen : blen; while ( l-- && a->lower() == b->lower() ) a++,b++; if ( l!=-1 ) { QChar al = a->lower(); QChar bl = b->lower(); return al.unicode() - bl.unicode(); } else { if ( alen == blen ) { QFileInfo fa(linkFileKnown(docA) ? docA->linkFile() : docA->file()); QFileInfo fb(linkFileKnown(docB) ? docB->linkFile() : docB->file()); return fa.lastModified().secsTo(fb.lastModified()); } else { return alen - blen; } }}static int compareDocLnkReverse(const void* va, const void* vb){ return -compareDocLnk(va, vb);}static int compareDocLnkChron(const void* va, const void* vb){ const DocLnk* docB = *(const DocLnk**)va; const DocLnk* docA = *(const DocLnk**)vb; QFileInfo fa(linkFileKnown(docA) ? docA->linkFile() : docA->file()); QFileInfo fb(linkFileKnown(docB) ? docB->linkFile() : docB->file()); return fb.lastModified().secsTo(fa.lastModified());}static int compareDocLnkChronReverse(const void* va, const void* vb){ const DocLnk* docB = *(const DocLnk**)va; const DocLnk* docA = *(const DocLnk**)vb; QFileInfo fa(linkFileKnown(docA) ? docA->linkFile() : docA->file()); QFileInfo fb(linkFileKnown(docB) ? docB->linkFile() : docB->file()); return fa.lastModified().secsTo(fb.lastModified());}void FileSelector::updateView(){ FileSelectorItem *item = (FileSelectorItem *)view->selectedItem(); if ( item == d->newDocItem ) item = 0; QString oldFile; if ( item ) oldFile = item->file().file(); view->clear(); int ndocs = fileCount(); QListIterator<DocLnk> dit( d->files->children() ); DocLnk* *doc = new DocLnk*[ndocs]; int i=0; for ( ; dit.current(); ++dit ) { doc[i++] = dit.current(); } switch( d->sortMode ) { case FileSelector::Alphabetical: default: qsort(doc,ndocs,sizeof(doc[0]),compareDocLnk); break; case FileSelector::ReverseAlphabetical: qsort(doc,ndocs,sizeof(doc[0]),compareDocLnkReverse); break; case FileSelector::Chronological: qsort(doc,ndocs,sizeof(doc[0]),compareDocLnkChron); break; case FileSelector::ReverseChronological: qsort(doc,ndocs,sizeof(doc[0]),compareDocLnkChronReverse); break; } for ( i=0; i<ndocs; ++i ) { bool mimeMatch = FALSE; if ( d->mimeFilters.count() ) { QValueList<QRegExp>::Iterator it; for ( it = d->mimeFilters.begin(); it != d->mimeFilters.end(); ++it ) { if ( (*it).match(doc[i]->type()) >= 0 ) { mimeMatch = TRUE; break; } } } else { mimeMatch = TRUE; } if ( mimeMatch && (d->catId == -2 || doc[i]->categories().contains(d->catId) || (d->catId == -1 && doc[i]->categories().isEmpty())) ) { item = new FileSelectorItem( view, *doc[i] ); if ( oldFile && item->fl.file() == oldFile ) view->setCurrentItem( item ); } } delete [] doc; if (d->showNew) d->newDocItem = new NewDocItem( view, DocLnk() ); else d->newDocItem = 0; #ifdef QTOPIA_PHONE if( view->childCount() == 0 && !d->newDocItem ) { if( d->haveContextMenu ) d->deleteAction->setEnabled( FALSE ); d->message->setText( tr( "<qt><center><p>No documents found.</p></center></qt>" ) ); if( d->widgetStack->visibleWidget() != d->message ) d->widgetStack->raiseWidget( d->message ); d->message->setFocus(); } else { if( d->haveContextMenu ) d->deleteAction->setEnabled( TRUE ); if( d->widgetStack->visibleWidget() != view ) d->widgetStack->raiseWidget( view ); view->setFocus(); }#endif if ( !view->selectedItem() || view->childCount() == 1 ) { view->setCurrentItem( view->firstChild() ); view->setSelected( view->firstChild(), TRUE ); } qApp->processEvents(); QScrollBar *sb = view->verticalScrollBar(); int sbWidth = sb->isVisible() ? sb->width() : 0; view->setColumnWidth( 0, view->width() - sbWidth ); view->triggerUpdate();}void FileSelector::updateWhatsThis(){ QWhatsThis::remove( this ); QString text; if (d->showNew) { text = tr("Click to select a document from the list, or select <b>New</b> to create a new document. <br><br>Click and hold for document properties"); } else { text = tr("Click to select a document from the list<br><br>Click and hold for document properties"); } QWhatsThis::add( this, text );}void FileSelector::showFilterDlg(){#ifdef QTOPIA_PHONE QPEApplication::execDialog(d->filterDlg);#endif}#ifdef QTOPIA_PHONEvoid FileSelector::addOptions(QPopupMenu *menu){ if (!d->filterAction) { d->newAction = new QAction(tr("New"), Resource::loadIconSet("new"), QString::null, 0, this, 0); connect(d->newAction, SIGNAL(activated()), this, SLOT(createNew())); d->deleteAction = new QAction(tr("Delete"), Resource::loadIconSet("trash"), QString::null, 0, this, 0); connect(d->deleteAction, SIGNAL(activated()), this, SLOT(deleteFile())); d->filterAction = new QAction(tr("View Category..."), Resource::loadIconSet("viewcategory"), QString::null, 0, this, 0); connect(d->filterAction, SIGNAL(activated()), this, SLOT(showFilterDlg())); } if (d->showNew) d->newAction->addTo(menu); d->deleteAction->addTo(menu); menu->insertSeparator(); d->filterAction->addTo(menu); d->haveContextMenu = TRUE;}#endif/*! \fn const DocLnk *FileSelector::selected() Returns a copy of the selected \link doclnk.html DocLnk\endlink which must be deleted by the caller. This function is deprecated. It will be removed in Qtopia 2. Please switch to using \link selectedDocument() \endlink instead.*/#include "fileselector.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -