KDE3Support
k3fileview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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();
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 ) {
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
00171
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
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
00268
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
00289
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
00305
00306 else {
00307 keepFirst = true;
00308 goto sort_by_name;
00309 }
00310 }
00311 case QDir::Unsorted:
00312 bigger = true;
00313 break;
00314 }
00315 }
00316 }
00317
00318 if (reversed && !keepFirst )
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
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"