kio
kfileview.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 <assert.h>
00023 #include <stdlib.h>
00024
00025 #include <kaction.h>
00026 #include <kapplication.h>
00027 #include <kdebug.h>
00028 #include <kglobal.h>
00029 #include <klocale.h>
00030 #include <kstandarddirs.h>
00031
00032 #include "config-kfile.h"
00033 #include "kfileview.h"
00034
00035 #ifdef Unsorted // the "I hate X.h" modus
00036 #undef Unsorted
00037 #endif
00038
00039 QDir::SortSpec KFileView::defaultSortSpec = static_cast<QDir::SortSpec>(QDir::Name | QDir::IgnoreCase | QDir::DirsFirst);
00040
00041 class KFileView::KFileViewPrivate
00042 {
00043 public:
00044 KFileViewPrivate()
00045 {
00046 actions = 0;
00047 dropOptions = 0;
00048 }
00049
00050 ~KFileViewPrivate()
00051 {
00052 if( actions ) {
00053 actions->clear();
00054 delete actions;
00055 }
00056 }
00057
00058 QGuardedPtr<KActionCollection> actions;
00059 int dropOptions;
00060 };
00061
00062
00063 KFileView::KFileView()
00064 {
00065 d = new KFileViewPrivate();
00066 m_sorting = KFileView::defaultSortSpec;
00067
00068 sig = new KFileViewSignaler();
00069 sig->setName("view-signaller");
00070
00071 m_selectedList = 0L;
00072 filesNumber = 0;
00073 dirsNumber = 0;
00074
00075 view_mode = All;
00076 selection_mode = KFile::Single;
00077 m_viewName = i18n("Unknown View");
00078
00079 myOnlyDoubleClickSelectsFiles = false;
00080 m_itemList.setAutoDelete( false );
00081 }
00082
00083 KFileView::~KFileView()
00084 {
00085 delete d;
00086 delete sig;
00087 delete m_selectedList;
00088 }
00089
00090 void KFileView::setParentView(KFileView *parent)
00091 {
00092 if ( parent ) {
00093 QObject::connect(sig, SIGNAL( activatedMenu(const KFileItem *,
00094 const QPoint& ) ),
00095 parent->sig, SIGNAL( activatedMenu(const KFileItem *,
00096 const QPoint& )));
00097 QObject::connect(sig, SIGNAL( dirActivated(const KFileItem *)),
00098 parent->sig, SIGNAL( dirActivated(const KFileItem*)));
00099 QObject::connect(sig, SIGNAL( fileSelected(const KFileItem *)),
00100 parent->sig, SIGNAL( fileSelected(const KFileItem*)));
00101 QObject::connect(sig, SIGNAL( fileHighlighted(const KFileItem *) ),
00102 parent->sig,SIGNAL(fileHighlighted(const KFileItem*)));
00103 QObject::connect(sig, SIGNAL( sortingChanged( QDir::SortSpec ) ),
00104 parent->sig, SIGNAL(sortingChanged( QDir::SortSpec)));
00105 QObject::connect(sig, SIGNAL( dropped(const KFileItem *, QDropEvent*, const KURL::List&) ),
00106 parent->sig, SIGNAL(dropped(const KFileItem *, QDropEvent*, const KURL::List&)));
00107 }
00108 }
00109
00110 bool KFileView::updateNumbers(const KFileItem *i)
00111 {
00112 if (!( viewMode() & Files ) && i->isFile())
00113 return false;
00114
00115 if (!( viewMode() & Directories ) && i->isDir())
00116 return false;
00117
00118 if (i->isDir())
00119 dirsNumber++;
00120 else
00121 filesNumber++;
00122
00123 return true;
00124 }
00125
00126 void qt_qstring_stats();
00127
00128
00129
00130 void KFileView::addItemList(const KFileItemList& list)
00131 {
00132 KFileItem *tmp;
00133
00134 for (KFileItemListIterator it(list); (tmp = it.current()); ++it)
00135 {
00136 if (!updateNumbers(tmp))
00137 continue;
00138
00139 insertItem( tmp );
00140 }
00141
00142 #ifdef Q2HELPER
00143 qt_qstring_stats();
00144 #endif
00145 }
00146
00147 void KFileView::insertItem( KFileItem * )
00148 {
00149 }
00150
00151 void KFileView::setSorting(QDir::SortSpec new_sort)
00152 {
00153 m_sorting = new_sort;
00154 }
00155
00156 void KFileView::clear()
00157 {
00158 m_itemList.clear();
00159 filesNumber = 0;
00160 dirsNumber = 0;
00161 clearView();
00162 }
00163
00164 void KFileView::sortReversed()
00165 {
00166 int spec = sorting();
00167
00168 setSorting( static_cast<QDir::SortSpec>( spec ^ QDir::Reversed ) );
00169 }
00170
00171 #if 0
00172 int KFileView::compareItems(const KFileItem *fi1, const KFileItem *fi2) const
00173 {
00174 static const QString &dirup = KGlobal::staticQString("..");
00175 bool bigger = true;
00176 bool keepFirst = false;
00177 bool dirsFirst = ((m_sorting & QDir::DirsFirst) == QDir::DirsFirst);
00178
00179 if (fi1 == fi2)
00180 return 0;
00181
00182
00183 if ( fi1->name() == dirup ) {
00184 bigger = false;
00185 keepFirst = dirsFirst;
00186 }
00187 else if ( fi2->name() == dirup ) {
00188 bigger = true;
00189 keepFirst = dirsFirst;
00190 }
00191
00192 else {
00193 if ( fi1->isDir() != fi2->isDir() && dirsFirst ) {
00194 bigger = fi2->isDir();
00195 keepFirst = true;
00196 }
00197 else {
00198
00199 QDir::SortSpec sort = static_cast<QDir::SortSpec>(m_sorting & QDir::SortByMask);
00200
00201
00202
00203
00204 switch (sort) {
00205 case QDir::Name:
00206 default:
00207 sort_by_name:
00208 if ( (m_sorting & QDir::IgnoreCase) == QDir::IgnoreCase )
00209 bigger = (fi1->name( true ) > fi2->name( true ));
00210 else
00211 bigger = (fi1->name() > fi2->name());
00212 break;
00213 case QDir::Time:
00214 {
00215 time_t t1 = fi1->time( KIO::UDS_MODIFICATION_TIME );
00216 time_t t2 = fi2->time( KIO::UDS_MODIFICATION_TIME );
00217 if ( t1 != t2 ) {
00218 bigger = (t1 > t2);
00219 break;
00220 }
00221
00222
00223
00224 else {
00225 keepFirst = true;
00226 goto sort_by_name;
00227 }
00228 }
00229 case QDir::Size:
00230 {
00231 KIO::filesize_t s1 = fi1->size();
00232 KIO::filesize_t s2 = fi2->size();
00233 if ( s1 != s2 ) {
00234 bigger = (s1 > s2);
00235 break;
00236 }
00237
00238
00239
00240 else {
00241 keepFirst = true;
00242 goto sort_by_name;
00243 }
00244 }
00245 case QDir::Unsorted:
00246 bigger = true;
00247 break;
00248 }
00249 }
00250 }
00251
00252 if (reversed && !keepFirst )
00253 bigger = !bigger;
00254
00255 return (bigger ? 1 : -1);
00256 }
00257 #endif
00258
00259 void KFileView::updateView(bool f)
00260 {
00261 widget()->repaint(f);
00262 }
00263
00264 void KFileView::updateView(const KFileItem *)
00265 {
00266 }
00267
00268 void KFileView::setCurrentItem(const QString &filename )
00269 {
00270 if (!filename.isNull()) {
00271 KFileItem *item;
00272 for ( (item = firstFileItem()); item; item = nextItem( item ) ) {
00273 if (item->name() == filename) {
00274 setCurrentItem( item );
00275 return;
00276 }
00277 }
00278 }
00279
00280 kdDebug(kfile_area) << "setCurrentItem: no match found: " << filename << endl;
00281 }
00282
00283 const KFileItemList * KFileView::items() const
00284 {
00285 KFileItem *item = 0L;
00286
00287
00288 m_itemList.clear();
00289 for ( (item = firstFileItem()); item; item = nextItem( item ) )
00290 m_itemList.append( item );
00291
00292 return &m_itemList;
00293 }
00294
00295
00296 const KFileItemList * KFileView::selectedItems() const
00297 {
00298 if ( !m_selectedList )
00299 m_selectedList = new KFileItemList;
00300
00301 m_selectedList->clear();
00302
00303 KFileItem *item;
00304 for ( (item = firstFileItem()); item; item = nextItem( item ) ) {
00305 if ( isSelected( item ) )
00306 m_selectedList->append( item );
00307 }
00308
00309 return m_selectedList;
00310 }
00311
00312 void KFileView::selectAll()
00313 {
00314 if (selection_mode == KFile::NoSelection || selection_mode== KFile::Single)
00315 return;
00316
00317 KFileItem *item = 0L;
00318 for ( (item = firstFileItem()); item; item = nextItem( item ) )
00319 setSelected( item, true );
00320 }
00321
00322
00323 void KFileView::invertSelection()
00324 {
00325 KFileItem *item = 0L;
00326 for ( (item = firstFileItem()); item; item = nextItem( item ) )
00327 setSelected( item, !isSelected( item ) );
00328 }
00329
00330
00331 void KFileView::setSelectionMode( KFile::SelectionMode sm )
00332 {
00333 selection_mode = sm;
00334 }
00335
00336 KFile::SelectionMode KFileView::selectionMode() const
00337 {
00338 return selection_mode;
00339 }
00340
00341 void KFileView::setViewMode( ViewMode vm )
00342 {
00343 view_mode = vm;
00344 }
00345
00346 void KFileView::removeItem( const KFileItem *item )
00347 {
00348 if ( !item )
00349 return;
00350
00351 if ( item->isDir() )
00352 dirsNumber--;
00353 else
00354 filesNumber--;
00355
00356 if ( m_selectedList )
00357 m_selectedList->removeRef( item );
00358 }
00359
00360 void KFileView::listingCompleted()
00361 {
00362
00363 }
00364
00365 KActionCollection * KFileView::actionCollection() const
00366 {
00367 if ( !d->actions )
00368 d->actions = new KActionCollection( widget(), "KFileView::d->actions" );
00369 return d->actions;
00370 }
00371
00372 void KFileView::readConfig( KConfig *, const QString& )
00373 {
00374 }
00375
00376 void KFileView::writeConfig( KConfig *, const QString& )
00377 {
00378 }
00379
00380 QString KFileView::sortingKey( const QString& value, bool isDir, int sortSpec )
00381 {
00382 bool reverse = sortSpec & QDir::Reversed;
00383 bool dirsFirst = sortSpec & QDir::DirsFirst;
00384 char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1';
00385 QString result = (sortSpec & QDir::IgnoreCase) ? value.lower() : value;
00386 return result.prepend( start );
00387 }
00388
00389 QString KFileView::sortingKey( KIO::filesize_t value, bool isDir, int sortSpec)
00390 {
00391 bool reverse = sortSpec & QDir::Reversed;
00392 bool dirsFirst = sortSpec & QDir::DirsFirst;
00393 char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1';
00394 return KIO::number( value ).rightJustify( 24, '0' ).prepend( start );
00395 }
00396
00397 void KFileView::setDropOptions(int options)
00398 {
00399 virtual_hook(VIRTUAL_SET_DROP_OPTIONS, &options);
00400 }
00401
00402 void KFileView::setDropOptions_impl(int options)
00403 {
00404 d->dropOptions = options;
00405 }
00406
00407 int KFileView::dropOptions()
00408 {
00409 return d->dropOptions;
00410 }
00411
00412 int KFileView::autoOpenDelay()
00413 {
00414 return (QApplication::startDragTime() * 3) / 2;
00415 }
00416
00417 void KFileView::virtual_hook( int id, void* data)
00418 {
00419 switch(id) {
00420 case VIRTUAL_SET_DROP_OPTIONS:
00421 setDropOptions_impl(*(int *)data);
00422 break;
00423 default:
00424
00425 break;
00426 }
00427 }
00428
00429 #include "kfileview.moc"