summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kfiletreeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/kfile/kfiletreeview.cpp')
-rw-r--r--kio/kfile/kfiletreeview.cpp677
1 files changed, 0 insertions, 677 deletions
diff --git a/kio/kfile/kfiletreeview.cpp b/kio/kfile/kfiletreeview.cpp
deleted file mode 100644
index 0b8504fd6..000000000
--- a/kio/kfile/kfiletreeview.cpp
+++ /dev/null
@@ -1,677 +0,0 @@
-/* This file is part of the KDEproject
- Copyright (C) 2000 David Faure <faure@kde.org>
- 2000 Carsten Pfeiffer <pfeiffer@kde.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- 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.
-*/
-
-#include <tqapplication.h>
-#include <tqheader.h>
-#include <tqtimer.h>
-#include <kdebug.h>
-#include <kdirnotify_stub.h>
-#include <kglobalsettings.h>
-#include <kfileitem.h>
-#include <kfileview.h>
-#include <kmimetype.h>
-#include <kstandarddirs.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <kio/job.h>
-#include <kio/global.h>
-#include <kurldrag.h>
-#include <kiconloader.h>
-
-
-#include "kfiletreeview.h"
-#include "kfiletreebranch.h"
-#include "kfiletreeviewitem.h"
-
-KFileTreeView::KFileTreeView( TQWidget *parent, const char *name )
- : KListView( parent, name ),
- m_wantOpenFolderPixmaps( true ),
- m_toolTip( this )
-{
- setDragEnabled(true);
- setSelectionModeExt( KListView::Single );
-
- m_animationTimer = new TQTimer( this );
- connect( m_animationTimer, TQT_SIGNAL( timeout() ),
- this, TQT_SLOT( slotAnimation() ) );
-
- m_currentBeforeDropItem = 0;
- m_dropItem = 0;
-
- m_autoOpenTimer = new TQTimer( this );
- connect( m_autoOpenTimer, TQT_SIGNAL( timeout() ),
- this, TQT_SLOT( slotAutoOpenFolder() ) );
-
- /* The executed-Slot only opens a path, while the expanded-Slot populates it */
- connect( this, TQT_SIGNAL( executed( TQListViewItem * ) ),
- this, TQT_SLOT( slotExecuted( TQListViewItem * ) ) );
- connect( this, TQT_SIGNAL( expanded ( TQListViewItem *) ),
- this, TQT_SLOT( slotExpanded( TQListViewItem *) ));
- connect( this, TQT_SIGNAL( collapsed( TQListViewItem *) ),
- this, TQT_SLOT( slotCollapsed( TQListViewItem* )));
-
-
- /* connections from the konqtree widget */
- connect( this, TQT_SIGNAL( selectionChanged() ),
- this, TQT_SLOT( slotSelectionChanged() ) );
- connect( this, TQT_SIGNAL( onItem( TQListViewItem * )),
- this, TQT_SLOT( slotOnItem( TQListViewItem * ) ) );
- connect( this, TQT_SIGNAL(itemRenamed(TQListViewItem*, const TQString &, int)),
- this, TQT_SLOT(slotItemRenamed(TQListViewItem*, const TQString &, int)));
-
-
- m_bDrag = false;
- m_branches.setAutoDelete( true );
-
- m_openFolderPixmap = DesktopIcon( "folder_open",KIcon::SizeSmall,KIcon::ActiveState );
-}
-
-KFileTreeView::~KFileTreeView()
-{
- // we must make sure that the KFileTreeViewItems are deleted _before_ the
- // branches are deleted. Otherwise, the KFileItems would be destroyed
- // and the KFileTreeViewItems had dangling pointers to them.
- hide();
- clear();
- m_branches.clear(); // finally delete the branches and KFileItems
-}
-
-
-bool KFileTreeView::isValidItem( TQListViewItem *item)
-{
- if (!item)
- return false;
- TQPtrList<TQListViewItem> lst;
- TQListViewItemIterator it( this );
- while ( it.current() )
- {
- if ( it.current() == item )
- return true;
- ++it;
- }
- return false;
-}
-
-void KFileTreeView::contentsDragEnterEvent( TQDragEnterEvent *ev )
-{
- if ( ! acceptDrag( ev ) )
- {
- ev->ignore();
- return;
- }
- ev->acceptAction();
- m_currentBeforeDropItem = selectedItem();
-
- TQListViewItem *item = itemAt( contentsToViewport( ev->pos() ) );
- if( item )
- {
- m_dropItem = item;
- m_autoOpenTimer->start( KFileView::autoOpenDelay() );
- }
- else
- {
- m_dropItem = 0;
-}
-}
-
-void KFileTreeView::contentsDragMoveEvent( TQDragMoveEvent *e )
-{
- if( ! acceptDrag( e ) )
- {
- e->ignore();
- return;
- }
- e->acceptAction();
-
-
- TQListViewItem *afterme;
- TQListViewItem *parent;
-
- findDrop( e->pos(), parent, afterme );
-
- // "afterme" is 0 when aiming at a directory itself
- TQListViewItem *item = afterme ? afterme : parent;
-
- if( item && item->isSelectable() )
- {
- setSelected( item, true );
- if( item != m_dropItem ) {
- m_autoOpenTimer->stop();
- m_dropItem = item;
- m_autoOpenTimer->start( KFileView::autoOpenDelay() );
- }
- }
- else
- {
- m_autoOpenTimer->stop();
- m_dropItem = 0;
- }
-}
-
-void KFileTreeView::contentsDragLeaveEvent( TQDragLeaveEvent * )
-{
- // Restore the current item to what it was before the dragging (#17070)
- if ( isValidItem(m_currentBeforeDropItem) )
- {
- setSelected( m_currentBeforeDropItem, true );
- ensureItemVisible( m_currentBeforeDropItem );
- }
- else if ( isValidItem(m_dropItem) )
- setSelected( m_dropItem, false ); // no item selected
- m_currentBeforeDropItem = 0;
- m_dropItem = 0;
-
-}
-
-void KFileTreeView::contentsDropEvent( TQDropEvent *e )
-{
-
- m_autoOpenTimer->stop();
- m_dropItem = 0;
-
- kdDebug(250) << "contentsDropEvent !" << endl;
- if( ! acceptDrag( e ) ) {
- e->ignore();
- return;
- }
-
- e->acceptAction();
- TQListViewItem *afterme;
- TQListViewItem *parent;
- findDrop(e->pos(), parent, afterme);
-
- //kdDebug(250) << " parent=" << (parent?parent->text(0):TQString::null)
- // << " afterme=" << (afterme?afterme->text(0):TQString::null) << endl;
-
- if (e->source() == viewport() && itemsMovable())
- movableDropEvent(parent, afterme);
- else
- {
- emit dropped(e, afterme);
- emit dropped(this, e, afterme);
- emit dropped(e, parent, afterme);
- emit dropped(this, e, parent, afterme);
-
- KURL::List urls;
- KURLDrag::decode( e, urls );
- emit dropped( this, e, urls );
-
- KURL parentURL;
- if( parent )
- parentURL = static_cast<KFileTreeViewItem*>(parent)->url();
- else
- // can happen when dropping above the root item
- // Should we choose the first branch in such a case ??
- return;
-
- emit dropped( urls, parentURL );
- emit dropped( this , e, urls, parentURL );
- }
-}
-
-bool KFileTreeView::acceptDrag(TQDropEvent* e ) const
-{
-
- bool ancestOK= acceptDrops();
- // kdDebug(250) << "Do accept drops: " << ancestOK << endl;
- ancestOK = ancestOK && itemsMovable();
- // kdDebug(250) << "acceptDrag: " << ancestOK << endl;
- // kdDebug(250) << "canDecode: " << KURLDrag::canDecode(e) << endl;
- // kdDebug(250) << "action: " << e->action() << endl;
-
- /* KListView::acceptDrag(e); */
- /* this is what KListView does:
- * acceptDrops() && itemsMovable() && (e->source()==viewport());
- * ask acceptDrops and itemsMovable, but not the third
- */
- return ancestOK && KURLDrag::canDecode( e ) &&
- // Why this test? All DnDs are one of those AFAIK (DF)
- ( e->action() == TQDropEvent::Copy
- || e->action() == TQDropEvent::Move
- || e->action() == TQDropEvent::Link );
-}
-
-
-
-TQDragObject * KFileTreeView::dragObject()
-{
-
- KURL::List urls;
- const TQPtrList<TQListViewItem> fileList = selectedItems();
- TQPtrListIterator<TQListViewItem> it( fileList );
- for ( ; it.current(); ++it )
- {
- urls.append( static_cast<KFileTreeViewItem*>(it.current())->url() );
- }
- TQPoint hotspot;
- TQPixmap pixmap;
- if( urls.count() > 1 ){
- pixmap = DesktopIcon( "tdemultiple", 16 );
- }
- if( pixmap.isNull() )
- pixmap = currentKFileTreeViewItem()->fileItem()->pixmap( 16 );
- hotspot.setX( pixmap.width() / 2 );
- hotspot.setY( pixmap.height() / 2 );
- TQDragObject* dragObject = new KURLDrag( urls, this );
- if( dragObject )
- dragObject->setPixmap( pixmap, hotspot );
- return dragObject;
-}
-
-
-
-void KFileTreeView::slotCollapsed( TQListViewItem *item )
-{
- KFileTreeViewItem *kftvi = static_cast<KFileTreeViewItem*>(item);
- kdDebug(250) << "hit slotCollapsed" << endl;
- if( kftvi && kftvi->isDir())
- {
- item->setPixmap( 0, itemIcon(kftvi));
- }
-}
-
-void KFileTreeView::slotExpanded( TQListViewItem *item )
-{
- kdDebug(250) << "slotExpanded here !" << endl;
-
- if( ! item ) return;
-
- KFileTreeViewItem *it = static_cast<KFileTreeViewItem*>(item);
- KFileTreeBranch *branch = it->branch();
-
- /* Start the animation for the branch object */
- if( it->isDir() && branch && item->childCount() == 0 )
- {
- /* check here if the branch really needs to be populated again */
- kdDebug(250 ) << "starting to open " << it->url().prettyURL() << endl;
- startAnimation( it );
- bool branchAnswer = branch->populate( it->url(), it );
- kdDebug(250) << "Branches answer: " << branchAnswer << endl;
- if( ! branchAnswer )
- {
- kdDebug(250) << "ERR: Could not populate!" << endl;
- stopAnimation( it );
- }
- }
-
- /* set a pixmap 'open folder' */
- if( it->isDir() && isOpen( item ) )
- {
- kdDebug(250)<< "Setting open Pixmap" << endl;
- item->setPixmap( 0, itemIcon( it )); // 0, m_openFolderPixmap );
- }
-}
-
-
-
-void KFileTreeView::slotExecuted( TQListViewItem *item )
-{
- if ( !item )
- return;
- /* This opens the dir and causes the Expanded-slot to be called,
- * which strolls through the children.
- */
- if( static_cast<KFileTreeViewItem*>(item)->isDir())
- {
- item->setOpen( !item->isOpen() );
- }
-}
-
-
-void KFileTreeView::slotAutoOpenFolder()
-{
- m_autoOpenTimer->stop();
-
- if ( !isValidItem(m_dropItem) || m_dropItem->isOpen() )
- return;
-
- m_dropItem->setOpen( true );
- m_dropItem->repaint();
-}
-
-
-void KFileTreeView::slotSelectionChanged()
-{
- if ( !m_dropItem ) // don't do this while the dragmove thing
- {
- }
-}
-
-
-KFileTreeBranch* KFileTreeView::addBranch( const KURL &path, const TQString& name,
- bool showHidden )
-{
- const TQPixmap& folderPix = KMimeType::mimeType("inode/directory")->pixmap( KIcon::Desktop,KIcon::SizeSmall );
-
- return addBranch( path, name, folderPix, showHidden);
-}
-
-KFileTreeBranch* KFileTreeView::addBranch( const KURL &path, const TQString& name,
- const TQPixmap& pix, bool showHidden )
-{
- kdDebug(250) << "adding another root " << path.prettyURL() << endl;
-
- /* Open a new branch */
- KFileTreeBranch *newBranch = new KFileTreeBranch( this, path, name, pix,
- showHidden );
- return addBranch(newBranch);
-}
-
-KFileTreeBranch *KFileTreeView::addBranch(KFileTreeBranch *newBranch)
-{
- connect( newBranch, TQT_SIGNAL(populateFinished( KFileTreeViewItem* )),
- this, TQT_SLOT( slotPopulateFinished( KFileTreeViewItem* )));
-
- connect( newBranch, TQT_SIGNAL( newTreeViewItems( KFileTreeBranch*,
- const KFileTreeViewItemList& )),
- this, TQT_SLOT( slotNewTreeViewItems( KFileTreeBranch*,
- const KFileTreeViewItemList& )));
-
- m_branches.append( newBranch );
- return( newBranch );
-}
-
-KFileTreeBranch *KFileTreeView::branch( const TQString& searchName )
-{
- KFileTreeBranch *branch = 0;
- TQPtrListIterator<KFileTreeBranch> it( m_branches );
-
- while ( (branch = it.current()) != 0 ) {
- ++it;
- TQString bname = branch->name();
- kdDebug(250) << "This is the branches name: " << bname << endl;
- if( bname == searchName )
- {
- kdDebug(250) << "Found branch " << bname << " and return ptr" << endl;
- return( branch );
- }
- }
- return ( 0L );
-}
-
-KFileTreeBranchList& KFileTreeView::branches()
-{
- return( m_branches );
-}
-
-
-bool KFileTreeView::removeBranch( KFileTreeBranch *branch )
-{
- if(m_branches.contains(branch))
- {
- delete (branch->root());
- m_branches.remove( branch );
- return true;
- }
- else
- {
- return false;
- }
-}
-
-void KFileTreeView::setDirOnlyMode( KFileTreeBranch* branch, bool bom )
-{
- if( branch )
- {
- branch->setDirOnlyMode( bom );
- }
-}
-
-
-void KFileTreeView::slotPopulateFinished( KFileTreeViewItem *it )
-{
- if( it && it->isDir())
- stopAnimation( it );
-}
-
-void KFileTreeView::slotNewTreeViewItems( KFileTreeBranch* branch, const KFileTreeViewItemList& itemList )
-{
- if( ! branch ) return;
- kdDebug(250) << "hitting slotNewTreeViewItems" << endl;
-
- /* Sometimes it happens that new items should become selected, i.e. if the user
- * creates a new dir, he probably wants it to be selected. This can not be done
- * right after creating the directory or file, because it takes some time until
- * the item appears here in the treeview. Thus, the creation code sets the member
- * m_neUrlToSelect to the required url. If this url appears here, the item becomes
- * selected and the member nextUrlToSelect will be cleared.
- */
- if( ! m_nextUrlToSelect.isEmpty() )
- {
- KFileTreeViewItemListIterator it( itemList );
-
- bool end = false;
- for( ; !end && it.current(); ++it )
- {
- KURL url = (*it)->url();
-
- if( m_nextUrlToSelect.equals(url, true )) // ignore trailing / on dirs
- {
- setCurrentItem( static_cast<TQListViewItem*>(*it) );
- m_nextUrlToSelect = KURL();
- end = true;
- }
- }
- }
-}
-
-TQPixmap KFileTreeView::itemIcon( KFileTreeViewItem *item, int gap ) const
-{
- TQPixmap pix;
- kdDebug(250) << "Setting icon for column " << gap << endl;
-
- if( item )
- {
- /* Check if it is a branch root */
- KFileTreeBranch *brnch = item->branch();
- if( item == brnch->root() )
- {
- pix = brnch->pixmap();
- if( m_wantOpenFolderPixmaps && brnch->root()->isOpen() )
- {
- pix = brnch->openPixmap();
- }
- }
- else
- {
- // TODO: different modes, user Pixmaps ?
- pix = item->fileItem()->pixmap( KIcon::SizeSmall ); // , KIcon::DefaultState);
-
- /* Only if it is a dir and the user wants open dir pixmap and it is open,
- * change the fileitem's pixmap to the open folder pixmap. */
- if( item->isDir() && m_wantOpenFolderPixmaps )
- {
- if( isOpen( static_cast<TQListViewItem*>(item)))
- pix = m_openFolderPixmap;
- }
- }
- }
-
- return pix;
-}
-
-
-void KFileTreeView::slotAnimation()
-{
- MapCurrentOpeningFolders::Iterator it = m_mapCurrentOpeningFolders.begin();
- MapCurrentOpeningFolders::Iterator end = m_mapCurrentOpeningFolders.end();
- for (; it != end;)
- {
- KFileTreeViewItem *item = it.key();
- if (!isValidItem(item))
- {
- ++it;
- m_mapCurrentOpeningFolders.remove(item);
- continue;
- }
-
- uint & iconNumber = it.data().iconNumber;
- TQString icon = TQString::fromLatin1( it.data().iconBaseName ).append( TQString::number( iconNumber ) );
- // kdDebug(250) << "Loading icon " << icon << endl;
- item->setPixmap( 0, DesktopIcon( icon,KIcon::SizeSmall,KIcon::ActiveState )); // KFileTreeViewFactory::instance() ) );
-
- iconNumber++;
- if ( iconNumber > it.data().iconCount )
- iconNumber = 1;
-
- ++it;
- }
-}
-
-
-void KFileTreeView::startAnimation( KFileTreeViewItem * item, const char * iconBaseName, uint iconCount )
-{
- /* TODO: allow specific icons */
- if( ! item )
- {
- kdDebug(250) << " startAnimation Got called without valid item !" << endl;
- return;
- }
-
- m_mapCurrentOpeningFolders.insert( item,
- AnimationInfo( iconBaseName,
- iconCount,
- itemIcon(item, 0) ) );
- if ( !m_animationTimer->isActive() )
- m_animationTimer->start( 50 );
-}
-
-void KFileTreeView::stopAnimation( KFileTreeViewItem * item )
-{
- if( ! item ) return;
-
- kdDebug(250) << "Stoping Animation !" << endl;
-
- MapCurrentOpeningFolders::Iterator it = m_mapCurrentOpeningFolders.find(item);
- if ( it != m_mapCurrentOpeningFolders.end() )
- {
- if( item->isDir() && isOpen( item) )
- {
- kdDebug(250) << "Setting folder open pixmap !" << endl;
- item->setPixmap( 0, itemIcon( item ));
- }
- else
- {
- item->setPixmap( 0, it.data().originalPixmap );
- }
- m_mapCurrentOpeningFolders.remove( item );
- }
- else
- {
- if( item )
- kdDebug(250)<< "StopAnimation - could not find item " << item->url().prettyURL()<< endl;
- else
- kdDebug(250)<< "StopAnimation - item is zero !" << endl;
- }
- if (m_mapCurrentOpeningFolders.isEmpty())
- m_animationTimer->stop();
-}
-
-KFileTreeViewItem * KFileTreeView::currentKFileTreeViewItem() const
-{
- return static_cast<KFileTreeViewItem *>( selectedItem() );
-}
-
-KURL KFileTreeView::currentURL() const
-{
- KFileTreeViewItem *item = currentKFileTreeViewItem();
- if ( item )
- return currentKFileTreeViewItem()->url();
- else
- return KURL();
-}
-
-void KFileTreeView::slotOnItem( TQListViewItem *item )
-{
- KFileTreeViewItem *i = static_cast<KFileTreeViewItem *>( item );
- if( i )
- {
- const KURL url = i->url();
- if ( url.isLocalFile() )
- emit onItem( url.path() );
- else
- emit onItem( url.prettyURL() );
- }
-}
-
-void KFileTreeView::slotItemRenamed(TQListViewItem* item, const TQString &name, int col)
-{
- (void) item;
- kdDebug(250) << "Do not bother: " << name << col << endl;
-}
-
-KFileTreeViewItem *KFileTreeView::findItem( const TQString& branchName, const TQString& relUrl )
-{
- KFileTreeBranch *br = branch( branchName );
- return( findItem( br, relUrl ));
-}
-
-KFileTreeViewItem *KFileTreeView::findItem( KFileTreeBranch* brnch, const TQString& relUrl )
-{
- KFileTreeViewItem *ret = 0;
- if( brnch )
- {
- KURL url = brnch->rootUrl();
-
- if( ! relUrl.isEmpty() && TQDir::isRelativePath(relUrl) )
- {
- TQString partUrl( relUrl );
-
- if( partUrl.endsWith("/"))
- partUrl.truncate( relUrl.length()-1 );
-
- url.addPath( partUrl );
-
- kdDebug(250) << "assembled complete dir string " << url.prettyURL() << endl;
-
- KFileItem *fi = brnch->findByURL( url );
- if( fi )
- {
- ret = static_cast<KFileTreeViewItem*>( fi->extraData( brnch ));
- kdDebug(250) << "Found item !" <<ret << endl;
- }
- }
- else
- {
- ret = brnch->root();
- }
- }
- return( ret );
-}
-
-///////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////
-
-
-void KFileTreeViewToolTip::maybeTip( const TQPoint & )
-{
-#if 0
- TQListViewItem *item = m_view->itemAt( point );
- if ( item ) {
- TQString text = static_cast<KFileViewItem*>( item )->toolTipText();
- if ( !text.isEmpty() )
- tip ( m_view->itemRect( item ), text );
- }
-#endif
-}
-
-void KFileTreeView::virtual_hook( int id, void* data )
-{ KListView::virtual_hook( id, data ); }
-
-#include "kfiletreeview.moc"