00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <assert.h>
00023
#include <stdlib.h>
00024
00025
#include <kaction.h>
00026
#include <kapplication.h>
00027
#include <kdebug.h>
00028
#include <kglobal.h>
00029
#include <klocale.h>
00030
#include <kstandarddirs.h>
00031
00032
#include "config-kfile.h"
00033
#include "kfileview.h"
00034
00035
#ifdef Unsorted // the "I hate X.h" modus
00036
#undef Unsorted
00037
#endif
00038
00039 QDir::SortSpec KFileView::defaultSortSpec = static_cast<QDir::SortSpec>(QDir::Name | QDir::IgnoreCase | QDir::DirsFirst);
00040
00041
class KFileView::KFileViewPrivate
00042 {
00043
public:
00044 KFileViewPrivate()
00045 {
00046 actions = 0;
00047 dropOptions = 0;
00048 }
00049
00050 ~KFileViewPrivate()
00051 {
00052
if( actions ) {
00053 actions->clear();
00054
delete actions;
00055 }
00056 }
00057
00058
QGuardedPtr<KActionCollection> actions;
00059
int dropOptions;
00060 };
00061
00062
00063 KFileView::KFileView()
00064 {
00065 d =
new KFileViewPrivate();
00066 m_sorting = KFileView::defaultSortSpec;
00067
00068 sig =
new KFileViewSignaler();
00069 sig->setName(
"view-signaller");
00070
00071 m_selectedList = 0L;
00072 filesNumber = 0;
00073 dirsNumber = 0;
00074
00075 view_mode = All;
00076 selection_mode = KFile::Single;
00077 m_viewName = i18n(
"Unknown View");
00078
00079 myOnlyDoubleClickSelectsFiles =
false;
00080 m_itemList.setAutoDelete(
false );
00081 }
00082
00083 KFileView::~KFileView()
00084 {
00085
delete d;
00086
delete sig;
00087
delete m_selectedList;
00088 }
00089
00090
void KFileView::setParentView(
KFileView *parent)
00091 {
00092
if ( parent ) {
00093 QObject::connect(sig, SIGNAL( activatedMenu(
const KFileItem *,
00094
const QPoint& ) ),
00095 parent->
sig, SIGNAL( activatedMenu(
const KFileItem *,
00096
const QPoint& )));
00097 QObject::connect(sig, SIGNAL( dirActivated(
const KFileItem *)),
00098 parent->
sig, SIGNAL( dirActivated(
const KFileItem*)));
00099 QObject::connect(sig, SIGNAL( fileSelected(
const KFileItem *)),
00100 parent->
sig, SIGNAL( fileSelected(
const KFileItem*)));
00101 QObject::connect(sig, SIGNAL( fileHighlighted(
const KFileItem *) ),
00102 parent->
sig,SIGNAL(fileHighlighted(
const KFileItem*)));
00103 QObject::connect(sig, SIGNAL( sortingChanged( QDir::SortSpec ) ),
00104 parent->
sig, SIGNAL(sortingChanged( QDir::SortSpec)));
00105 QObject::connect(sig, SIGNAL( dropped(
const KFileItem *,
QDropEvent*,
const KURL::List&) ),
00106 parent->
sig, SIGNAL(dropped(
const KFileItem *,
QDropEvent*,
const KURL::List&)));
00107 }
00108 }
00109
00110 bool KFileView::updateNumbers(
const KFileItem *i)
00111 {
00112
if (!( viewMode() & Files ) && i->
isFile())
00113
return false;
00114
00115
if (!( viewMode() & Directories ) && i->
isDir())
00116
return false;
00117
00118
if (i->
isDir())
00119 dirsNumber++;
00120
else
00121 filesNumber++;
00122
00123
return true;
00124 }
00125
00126
void qt_qstring_stats();
00127
00128
00129
00130 void KFileView::addItemList(
const KFileItemList& list)
00131 {
00132
KFileItem *tmp;
00133
00134
for (
KFileItemListIterator it(list); (tmp = it.current()); ++it)
00135 {
00136
if (!
updateNumbers(tmp))
00137
continue;
00138
00139
insertItem( tmp );
00140 }
00141
00142
#ifdef Q2HELPER
00143
qt_qstring_stats();
00144
#endif
00145
}
00146
00147 void KFileView::insertItem(
KFileItem * )
00148 {
00149 }
00150
00151 void KFileView::setSorting(QDir::SortSpec new_sort)
00152 {
00153 m_sorting = new_sort;
00154 }
00155
00156 void KFileView::clear()
00157 {
00158 m_itemList.clear();
00159 filesNumber = 0;
00160 dirsNumber = 0;
00161
clearView();
00162 }
00163
00164
void KFileView::sortReversed()
00165 {
00166
int spec =
sorting();
00167
00168
setSorting( static_cast<QDir::SortSpec>( spec ^ QDir::Reversed ) );
00169 }
00170
00171
#if 0
00172
int KFileView::compareItems(
const KFileItem *fi1,
const KFileItem *fi2)
const
00173
{
00174
static const QString &dirup =
KGlobal::staticQString(
"..");
00175
bool bigger =
true;
00176
bool keepFirst =
false;
00177
bool dirsFirst = ((m_sorting & QDir::DirsFirst) == QDir::DirsFirst);
00178
00179
if (fi1 == fi2)
00180
return 0;
00181
00182
00183
if ( fi1->
name() == dirup ) {
00184 bigger =
false;
00185 keepFirst = dirsFirst;
00186 }
00187
else if ( fi2->
name() == dirup ) {
00188 bigger =
true;
00189 keepFirst = dirsFirst;
00190 }
00191
00192
else {
00193
if ( fi1->
isDir() != fi2->
isDir() && dirsFirst ) {
00194 bigger = fi2->
isDir();
00195 keepFirst =
true;
00196 }
00197
else {
00198
00199 QDir::SortSpec sort = static_cast<QDir::SortSpec>(m_sorting & QDir::SortByMask);
00200
00201
00202
00203
00204
switch (sort) {
00205
case QDir::Name:
00206
default:
00207 sort_by_name:
00208
if ( (m_sorting & QDir::IgnoreCase) == QDir::IgnoreCase )
00209 bigger = (fi1->
name(
true ) > fi2->
name(
true ));
00210
else
00211 bigger = (fi1->
name() > fi2->
name());
00212
break;
00213
case QDir::Time:
00214 {
00215 time_t t1 = fi1->
time( KIO::UDS_MODIFICATION_TIME );
00216 time_t t2 = fi2->
time( KIO::UDS_MODIFICATION_TIME );
00217
if ( t1 != t2 ) {
00218 bigger = (t1 > t2);
00219
break;
00220 }
00221
00222
00223
00224
else {
00225 keepFirst =
true;
00226
goto sort_by_name;
00227 }
00228 }
00229
case QDir::Size:
00230 {
00231
KIO::filesize_t s1 = fi1->
size();
00232
KIO::filesize_t s2 = fi2->
size();
00233
if ( s1 != s2 ) {
00234 bigger = (s1 > s2);
00235
break;
00236 }
00237
00238
00239
00240
else {
00241 keepFirst =
true;
00242
goto sort_by_name;
00243 }
00244 }
00245
case QDir::Unsorted:
00246 bigger =
true;
00247
break;
00248 }
00249 }
00250 }
00251
00252
if (reversed && !keepFirst )
00253 bigger = !bigger;
00254
00255
return (bigger ? 1 : -1);
00256 }
00257
#endif
00258
00259 void KFileView::updateView(
bool f)
00260 {
00261
widget()->repaint(f);
00262 }
00263
00264
void KFileView::updateView(
const KFileItem *)
00265 {
00266 }
00267
00268 void KFileView::setCurrentItem(
const QString &filename )
00269 {
00270
if (!filename.isNull()) {
00271
KFileItem *item;
00272
for ( (item = firstFileItem()); item; item = nextItem( item ) ) {
00273
if (item->
name() == filename) {
00274
setCurrentItem( item );
00275
return;
00276 }
00277 }
00278 }
00279
00280
kdDebug(kfile_area) <<
"setCurrentItem: no match found: " << filename <<
endl;
00281 }
00282
00283 const KFileItemList *
KFileView::items()
const
00284
{
00285
KFileItem *item = 0L;
00286
00287
00288 m_itemList.clear();
00289
for ( (item = firstFileItem()); item; item = nextItem( item ) )
00290 m_itemList.append( item );
00291
00292
return &m_itemList;
00293 }
00294
00295
00296 const KFileItemList *
KFileView::selectedItems()
const
00297
{
00298
if ( !m_selectedList )
00299 m_selectedList =
new KFileItemList;
00300
00301 m_selectedList->clear();
00302
00303
KFileItem *item;
00304
for ( (item = firstFileItem()); item; item = nextItem( item ) ) {
00305
if (
isSelected( item ) )
00306 m_selectedList->append( item );
00307 }
00308
00309
return m_selectedList;
00310 }
00311
00312 void KFileView::selectAll()
00313 {
00314
if (selection_mode == KFile::NoSelection || selection_mode== KFile::Single)
00315
return;
00316
00317
KFileItem *item = 0L;
00318
for ( (item = firstFileItem()); item; item = nextItem( item ) )
00319
setSelected( item,
true );
00320 }
00321
00322
00323 void KFileView::invertSelection()
00324 {
00325
KFileItem *item = 0L;
00326
for ( (item = firstFileItem()); item; item = nextItem( item ) )
00327
setSelected( item, !
isSelected( item ) );
00328 }
00329
00330
00331
void KFileView::setSelectionMode( KFile::SelectionMode sm )
00332 {
00333 selection_mode = sm;
00334 }
00335
00336 KFile::SelectionMode KFileView::selectionMode()
const
00337
{
00338
return selection_mode;
00339 }
00340
00341
void KFileView::setViewMode( ViewMode vm )
00342 {
00343 view_mode = vm;
00344 }
00345
00346 void KFileView::removeItem(
const KFileItem *item )
00347 {
00348
if ( !item )
00349
return;
00350
00351
if ( item->
isDir() )
00352 dirsNumber--;
00353
else
00354 filesNumber--;
00355
00356
if ( m_selectedList )
00357 m_selectedList->removeRef( item );
00358 }
00359
00360 void KFileView::listingCompleted()
00361 {
00362
00363 }
00364
00365 KActionCollection *
KFileView::actionCollection()
const
00366
{
00367
if ( !d->actions )
00368 d->actions =
new KActionCollection(
widget(),
"KFileView::d->actions" );
00369
return d->actions;
00370 }
00371
00372
void KFileView::readConfig(
KConfig *,
const QString& )
00373 {
00374 }
00375
00376
void KFileView::writeConfig(
KConfig *,
const QString& )
00377 {
00378 }
00379
00380 QString KFileView::sortingKey(
const QString& value,
bool isDir,
int sortSpec )
00381 {
00382
bool reverse = sortSpec & QDir::Reversed;
00383
bool dirsFirst = sortSpec & QDir::DirsFirst;
00384
char start = (isDir && dirsFirst) ? (reverse ?
'2' :
'0') :
'1';
00385
QString result = (sortSpec & QDir::IgnoreCase) ? value.lower() : value;
00386
return result.prepend( start );
00387 }
00388
00389 QString KFileView::sortingKey(
KIO::filesize_t value,
bool isDir,
int sortSpec)
00390 {
00391
bool reverse = sortSpec & QDir::Reversed;
00392
bool dirsFirst = sortSpec & QDir::DirsFirst;
00393
char start = (isDir && dirsFirst) ? (reverse ?
'2' :
'0') :
'1';
00394
return KIO::number( value ).rightJustify( 24,
'0' ).prepend( start );
00395 }
00396
00397 void KFileView::setDropOptions(
int options)
00398 {
00399 virtual_hook(VIRTUAL_SET_DROP_OPTIONS, &options);
00400 }
00401
00402
void KFileView::setDropOptions_impl(
int options)
00403 {
00404 d->dropOptions = options;
00405 }
00406
00407 int KFileView::dropOptions()
00408 {
00409
return d->dropOptions;
00410 }
00411
00412
int KFileView::autoOpenDelay()
00413 {
00414
return (QApplication::startDragTime() * 3) / 2;
00415 }
00416
00417
void KFileView::virtual_hook(
int id,
void* data)
00418 {
00419
switch(
id) {
00420
case VIRTUAL_SET_DROP_OPTIONS:
00421 setDropOptions_impl(*(
int *)data);
00422
break;
00423
default:
00424
00425
break;
00426 }
00427 }
00428
00429
#include "kfileview.moc"