KDE3Support
k3fileview.cpp
Go to the documentation of this file.
00001 /* This file is part of the KDE libraries 00002 Copyright (C) 1998 Stephan Kulow <coolo@kde.org> 00003 1998 Daniel Grana <grana@ie.iwi.unibe.ch> 00004 2001 Carsten Pfeiffer <pfeiffer@kde.org> 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License as published by the Free Software Foundation; either 00009 version 2 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Library General Public License for more details. 00015 00016 You should have received a copy of the GNU Library General Public License 00017 along with this library; see the file COPYING.LIB. If not, write to 00018 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00019 Boston, MA 02110-1301, USA. 00020 */ 00021 00022 #include "k3fileview.h" 00023 #include <config-kfile.h> 00024 00025 #include <kaction.h> 00026 #include <kactioncollection.h> 00027 #include <kapplication.h> 00028 #include <kdebug.h> 00029 #include <kglobal.h> 00030 #include <klocale.h> 00031 #include <kstandarddirs.h> 00032 00033 #include <QtCore/QPointer> 00034 00035 #include <assert.h> 00036 #include <stdlib.h> 00037 00038 #ifdef Unsorted // the "I hate X.h" modus 00039 #undef Unsorted 00040 #endif 00041 00042 void K3FileViewSignaler::activate( const KFileItem &item ) 00043 { 00044 if ( item.isDir() ) 00045 dirActivated( item ); 00046 else 00047 fileSelected( item ); 00048 } 00049 00050 void K3FileViewSignaler::highlightFile( const KFileItem &item ) 00051 { 00052 fileHighlighted( item ); 00053 } 00054 00055 void K3FileViewSignaler::activateMenu( const KFileItem &item, const QPoint& pos ) 00056 { 00057 activatedMenu( item, pos ); 00058 } 00059 00060 void K3FileViewSignaler::changeSorting( QDir::SortFlags sorting ) 00061 { 00062 sortingChanged( sorting ); 00063 } 00064 00065 void K3FileViewSignaler::dropURLs( const KFileItem &item, QDropEvent *event, const KUrl::List &urls ) 00066 { 00067 dropped( item, event, urls ); 00068 } 00069 00070 class K3FileView::K3FileViewPrivate 00071 { 00072 public: 00073 K3FileViewPrivate() 00074 { 00075 actions = 0; 00076 dropOptions = 0; 00077 } 00078 00079 ~K3FileViewPrivate() 00080 { 00081 if( actions ) { 00082 actions->clear(); // so that the removed() signal is emitted! 00083 delete actions; 00084 } 00085 } 00086 00087 QPointer<KActionCollection> actions; 00088 int dropOptions; 00089 00090 const static QDir::SortFlags defaultSortFlags; 00091 QDir::SortFlags m_sorting; 00092 QString m_viewName; 00093 00097 uint filesNumber; 00098 uint dirsNumber; 00099 00100 ViewMode view_mode; 00101 KFile::SelectionMode selection_mode; 00102 00103 bool myOnlyDoubleClickSelectsFiles; 00104 00105 }; 00106 00107 const QDir::SortFlags K3FileView::K3FileViewPrivate::defaultSortFlags = (QDir::Name | QDir::IgnoreCase | QDir::DirsFirst); 00108 00109 00110 K3FileView::K3FileView() 00111 :d(new K3FileViewPrivate()) 00112 { 00113 d->m_sorting = K3FileView::K3FileViewPrivate::defaultSortFlags; 00114 00115 sig = new K3FileViewSignaler(); 00116 sig->setObjectName("view-signaller"); 00117 00118 d->filesNumber = 0; 00119 d->dirsNumber = 0; 00120 00121 d->view_mode = All; 00122 d->selection_mode = KFile::Single; 00123 d->m_viewName = i18n("Unknown View"); 00124 00125 d->myOnlyDoubleClickSelectsFiles = false; 00126 } 00127 00128 K3FileView::~K3FileView() 00129 { 00130 delete d; 00131 delete sig; 00132 } 00133 00134 void K3FileView::setParentView(K3FileView *parent) 00135 { 00136 if ( parent ) { // pass all signals right to our parent 00137 QObject::connect(sig, SIGNAL( activatedMenu(const KFileItem &, 00138 const QPoint& ) ), 00139 parent->sig, SIGNAL( activatedMenu(const KFileItem &, 00140 const QPoint& ))); 00141 QObject::connect(sig, SIGNAL( dirActivated(const KFileItem &)), 00142 parent->sig, SIGNAL( dirActivated(const KFileItem&))); 00143 QObject::connect(sig, SIGNAL( fileSelected(const KFileItem &)), 00144 parent->sig, SIGNAL( fileSelected(const KFileItem&))); 00145 QObject::connect(sig, SIGNAL( fileHighlighted(const KFileItem &) ), 00146 parent->sig,SIGNAL(fileHighlighted(const KFileItem&))); 00147 QObject::connect(sig, SIGNAL( sortingChanged( QDir::SortFlags ) ), 00148 parent->sig, SIGNAL(sortingChanged( QDir::SortFlags))); 00149 QObject::connect(sig, SIGNAL( dropped(const KFileItem &, QDropEvent*, const KUrl::List&) ), 00150 parent->sig, SIGNAL(dropped(const KFileItem &, QDropEvent*, const KUrl::List&))); 00151 } 00152 } 00153 00154 bool K3FileView::updateNumbers(const KFileItem &i) 00155 { 00156 if (!( viewMode() & Files ) && i.isFile()) 00157 return false; 00158 00159 if (!( viewMode() & Directories ) && i.isDir()) 00160 return false; 00161 00162 if (i.isDir()) 00163 d->dirsNumber++; 00164 else 00165 d->filesNumber++; 00166 00167 return true; 00168 } 00169 00170 // filter out files if we're in directory mode and count files/directories 00171 // and insert into the view 00172 void K3FileView::addItemList(const KFileItemList& list) 00173 { 00174 KFileItemList::const_iterator kit = list.begin(); 00175 const KFileItemList::const_iterator kend = list.end(); 00176 for ( ; kit != kend; ++kit ) { 00177 const KFileItem item = *kit; 00178 if (!updateNumbers(item)) 00179 continue; 00180 insertItem(item); 00181 } 00182 } 00183 00184 void K3FileView::insertItem( const KFileItem& ) 00185 { 00186 } 00187 00188 QWidget* K3FileView::widget() const 00189 { 00190 return const_cast<K3FileView*>(this)->widget(); 00191 } 00192 00193 QDir::SortFlags K3FileView::sorting() const 00194 { 00195 return d->m_sorting; 00196 } 00197 00198 void K3FileView::setSorting(QDir::SortFlags new_sort) 00199 { 00200 d->m_sorting = new_sort; 00201 } 00202 00203 void K3FileView::clear() 00204 { 00205 d->filesNumber = 0; 00206 d->dirsNumber = 0; 00207 clearView(); 00208 } 00209 00210 bool K3FileView::isReversed() const 00211 { 00212 return (d->m_sorting & QDir::Reversed); 00213 } 00214 00215 void K3FileView::sortReversed() 00216 { 00217 int spec = sorting(); 00218 00219 setSorting( QDir::SortFlags( spec ^ QDir::Reversed ) ); 00220 } 00221 00222 uint K3FileView::count() const 00223 { 00224 return d->filesNumber + d->dirsNumber; 00225 } 00226 00227 uint K3FileView::numFiles() const 00228 { 00229 return d->filesNumber; 00230 } 00231 00232 uint K3FileView::numDirs() const 00233 { 00234 return d->dirsNumber; 00235 } 00236 00237 #if 0 00238 int K3FileView::compareItems(const KFileItem *fi1, const KFileItem *fi2) const 00239 { 00240 static const QString &dirup = KGlobal::staticQString(".."); 00241 bool bigger = true; 00242 bool keepFirst = false; 00243 bool dirsFirst = ((m_sorting & QDir::DirsFirst) == QDir::DirsFirst); 00244 00245 if (fi1 == fi2) 00246 return 0; 00247 00248 // .. is always bigger, independent of the sort criteria 00249 if ( fi1->name() == dirup ) { 00250 bigger = false; 00251 keepFirst = dirsFirst; 00252 } 00253 else if ( fi2->name() == dirup ) { 00254 bigger = true; 00255 keepFirst = dirsFirst; 00256 } 00257 00258 else { 00259 if ( fi1->isDir() != fi2->isDir() && dirsFirst ) { 00260 bigger = fi2->isDir(); 00261 keepFirst = true; 00262 } 00263 else { 00264 00265 QDir::SortFlags sort = static_cast<QDir::SortFlags>(m_sorting & QDir::SortByMask); 00266 00267 //if (fi1->isDir() || fi2->isDir()) 00268 // sort = static_cast<QDir::SortFlags>(K3FileView::defaultSortSpec & QDir::SortByMask); 00269 00270 switch (sort) { 00271 case QDir::Name: 00272 default: 00273 sort_by_name: 00274 if ( (m_sorting & QDir::IgnoreCase) == QDir::IgnoreCase ) 00275 bigger = (fi1->name( true ) > fi2->name( true )); 00276 else 00277 bigger = (fi1->name() > fi2->name()); 00278 break; 00279 case QDir::Time: 00280 { 00281 time_t t1 = fi1->time( KIO::UDSEntry::UDS_MODIFICATION_TIME ); 00282 time_t t2 = fi2->time( KIO::UDSEntry::UDS_MODIFICATION_TIME ); 00283 if ( t1 != t2 ) { 00284 bigger = (t1 > t2); 00285 break; 00286 } 00287 00288 // Sort by name if both items have the same timestamp. 00289 // Don't honor the reverse flag tho. 00290 else { 00291 keepFirst = true; 00292 goto sort_by_name; 00293 } 00294 } 00295 case QDir::Size: 00296 { 00297 KIO::filesize_t s1 = fi1->size(); 00298 KIO::filesize_t s2 = fi2->size(); 00299 if ( s1 != s2 ) { 00300 bigger = (s1 > s2); 00301 break; 00302 } 00303 00304 // Sort by name if both items have the same size. 00305 // Don't honor the reverse flag tho. 00306 else { 00307 keepFirst = true; 00308 goto sort_by_name; 00309 } 00310 } 00311 case QDir::Unsorted: 00312 bigger = true; // nothing 00313 break; 00314 } 00315 } 00316 } 00317 00318 if (reversed && !keepFirst ) // don't reverse dirs to the end! 00319 bigger = !bigger; 00320 00321 return (bigger ? 1 : -1); 00322 } 00323 #endif 00324 00325 void K3FileView::updateView(bool) 00326 { 00327 widget()->repaint(); 00328 } 00329 00330 void K3FileView::updateView(const KFileItem &) 00331 { 00332 } 00333 00334 void K3FileView::setCurrentItem(const QString &filename ) 00335 { 00336 if (!filename.isNull()) { 00337 KFileItem item; 00338 for ( (item = firstFileItem()); !item.isNull(); item = nextItem( item ) ) { 00339 if (item.name() == filename) { 00340 setCurrentItem( item ); 00341 return; 00342 } 00343 } 00344 } 00345 00346 kDebug(kfile_area) << "setCurrentItem: no match found: " << filename; 00347 } 00348 00349 KFileItemList K3FileView::items() const 00350 { 00351 KFileItemList list; 00352 00353 for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) ) 00354 list.append( item ); 00355 00356 return list; 00357 } 00358 00359 void K3FileView::setOnlyDoubleClickSelectsFiles( bool enable ) { 00360 d->myOnlyDoubleClickSelectsFiles = enable; 00361 } 00362 00363 bool K3FileView::onlyDoubleClickSelectsFiles() const { 00364 return d->myOnlyDoubleClickSelectsFiles; 00365 } 00366 00367 00368 KFileItemList K3FileView::selectedItems() const 00369 { 00370 KFileItemList list; 00371 00372 for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) ) { 00373 if ( isSelected( item ) ) 00374 list.append( item ); 00375 } 00376 00377 return list; 00378 } 00379 00380 void K3FileView::selectAll() 00381 { 00382 if (d->selection_mode == KFile::NoSelection || d->selection_mode== KFile::Single) 00383 return; 00384 00385 for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) ) 00386 setSelected( item, true ); 00387 } 00388 00389 00390 void K3FileView::invertSelection() 00391 { 00392 for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) ) 00393 setSelected( item, !isSelected( item ) ); 00394 } 00395 00396 00397 void K3FileView::setSelectionMode( KFile::SelectionMode sm ) 00398 { 00399 d->selection_mode = sm; 00400 } 00401 00402 KFile::SelectionMode K3FileView::selectionMode() const 00403 { 00404 return d->selection_mode; 00405 } 00406 00407 void K3FileView::setViewMode( K3FileView::ViewMode vm ) 00408 { 00409 d->view_mode = vm; 00410 } 00411 00412 K3FileView::ViewMode K3FileView::viewMode() const 00413 { 00414 return d->view_mode; 00415 } 00416 00417 QString K3FileView::viewName() const 00418 { 00419 return d->m_viewName; 00420 } 00421 00422 void K3FileView::setViewName( const QString& name ) 00423 { 00424 d->m_viewName = name; 00425 } 00426 00427 void K3FileView::removeItem( const KFileItem &item ) 00428 { 00429 if ( item.isNull() ) 00430 return; 00431 00432 if ( item.isDir() ) 00433 d->dirsNumber--; 00434 else 00435 d->filesNumber--; 00436 } 00437 00438 void K3FileView::listingCompleted() 00439 { 00440 // empty default impl. 00441 } 00442 00443 KActionCollection * K3FileView::actionCollection() const 00444 { 00445 if ( !d->actions ) { 00446 d->actions = new KActionCollection( widget() ); 00447 d->actions->setObjectName( "K3FileView::d->actions" ); 00448 } 00449 return d->actions; 00450 } 00451 00452 K3FileViewSignaler * K3FileView::signaler() const 00453 { 00454 return sig; 00455 } 00456 00457 void K3FileView::readConfig( KConfigGroup *) 00458 { 00459 } 00460 00461 void K3FileView::writeConfig( KConfigGroup *) 00462 { 00463 } 00464 00465 QString K3FileView::sortingKey( const QString& value, bool isDir, QDir::SortFlags SortFlags ) 00466 { 00467 bool reverse = SortFlags & QDir::Reversed; 00468 bool dirsFirst = SortFlags & QDir::DirsFirst; 00469 char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1'; 00470 QString result = (SortFlags & QDir::IgnoreCase) ? value.toLower() : value; 00471 return result.prepend( QLatin1Char(start) ); 00472 } 00473 00474 QString K3FileView::sortingKey( KIO::filesize_t value, bool isDir, QDir::SortFlags SortFlags) 00475 { 00476 bool reverse = SortFlags & QDir::Reversed; 00477 bool dirsFirst = SortFlags & QDir::DirsFirst; 00478 char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1'; 00479 return KIO::number( value ).rightJustified( 24, '0' ).prepend( QLatin1Char(start) ); 00480 } 00481 00482 void K3FileView::setDropOptions(int options) 00483 { 00484 d->dropOptions = options; 00485 } 00486 00487 int K3FileView::dropOptions() 00488 { 00489 return d->dropOptions; 00490 } 00491 00492 int K3FileView::autoOpenDelay() 00493 { 00494 return (QApplication::startDragTime() * 3) / 2; 00495 } 00496 00497 #include "k3fileview.moc"
KDE 4.6 API Reference