summaryrefslogtreecommitdiffstats
path: root/src/app/Panel/krview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/Panel/krview.cpp')
-rw-r--r--src/app/Panel/krview.cpp332
1 files changed, 332 insertions, 0 deletions
diff --git a/src/app/Panel/krview.cpp b/src/app/Panel/krview.cpp
new file mode 100644
index 0000000..8330f16
--- /dev/null
+++ b/src/app/Panel/krview.cpp
@@ -0,0 +1,332 @@
+/***************************************************************************
+ krview.cpp
+ -------------------
+ copyright : (C) 2000-2002 by Shie Erlich & Rafi Yanai
+ e-mail : krusader@users.sourceforge.net
+ web site : http://krusader.sourceforge.net
+---------------------------------------------------------------------------
+ Description
+***************************************************************************
+
+ A
+
+ db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b.
+ 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D
+ 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY'
+ 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b
+ 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88.
+ YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD
+
+ S o u r c e F i l e
+
+***************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+***************************************************************************/
+#include "krview.h"
+#include "../kicons.h"
+#include "../defaults.h"
+#include "../VFS/krpermhandler.h"
+#include "krviewitem.h"
+#include <tqnamespace.h>
+#include <tqpixmapcache.h>
+#include <tqdir.h>
+#include <tqbitmap.h>
+#include <kmimetype.h>
+#include <tdelocale.h>
+#include <kinputdialog.h>
+
+
+#define VF getVfile()
+
+
+// ----------------------------- operator
+KrViewOperator::KrViewOperator(KrView *view, TQWidget *widget): _view(view), _widget(widget) {
+}
+
+KrViewOperator::~KrViewOperator() {
+}
+
+void KrViewOperator::startDrag() {
+ TQStringList items;
+ _view->getSelectedItems( &items );
+ if ( items.empty() )
+ return ; // don't drag an empty thing
+ TQPixmap px;
+ if ( items.count() > 1 )
+ px = FL_LOADICON( "queue" ); // how much are we dragging
+ else
+ px = _view->getCurrentKrViewItem() ->icon();
+ emit letsDrag( items, px );
+}
+
+// ----------------------------- krview
+
+KrView::KrView( TDEConfig *cfg ) : _config( cfg ), _widget(0), _nameToMakeCurrent( TQString() ), _nameToMakeCurrentIfAdded( TQString() ),
+_numSelected( 0 ), _count( 0 ), _numDirs( 0 ), _countSize( 0 ), _selectedSize( 0 ), _properties(0), _focused( false ), _nameInTDEConfig(TQString()) {
+}
+
+KrView::~KrView() {
+ if (_properties)
+ tqFatal("A class inheriting KrView didn't delete _properties!");
+ if (_operator)
+ tqFatal("A class inheriting KrView didn't delete _operator!");
+}
+
+void KrView::init() {
+ // sanity checks:
+ if (_nameInTDEConfig.isEmpty())
+ tqFatal("_nameInTDEConfig must be set during construction of KrView inheritors");
+ if (!_widget)
+ tqFatal("_widget must be set during construction of KrView inheritors");
+ // ok, continue
+ initProperties();
+ initOperator();
+ setup();
+}
+
+TQPixmap KrView::getIcon( vfile *vf /*, KRListItem::cmpColor color*/ ) {
+ //krConfig->setGroup("Advanced");
+ //////////////////////////////
+ TQPixmap icon;
+ TQString icon_name = vf->vfile_getIcon();
+ //TQPixmapCache::setCacheLimit( krConfig->readNumEntry("Icon Cache Size",_IconCacheSize) );
+
+ if( icon_name.isNull() )
+ icon_name="";
+
+ // first try the cache
+ if ( !TQPixmapCache::find( icon_name, icon ) ) {
+ icon = FL_LOADICON( icon_name );
+ // insert it into the cache
+ TQPixmapCache::insert( icon_name, icon );
+ }
+ // if it's a symlink - add an arrow overlay
+ if ( vf->vfile_isSymLink() ) {
+ TQPixmap link( link_xpm );
+ bitBlt ( &icon, 0, icon.height() - 11, &link, 0, 21, 10, 11, TQt::CopyROP, false );
+ icon.setMask( icon.createHeuristicMask( false ) );
+ }
+
+ return icon;
+}
+
+/**
+ * this function ADDs a list of selected item names into 'names'.
+ * it assumes the list is ready and doesn't initialize it, or clears it
+ */
+void KrView::getItemsByMask( TQString mask, TQStringList* names, bool dirs, bool files ) {
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) ) {
+ if ( ( it->name() == ".." ) || !TQDir::match( mask, it->name() ) ) continue;
+ // if we got here, than the item fits the mask
+ if ( it->getVfile()->vfile_isDir() && !dirs ) continue; // do we need to skip folders?
+ if ( !it->getVfile()->vfile_isDir() && !files ) continue; // do we need to skip files
+ names->append( it->name() );
+ }
+}
+
+/**
+ * this function ADDs a list of selected item names into 'names'.
+ * it assumes the list is ready and doesn't initialize it, or clears it
+ */
+void KrView::getSelectedItems( TQStringList *names ) {
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) )
+ if ( it->isSelected() && ( it->name() != ".." ) ) names->append( it->name() );
+
+ // if all else fails, take the current item
+ TQString item = getCurrentItem();
+ if ( names->empty() && item!=TQString() && item!=".." ) names->append( item );
+}
+
+void KrView::getSelectedKrViewItems( KrViewItemList *items ) {
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) )
+ if ( it->isSelected() && ( it->name() != ".." ) ) items->append( it );
+
+ // if all else fails, take the current item
+ TQString item = getCurrentItem();
+ if ( items->empty() && item!=TQString() && item!=".." ) items->append( getCurrentKrViewItem() );
+}
+
+TQString KrView::statistics() {
+ _countSize = _numSelected = _selectedSize = 0;
+
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) ){
+ if ( it->isSelected() ) {
+ ++_numSelected;
+ _selectedSize += it->getVfile()->vfile_getSize();
+ }
+ if (it->getVfile()->vfile_getSize() > 0)
+ _countSize += it->getVfile()->vfile_getSize();
+ }
+ TQString tmp = TQString(i18n("%1 out of %2, %3 (%4) out of %5 (%6)"))
+ .arg( _numSelected ).arg( _count ).arg( TDEIO::convertSize( _selectedSize ) )
+ .arg( KRpermHandler::parseSize(_selectedSize) )
+ .arg( TDEIO::convertSize( _countSize ) ).arg( KRpermHandler::parseSize(_countSize) );
+ // notify if we're running a filtered view
+ if (filter() != KrViewProperties::All)
+ tmp = ">> [ " + filterMask().nameFilter() + " ] "+tmp;
+ return tmp;
+}
+
+void KrView::changeSelection( const KRQuery& filter, bool select, bool includeDirs ) {
+ TDEConfigGroupSaver grpSvr( _config, "Look&Feel" );
+ bool markDirs = _config->readBoolEntry( "Mark Dirs", _MarkDirs ) || includeDirs;
+
+ KrViewItem *temp = getCurrentKrViewItem();
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) ) {
+ if ( it->name() == ".." ) continue;
+ if ( it->getVfile()->vfile_isDir() && !markDirs ) continue;
+
+ vfile * file = it->getMutableVfile(); // filter::match calls getMimetype which isn't const
+ if( file == 0 ) continue;
+
+ if( filter.match( file ) ) {
+ // we're increasing/decreasing the number of selected files
+ if ( select ) {
+ if ( !it->isSelected() ) {
+ ++_numSelected;
+ _selectedSize += it->getVfile()->vfile_getSize();
+ }
+ } else {
+ if ( it->isSelected() ) {
+ --_numSelected;
+ _selectedSize -= it->getVfile()->vfile_getSize();
+ }
+ }
+ it->setSelected( select );
+ }
+ }
+ updateView();
+ makeItemVisible( temp );
+}
+
+void KrView::invertSelection() {
+ TDEConfigGroupSaver grpSvr( _config, "Look&Feel" /*nameInTDEConfig()*/ );
+ bool markDirs = _config->readBoolEntry( "Mark Dirs", _MarkDirs );
+
+ KrViewItem *temp = getCurrentKrViewItem();
+ for ( KrViewItem * it = getFirst(); it != 0; it = getNext( it ) ) {
+ if ( it->name() == ".." ) continue;
+ if ( it->getVfile()->vfile_isDir() && !markDirs && !it->isSelected() ) continue;
+ if ( it->isSelected() ) {
+ --_numSelected;
+ _selectedSize -= it->getVfile()->vfile_getSize();
+ } else {
+ ++_numSelected;
+ _selectedSize += it->getVfile()->vfile_getSize();
+ }
+ it->setSelected( !it->isSelected() );
+ }
+ updateView();
+ makeItemVisible( temp );
+}
+
+TQString KrView::firstUnmarkedBelowCurrent() {
+ KrViewItem * iterator = getNext( getCurrentKrViewItem() );
+ while ( iterator && iterator->isSelected() )
+ iterator = getNext( iterator );
+ if ( !iterator ) {
+ iterator = getPrev( getCurrentKrViewItem() );
+ while ( iterator && iterator->isSelected() )
+ iterator = getPrev( iterator );
+ }
+ if ( !iterator ) return TQString();
+ return iterator->name();
+}
+
+void KrView::delItem(const TQString &name) {
+ KrViewItem * it = _dict[ name ];
+ if ( !it ) {
+ krOut << "got signal deletedVfile(" << name << ") but can't find KrViewItem" << endl;
+ return;
+ }
+ if (!preDelItem(it)) return; // do not delete this after all
+
+ // remove from dict
+ if (it->VF->vfile_isDir()) {
+ --_numDirs;
+ } else {
+ _countSize -= it->VF->vfile_getSize();
+ }
+ --_count;
+ _dict.remove( name );
+ delete it;
+ op()->emitSelectionChanged();
+}
+
+KrViewItem *KrView::addItem( vfile *vf ) {
+ KrViewItem *item = preAddItem(vf);
+ if (!item) return 0; // don't add it after all
+
+ // add to dictionary
+ _dict.insert( vf->vfile_getName(), item );
+ if ( vf->vfile_isDir() )
+ ++_numDirs;
+ else _countSize += vf->vfile_getSize();
+ ++_count;
+
+ if (item->name() == nameToMakeCurrent() ) {
+ setCurrentItem(item->name()); // dictionary based - quick
+ makeItemVisible( item );
+ }
+ if (item->name() == nameToMakeCurrentIfAdded() ) {
+ setCurrentItem(item->name());
+ setNameToMakeCurrentIfAdded(TQString());
+ makeItemVisible( item );
+ }
+
+
+ op()->emitSelectionChanged();
+ return item;
+}
+
+void KrView::updateItem(vfile *vf) {
+ // since we're deleting the item, make sure we keep
+ // it's properties first and repair it later
+ KrViewItem * it = _dict[ vf->vfile_getName() ];
+ if ( !it ) {
+ krOut << "got signal updatedVfile(" << vf->vfile_getName() << ") but can't find KrViewItem" << endl;
+ } else {
+ bool selected = it->isSelected();
+ bool current = ( getCurrentKrViewItem() == it );
+ delItem( vf->vfile_getName() );
+ KrViewItem *updatedItem = addItem( vf );
+ // restore settings
+ ( _dict[ vf->vfile_getName() ] ) ->setSelected( selected );
+ if ( current ) {
+ setCurrentItem( vf->vfile_getName() );
+ makeItemVisible( updatedItem );
+ }
+ }
+ op()->emitSelectionChanged();
+}
+
+void KrView::clear() {
+ _count = _numSelected = _numDirs = _selectedSize = _countSize = 0;
+ _dict.clear();
+}
+
+// good old dialog box
+void KrView::renameCurrentItem() {
+ TQString newName, fileName;
+
+ KrViewItem *it = getCurrentKrViewItem();
+ if ( it ) fileName = it->name();
+ else return ; // quit if no current item available
+
+ // don't allow anyone to rename ..
+ if ( fileName == ".." ) return ;
+
+ bool ok = false;
+ newName = KInputDialog::getText( i18n( "Rename" ), i18n( "Rename " ) + fileName + i18n( " to:" ),
+ fileName, &ok, krApp );
+ // if the user canceled - quit
+ if ( !ok || newName == fileName )
+ return ;
+ op()->emitRenameItem(it->name(), newName);
+}
+