• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kio

kfileview.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 <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(); // so that the removed() signal is emitted!
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 ); // just references
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 ) { // pass all signals right to our 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 // filter out files if we're in directory mode and count files/directories
00129 // and insert into the view
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     // .. is always bigger, independent of the sort criteria
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         //if (fi1->isDir() || fi2->isDir())
00202             // sort = static_cast<QDir::SortSpec>(KFileView::defaultSortSpec & QDir::SortByMask);
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                     // Sort by name if both items have the same timestamp.
00223                     // Don't honor the reverse flag tho.
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                     // Sort by name if both items have the same size.
00239                     // Don't honor the reverse flag tho.
00240                     else {
00241                         keepFirst = true;
00242                         goto sort_by_name;
00243                     }
00244                 }
00245                 case QDir::Unsorted:
00246                     bigger = true;  // nothing
00247                     break;
00248         }
00249     }
00250     }
00251 
00252     if (reversed && !keepFirst ) // don't reverse dirs to the end!
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     // only ever use m_itemList in this method!
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     // empty default impl.
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); // Virtual call
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          /*BASE::virtual_hook( id, data );*/
00425          break;
00426     }
00427 }
00428 
00429 #include "kfileview.moc"

kio

Skip menu "kio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal