23 #include <tqkeycode.h> 25 #include <tqpainter.h> 28 #include <tdeapplication.h> 29 #include <tdefileitem.h> 30 #include <tdeglobal.h> 31 #include <tdeglobalsettings.h> 32 #include <kiconloader.h> 33 #include <kicontheme.h> 34 #include <tdelocale.h> 38 #include "tdefiledetailview.h" 39 #include "config-tdefile.h" 48 class KFileDetailView::KFileDetailViewPrivate
51 KFileDetailViewPrivate() : dropItem(0)
55 TQTimer autoOpenTimer;
58 KFileDetailView::KFileDetailView(TQWidget *parent,
const char *name)
59 : TDEListView(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( TDEConfig *config,
const TQString& group )
135 restoreLayout( config, group );
138 void KFileDetailView::writeConfig( TDEConfig *config,
const TQString& group )
140 saveLayout( config, group );
152 TDEListView::setSelected( item, enable );
161 TDEListView::setCurrentItem( it );
175 TDEListView::clearSelection();
180 if (KFileView::selectionMode() == KFile::NoSelection ||
181 KFileView::selectionMode() == KFile::Single)
184 TDEListView::selectAll(
true );
189 TDEListView::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();
205 TDEListView::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 ( TDEGlobalSettings::singleClick() ) {
239 if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) )
244 void KFileDetailView::highlighted( TQListViewItem *item )
251 sig->highlightFile( fi );
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(TDEIcon::SizeSmall) );
318 setSortingKey( item, i );
329 if ( spec & TQDir::Time )
330 item->setKey( sortingKey( i->time( TDEIO::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( TDEIO::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 TDEListView::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 TDEListView::ensureItemVisible( item );
466 void KFileDetailView::slotSelectionChanged()
468 sig->highlightFile( 0L );
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 TDEListView::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(
"application-vnd.tde.tdemultiple", TDEIcon::SizeSmall );
547 if( pixmap.isNull() )
548 pixmap = currentFileItem()->pixmap( TDEIcon::SizeSmall );
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())
572 sig->activate( fileItem );
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 ) ) {
592 if ((dropOptions() & AutoOpenDirs) == 0)
598 d->autoOpenTimer.start( autoOpenDelay() );
603 d->autoOpenTimer.stop();
607 void KFileDetailView::contentsDragMoveEvent( TQDragMoveEvent *e )
609 if ( ! acceptDrag( e ) ) {
615 if ((dropOptions() & AutoOpenDirs) == 0)
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;
655 emit dropped(e, fileItem);
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(TDEIcon::SizeSmall));
673 setText( COL_NAME, inf->text() );
674 setText( COL_SIZE, TDEGlobal::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 { TDEListView::virtual_hook(
id, data );
684 KFileView::virtual_hook(
id, data ); }
686 #include "tdefiledetailview.moc" virtual bool isSelected(const KFileItem *i) const
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.
virtual void listingCompleted()
This hook is called when all items of the currently listed directory are listed and inserted into the...
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.
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.
virtual void removeItem(const KFileItem *)
Removes an item from the list; has to be implemented by the view.
KFileItem * fileInfo() const
A list-view capable of showing KFileItem'.