diff options
Diffstat (limited to 'parts/tools/kapplicationtree.cpp')
-rw-r--r-- | parts/tools/kapplicationtree.cpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/parts/tools/kapplicationtree.cpp b/parts/tools/kapplicationtree.cpp new file mode 100644 index 00000000..dd33e851 --- /dev/null +++ b/parts/tools/kapplicationtree.cpp @@ -0,0 +1,258 @@ +/* This file is part of the KDE libraries + Nicked from KDElibs since KDevApplicationTree is not a public class.. + + Copyright (C) 1997 Torben Weis <weis@stud.uni-frankfurt.de> + Copyright (C) 1999 Dirk A. Mueller <dmuell@gmx.net> + Portions copyright (C) 1999 Preston Brown <pbrown@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <qfile.h> +#include <qdir.h> +#include <qdialog.h> +#include <qpixmap.h> +#include <qlabel.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qtoolbutton.h> +#include <qcheckbox.h> +#include <qtooltip.h> +#include <qstyle.h> + +#include <kapplication.h> +#include <kbuttonbox.h> +#include <kcombobox.h> +#include <kdesktopfile.h> +#include <kdialog.h> +#include <kglobal.h> +#include <klineedit.h> +#include <klocale.h> +#include <kiconloader.h> +#include <kmimemagic.h> +#include <krun.h> +#include <kstandarddirs.h> +#include <kstringhandler.h> +#include <kuserprofile.h> +#include <kurlcompletion.h> +#include <kurlrequester.h> +#include <dcopclient.h> +#include <kmimetype.h> +#include <kservicegroup.h> +#include <klistview.h> +#include <ksycoca.h> +#include <kdebug.h> + +#include "kapplicationtree.h" + +template class QPtrList<QString>; + +#define SORT_SPEC (QDir::DirsFirst | QDir::Name | QDir::IgnoreCase) + + +// ---------------------------------------------------------------------- + +KDevAppTreeListItem::KDevAppTreeListItem( KListView* parent, const QString & name, + const QPixmap& pixmap, bool parse, bool dir, const QString& p, const QString& c, const QString& dE ) + : QListViewItem( parent, name ) +{ + init(pixmap, parse, dir, p, c, dE); +} + + +// ---------------------------------------------------------------------- + +KDevAppTreeListItem::KDevAppTreeListItem( QListViewItem* parent, const QString & name, + const QPixmap& pixmap, bool parse, bool dir, const QString& p, const QString& c, const QString& dE ) + : QListViewItem( parent, name ) +{ + init(pixmap, parse, dir, p, c, dE); +} + + +// ---------------------------------------------------------------------- + +void KDevAppTreeListItem::init(const QPixmap& pixmap, bool parse, bool dir, const QString& _path, const QString& _exec, const QString& _dEntry) +{ + setPixmap(0, pixmap); + parsed = parse; + directory = dir; + path = _path; // relative path + exec = _exec; + dEntry = _dEntry; + exec.simplifyWhiteSpace(); + exec.truncate(exec.find(' ')); +} + + +// ---------------------------------------------------------------------- +// Ensure that dirs are sorted in front of files and case is ignored + +QString KDevAppTreeListItem::key(int column, bool /*ascending*/) const +{ + if (directory) + return QString::fromLatin1(" ") + text(column).upper(); + else + return text(column).upper(); +} + +void KDevAppTreeListItem::activate() +{ + if ( directory ) + setOpen(!isOpen()); +} + +void KDevAppTreeListItem::setOpen( bool o ) +{ + if( o && !parsed ) { // fill the children before opening + ((KDevApplicationTree *) parent())->addDesktopGroup( path, this ); + parsed = true; + } + QListViewItem::setOpen( o ); +} + +bool KDevAppTreeListItem::isDirectory() +{ + return directory; +} + +// ---------------------------------------------------------------------- + +KDevApplicationTree::KDevApplicationTree( QWidget *parent, const char* name ) + : KListView( parent, name ), currentitem(0) +{ + addColumn( i18n("Known Applications") ); + setRootIsDecorated( true ); + + addDesktopGroup( QString::null ); + + connect( this, SIGNAL( currentChanged(QListViewItem*) ), SLOT( slotItemHighlighted(QListViewItem*) ) ); + connect( this, SIGNAL( selectionChanged(QListViewItem*) ), SLOT( slotSelectionChanged(QListViewItem*) ) ); +} + +// ---------------------------------------------------------------------- + +bool KDevApplicationTree::isDirSel() +{ + if (!currentitem) return false; // if currentitem isn't set + return currentitem->isDirectory(); +} + +// ---------------------------------------------------------------------- + +void KDevApplicationTree::addDesktopGroup( QString relPath, KDevAppTreeListItem *item) +{ + KServiceGroup::Ptr root = KServiceGroup::group(relPath); + KServiceGroup::List list = root->entries(); + + KDevAppTreeListItem * newItem; + for( KServiceGroup::List::ConstIterator it = list.begin(); + it != list.end(); it++) + { + QString icon; + QString text; + QString relPath; + QString exec; + QString dEntry; + bool isDir = false; + KSycocaEntry *p = (*it); + if (p->isType(KST_KService)) + { + KService *service = static_cast<KService *>(p); + icon = service->icon(); + text = service->name(); + exec = service->exec(); + dEntry = service->desktopEntryPath(); + } + else if (p->isType(KST_KServiceGroup)) + { + KServiceGroup *serviceGroup = static_cast<KServiceGroup *>(p); + icon = serviceGroup->icon(); + text = serviceGroup->caption(); + relPath = serviceGroup->relPath(); + isDir = true; + if ( text[0] == '.' ) // skip ".hidden" like kicker does + continue; + // avoid adding empty groups + KServiceGroup::Ptr subMenuRoot = KServiceGroup::group(relPath); + if (subMenuRoot->childCount() == 0) + continue; + } + else + { + kdWarning(250) << "KServiceGroup: Unexpected object in list!" << endl; + continue; + } + + QPixmap pixmap = SmallIcon( icon ); + + if (item) + newItem = new KDevAppTreeListItem( item, text, pixmap, false, isDir, + relPath, exec, dEntry ); + else + newItem = new KDevAppTreeListItem( this, text, pixmap, false, isDir, + relPath, exec, dEntry ); + if (isDir) + newItem->setExpandable( true ); + } +} + + +// ---------------------------------------------------------------------- + +void KDevApplicationTree::slotItemHighlighted(QListViewItem* i) +{ + // i may be 0 (see documentation) + if(!i) + return; + + KDevAppTreeListItem *item = (KDevAppTreeListItem *) i; + + currentitem = item; + + if( (!item->directory ) && (!item->exec.isEmpty()) ) + emit highlighted( item->text(0), item->exec ); +} + + +// ---------------------------------------------------------------------- + +void KDevApplicationTree::slotSelectionChanged(QListViewItem* i) +{ + // i may be 0 (see documentation) + if(!i) + return; + + KDevAppTreeListItem *item = (KDevAppTreeListItem *) i; + + currentitem = item; + + if( ( !item->directory ) && (!item->exec.isEmpty() ) ) + emit selected( item->text(0), item->exec ); +} + +// ---------------------------------------------------------------------- + +void KDevApplicationTree::resizeEvent( QResizeEvent * e) +{ + setColumnWidth(0, width()-QApplication::style().pixelMetric(QStyle::PM_ScrollBarExtent)); + KListView::resizeEvent(e); +} + + + +#include "kapplicationtree.moc" + |