summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kcombiview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/kfile/kcombiview.cpp')
-rw-r--r--kio/kfile/kcombiview.cpp371
1 files changed, 371 insertions, 0 deletions
diff --git a/kio/kfile/kcombiview.cpp b/kio/kfile/kcombiview.cpp
new file mode 100644
index 000000000..fc16054f1
--- /dev/null
+++ b/kio/kfile/kcombiview.cpp
@@ -0,0 +1,371 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 1998 Stephan Kulow <coolo@kde.org>
+ 1998 Daniel Grana <grana@ie.iwi.unibe.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// $Id$
+
+#include <assert.h>
+
+#include "kfileitem.h"
+#include "kcombiview.h"
+#include "kfileiconview.h"
+#include "kfiledetailview.h"
+#include "config-kfile.h"
+
+#include <qevent.h>
+
+#include <qdir.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+
+#include <qvaluelist.h>
+
+KCombiView::KCombiView( QWidget *parent, const char *name)
+ : QSplitter( parent, name),
+ KFileView(),
+ right(0),
+ m_lastViewForNextItem(0),
+ m_lastViewForPrevItem(0)
+{
+ left = new KFileIconView( this, "left" );
+ left->setAcceptDrops(false);
+ left->viewport()->setAcceptDrops(false);
+ left->setGridX( 160 );
+ left->KFileView::setViewMode( Directories );
+ left->setArrangement( QIconView::LeftToRight );
+ left->setParentView( this );
+ left->setAcceptDrops(false);
+ left->installEventFilter( this );
+
+ connect( sig, SIGNAL( sortingChanged( QDir::SortSpec ) ),
+ SLOT( slotSortingChanged( QDir::SortSpec ) ));
+}
+
+KCombiView::~KCombiView()
+{
+ delete right;
+}
+
+void KCombiView::setRight(KFileView *view)
+{
+ delete right;
+ right = view;
+ right->KFileView::setViewMode( Files );
+ setViewName( right->viewName() );
+
+ QValueList<int> lst;
+ lst << left->gridX() + 2 * left->spacing();
+ setSizes( lst );
+ setResizeMode( left, QSplitter::KeepSize );
+
+ right->setParentView( this );
+ right->widget()->setAcceptDrops(acceptDrops());
+ right->setDropOptions(dropOptions());
+ right->widget()->installEventFilter( this );
+}
+
+
+void KCombiView::insertItem( KFileItem *item )
+{
+ KFileView::insertItem( item );
+
+ if ( item->isDir() ) {
+ left->updateNumbers( item );
+ left->insertItem( item );
+ }
+ else {
+ right->updateNumbers( item );
+ right->insertItem( item );
+ }
+}
+
+void KCombiView::setSorting( QDir::SortSpec sort )
+{
+ if ( !right )
+ kdFatal() << "You need to call setRight( someview ) before!" << endl;
+ right->setSorting( sort );
+ left->setSorting( sort );
+
+ KFileView::setSorting( right->sorting() );
+}
+
+void KCombiView::clearView()
+{
+ left->clearView();
+ if ( right )
+ right->clearView();
+}
+
+void KCombiView::updateView( bool b )
+{
+ left->updateView( b );
+ if ( right )
+ right->updateView( b );
+}
+
+void KCombiView::updateView( const KFileItem *i )
+{
+ left->updateView( i );
+ if ( right )
+ right->updateView( i );
+}
+
+void KCombiView::removeItem( const KFileItem *i )
+{
+ left->removeItem( i );
+ if ( right )
+ right->removeItem( i );
+ KFileView::removeItem( i );
+}
+
+void KCombiView::listingCompleted()
+{
+ left->listingCompleted();
+ if ( right )
+ right->listingCompleted();
+}
+
+void KCombiView::clear()
+{
+ KFileView::clear();
+ left->KFileView::clear();
+ if ( right )
+ right->clear();
+}
+
+void KCombiView::clearSelection()
+{
+ left->clearSelection();
+ if ( right )
+ right->clearSelection();
+}
+
+void KCombiView::selectAll()
+{
+ left->selectAll();
+ if ( right )
+ right->selectAll();
+}
+
+void KCombiView::invertSelection()
+{
+ left->invertSelection();
+ if ( right )
+ right->invertSelection();
+}
+
+bool KCombiView::isSelected( const KFileItem *item ) const
+{
+ assert( right ); // for performance reasons no if ( right ) check.
+ return (right->isSelected( item ) || left->isSelected( item ));
+}
+
+void KCombiView::setSelectionMode( KFile::SelectionMode sm )
+{
+ // I think the left view (directories should always be in
+ // Single-Mode, right?
+ // left->setSelectionMode( sm );
+ if ( !right )
+ kdFatal() << "You need to call setRight( someview ) before!" << endl;
+ right->setSelectionMode( sm );
+}
+
+void KCombiView::setSelected( const KFileItem *item, bool enable )
+{
+ left->setSelected( item, enable );
+ if ( right )
+ right->setSelected( item, enable );
+}
+
+void KCombiView::setCurrentItem( const KFileItem *item )
+{
+ left->setCurrentItem( item );
+ if ( right )
+ right->setCurrentItem( item );
+}
+
+KFileItem * KCombiView::currentFileItem() const
+{
+ // we can actually have two current items, one in each view. So we simply
+ // prefer the fileview's item over the directory's.
+ // Smarter: if the right view has focus, prefer that over the left.
+ if ( !right )
+ return left->currentFileItem();
+
+ KFileView *preferredView = focusView( right );
+ KFileItem *item = preferredView->currentFileItem();
+ if ( !item && preferredView != left )
+ item = left->currentFileItem();
+
+ return item;
+}
+
+void KCombiView::ensureItemVisible(const KFileItem *item)
+{
+ left->ensureItemVisible( item );
+ if ( right )
+ right->ensureItemVisible( item );
+}
+
+KFileItem * KCombiView::firstFileItem() const
+{
+ if ( !right )
+ return left->firstFileItem();
+
+ KFileView *preferredView = focusView( left );
+ KFileView *otherView = (preferredView == left) ? right : left;
+ KFileItem *item = preferredView->firstFileItem();
+ if ( !item )
+ item = otherView->firstFileItem();
+
+ return item;
+}
+
+KFileItem * KCombiView::nextItem( const KFileItem *fileItem ) const
+{
+ if ( !right )
+ return left->nextItem( fileItem );
+
+ KFileView *preferredView = focusView( left );
+ KFileView *otherView = (preferredView == left) ? right : left;
+ KFileItem *item = preferredView->nextItem( fileItem );
+
+ if ( item )
+ m_lastViewForNextItem = preferredView;
+ else { // no item, check other view
+ // when changing from one to another view, we need to continue
+ // with the next view's first item!
+ if ( m_lastViewForNextItem != otherView ) {
+ m_lastViewForNextItem = otherView;
+ return otherView->firstFileItem();
+ }
+
+ item = otherView->nextItem( fileItem );
+ m_lastViewForNextItem = otherView;
+ }
+
+ return item;
+}
+
+KFileItem * KCombiView::prevItem( const KFileItem *fileItem ) const
+{
+ if ( !right )
+ return left->nextItem( fileItem );
+
+ KFileView *preferredView = focusView( left );
+ KFileView *otherView = (preferredView == left) ? right : left;
+ KFileItem *item = preferredView->prevItem( fileItem );
+ if ( item )
+ m_lastViewForPrevItem = preferredView;
+
+ else { // no item, check other view
+ // when changing from one to another view, we need to continue
+ // with the next view's last item!
+ if ( m_lastViewForPrevItem != otherView ) {
+ fileItem = otherView->firstFileItem();
+ while ( otherView->nextItem( fileItem ) ) // find the last item
+ fileItem = otherView->nextItem( fileItem );
+ }
+
+ item = otherView->prevItem( fileItem );
+ m_lastViewForPrevItem = otherView;
+ }
+
+ return item;
+}
+
+void KCombiView::slotSortingChanged( QDir::SortSpec sorting )
+{
+ KFileView::setSorting( sorting );
+}
+
+KFileView *KCombiView::focusView( KFileView *preferred ) const
+{
+ QWidget *w = focusWidget();
+ KFileView *other = (right == preferred) ? left : right;
+ return (preferred && w == preferred->widget()) ? preferred : other;
+}
+
+void KCombiView::readConfig( KConfig *config, const QString& group )
+{
+ left->readConfig( config, group );
+ if ( right )
+ right->readConfig( config, group );
+}
+
+void KCombiView::writeConfig( KConfig *config, const QString& group )
+{
+ left->writeConfig( config, group );
+ if ( right )
+ right->writeConfig( config, group );
+}
+
+KActionCollection * KCombiView::actionCollection() const
+{
+ return focusView( right )->actionCollection();
+}
+
+void KCombiView::setAcceptDrops(bool b)
+{
+ left->setAcceptDrops(b);
+ if (right)
+ right->widget()->setAcceptDrops(b);
+ QSplitter::setAcceptDrops(b);
+}
+
+void KCombiView::setDropOptions_impl(int options)
+{
+ KFileView::setDropOptions_impl(options);
+ left->setDropOptions(options);
+ if (right)
+ right->setDropOptions(options);
+}
+
+void KCombiView::virtual_hook( int id, void* data )
+{
+ switch(id) {
+ case VIRTUAL_SET_DROP_OPTIONS:
+ setDropOptions_impl(*(int *)data);
+ break;
+ default:
+ KFileView::virtual_hook( id, data );
+ }
+}
+
+bool KCombiView::eventFilter( QObject *o, QEvent *e )
+{
+ int type = e->type();
+
+ // only the focused view may have a selection
+ if ( type == QEvent::FocusIn )
+ {
+ if ( o == left )
+ right->clearSelection();
+ else if ( o == right->widget() )
+ left->clearSelection();
+ }
+
+ return QSplitter::eventFilter( o, e );
+}
+
+#include "kcombiview.moc"
+