20 #include "konq_dirpart.h"
21 #include "konq_bgnddlg.h"
22 #include "konq_propsview.h"
23 #include "konq_settings.h"
25 #include <kio/paste.h>
26 #include <kapplication.h>
28 #include <kdatastream.h>
30 #include <kdirlister.h>
31 #include <kiconloader.h>
33 #include <kmessagebox.h>
34 #include <konq_drag.h>
35 #include <kparts/browserextension.h>
37 #include <kuserprofile.h>
38 #include <kurifilter.h>
39 #include <kglobalsettings.h>
41 #include <tqapplication.h>
42 #include <tqclipboard.h>
44 #include <tqguardedptr.h>
46 #include <tqvaluevector.h>
48 class KonqDirPart::KonqDirPartPrivate
51 KonqDirPartPrivate() : dirLister( 0 ) {}
52 TQStringList mimeFilters;
53 KToggleAction *aEnormousIcons;
54 KToggleAction *aSmallMediumIcons;
55 TQValueVector<int> iconSize;
57 KDirLister* dirLister;
60 void findAvailableIconSizes(
void);
61 int findNearestIconSize(
int size);
62 int nearestIconSizeError(
int size);
65 void KonqDirPart::KonqDirPartPrivate::findAvailableIconSizes(
void)
67 KIconTheme *root = KGlobal::instance()->iconLoader()->theme();
70 TQValueList<int> avSizes = root->querySizes(KIcon::Desktop);
71 kdDebug(1203) <<
"The icon theme handles the sizes:" << avSizes << endl;
74 if (avSizes.count() < 10) {
76 TQValueListConstIterator<int> i;
77 for (i = avSizes.begin(); i != avSizes.end(); i++) {
79 if (*i != oldSize) iconSize.append(*i);
84 const int progression[] = {16, 22, 32, 48, 64, 96, 128, 192, 256};
86 TQValueListConstIterator<int> j = avSizes.begin();
87 for (uint i = 0; i < 9; i++) {
88 while (j++ != avSizes.end()) {
89 if (*j >= progression[i]) {
91 kdDebug(1203) <<
"appending " << *j <<
" size." << endl;
98 iconSize.append(KIcon::SizeSmall);
99 iconSize.append(KIcon::SizeMedium);
100 iconSize.append(KIcon::SizeLarge);
101 iconSize.append(KIcon::SizeHuge);
103 kdDebug(1203) <<
"Using " << iconSize.count() <<
" icon sizes." << endl;
106 int KonqDirPart::KonqDirPartPrivate::findNearestIconSize(
int preferred)
108 int s1 = iconSize[1];
109 if (preferred == 0)
return KGlobal::iconLoader()->currentSize(KIcon::Desktop);
110 if (preferred <= s1)
return s1;
111 for (uint i = 2; i <= iconSize.count(); i++) {
112 if (preferred <= iconSize[i]) {
113 if (preferred - s1 < iconSize[i] - preferred)
return s1;
114 else return iconSize[i];
122 int KonqDirPart::KonqDirPartPrivate::nearestIconSizeError(
int size)
124 return QABS(size - findNearestIconSize(size));
127 KonqDirPart::KonqDirPart( TQObject *parent,
const char *name )
128 :KParts::ReadOnlyPart( parent, name ),
132 d =
new KonqDirPartPrivate;
136 connect( TQApplication::clipboard(), TQT_SIGNAL(dataChanged()),
this, TQT_SLOT(slotClipboardDataChanged()) );
138 actionCollection()->setHighlightingEnabled(
true );
140 m_paIncIconSize =
new KAction( i18n(
"Enlarge Icons" ),
"viewmag+", 0,
this, TQT_SLOT( slotIncIconSize() ), actionCollection(),
"incIconSize" );
141 m_paDecIconSize =
new KAction( i18n(
"Shrink Icons" ),
"viewmag-", 0,
this, TQT_SLOT( slotDecIconSize() ), actionCollection(),
"decIconSize" );
143 m_paDefaultIcons =
new KRadioAction( i18n(
"&Default Size" ), 0, actionCollection(),
"modedefault" );
144 d->aEnormousIcons =
new KRadioAction( i18n(
"&Huge" ), 0,
145 actionCollection(),
"modeenormous" );
146 m_paHugeIcons =
new KRadioAction( i18n(
"&Very Large" ), 0, actionCollection(),
"modehuge" );
147 m_paLargeIcons =
new KRadioAction( i18n(
"&Large" ), 0, actionCollection(),
"modelarge" );
148 m_paMediumIcons =
new KRadioAction( i18n(
"&Medium" ), 0, actionCollection(),
"modemedium" );
149 d->aSmallMediumIcons =
new KRadioAction( i18n(
"&Small" ), 0,
150 actionCollection(),
"modesmallmedium" );
151 m_paSmallIcons =
new KRadioAction( i18n(
"&Tiny" ), 0, actionCollection(),
"modesmall" );
153 m_paDefaultIcons->setExclusiveGroup(
"ViewMode" );
154 d->aEnormousIcons->setExclusiveGroup(
"ViewMode" );
155 m_paHugeIcons->setExclusiveGroup(
"ViewMode" );
156 m_paLargeIcons->setExclusiveGroup(
"ViewMode" );
157 m_paMediumIcons->setExclusiveGroup(
"ViewMode" );
158 d->aSmallMediumIcons->setExclusiveGroup(
"ViewMode" );
159 m_paSmallIcons->setExclusiveGroup(
"ViewMode" );
161 connect( m_paDefaultIcons, TQT_SIGNAL( toggled(
bool ) ),
this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
162 connect( d->aEnormousIcons, TQT_SIGNAL( toggled(
bool ) ),
163 this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
164 connect( m_paHugeIcons, TQT_SIGNAL( toggled(
bool ) ),
this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
165 connect( m_paLargeIcons, TQT_SIGNAL( toggled(
bool ) ),
this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
166 connect( m_paMediumIcons, TQT_SIGNAL( toggled(
bool ) ),
this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
167 connect( d->aSmallMediumIcons, TQT_SIGNAL( toggled(
bool ) ),
168 this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
169 connect( m_paSmallIcons, TQT_SIGNAL( toggled(
bool ) ),
this, TQT_SLOT( slotIconSizeToggled(
bool ) ) );
171 connect( kapp, TQT_SIGNAL(iconChanged(
int)), TQT_SLOT(slotIconChanged(
int)) );
178 d->iconSize[1] = KIcon::SizeSmall;
179 d->iconSize[2] = KIcon::SizeSmallMedium;
180 d->iconSize[3] = KIcon::SizeMedium;
181 d->iconSize[4] = KIcon::SizeLarge;
182 d->iconSize[5] = KIcon::SizeHuge;
183 d->iconSize[6] = KIcon::SizeEnormous;
184 d->iconSize[7] = 192;
185 d->iconSize[8] = 256;
186 KIconTheme *root = KGlobal::instance()->iconLoader()->theme();
189 TQValueList<int> avSizes = root->querySizes(KIcon::Desktop);
190 kdDebug(1203) <<
"the icon theme handles the following sizes:" << avSizes << endl;
191 if (avSizes.count() < 10) {
195 TQValueList<int>::Iterator it;
196 for (i=1, it=avSizes.begin(); (it!=avSizes.end()) && (i<7); it++, i++)
198 d->iconSize[i] = *it;
199 kdDebug(1203) <<
"m_iIconSize[" << i <<
"] = " << *it << endl;
203 d->iconSize[i] = d->iconSize[i - 1] + d->iconSize[i - 1] / 2 ;
204 kdDebug(1203) <<
"m_iIconSize[" << i <<
"] = " << d->iconSize[i] << endl;
209 d->iconSize.reserve(10);
210 d->iconSize.append(0);
216 m_iIconSize[1] = KIcon::SizeSmall;
217 m_iIconSize[2] = KIcon::SizeMedium;
218 m_iIconSize[3] = KIcon::SizeLarge;
219 m_iIconSize[4] = KIcon::SizeHuge;
222 KAction *a =
new KAction( i18n(
"Configure Background..." ),
"background", 0,
this, TQT_SLOT( slotBackgroundSettings() ),
223 actionCollection(),
"bgsettings" );
225 a->setToolTip( i18n(
"Allows choosing of background settings for this view" ) );
228 KonqDirPart::~KonqDirPart()
236 void KonqDirPart::adjustIconSizes()
238 d->findAvailableIconSizes();
239 m_paSmallIcons->setEnabled(d->findNearestIconSize(16) < 20);
240 d->aSmallMediumIcons->setEnabled(d->nearestIconSizeError(22) < 2);
241 m_paMediumIcons->setEnabled(d->nearestIconSizeError(32) < 6);
242 m_paLargeIcons->setEnabled(d->nearestIconSizeError(48) < 8);
243 m_paHugeIcons->setEnabled(d->nearestIconSizeError(64) < 12);
244 d->aEnormousIcons->setEnabled(d->findNearestIconSize(128) > 110);
247 int size = m_pProps->iconSize();
248 int nearSize = d->findNearestIconSize(size);
250 if (size != nearSize) {
251 m_pProps->setIconSize(nearSize);
253 newIconSize(nearSize);
257 void KonqDirPart::setMimeFilter (
const TQStringList& mime)
259 TQString u = url().url();
264 if ( mime.isEmpty() )
265 d->mimeFilters.clear();
267 d->mimeFilters = mime;
270 TQStringList KonqDirPart::mimeFilter()
const
272 return d->mimeFilters;
275 TQScrollView * KonqDirPart::scrollWidget()
277 return static_cast<TQScrollView *
>(widget());
280 void KonqDirPart::slotBackgroundSettings()
282 TQColor bgndColor = m_pProps->bgColor( widget() );
283 TQColor defaultColor = KGlobalSettings::baseColor();
287 m_pProps->bgPixmapFile(),
291 if ( dlg->exec() == KonqBgndDialog::Accepted )
293 if ( dlg->color().isValid() )
295 m_pProps->setBgColor( dlg->color() );
296 m_pProps->setBgPixmapFile(
"" );
300 m_pProps->setBgColor( defaultColor );
301 m_pProps->setBgPixmapFile( dlg->pixmapFile() );
303 m_pProps->applyColors( scrollWidget()->viewport() );
304 scrollWidget()->viewport()->repaint();
310 void KonqDirPart::lmbClicked( KFileItem * fileItem )
312 KURL url = fileItem->url();
313 if ( !fileItem->isReadable() )
316 if ( ( !fileItem->isLocalFile() ) || TQFile::exists( url.path() ) )
318 KMessageBox::error( widget(), i18n(
"<p>You do not have enough permissions to read <b>%1</b></p>").arg(url.prettyURL()) );
321 KMessageBox::error( widget(), i18n(
"<p><b>%1</b> does not seem to exist anymore</p>").arg(url.prettyURL()) );
325 KParts::URLArgs args;
326 fileItem->determineMimeType();
327 if ( fileItem->isMimeTypeKnown() )
328 args.serviceType = fileItem->mimetype();
329 args.trustedSource =
true;
338 KParts::WindowArgs wargs;
339 KParts::ReadOnlyPart* dummy;
340 emit m_extension->createNewWindow( url, args, wargs, dummy );
344 kdDebug() <<
"emit m_extension->openURLRequest( " << url.url() <<
"," << args.serviceType <<
")" << endl;
345 emit m_extension->openURLRequest( url, args );
349 void KonqDirPart::mmbClicked( KFileItem * fileItem )
355 KService::Ptr offer = KServiceTypeProfile::preferredService(fileItem->mimetype(),
"Application");
357 if ( offer && offer->desktopEntryName().startsWith(
"kfmclient") )
359 KParts::URLArgs args;
360 args.serviceType = fileItem->mimetype();
361 emit m_extension->createNewWindow( fileItem->url(), args );
368 m_extension->pasteRequest();
372 void KonqDirPart::saveState( TQDataStream& stream )
374 stream << m_nameFilter;
377 void KonqDirPart::restoreState( TQDataStream& stream )
379 stream >> m_nameFilter;
382 void KonqDirPart::saveFindState( TQDataStream& stream )
393 KParts::BrowserExtension* ext = KParts::BrowserExtension::childObject( m_findPart );
397 ext->saveState( stream );
400 void KonqDirPart::restoreFindState( TQDataStream& stream )
405 emit findOpen(
this );
407 KParts::BrowserExtension* ext = KParts::BrowserExtension::childObject( m_findPart );
413 ext->restoreState( stream );
416 void KonqDirPart::slotClipboardDataChanged()
421 TQMimeSource *data = TQApplication::clipboard()->data();
422 if ( data->provides(
"application/x-kde-cutselection" ) && data->provides(
"text/uri-list" ) )
423 if ( KonqDrag::decodeIsCutSelection( data ) )
424 (
void) KURLDrag::decode( data, lst );
431 void KonqDirPart::updatePasteAction()
433 TQString actionText = KIO::pasteActionText();
434 bool paste = !actionText.isEmpty();
436 emit m_extension->setActionText(
"paste", actionText );
437 emit m_extension->enableAction(
"paste", paste );
440 void KonqDirPart::newItems(
const KFileItemList & entries )
442 d->dirSizeDirty =
true;
446 emit itemsAdded( entries );
449 void KonqDirPart::deleteItem( KFileItem * fileItem )
451 d->dirSizeDirty =
true;
452 emit itemRemoved( fileItem );
455 void KonqDirPart::emitTotalCount()
457 if ( !d->dirLister || d->dirLister->url().isEmpty() )
459 if ( d->dirSizeDirty ) {
463 KFileItemList entries = d->dirLister->items();
464 for (KFileItemListIterator it(entries); it.current(); ++it)
466 if ( !it.current()->isDir() )
468 if (!it.current()->isLink())
469 m_lDirSize += it.current()->size();
475 d->dirSizeDirty =
false;
479 KIO::itemsSummaryString(m_lFileCount + m_lDirCount,
484 bool bShowsResult =
false;
487 TQVariant prop = m_findPart->property(
"showsResult" );
488 bShowsResult = prop.isValid() && prop.toBool();
491 emit setStatusBarText( bShowsResult ? i18n(
"Search result: %1").arg(summary) : summary );
494 void KonqDirPart::emitCounts(
const KFileItemList & lst )
496 if ( lst.count() == 1 )
497 emit setStatusBarText( ((KFileItemList)lst).first()->getStatusBarInfo() );
500 long long fileSizeSum = 0;
504 for ( KFileItemListIterator it( lst ); it.current(); ++it )
506 if ( it.current()->isDir() )
510 if ( !it.current()->isLink() )
511 fileSizeSum += it.current()->size();
516 emit setStatusBarText( KIO::itemsSummaryString( fileCount + dirCount,
518 fileSizeSum,
true ) );
522 void KonqDirPart::emitCounts(
const KFileItemList & lst,
bool selectionChanged )
524 if ( lst.count() == 0 )
536 if ( selectionChanged )
537 emit m_extension->selectionInfo( lst );
540 void KonqDirPart::emitMouseOver(
const KFileItem* item )
542 emit m_extension->mouseOverInfo( item );
545 void KonqDirPart::slotIconSizeToggled(
bool toggleOn )
555 if ( m_paDefaultIcons->isChecked() )
557 else if ( d->aEnormousIcons->isChecked() )
558 setIconSize(d->findNearestIconSize(KIcon::SizeEnormous));
559 else if ( m_paHugeIcons->isChecked() )
560 setIconSize(d->findNearestIconSize(KIcon::SizeHuge));
561 else if ( m_paLargeIcons->isChecked() )
562 setIconSize(d->findNearestIconSize(KIcon::SizeLarge));
563 else if ( m_paMediumIcons->isChecked() )
564 setIconSize(d->findNearestIconSize(KIcon::SizeMedium));
565 else if ( d->aSmallMediumIcons->isChecked() )
566 setIconSize(d->findNearestIconSize(KIcon::SizeSmallMedium));
567 else if ( m_paSmallIcons->isChecked() )
568 setIconSize(d->findNearestIconSize(KIcon::SizeSmall));
571 void KonqDirPart::slotIncIconSize()
573 int s = m_pProps->iconSize();
574 s = s ? s : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
576 for ( uint idx = 1; idx < d->iconSize.count() ; ++idx )
577 if (s == d->iconSize[idx]) {
581 if ( sizeIndex > 0 && sizeIndex < d->iconSize.count() - 1 )
583 setIconSize( d->iconSize[sizeIndex + 1] );
587 void KonqDirPart::slotDecIconSize()
589 int s = m_pProps->iconSize();
590 s = s ? s : KGlobal::iconLoader()->currentSize( KIcon::Desktop );
592 for ( uint idx = 1; idx < d->iconSize.count() ; ++idx )
593 if (s == d->iconSize[idx]) {
599 setIconSize( d->iconSize[sizeIndex - 1] );
604 void KonqDirPart::newIconSize(
int size )
606 int realSize = (size==0) ? KGlobal::iconLoader()->currentSize( KIcon::Desktop ) : size;
607 m_paDecIconSize->setEnabled(realSize > d->iconSize[1]);
608 m_paIncIconSize->setEnabled(realSize < d->iconSize.back());
610 m_paDefaultIcons->setChecked(size == 0);
611 d->aEnormousIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeEnormous));
612 m_paHugeIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeHuge));
613 m_paLargeIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeLarge));
614 m_paMediumIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeMedium));
615 d->aSmallMediumIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeSmallMedium));
616 m_paSmallIcons->setChecked(size == d->findNearestIconSize(KIcon::SizeSmall));
620 void KonqDirPart::setIconSize(
int size )
623 m_pProps->setIconSize( size );
627 bool KonqDirPart::closeURL()
633 bool KonqDirPart::openURL(
const KURL& url)
637 kdDebug(1203) <<
"KonqDirPart::openURL -> emit findClosed " <<
this << endl;
640 emit findClosed(
this );
644 emit aboutToOpenURL ();
646 return doOpenURL(url);
649 void KonqDirPart::setFindPart( KParts::ReadOnlyPart * part )
653 connect( m_findPart, TQT_SIGNAL( started() ),
654 this, TQT_SLOT( slotStarted() ) );
655 connect( m_findPart, TQT_SIGNAL( started() ),
656 this, TQT_SLOT( slotStartAnimationSearching() ) );
657 connect( m_findPart, TQT_SIGNAL( clear() ),
658 this, TQT_SLOT( slotClear() ) );
659 connect( m_findPart, TQT_SIGNAL( newItems(
const KFileItemList & ) ),
660 this, TQT_SLOT( slotNewItems(
const KFileItemList & ) ) );
661 connect( m_findPart, TQT_SIGNAL( finished() ),
662 this, TQT_SLOT( slotCompleted() ) );
663 connect( m_findPart, TQT_SIGNAL( finished() ),
664 this, TQT_SLOT( slotStopAnimationSearching() ) );
665 connect( m_findPart, TQT_SIGNAL( canceled() ),
666 this, TQT_SLOT( slotCanceled() ) );
667 connect( m_findPart, TQT_SIGNAL( canceled() ),
668 this, TQT_SLOT( slotStopAnimationSearching() ) );
670 connect( m_findPart, TQT_SIGNAL( findClosed() ),
671 this, TQT_SLOT( slotFindClosed() ) );
673 emit findOpened(
this );
676 m_findPart->openURL( url() );
679 void KonqDirPart::slotFindClosed()
681 kdDebug(1203) <<
"KonqDirPart::slotFindClosed -> emit findClosed " <<
this << endl;
684 emit findClosed(
this );
689 void KonqDirPart::slotIconChanged(
int group )
691 if (group != KIcon::Desktop)
return;
695 void KonqDirPart::slotStartAnimationSearching()
700 void KonqDirPart::slotStopAnimationSearching()
705 void KonqDirPartBrowserExtension::saveState( TQDataStream &stream )
707 m_dirPart->saveState( stream );
708 bool hasFindPart = m_dirPart->findPart();
709 stream << hasFindPart;
710 assert( ! ( hasFindPart && !strcmp(m_dirPart->className(),
"KFindPart") ) );
712 KParts::BrowserExtension::saveState( stream );
714 m_dirPart->saveFindState( stream );
718 void KonqDirPartBrowserExtension::restoreState( TQDataStream &stream )
720 m_dirPart->restoreState( stream );
722 stream >> hasFindPart;
723 assert( ! ( hasFindPart && !strcmp(m_dirPart->className(),
"KFindPart") ) );
726 KParts::BrowserExtension::restoreState( stream );
728 m_dirPart->restoreFindState( stream );
733 void KonqDirPart::resetCount()
738 d->dirSizeDirty =
true;
741 void KonqDirPart::setDirLister( KDirLister* lister )
743 d->dirLister = lister;
746 #include "konq_dirpart.moc"