23 #include <tqkeycode.h>
25 #include <tqpainter.h>
28 #include <kapplication.h>
29 #include <kfileitem.h>
31 #include <kglobalsettings.h>
32 #include <kiconloader.h>
33 #include <kicontheme.h>
38 #include "kfiledetailview.h"
39 #include "config-kfile.h"
48 class KFileDetailView::KFileDetailViewPrivate
51 KFileDetailViewPrivate() : dropItem(0)
55 TQTimer autoOpenTimer;
58 KFileDetailView::KFileDetailView(TQWidget *parent,
const char *name)
59 : KListView(parent, name),
KFileView(), d(new KFileDetailViewPrivate())
62 m_sortingCol = COL_NAME;
63 m_blockSortingSignal =
false;
64 setViewName( i18n(
"Detailed View") );
66 addColumn( i18n(
"Name" ) );
67 addColumn( i18n(
"Size" ) );
68 addColumn( i18n(
"Date" ) );
69 addColumn( i18n(
"Permissions" ) );
70 addColumn( i18n(
"Owner" ) );
71 addColumn( i18n(
"Group" ) );
72 setShowSortIndicator(
true );
73 setAllColumnsShowFocus(
true );
76 connect( header(), TQT_SIGNAL( clicked(
int)),
77 TQT_SLOT(slotSortingChanged(
int) ));
80 connect(
this, TQT_SIGNAL( returnPressed(TQListViewItem *) ),
81 TQT_SLOT( slotActivate( TQListViewItem *) ) );
83 connect(
this, TQT_SIGNAL( clicked(TQListViewItem *,
const TQPoint&,
int)),
84 TQT_SLOT( selected( TQListViewItem *) ) );
85 connect(
this, TQT_SIGNAL( doubleClicked(TQListViewItem *,
const TQPoint&,
int)),
86 TQT_SLOT( slotActivate( TQListViewItem *) ) );
88 connect(
this, TQT_SIGNAL(contextMenuRequested( TQListViewItem *,
89 const TQPoint &,
int )),
90 this, TQT_SLOT( slotActivateMenu( TQListViewItem *,
const TQPoint& )));
92 KFile::SelectionMode sm = KFileView::selectionMode();
95 TQListView::setSelectionMode( TQListView::Multi );
98 TQListView::setSelectionMode( TQListView::Extended );
100 case KFile::NoSelection:
101 TQListView::setSelectionMode( TQListView::NoSelection );
105 TQListView::setSelectionMode( TQListView::Single );
110 if ( sm == KFile::Multi || sm == KFile::Extended )
111 connect(
this, TQT_SIGNAL( selectionChanged() ),
112 TQT_SLOT( slotSelectionChanged() ));
114 connect(
this, TQT_SIGNAL( selectionChanged( TQListViewItem * ) ),
115 TQT_SLOT( highlighted( TQListViewItem * ) ));
118 connect( &(d->autoOpenTimer), TQT_SIGNAL( timeout() ),
119 this, TQT_SLOT( slotAutoOpen() ));
121 setSorting( sorting() );
124 new KMimeTypeResolver<KFileListViewItem,KFileDetailView>( this );
127 KFileDetailView::~KFileDetailView()
133 void KFileDetailView::readConfig( KConfig *config,
const TQString& group )
135 restoreLayout( config, group );
138 void KFileDetailView::writeConfig( KConfig *config,
const TQString& group )
140 saveLayout( config, group );
152 KListView::setSelected( item, enable );
161 KListView::setCurrentItem( it );
175 KListView::clearSelection();
180 if (KFileView::selectionMode() == KFile::NoSelection ||
181 KFileView::selectionMode() == KFile::Single)
184 KListView::selectAll(
true );
189 KListView::invertSelection();
192 void KFileDetailView::slotActivateMenu (TQListViewItem *item,
const TQPoint& pos )
195 sig->activateMenu( 0, pos );
199 sig->activateMenu( i->
fileInfo(), pos );
204 m_resolver->m_lstPendingMimeIconItems.clear();
214 setSortingKey( item, i );
216 i->setExtraData(
this, item );
218 if ( !i->isMimeTypeKnown() )
219 m_resolver->m_lstPendingMimeIconItems.append( item );
222 void KFileDetailView::slotActivate( TQListViewItem *item )
232 void KFileDetailView::selected( TQListViewItem *item )
237 if ( KGlobalSettings::singleClick() ) {
244 void KFileDetailView::highlighted( TQListViewItem *item )
255 void KFileDetailView::setSelectionMode( KFile::SelectionMode sm )
257 disconnect(
this, TQT_SIGNAL( selectionChanged() ));
258 disconnect(
this, TQT_SIGNAL( selectionChanged( TQListViewItem * ) ));
260 KFileView::setSelectionMode( sm );
262 switch ( KFileView::selectionMode() ) {
264 TQListView::setSelectionMode( TQListView::Multi );
266 case KFile::Extended:
267 TQListView::setSelectionMode( TQListView::Extended );
269 case KFile::NoSelection:
270 TQListView::setSelectionMode( TQListView::NoSelection );
274 TQListView::setSelectionMode( TQListView::Single );
278 if ( sm == KFile::Multi || sm == KFile::Extended )
279 connect(
this, TQT_SIGNAL( selectionChanged() ),
280 TQT_SLOT( slotSelectionChanged() ));
282 connect(
this, TQT_SIGNAL( selectionChanged( TQListViewItem * )),
283 TQT_SLOT( highlighted( TQListViewItem * )));
292 return (item && item->isSelected());
301 TQListViewItemIterator it( (TQListView*)
this );
302 for ( ; it.current(); ++it ) {
304 item->setPixmap( 0, item->
fileInfo()->pixmap(KIcon::SizeSmall) );
318 setSortingKey( item, i );
329 if ( spec & TQDir::Time )
330 item->setKey(
sortingKey( i->time( KIO::UDS_MODIFICATION_TIME ),
332 else if ( spec & TQDir::Size )
333 item->setKey(
sortingKey( i->size(), i->isDir(), spec ));
336 item->setKey(
sortingKey( i->text(), i->isDir(), spec ));
346 m_resolver->m_lstPendingMimeIconItems.remove( item );
352 void KFileDetailView::slotSortingChanged(
int col )
356 TQDir::SortSpec sort =
sorting();
358 bool reversed = (col == m_sortingCol) && (sort & TQDir::Reversed) == 0;
363 sortSpec = ((sort & ~TQDir::SortByMask) | TQDir::Name);
366 sortSpec = ((sort & ~TQDir::SortByMask) | TQDir::Size);
369 sortSpec = ((sort & ~TQDir::SortByMask) | TQDir::Time);
378 sortSpec = (sort & ~TQDir::SortByMask);
385 sortSpec |= TQDir::Reversed;
387 sortSpec &= ~TQDir::Reversed;
389 if ( sort & TQDir::IgnoreCase )
390 sortSpec |= TQDir::IgnoreCase;
392 sortSpec &= ~TQDir::IgnoreCase;
398 KFileItemListIterator it( *
items() );
400 if ( sortSpec & TQDir::Time ) {
401 for ( ; (item = it.current()); ++it )
402 viewItem(item)->setKey(
sortingKey( item->time( KIO::UDS_MODIFICATION_TIME ), item->isDir(), sortSpec ));
405 else if ( sortSpec & TQDir::Size ) {
406 for ( ; (item = it.current()); ++it )
407 viewItem(item)->setKey(
sortingKey( item->size(), item->isDir(),
411 for ( ; (item = it.current()); ++it ) {
413 i->setKey(
sortingKey( i->text(m_sortingCol), item->isDir(),
418 KListView::setSorting( m_sortingCol, !reversed );
421 if ( !m_blockSortingSignal )
422 sig->changeSorting( static_cast<TQDir::SortSpec>( sortSpec ) );
429 if ( spec & TQDir::Time )
431 else if ( spec & TQDir::Size )
433 else if ( spec & TQDir::Unsorted )
439 if ( spec & TQDir::Reversed )
440 spec = (TQDir::SortSpec) (spec & ~TQDir::Reversed);
442 spec = (TQDir::SortSpec) (spec | TQDir::Reversed);
449 m_blockSortingSignal =
true;
450 slotSortingChanged( col );
451 m_blockSortingSignal =
false;
462 KListView::ensureItemVisible( item );
466 void KFileDetailView::slotSelectionChanged()
471 KFileItem * KFileDetailView::firstFileItem()
const
479 KFileItem * KFileDetailView::nextItem(
const KFileItem *fileItem )
const
483 if ( item && item->itemBelow() )
489 return firstFileItem();
492 KFileItem * KFileDetailView::prevItem(
const KFileItem *fileItem )
const
496 if ( item && item->itemAbove() )
502 return firstFileItem();
505 void KFileDetailView::keyPressEvent( TQKeyEvent *e )
507 KListView::keyPressEvent( e );
509 if ( e->key() == Key_Return || e->key() == Key_Enter ) {
510 if ( e->state() & ControlButton )
520 void KFileDetailView::mimeTypeDeterminationFinished()
527 (void) item->
fileInfo()->determineMimeType();
536 TQDragObject *KFileDetailView::dragObject()
541 for ( ; it.current(); ++it ){
542 urls.append( (*it)->url() );
545 if( urls.count() > 1 )
546 pixmap = DesktopIcon(
"kmultiple", KIcon::SizeSmall );
547 if( pixmap.isNull() )
551 hotspot.setX( pixmap.width() / 2 );
552 hotspot.setY( pixmap.height() / 2 );
553 TQDragObject* myDragObject =
new KURLDrag( urls,
widget() );
554 myDragObject->setPixmap( pixmap, hotspot );
558 void KFileDetailView::slotAutoOpen()
560 d->autoOpenTimer.stop();
564 KFileItem *fileItem = d->dropItem->fileInfo();
568 if( fileItem->isFile() )
571 if ( fileItem->isDir() || fileItem->isLink())
575 bool KFileDetailView::acceptDrag(TQDropEvent* e)
const
577 return KURLDrag::canDecode( e ) &&
579 ( e->action() == TQDropEvent::Copy
580 || e->action() == TQDropEvent::Move
581 || e->action() == TQDropEvent::Link );
584 void KFileDetailView::contentsDragEnterEvent( TQDragEnterEvent *e )
586 if ( ! acceptDrag( e ) ) {
598 d->autoOpenTimer.start( autoOpenDelay() );
603 d->autoOpenTimer.stop();
607 void KFileDetailView::contentsDragMoveEvent( TQDragMoveEvent *e )
609 if ( ! acceptDrag( e ) ) {
620 if (d->dropItem != item)
623 d->autoOpenTimer.start( autoOpenDelay() );
629 d->autoOpenTimer.stop();
633 void KFileDetailView::contentsDragLeaveEvent( TQDragLeaveEvent * )
636 d->autoOpenTimer.stop();
639 void KFileDetailView::contentsDropEvent( TQDropEvent *e )
642 d->autoOpenTimer.stop();
644 if ( ! acceptDrag( e ) ) {
651 KFileItem * fileItem = 0;
658 if (KURLDrag::decode( e, urls ) && !urls.isEmpty())
660 emit
dropped(e, urls, fileItem ? fileItem->url() : KURL());
661 sig->dropURLs(fileItem, e, urls);
671 KFileListViewItem::setPixmap( COL_NAME, inf->pixmap(KIcon::SizeSmall));
673 setText( COL_NAME, inf->text() );
674 setText( COL_SIZE, KGlobal::locale()->formatNumber( inf->size(), 0));
675 setText( COL_DATE, inf->timeString() );
676 setText( COL_PERM, inf->permissionsString() );
677 setText( COL_OWNER, inf->user() );
678 setText( COL_GROUP, inf->group() );
682 void KFileDetailView::virtual_hook(
int id,
void* data )
683 { KListView::virtual_hook(
id, data );
684 KFileView::virtual_hook(
id, data ); }
686 #include "kfiledetailview.moc"
void activate(const KFileItem *item)
Call this method when an item is selected (depends on single click / double click configuration)...
virtual bool isSelected(const KFileItem *i) const
bool onlyDoubleClickSelectsFiles() const
virtual TQWidget * widget()
a pure virtual function to get a TQWidget, that can be added to other widgets.
virtual void invertSelection()
Inverts the current selection, i.e.
void ensureItemVisible(const KFileItem *)
pure virtual function, that should be implemented to make item i visible, i.e.
const KFileItemList * items() const
virtual void listingCompleted()
This hook is called when all items of the currently listed directory are listed and inserted into the...
void highlightFile(const KFileItem *i)
emits the highlighted signal for item.
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
virtual void insertItem(KFileItem *i)
The derived view must implement this function to add the file in the widget.
virtual KFileItem * currentFileItem() const
This class defines an interface to all file views.
virtual void selectAll()
Selects all items.
TQDir::SortSpec sorting() const
Returns the sorting order of the internal list.
const KFileItemList * selectedItems() const
virtual void clearView()
pure virtual function, that should be implemented to clear the view.
virtual void setCurrentItem(const KFileItem *)
Reimplement this to set item the current item in the view, e.g.
virtual void clearSelection()
Clears any selection, unhighlights everything.
int dropOptions()
Returns the DND options in effect.
virtual void removeItem(const KFileItem *item)
Removes an item from the list; has to be implemented by the view.
virtual void setSelected(const KFileItem *, bool)
Tells the view that it should highlight the item.
virtual void setSorting(TQDir::SortSpec sort)
Sets the sorting order of the view.
virtual void updateView(bool)
does a repaint of the view.
virtual void setSorting(TQDir::SortSpec)
Sets the sorting order of the view.
An item for the listiew, that has a reference to its corresponding KFileItem.
static TQString sortingKey(const TQString &value, bool isDir, int sortSpec)
This method calculates a TQString from the given parameters, that is suitable for sorting with e...
virtual void removeItem(const KFileItem *)
Removes an item from the list; has to be implemented by the view.
KFileItem * fileInfo() const
void dropped(TQDropEvent *event, KFileItem *fileItem)
The user dropped something.
A list-view capable of showing KFileItem'.