• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.10.5 API Reference
  • KDE Home
  • Contact Us
 

KDE3Support

  • kde3support
  • kio
  • kfile
k3fileview.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  Copyright (C) 1998 Stephan Kulow <coolo@kde.org>
3  1998 Daniel Grana <grana@ie.iwi.unibe.ch>
4  2001 Carsten Pfeiffer <pfeiffer@kde.org>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 
22 #include "k3fileview.h"
23 #include <config-kfile.h>
24 
25 #include <kaction.h>
26 #include <kactioncollection.h>
27 #include <kapplication.h>
28 #include <kdebug.h>
29 #include <kglobal.h>
30 #include <klocale.h>
31 #include <kstandarddirs.h>
32 
33 #include <QtCore/QPointer>
34 
35 #include <assert.h>
36 #include <stdlib.h>
37 
38 #ifdef Unsorted // the "I hate X.h" modus
39 #undef Unsorted
40 #endif
41 
42 void K3FileViewSignaler::activate( const KFileItem &item )
43 {
44  if ( item.isDir() )
45  dirActivated( item );
46  else
47  fileSelected( item );
48 }
49 
50 void K3FileViewSignaler::highlightFile( const KFileItem &item )
51 {
52  fileHighlighted( item );
53 }
54 
55 void K3FileViewSignaler::activateMenu( const KFileItem &item, const QPoint& pos )
56 {
57  activatedMenu( item, pos );
58 }
59 
60 void K3FileViewSignaler::changeSorting( QDir::SortFlags sorting )
61 {
62  sortingChanged( sorting );
63 }
64 
65 void K3FileViewSignaler::dropURLs( const KFileItem &item, QDropEvent *event, const KUrl::List &urls )
66 {
67  dropped( item, event, urls );
68 }
69 
70 class K3FileView::K3FileViewPrivate
71 {
72 public:
73  K3FileViewPrivate()
74  {
75  actions = 0;
76  dropOptions = 0;
77  }
78 
79  ~K3FileViewPrivate()
80  {
81  if( actions ) {
82  actions->clear(); // so that the removed() signal is emitted!
83  delete actions;
84  }
85  }
86 
87  QPointer<KActionCollection> actions;
88  int dropOptions;
89 
90  const static QDir::SortFlags defaultSortFlags;
91  QDir::SortFlags m_sorting;
92  QString m_viewName;
93 
97  uint filesNumber;
98  uint dirsNumber;
99 
100  ViewMode view_mode;
101  KFile::SelectionMode selection_mode;
102 
103  bool myOnlyDoubleClickSelectsFiles;
104 
105 };
106 
107 const QDir::SortFlags K3FileView::K3FileViewPrivate::defaultSortFlags = (QDir::Name | QDir::IgnoreCase | QDir::DirsFirst);
108 
109 
110 K3FileView::K3FileView()
111  :d(new K3FileViewPrivate())
112 {
113  d->m_sorting = K3FileView::K3FileViewPrivate::defaultSortFlags;
114 
115  sig = new K3FileViewSignaler();
116  sig->setObjectName("view-signaller");
117 
118  d->filesNumber = 0;
119  d->dirsNumber = 0;
120 
121  d->view_mode = All;
122  d->selection_mode = KFile::Single;
123  d->m_viewName = i18n("Unknown View");
124 
125  d->myOnlyDoubleClickSelectsFiles = false;
126 }
127 
128 K3FileView::~K3FileView()
129 {
130  delete d;
131  delete sig;
132 }
133 
134 void K3FileView::setParentView(K3FileView *parent)
135 {
136  if ( parent ) { // pass all signals right to our parent
137  QObject::connect(sig, SIGNAL( activatedMenu(const KFileItem &,
138  const QPoint& ) ),
139  parent->sig, SIGNAL( activatedMenu(const KFileItem &,
140  const QPoint& )));
141  QObject::connect(sig, SIGNAL(dirActivated(KFileItem)),
142  parent->sig, SIGNAL(dirActivated(KFileItem)));
143  QObject::connect(sig, SIGNAL(fileSelected(KFileItem)),
144  parent->sig, SIGNAL(fileSelected(KFileItem)));
145  QObject::connect(sig, SIGNAL(fileHighlighted(KFileItem)),
146  parent->sig,SIGNAL(fileHighlighted(KFileItem)));
147  QObject::connect(sig, SIGNAL(sortingChanged(QDir::SortFlags)),
148  parent->sig, SIGNAL(sortingChanged(QDir::SortFlags)));
149  QObject::connect(sig, SIGNAL(dropped(KFileItem,QDropEvent*,KUrl::List)),
150  parent->sig, SIGNAL(dropped(KFileItem,QDropEvent*,KUrl::List)));
151  }
152 }
153 
154 bool K3FileView::updateNumbers(const KFileItem &i)
155 {
156  if (!( viewMode() & Files ) && i.isFile())
157  return false;
158 
159  if (!( viewMode() & Directories ) && i.isDir())
160  return false;
161 
162  if (i.isDir())
163  d->dirsNumber++;
164  else
165  d->filesNumber++;
166 
167  return true;
168 }
169 
170 // filter out files if we're in directory mode and count files/directories
171 // and insert into the view
172 void K3FileView::addItemList(const KFileItemList& list)
173 {
174  KFileItemList::const_iterator kit = list.begin();
175  const KFileItemList::const_iterator kend = list.end();
176  for ( ; kit != kend; ++kit ) {
177  const KFileItem item = *kit;
178  if (!updateNumbers(item))
179  continue;
180  insertItem(item);
181  }
182 }
183 
184 void K3FileView::insertItem( const KFileItem& )
185 {
186 }
187 
188 QWidget* K3FileView::widget() const
189 {
190  return const_cast<K3FileView*>(this)->widget();
191 }
192 
193 QDir::SortFlags K3FileView::sorting() const
194 {
195  return d->m_sorting;
196 }
197 
198 void K3FileView::setSorting(QDir::SortFlags new_sort)
199 {
200  d->m_sorting = new_sort;
201 }
202 
203 void K3FileView::clear()
204 {
205  d->filesNumber = 0;
206  d->dirsNumber = 0;
207  clearView();
208 }
209 
210 bool K3FileView::isReversed() const
211 {
212  return (d->m_sorting & QDir::Reversed);
213 }
214 
215 void K3FileView::sortReversed()
216 {
217  int spec = sorting();
218 
219  setSorting( QDir::SortFlags( spec ^ QDir::Reversed ) );
220 }
221 
222 uint K3FileView::count() const
223 {
224  return d->filesNumber + d->dirsNumber;
225 }
226 
227 uint K3FileView::numFiles() const
228 {
229  return d->filesNumber;
230 }
231 
232 uint K3FileView::numDirs() const
233 {
234  return d->dirsNumber;
235 }
236 
237 #if 0
238 int K3FileView::compareItems(const KFileItem *fi1, const KFileItem *fi2) const
239 {
240  static const QString &dirup = KGlobal::staticQString("..");
241  bool bigger = true;
242  bool keepFirst = false;
243  bool dirsFirst = ((m_sorting & QDir::DirsFirst) == QDir::DirsFirst);
244 
245  if (fi1 == fi2)
246  return 0;
247 
248  // .. is always bigger, independent of the sort criteria
249  if ( fi1->name() == dirup ) {
250  bigger = false;
251  keepFirst = dirsFirst;
252  }
253  else if ( fi2->name() == dirup ) {
254  bigger = true;
255  keepFirst = dirsFirst;
256  }
257 
258  else {
259  if ( fi1->isDir() != fi2->isDir() && dirsFirst ) {
260  bigger = fi2->isDir();
261  keepFirst = true;
262  }
263  else {
264 
265  QDir::SortFlags sort = static_cast<QDir::SortFlags>(m_sorting & QDir::SortByMask);
266 
267  //if (fi1->isDir() || fi2->isDir())
268  // sort = static_cast<QDir::SortFlags>(K3FileView::defaultSortSpec & QDir::SortByMask);
269 
270  switch (sort) {
271  case QDir::Name:
272  default:
273 sort_by_name:
274  if ( (m_sorting & QDir::IgnoreCase) == QDir::IgnoreCase )
275  bigger = (fi1->name( true ) > fi2->name( true ));
276  else
277  bigger = (fi1->name() > fi2->name());
278  break;
279  case QDir::Time:
280  {
281  time_t t1 = fi1->time( KIO::UDSEntry::UDS_MODIFICATION_TIME );
282  time_t t2 = fi2->time( KIO::UDSEntry::UDS_MODIFICATION_TIME );
283  if ( t1 != t2 ) {
284  bigger = (t1 > t2);
285  break;
286  }
287 
288  // Sort by name if both items have the same timestamp.
289  // Don't honor the reverse flag tho.
290  else {
291  keepFirst = true;
292  goto sort_by_name;
293  }
294  }
295  case QDir::Size:
296  {
297  KIO::filesize_t s1 = fi1->size();
298  KIO::filesize_t s2 = fi2->size();
299  if ( s1 != s2 ) {
300  bigger = (s1 > s2);
301  break;
302  }
303 
304  // Sort by name if both items have the same size.
305  // Don't honor the reverse flag tho.
306  else {
307  keepFirst = true;
308  goto sort_by_name;
309  }
310  }
311  case QDir::Unsorted:
312  bigger = true; // nothing
313  break;
314  }
315  }
316  }
317 
318  if (reversed && !keepFirst ) // don't reverse dirs to the end!
319  bigger = !bigger;
320 
321  return (bigger ? 1 : -1);
322 }
323 #endif
324 
325 void K3FileView::updateView(bool)
326 {
327  widget()->repaint();
328 }
329 
330 void K3FileView::updateView(const KFileItem &)
331 {
332 }
333 
334 void K3FileView::setCurrentItem(const QString &filename )
335 {
336  if (!filename.isNull()) {
337  KFileItem item;
338  for ( (item = firstFileItem()); !item.isNull(); item = nextItem( item ) ) {
339  if (item.name() == filename) {
340  setCurrentItem( item );
341  return;
342  }
343  }
344  }
345 
346  kDebug(kfile_area) << "setCurrentItem: no match found: " << filename;
347 }
348 
349 KFileItemList K3FileView::items() const
350 {
351  KFileItemList list;
352 
353  for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) )
354  list.append( item );
355 
356  return list;
357 }
358 
359 void K3FileView::setOnlyDoubleClickSelectsFiles( bool enable ) {
360  d->myOnlyDoubleClickSelectsFiles = enable;
361 }
362 
363 bool K3FileView::onlyDoubleClickSelectsFiles() const {
364  return d->myOnlyDoubleClickSelectsFiles;
365 }
366 
367 
368 KFileItemList K3FileView::selectedItems() const
369 {
370  KFileItemList list;
371 
372  for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) ) {
373  if ( isSelected( item ) )
374  list.append( item );
375  }
376 
377  return list;
378 }
379 
380 void K3FileView::selectAll()
381 {
382  if (d->selection_mode == KFile::NoSelection || d->selection_mode== KFile::Single)
383  return;
384 
385  for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) )
386  setSelected( item, true );
387 }
388 
389 
390 void K3FileView::invertSelection()
391 {
392  for ( KFileItem item = firstFileItem(); !item.isNull(); item = nextItem( item ) )
393  setSelected( item, !isSelected( item ) );
394 }
395 
396 
397 void K3FileView::setSelectionMode( KFile::SelectionMode sm )
398 {
399  d->selection_mode = sm;
400 }
401 
402 KFile::SelectionMode K3FileView::selectionMode() const
403 {
404  return d->selection_mode;
405 }
406 
407 void K3FileView::setViewMode( K3FileView::ViewMode vm )
408 {
409  d->view_mode = vm;
410 }
411 
412 K3FileView::ViewMode K3FileView::viewMode() const
413 {
414  return d->view_mode;
415 }
416 
417 QString K3FileView::viewName() const
418 {
419  return d->m_viewName;
420 }
421 
422 void K3FileView::setViewName( const QString& name )
423 {
424  d->m_viewName = name;
425 }
426 
427 void K3FileView::removeItem( const KFileItem &item )
428 {
429  if ( item.isNull() )
430  return;
431 
432  if ( item.isDir() )
433  d->dirsNumber--;
434  else
435  d->filesNumber--;
436 }
437 
438 void K3FileView::listingCompleted()
439 {
440  // empty default impl.
441 }
442 
443 KActionCollection * K3FileView::actionCollection() const
444 {
445  if ( !d->actions ) {
446  d->actions = new KActionCollection( widget() );
447  d->actions->setObjectName( "K3FileView::d->actions" );
448  }
449  return d->actions;
450 }
451 
452 K3FileViewSignaler * K3FileView::signaler() const
453 {
454  return sig;
455 }
456 
457 void K3FileView::readConfig( KConfigGroup *)
458 {
459 }
460 
461 void K3FileView::writeConfig( KConfigGroup *)
462 {
463 }
464 
465 QString K3FileView::sortingKey( const QString& value, bool isDir, QDir::SortFlags SortFlags )
466 {
467  bool reverse = SortFlags & QDir::Reversed;
468  bool dirsFirst = SortFlags & QDir::DirsFirst;
469  char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1';
470  QString result = (SortFlags & QDir::IgnoreCase) ? value.toLower() : value;
471  return result.prepend( QLatin1Char(start) );
472 }
473 
474 QString K3FileView::sortingKey( KIO::filesize_t value, bool isDir, QDir::SortFlags SortFlags)
475 {
476  bool reverse = SortFlags & QDir::Reversed;
477  bool dirsFirst = SortFlags & QDir::DirsFirst;
478  char start = (isDir && dirsFirst) ? (reverse ? '2' : '0') : '1';
479  return KIO::number( value ).rightJustified( 24, '0' ).prepend( QLatin1Char(start) );
480 }
481 
482 void K3FileView::setDropOptions(int options)
483 {
484  d->dropOptions = options;
485 }
486 
487 int K3FileView::dropOptions()
488 {
489  return d->dropOptions;
490 }
491 
492 int K3FileView::autoOpenDelay()
493 {
494  return (QApplication::startDragTime() * 3) / 2;
495 }
496 
497 #include "k3fileview.moc"
This file is part of the KDE documentation.
Documentation copyright © 1996-2013 The KDE developers.
Generated on Tue Jul 23 2013 20:46:28 by doxygen 1.8.1.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDE3Support

Skip menu "KDE3Support"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.10.5 API Reference

Skip menu "kdelibs-4.10.5 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal