1
// vim: set tabstop=4 shiftwidth=4 noexpandtab
2
/* This file is based on kfiledetailview.cpp v1.43 from the KDE libs. Original
5
/* This file is part of the KDE libraries
6
Copyright (C) 1997 Stephan Kulow <coolo@kde.org>
7
2000, 2001 Carsten Pfeiffer <pfeiffer@kde.org>
9
This library is free software; you can redistribute it and/or
10
modify it under the terms of the GNU Library General Public
11
License as published by the Free Software Foundation; either
12
version 2 of the License, or (at your option) any later version.
14
This library is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
Library General Public License for more details.
19
You should have received a copy of the GNU Library General Public License
20
along with this library; see the file COPYING.LIB. If not, write to
21
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22
Boston, MA 02111-1307, USA.
33
#include <kapplication.h>
35
#include <kfileitem.h>
36
#include <kglobalsettings.h>
37
#include <kiconloader.h>
42
#include "gvarchive.h"
43
#include "gvfiledetailviewitem.h"
44
#include "gvfiledetailview.moc"
47
GVFileDetailView::GVFileDetailView(QWidget *parent, const char *name)
48
: KListView(parent, name), GVFileViewBase()
50
mSortingCol = COL_NAME;
51
mBlockSortingSignal = false;
53
addColumn( i18n( "Name" ) );
54
addColumn( i18n( "Size" ) );
55
addColumn( i18n( "Date" ) );
56
addColumn( i18n( "Permissions" ) );
57
addColumn( i18n( "Owner" ) );
58
addColumn( i18n( "Group" ) );
59
setShowSortIndicator( TRUE );
60
setAllColumnsShowFocus( TRUE );
62
connect( header(), SIGNAL( sectionClicked(int)),
63
SLOT(slotSortingChanged(int) ));
66
connect( this, SIGNAL( returnPressed(QListViewItem *) ),
67
SLOT( slotActivate( QListViewItem *) ) );
69
connect( this, SIGNAL( clicked(QListViewItem *, const QPoint&, int)),
70
SLOT( selected( QListViewItem *) ) );
71
connect( this, SIGNAL( doubleClicked(QListViewItem *, const QPoint&, int)),
72
SLOT( slotActivate( QListViewItem *) ) );
74
connect( this, SIGNAL(contextMenuRequested( QListViewItem *,
75
const QPoint &, int )),
76
this, SLOT( slotActivateMenu( QListViewItem *, const QPoint& )));
78
QListView::setSelectionMode( QListView::Extended );
79
connect( this, SIGNAL( selectionChanged() ),
80
SLOT( slotSelectionChanged() ));
82
// GVFileViewStack need to be aware of sort changes, to update the sort menu
83
connect( sig, SIGNAL(sortingChanged(QDir::SortSpec)),
84
this, SIGNAL(sortingChanged(QDir::SortSpec)) );
86
setSorting( sorting() );
90
new KMimeTypeResolver<GVFileDetailViewItem,GVFileDetailView>( this );
95
setDropVisualizer(false);
96
setDropHighlighter(false);
100
GVFileDetailView::~GVFileDetailView()
106
void GVFileDetailView::setSelected( const KFileItem *info, bool enable )
109
GVFileDetailViewItem *item = viewItem(info);
110
if (item) KListView::setSelected(item, enable);
113
void GVFileDetailView::setCurrentItem( const KFileItem *item )
116
GVFileDetailViewItem *listItem = viewItem(item);
117
if (listItem) KListView::setCurrentItem(listItem);
120
KFileItem * GVFileDetailView::currentFileItem() const
122
GVFileDetailViewItem *current = static_cast<GVFileDetailViewItem*>( currentItem() );
123
if ( current ) return current->fileInfo();
128
void GVFileDetailView::clearSelection()
130
KListView::clearSelection();
133
void GVFileDetailView::selectAll()
135
KListView::selectAll( true );
138
void GVFileDetailView::invertSelection()
140
KListView::invertSelection();
143
void GVFileDetailView::slotActivateMenu (QListViewItem *item,const QPoint& pos )
146
sig->activateMenu( 0, pos );
149
GVFileDetailViewItem *i = (GVFileDetailViewItem*) item;
150
sig->activateMenu( i->fileInfo(), pos );
153
void GVFileDetailView::clearView()
155
mResolver->m_lstPendingMimeIconItems.clear();
160
void GVFileDetailView::insertItem( KFileItem *i )
162
KFileView::insertItem( i );
164
GVFileDetailViewItem *item = new GVFileDetailViewItem( (QListView*) this, i );
166
setSortingKey( item, i );
168
i->setExtraData( this, item );
170
if ( !i->isMimeTypeKnown() )
171
mResolver->m_lstPendingMimeIconItems.append( item );
174
void GVFileDetailView::slotActivate( QListViewItem *item )
178
const KFileItem *fi = ( (GVFileDetailViewItem*)item )->fileInfo();
179
if ( fi ) sig->activate( fi );
182
void GVFileDetailView::selected( QListViewItem *item )
186
if ( KGlobalSettings::singleClick() ) {
187
const KFileItem *fi = ( (GVFileDetailViewItem*)item )->fileInfo();
188
if ( fi && (fi->isDir() || !onlyDoubleClickSelectsFiles()) )
193
void GVFileDetailView::highlighted( QListViewItem *item )
197
const KFileItem *fi = ( (GVFileDetailViewItem*)item )->fileInfo();
198
if ( fi ) sig->highlightFile( fi );
202
bool GVFileDetailView::isSelected(const KFileItem* fileItem) const
204
if (!fileItem) return false;
206
GVFileDetailViewItem *item = viewItem(fileItem);
207
return item && item->isSelected();
211
void GVFileDetailView::updateView( bool b )
215
QListViewItemIterator it( (QListView*)this );
216
for ( ; it.current(); ++it ) {
217
GVFileDetailViewItem *item=static_cast<GVFileDetailViewItem *>(it.current());
218
item->setPixmap( 0, item->fileInfo()->pixmap(KIcon::SizeSmall) );
222
void GVFileDetailView::updateView( const KFileItem *i )
226
GVFileDetailViewItem *item = viewItem(i);
230
setSortingKey( item, i );
234
void GVFileDetailView::setSortingKey( GVFileDetailViewItem *item,
237
// see also setSorting()
238
QDir::SortSpec spec = KFileView::sorting();
239
bool isDirOrArchive=i->isDir() || GVArchive::fileItemIsArchive(i);
242
if ( spec & QDir::Time )
243
key=sortingKey( i->time( KIO::UDS_MODIFICATION_TIME ),
244
isDirOrArchive, spec );
245
else if ( spec & QDir::Size )
246
key=sortingKey( i->size(), isDirOrArchive, spec );
248
else // Name or Unsorted
249
key=sortingKey( i->text(), isDirOrArchive, spec );
255
void GVFileDetailView::removeItem( const KFileItem *i )
259
GVFileDetailViewItem *item = viewItem(i);
260
mResolver->m_lstPendingMimeIconItems.remove( item );
261
if(mShownFileItem==i) mShownFileItem=0L;
264
KFileView::removeItem( i );
267
void GVFileDetailView::slotSortingChanged( int col )
269
QDir::SortSpec sort = sorting();
271
bool reversed = col == mSortingCol && (sort & QDir::Reversed) == 0;
276
sortSpec = (sort & ~QDir::SortByMask | QDir::Name);
279
sortSpec = (sort & ~QDir::SortByMask | QDir::Size);
282
sortSpec = (sort & ~QDir::SortByMask | QDir::Time);
285
// the following columns have no equivalent in QDir, so we set it
286
// to QDir::Unsorted and remember the column (mSortingCol)
290
// grmbl, QDir::Unsorted == SortByMask.
291
sortSpec = (sort & ~QDir::SortByMask);// | QDir::Unsorted;
298
sortSpec |= QDir::Reversed;
300
sortSpec &= ~QDir::Reversed;
302
if ( sort & QDir::IgnoreCase )
303
sortSpec |= QDir::IgnoreCase;
305
sortSpec &= ~QDir::IgnoreCase;
308
KFileView::setSorting( static_cast<QDir::SortSpec>( sortSpec ) );
311
KFileItemListIterator it( *items() );
313
for ( ; (item = it.current() ); ++it ) {
314
GVFileDetailViewItem* thumbItem=viewItem( item );
315
if (thumbItem) setSortingKey(thumbItem,item);
318
KListView::setSorting( mSortingCol, !reversed );
321
if (!mBlockSortingSignal) sig->changeSorting( static_cast<QDir::SortSpec>( sortSpec ) );
325
void GVFileDetailView::setSorting( QDir::SortSpec spec )
328
if ( spec & QDir::Time )
330
else if ( spec & QDir::Size )
332
else if ( spec & QDir::Unsorted )
337
// inversed, because slotSortingChanged will reverse it
338
if ( spec & QDir::Reversed )
339
spec = (QDir::SortSpec) (spec & ~QDir::Reversed);
341
spec = (QDir::SortSpec) (spec | QDir::Reversed);
344
KFileView::setSorting( (QDir::SortSpec) spec );
347
// don't emit sortingChanged() when called via setSorting()
348
mBlockSortingSignal = true; // can't use blockSignals()
349
slotSortingChanged( col );
350
mBlockSortingSignal = false;
353
void GVFileDetailView::ensureItemVisible( const KFileItem *i )
357
GVFileDetailViewItem *item = viewItem(i);
359
if ( item ) KListView::ensureItemVisible( item );
362
// we're in multiselection mode
363
void GVFileDetailView::slotSelectionChanged()
365
sig->highlightFile( 0L );
368
KFileItem * GVFileDetailView::firstFileItem() const
370
GVFileDetailViewItem *item = static_cast<GVFileDetailViewItem*>( firstChild() );
371
if ( item ) return item->fileInfo();
375
KFileItem * GVFileDetailView::nextItem( const KFileItem *fileItem ) const
378
GVFileDetailViewItem *item = viewItem( fileItem );
379
if ( item && item->itemBelow() )
380
return ((GVFileDetailViewItem*) item->itemBelow())->fileInfo();
385
return firstFileItem();
388
KFileItem * GVFileDetailView::prevItem( const KFileItem *fileItem ) const
391
GVFileDetailViewItem *item = viewItem( fileItem );
392
if ( item && item->itemAbove() )
393
return ((GVFileDetailViewItem*) item->itemAbove())->fileInfo();
398
return firstFileItem();
401
void GVFileDetailView::keyPressEvent( QKeyEvent *e )
403
KListView::keyPressEvent( e );
405
if ( e->key() == Key_Return || e->key() == Key_Enter ) {
406
if ( e->state() & ControlButton )
414
// mimetype determination on demand
416
void GVFileDetailView::mimeTypeDeterminationFinished()
421
void GVFileDetailView::determineIcon( GVFileDetailViewItem *item )
423
(void) item->fileInfo()->determineMimeType();
424
updateView( item->fileInfo() );
427
void GVFileDetailView::listingCompleted()
432
void GVFileDetailView::startDrag()
435
KFileItemListIterator it(*KFileView::selectedItems());
437
for ( ; it.current(); ++it ) {
438
urls.append(it.current()->url());
441
if (urls.isEmpty()) {
442
kdWarning() << "No item to drag\n";
446
QDragObject* drag=new KURLDrag(urls, this, 0);
448
if (urls.count()>1) {
449
dragPixmap=SmallIcon("kmultiple");
451
dragPixmap=KFileView::selectedItems()->getFirst()->pixmap(16);
453
drag->setPixmap( dragPixmap, QPoint(dragPixmap.width()/2, dragPixmap.height()/2) );
459
void GVFileDetailView::setShownFileItem(KFileItem* fileItem)
461
if( fileItem == mShownFileItem ) return;
462
GVFileDetailViewItem* oldShownItem=viewItem(mShownFileItem);
463
GVFileDetailViewItem* newShownItem=viewItem(fileItem);
465
GVFileViewBase::setShownFileItem(fileItem);
466
if (oldShownItem) oldShownItem->repaint();
467
if (newShownItem) newShownItem->repaint();
471
//----------------------------------------------------------------------
475
//----------------------------------------------------------------------
476
bool GVFileDetailView::acceptDrag(QDropEvent* event) const {
477
return KURLDrag::canDecode(event);
480
void GVFileDetailView::contentsDropEvent(QDropEvent *event) {
481
KFileItem* fileItem=0L;
482
QListViewItem *item=itemAt(contentsToViewport(event->pos() ) );
485
fileItem=static_cast<GVFileDetailViewItem*>(item)->fileInfo();
487
emit dropped(event,fileItem);