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

kio

kcombiview.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 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018     Boston, MA 02110-1301, USA.
00019 */
00020 
00021 // $Id: kcombiview.cpp 465272 2005-09-29 09:47:40Z mueller $
00022 
00023 #include <assert.h>
00024 
00025 #include "kfileitem.h"
00026 #include "kcombiview.h"
00027 #include "kfileiconview.h"
00028 #include "kfiledetailview.h"
00029 #include "config-kfile.h"
00030 
00031 #include <qevent.h>
00032 
00033 #include <qdir.h>
00034 
00035 #include <kapplication.h>
00036 #include <kconfig.h>
00037 #include <kdebug.h>
00038 #include <kglobal.h>
00039 
00040 #include <qvaluelist.h>
00041 
00042 KCombiView::KCombiView( QWidget *parent, const char *name)
00043   : QSplitter( parent, name),
00044     KFileView(),
00045     right(0),
00046     m_lastViewForNextItem(0),
00047     m_lastViewForPrevItem(0)
00048 {
00049     left = new KFileIconView( this, "left" );
00050     left->setAcceptDrops(false);
00051     left->viewport()->setAcceptDrops(false);
00052     left->setGridX( 160 );
00053     left->KFileView::setViewMode( Directories );
00054     left->setArrangement( QIconView::LeftToRight );
00055     left->setParentView( this );
00056     left->setAcceptDrops(false);
00057     left->installEventFilter( this );
00058     
00059     connect( sig, SIGNAL( sortingChanged( QDir::SortSpec ) ),
00060              SLOT( slotSortingChanged( QDir::SortSpec ) ));
00061 }
00062 
00063 KCombiView::~KCombiView()
00064 {
00065     delete right;
00066 }
00067 
00068 void KCombiView::setRight(KFileView *view)
00069 {
00070     delete right;
00071     right = view;
00072     right->KFileView::setViewMode( Files );
00073     setViewName( right->viewName() );
00074 
00075     QValueList<int> lst;
00076     lst << left->gridX() + 2 * left->spacing();
00077     setSizes( lst );
00078     setResizeMode( left, QSplitter::KeepSize );
00079 
00080     right->setParentView( this );
00081     right->widget()->setAcceptDrops(acceptDrops());
00082     right->setDropOptions(dropOptions());
00083     right->widget()->installEventFilter( this );
00084 }
00085 
00086 
00087 void KCombiView::insertItem( KFileItem *item )
00088 {
00089     KFileView::insertItem( item );
00090 
00091     if ( item->isDir() ) {
00092         left->updateNumbers( item );
00093         left->insertItem( item );
00094     }
00095     else {
00096         right->updateNumbers( item );
00097         right->insertItem( item );
00098     }
00099 }
00100 
00101 void KCombiView::setSorting( QDir::SortSpec sort )
00102 {
00103     if ( !right )
00104         kdFatal() << "You need to call setRight( someview ) before!" << endl;
00105     right->setSorting( sort );
00106     left->setSorting( sort );
00107 
00108     KFileView::setSorting( right->sorting() );
00109 }
00110 
00111 void KCombiView::clearView()
00112 {
00113     left->clearView();
00114     if ( right )
00115         right->clearView();
00116 }
00117 
00118 void KCombiView::updateView( bool b )
00119 {
00120     left->updateView( b );
00121     if ( right )
00122         right->updateView( b );
00123 }
00124 
00125 void KCombiView::updateView( const KFileItem *i )
00126 {
00127     left->updateView( i );
00128     if ( right )
00129         right->updateView( i );
00130 }
00131 
00132 void KCombiView::removeItem( const KFileItem *i )
00133 {
00134     left->removeItem( i );
00135     if ( right )
00136         right->removeItem( i );
00137     KFileView::removeItem( i );
00138 }
00139 
00140 void KCombiView::listingCompleted()
00141 {
00142     left->listingCompleted();
00143     if ( right )
00144         right->listingCompleted();
00145 }
00146 
00147 void KCombiView::clear()
00148 {
00149     KFileView::clear();
00150     left->KFileView::clear();
00151     if ( right )
00152         right->clear();
00153 }
00154 
00155 void KCombiView::clearSelection()
00156 {
00157     left->clearSelection();
00158     if ( right )
00159         right->clearSelection();
00160 }
00161 
00162 void KCombiView::selectAll()
00163 {
00164     left->selectAll();
00165     if ( right )
00166         right->selectAll();
00167 }
00168 
00169 void KCombiView::invertSelection()
00170 {
00171     left->invertSelection();
00172     if ( right )
00173         right->invertSelection();
00174 }
00175 
00176 bool KCombiView::isSelected( const KFileItem *item ) const
00177 {
00178     assert( right ); // for performance reasons no if ( right ) check.
00179     return (right->isSelected( item ) || left->isSelected( item ));
00180 }
00181 
00182 void KCombiView::setSelectionMode( KFile::SelectionMode sm )
00183 {
00184     // I think the left view (directories should always be in
00185     // Single-Mode, right?
00186     // left->setSelectionMode( sm );
00187     if ( !right )
00188         kdFatal() << "You need to call setRight( someview ) before!" << endl;
00189     right->setSelectionMode( sm );
00190 }
00191 
00192 void KCombiView::setSelected( const KFileItem *item, bool enable )
00193 {
00194     left->setSelected( item, enable );
00195     if ( right )
00196         right->setSelected( item, enable );
00197 }
00198 
00199 void KCombiView::setCurrentItem( const KFileItem *item )
00200 {
00201     left->setCurrentItem( item );
00202     if ( right )
00203         right->setCurrentItem( item );
00204 }
00205 
00206 KFileItem * KCombiView::currentFileItem() const
00207 {
00208     // we can actually have two current items, one in each view. So we simply
00209     // prefer the fileview's item over the directory's.
00210     // Smarter: if the right view has focus, prefer that over the left.
00211     if ( !right )
00212         return left->currentFileItem();
00213 
00214     KFileView *preferredView = focusView( right );
00215     KFileItem *item = preferredView->currentFileItem();
00216     if ( !item && preferredView != left )
00217         item = left->currentFileItem();
00218 
00219     return item;
00220 }
00221 
00222 void KCombiView::ensureItemVisible(const KFileItem *item)
00223 {
00224     left->ensureItemVisible( item );
00225     if ( right )
00226         right->ensureItemVisible( item );
00227 }
00228 
00229 KFileItem * KCombiView::firstFileItem() const
00230 {
00231     if ( !right )
00232         return left->firstFileItem();
00233 
00234     KFileView *preferredView = focusView( left );
00235     KFileView *otherView = (preferredView == left) ? right : left;
00236     KFileItem *item = preferredView->firstFileItem();
00237     if ( !item )
00238         item = otherView->firstFileItem();
00239 
00240     return item;
00241 }
00242 
00243 KFileItem * KCombiView::nextItem( const KFileItem *fileItem ) const
00244 {
00245     if ( !right )
00246         return left->nextItem( fileItem );
00247 
00248     KFileView *preferredView = focusView( left );
00249     KFileView *otherView = (preferredView == left) ? right : left;
00250     KFileItem *item = preferredView->nextItem( fileItem );
00251 
00252     if ( item )
00253         m_lastViewForNextItem = preferredView;
00254     else { // no item, check other view
00255         // when changing from one to another view, we need to continue
00256         // with the next view's first item!
00257         if ( m_lastViewForNextItem != otherView ) {
00258             m_lastViewForNextItem = otherView;
00259             return otherView->firstFileItem();
00260         }
00261 
00262         item = otherView->nextItem( fileItem );
00263         m_lastViewForNextItem = otherView;
00264     }
00265 
00266     return item;
00267 }
00268 
00269 KFileItem * KCombiView::prevItem( const KFileItem *fileItem ) const
00270 {
00271     if ( !right )
00272         return left->nextItem( fileItem );
00273 
00274     KFileView *preferredView = focusView( left );
00275     KFileView *otherView = (preferredView == left) ? right : left;
00276     KFileItem *item = preferredView->prevItem( fileItem );
00277     if ( item )
00278         m_lastViewForPrevItem = preferredView;
00279 
00280     else { // no item, check other view
00281         // when changing from one to another view, we need to continue
00282         // with the next view's last item!
00283         if ( m_lastViewForPrevItem != otherView ) {
00284             fileItem = otherView->firstFileItem();
00285             while ( otherView->nextItem( fileItem ) ) // find the last item
00286                 fileItem = otherView->nextItem( fileItem );
00287         }
00288 
00289         item = otherView->prevItem( fileItem );
00290         m_lastViewForPrevItem = otherView;
00291     }
00292 
00293     return item;
00294 }
00295 
00296 void KCombiView::slotSortingChanged( QDir::SortSpec sorting )
00297 {
00298     KFileView::setSorting( sorting );
00299 }
00300 
00301 KFileView *KCombiView::focusView( KFileView *preferred ) const
00302 {
00303     QWidget *w = focusWidget();
00304     KFileView *other = (right == preferred) ? left : right;
00305     return (preferred && w == preferred->widget()) ? preferred : other;
00306 }
00307 
00308 void KCombiView::readConfig( KConfig *config, const QString& group )
00309 {
00310     left->readConfig( config, group );
00311     if ( right )
00312         right->readConfig( config, group );
00313 }
00314 
00315 void KCombiView::writeConfig( KConfig *config, const QString& group )
00316 {
00317     left->writeConfig( config, group );
00318     if ( right )
00319         right->writeConfig( config, group );
00320 }
00321 
00322 KActionCollection * KCombiView::actionCollection() const
00323 {
00324     return focusView( right )->actionCollection();
00325 }
00326 
00327 void KCombiView::setAcceptDrops(bool b)
00328 {
00329     left->setAcceptDrops(b);
00330     if (right)
00331        right->widget()->setAcceptDrops(b);
00332     QSplitter::setAcceptDrops(b);
00333 }
00334 
00335 void KCombiView::setDropOptions_impl(int options)
00336 {
00337     KFileView::setDropOptions_impl(options);
00338     left->setDropOptions(options);
00339     if (right)
00340        right->setDropOptions(options);
00341 }
00342 
00343 void KCombiView::virtual_hook( int id, void* data )
00344 {
00345     switch(id) {
00346       case VIRTUAL_SET_DROP_OPTIONS:
00347          setDropOptions_impl(*(int *)data);
00348          break;
00349       default:
00350          KFileView::virtual_hook( id, data );
00351     }
00352 }
00353 
00354 bool KCombiView::eventFilter( QObject *o, QEvent *e )
00355 {
00356     int type = e->type();
00357     
00358     // only the focused view may have a selection
00359     if ( type == QEvent::FocusIn )
00360     {
00361         if ( o == left )
00362             right->clearSelection();
00363         else if ( o == right->widget() )
00364             left->clearSelection();
00365     }
00366     
00367     return QSplitter::eventFilter( o, e );
00368 }
00369 
00370 #include "kcombiview.moc"
00371 

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