summaryrefslogtreecommitdiffstats
path: root/parts/tools
diff options
context:
space:
mode:
Diffstat (limited to 'parts/tools')
-rw-r--r--parts/tools/Makefile.am16
-rw-r--r--parts/tools/README.dox12
-rw-r--r--parts/tools/addtooldlg.ui245
-rw-r--r--parts/tools/addtooldlg.ui.h31
-rw-r--r--parts/tools/kapplicationtree.cpp258
-rw-r--r--parts/tools/kapplicationtree.h102
-rw-r--r--parts/tools/kdevpart_tools.rc14
-rw-r--r--parts/tools/kdevtools.desktop82
-rw-r--r--parts/tools/tools_part.cpp272
-rw-r--r--parts/tools/tools_part.h55
-rw-r--r--parts/tools/toolsconfig.cpp169
-rw-r--r--parts/tools/toolsconfig.h71
-rw-r--r--parts/tools/toolsconfigwidget.cpp284
-rw-r--r--parts/tools/toolsconfigwidget.h60
-rw-r--r--parts/tools/toolsconfigwidgetbase.ui410
15 files changed, 2081 insertions, 0 deletions
diff --git a/parts/tools/Makefile.am b/parts/tools/Makefile.am
new file mode 100644
index 00000000..887ccdd5
--- /dev/null
+++ b/parts/tools/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = -I$(top_srcdir)/lib/interfaces \
+ -I$(top_srcdir)/lib/interfaces/extensions -I$(top_srcdir)/lib/util $(all_includes)
+
+kde_module_LTLIBRARIES = libkdevtools.la
+libkdevtools_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN)
+libkdevtools_la_LIBADD = $(top_builddir)/lib/libkdevelop.la
+
+libkdevtools_la_SOURCES = tools_part.cpp toolsconfig.cpp toolsconfigwidgetbase.ui toolsconfigwidget.cpp kapplicationtree.cpp addtooldlg.ui
+
+METASOURCES = AUTO
+
+servicedir = $(kde_servicesdir)
+service_DATA = kdevtools.desktop
+
+rc_DATA = kdevpart_tools.rc
+rcdir = $(kde_datadir)/kdevtools
diff --git a/parts/tools/README.dox b/parts/tools/README.dox
new file mode 100644
index 00000000..00eab3bf
--- /dev/null
+++ b/parts/tools/README.dox
@@ -0,0 +1,12 @@
+/** \class ToolsPart
+This plugin provides an easy way to add external applications to the Tools menu and toolbar.
+
+\authors <a href="mailto:bernd AT kdevelop.org">Bernd Gehrmann</a>
+
+\unmaintained This part is currently un-maintained.
+
+\feature Provides an easy way to add external applications to the Tools menu and toolbar.
+\feature Tool menu and the file and directory context menus can now be populated with any shell command.
+\feature Output can be sent to the app output part. %S, %D, %T and %W magic works.
+
+*/
diff --git a/parts/tools/addtooldlg.ui b/parts/tools/addtooldlg.ui
new file mode 100644
index 00000000..2ec5e8b4
--- /dev/null
+++ b/parts/tools/addtooldlg.ui
@@ -0,0 +1,245 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>AddToolDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>add_tool_dialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>314</width>
+ <height>514</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add Tool</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>cmdlineLabel_2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Parameters:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>paramEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="4" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>capturedBox</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;apture output</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>If this is checked, the output of the application will be shown in the application output view; otherwise, all output will be ignored.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>cmdlineLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Executable:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>execEdit</cstring>
+ </property>
+ </widget>
+ <widget class="Line" row="5" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>menutextLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Menu text:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>menutextEdit</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>paramEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>&lt;p&gt;The following placeholders can be used:&lt;/p&gt;
+&lt;p&gt;
+&lt;b&gt;%D&lt;/b&gt; - The project directory&lt;br&gt;
+&lt;b&gt;%S&lt;/b&gt; - The current filename&lt;br&gt;
+&lt;b&gt;%T&lt;/b&gt; - The current selection&lt;br&gt;
+&lt;b&gt;%W&lt;/b&gt; - The current word under the cursor&lt;br&gt;
+&lt;/p&gt;
+&lt;p&gt;If any of the used placeholders cannot be evaluated (for example
+if you use %T but there is no current selection), the tool will not be
+executed.&lt;/p&gt;</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>menutextEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The text that appears in the Tools-Menu</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1">
+ <property name="name">
+ <cstring>execEdit</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>The path and name of the application to execute</string>
+ </property>
+ </widget>
+ <widget class="KDevApplicationTree" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>tree</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KDevApplicationTree</class>
+ <header location="local">kapplicationtree.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4350">789c6dd7594f23471007f0f7fd14d6d6db2aaaf58c3db647511eb831b7317794879ac30760cc61c010e5bba7dcf5af5688167664fdb66bbaababbb67cccf1f8dab93c3c68f9fdf5e16b298968d7222cf8d1fd5eb6cf6f1e75f7ffcfded7b9a3656ff9aad46fafdb76fdf078b46d9389a3fd42bf04841699e964933b830b79a7019dd0b96955b895b5a703bcd572e08eea576ff6570ae0eedd477b792103f854b8b2fc6d1163f77237e646e37113f89b6f8307e3bf1785a8b0eedbc696eb7ad9db7e01ee6476ee4ffe0c6fd158c7c69182cde4eec6e87fea50dfbf8176e6ba7d07f96669999cfa325ccaf862bcc97a36dbccf60f178cee11cde706761f16917ae30fe6b7488a7851bf14d7327417f676eb4f756eea41e2f57e6d83e83919f6cba117f04235fd9765b3b0fa36dfc398cf973edc67a6fb951ffe768ab6765ee26b8dff213ef5f4630e2b9e7463ea7ee8ee5ff60ee2618af8eb6fe3238437eb91bf1299cdbfacad3cadd5617f5a11738c7fe4adcb8ffd68d7aeec15e8fc3683b9f62ee2518ef33dafa3f75e3bc957086f86eb4d56f3db8e8e6dd56f01a5cc1bbe65e629673d8ebd18d0efdc9058cf9f2c08df9e630ce037db8719ec37c7a9a7fb708f10267b65e7cef46fb3e9ca3fd23dad6ef0cf67abe99f304f95ec3a8871cbb71be52d8d777e8b6fee412f6f958be3adf5ea817b561afe7d86ded7c67ce13c46fc37ede2766c17a17059cd9f38e466e8c3f8eb6fd700f0b9ef7095c37cd3d37de178f2be76dcf876fa343bd790267f012f67a77cc319f69b4ed872e2ca8e732daeabfe3c6fa9cc235f21f9b8bd4f2a5cd687bfedbfd659ee7ede017b842becf6eb44fa3cbd0df8559b0ffe808ceb0ff37e01afba3652e52cc87a26dbe276ecca7097790ff73b4cdef0616ac4fdf6df1c2d1d67ee8c6f80318eb4bd1180ff529513f0ecf7b694b62f5a002ceccb2662e523c2fb7605f9f0fd8fbbf75e3bc2dcd3e9ebcb9f17ce8c05e8f83685bcf701e44eb2db65e4fd1b65eebe62245be53b8c6f3ffdd8dfd3933fbf884761f5f0edcd88f951bf118bf44bde926dae24fe01ae7af76e3f9169e2f45bb143c0f5fdcf6fea23b18f773eac6f3e63ddac6db75e37df5e8c6fbae65aebcde6d37beaf84f528aa52f03c9dc3359ea79939c627d136deab1befaf75b883ef23e76e3ccfaea36d7dc2f795322b05ebfb0ad738af7db7ad371f99fd7e59b8b13f276e9cdf1318f5e54337e6d78cb67cf761ec170efba1acaa1afd9db92d3f3a36d729ea77efc6f33cbccf2beddfe6478fe6d85e45dbfd851bf1577007f5d877e3bc86f5a9ea3a2d6cffdfc1debe116df5db73a39e37b0e777191dda257c7fa83b6e8a2eaae00eeceb13d6b7d69f325b79b058fd32b170c1a55ebffaac2ccae2b9e6118f79c253bd6ef9ee3fd7587fef79c60f7acf3cc617fcc84ffcac6d8ffcc20b7ee5377ee7257ff027aff1bac66ff0269716cf5b1ab7cd3bbcabb17ddee37d3ee0433ee2633ee1019ff290cff89c2ff89229c48b66f1ac3d5df135df7093134eb9c56dcef4b3c35dee71ce393111dbfa8c784a4205955451cd1d1ad1982634a55bbad3f80eddd38c1ef882e66cf52ab5ff2b8d7ea4277aa6175ad06bb866f446efb4d4df0ffad4fed762ffb7b44e1b9cd2266dd142c75e5ddb3cd0bb3e347a477bd9d5f83ee245e3f7689f0ee830f67d44c77412ee186946033aa5e197fecfe85c7bf7be2fe892aee89a6ea84989f6bfa434f4eff9df52c509b5d0779b32ea684d13ea528f728d1e882ebfce37f6cf077422b4ea5b440ad14af1a15452ab473aee52c65ff39789b64fe955f44eb9937b5d858c5b32d377c0c32a7fee7ecd5fe61aff284ff22c2fb290577993775db1443fb53ef2219f5ff2bf93356d5b970dd9d41eb77820dbb223bbab155ed55ffab2f725ffb1eccb81aed6931cca116ab490633909d10339fd5ffdef795d869ae7923bc27226e772415d5986b51d683663b9d4fcfbb1ff190fe54aaec35aeaa577ee20f24673e94b531249a585fc2b69ebfe3ed7dae91f75ba964b5c03e9d344ba1add93bce0826c3f87f3b2a9fb6f18aeba10ba2f563f25eb1b563771a5d17531e2513c5fba538b3111cd690dd73c7ef6a95f4c8aa99de12fe77da4951de9ffffea730be7fd9fdfbffd0b690edc6c</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>clicked()</signal>
+ <receiver>add_tool_dialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelButton</sender>
+ <signal>clicked()</signal>
+ <receiver>add_tool_dialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>tree</tabstop>
+ <tabstop>menutextEdit</tabstop>
+ <tabstop>execEdit</tabstop>
+ <tabstop>paramEdit</tabstop>
+ <tabstop>capturedBox</tabstop>
+ <tabstop>okButton</tabstop>
+ <tabstop>cancelButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+ <include location="local" impldecl="in implementation">addtooldlg.ui.h</include>
+</includes>
+<forwards>
+ <forward>class QListViewItem;</forward>
+</forwards>
+<slots>
+ <slot>init()</slot>
+ <slot returnType="QString">getApp()</slot>
+ <slot access="private">treeSelectionChanged( QListViewItem * lvi )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/parts/tools/addtooldlg.ui.h b/parts/tools/addtooldlg.ui.h
new file mode 100644
index 00000000..d01c4da7
--- /dev/null
+++ b/parts/tools/addtooldlg.ui.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename slots use Qt Designer which will
+** update this file, preserving your code. Create an init() slot in place of
+** a constructor, and a destroy() slot in place of a destructor.
+*****************************************************************************/
+
+#include <qheader.h>
+#include <kurlrequester.h>
+#include "kapplicationtree.h"
+
+void AddToolDialog::init()
+{
+ connect( tree, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(treeSelectionChanged(QListViewItem*)) );
+ tree->header()->hide();
+}
+
+QString AddToolDialog::getApp()
+{
+ return execEdit->url() + " " + paramEdit->text();
+}
+
+void AddToolDialog::treeSelectionChanged( QListViewItem * lvi )
+{
+ KDevAppTreeListItem* item = dynamic_cast<KDevAppTreeListItem*> ( lvi );
+ if ( !item || item->isDirectory() )
+ return;
+ execEdit->setURL( item->executable() );
+ menutextEdit->setText( item->text( 0 ) );
+}
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"
+
diff --git a/parts/tools/kapplicationtree.h b/parts/tools/kapplicationtree.h
new file mode 100644
index 00000000..7c11870a
--- /dev/null
+++ b/parts/tools/kapplicationtree.h
@@ -0,0 +1,102 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2000 David Faure <faure@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.
+*/
+#ifndef __KDevApplicationTree_h__
+#define __KDevApplicationTree_h__
+
+#include <kurl.h>
+#include <klistview.h>
+
+class KURLRequester;
+
+class QWidget;
+class QCheckBox;
+class QPushButton;
+class QLabel;
+class QStringList;
+
+
+/* ------------------------------------------------------------------------- */
+
+/**
+ * @internal
+ */
+class KDevAppTreeListItem : public QListViewItem
+{
+ bool parsed;
+ bool directory;
+ QString path;
+ QString exec;
+ QString dEntry;
+
+protected:
+ QString key(int column, bool ascending) const;
+
+ void init(const QPixmap& pixmap, bool parse, bool dir, const QString& _path, const QString& _exec, const QString& _dEntry);
+
+public:
+ KDevAppTreeListItem( KListView* parent, const QString & name, const QPixmap& pixmap,
+ bool parse, bool dir, const QString& p, const QString& c, const QString& dE );
+ KDevAppTreeListItem( QListViewItem* parent, const QString & name, const QPixmap& pixmap,
+ bool parse, bool dir, const QString& p, const QString& c, const QString& dE );
+ bool isDirectory();
+
+ QString desktopEntryPath() const { return dEntry; }
+ QString executable() const { return exec; }
+
+protected:
+ virtual void activate();
+ virtual void setOpen( bool o );
+
+ friend class KDevApplicationTree;
+};
+
+/* ------------------------------------------------------------------------- */
+
+/**
+ * @internal
+ */
+class KDevApplicationTree : public KListView
+{
+ Q_OBJECT
+public:
+ KDevApplicationTree( QWidget *parent, const char* name = 0 );
+
+ /**
+ * Add a group of .desktop/.kdelnk entries
+ */
+ void addDesktopGroup( QString relPath, KDevAppTreeListItem *item = 0 );
+
+ bool isDirSel();
+
+protected:
+ void resizeEvent( QResizeEvent *_ev );
+ KDevAppTreeListItem* currentitem;
+
+public slots:
+ void slotItemHighlighted(QListViewItem* i);
+ void slotSelectionChanged(QListViewItem* i);
+
+signals:
+ void selected( const QString& _name, const QString& _exec );
+ void highlighted( const QString& _name, const QString& _exec );
+};
+
+/* ------------------------------------------------------------------------- */
+
+#endif
diff --git a/parts/tools/kdevpart_tools.rc b/parts/tools/kdevpart_tools.rc
new file mode 100644
index 00000000..ab8a6a98
--- /dev/null
+++ b/parts/tools/kdevpart_tools.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="tools" library="libtoolsplugin" version="1">
+<MenuBar>
+ <Menu name="tools">
+ <text>&amp;Tools</text>
+ <ActionList name="tools_list"/>
+ <ActionList name="tools2_list"/>
+ </Menu>
+</MenuBar>
+<ToolBar position="Top" iconText="IconOnly" noMerge="1" name="extraToolBar" fullWidth="false" hidden="true" >
+ <text>Tools Toolbar</text>
+ <ActionList name="tools_list"/>
+</ToolBar>
+</kpartplugin>
diff --git a/parts/tools/kdevtools.desktop b/parts/tools/kdevtools.desktop
new file mode 100644
index 00000000..5e245562
--- /dev/null
+++ b/parts/tools/kdevtools.desktop
@@ -0,0 +1,82 @@
+[Desktop Entry]
+Type=Service
+Exec=blubb
+Comment=This plugin provides an easy way to add external applications to the Tools menu and toolbar.
+Comment[ca]=Aquest connector proporciona un mètode fàcil per afegir aplicacions externes en el menú Eines i a la barra d'eines.
+Comment[da]=Dette plugin sørger for en nem måde at tilføje eksterne programmer til værktøjsmenuen og værktøjslinjen.
+Comment[de]=Dieses Modul erleichtert das Hinzufügen externer Anwendungen zum Menü "Werkzeuge" und in die Werkzeugleiste.
+Comment[el]=Αυτό το πρόσθετο προσφέρει μια εύκολη μέθοδο για τη προσθήκη εξωτερικών εφαρμογών στο μενού εργαλείων και τη γραμμή εργαλείων.
+Comment[es]=Este complemento proporciona un método sencillo para añadir aplicaciones externas en el menú de Herramientas y en la barra de herramientas.
+Comment[et]=See plugin võimaldab hõlpsasti lisada väliseid rakendusi tööriistade menüüsse ja tööriistaribale.
+Comment[eu]=Plugin honek kanpoko aplikazioak Tresnak menu eta tresna-barran erraz gehitzeko aukera eskeintzen du.
+Comment[fa]=این وصله، راه آسانی را برای افزودن کاربردهای خارجی به گزینگان ابزار و میله ابزار فراهم می‌کند.
+Comment[fr]=Ce module externe fournit un moyen facile d'ajouter des applications externes au menu « Outils » et à la barre d'outils.
+Comment[gl]=Esta extensión proporciona un método sinxelo para engadir aplicacións externas ao menú Ferramentas e á barra de ferramentas.
+Comment[hu]=Ez a bővítőmodul lehetővé teszi az Eszközök menü és az eszköztár egyszerű kibővítését
+Comment[it]=Questo plugin offre un modo per aggiungere applicazioni esterne al menu o alla barra degli strumenti.
+Comment[ja]=このプラグインはツールメニューやツールバーに外部のアプリケーションを追加する簡単な方法を提供します。
+Comment[ms]=Plugin ini menyediakan cara mudah untuk menambah aplikasi luaran ke menu Alatan dan bar alatan.
+Comment[nds]=Mit dit Moduul laat sik extern Programmen eenfach na dat "Warktüüch"-Menü un den Warktüüchbalken tofögen.
+Comment[ne]=यो प्लगइनले उपकरण मेनु र उपकरणपट्टीमा बाह्य अनुप्रयोग थप्न सजिलो तरिका प्रदान गर्दछ ।
+Comment[nl]=Met deze plugin kunt u op eenvoudige wijze externe toepassingen aan het menu Gereedschap en de werkbalk toevoegen.
+Comment[pl]=Ta wtyczka umożliwia łatwe dodawanie zewnętrznych programów do menu Narzędzia i do paska narzędzi.
+Comment[pt]=Este 'plugin' oferece uma forma simples de adicionar as aplicações externas ao menu Ferramentas e à barra de ferramentas.
+Comment[pt_BR]=Este plug-in fornece uma maneira fácil de adicionar aplicativos externos ao menu Ferramentas e barra de ferramentas.
+Comment[ru]=Предоставляет возможности добавления в меню пунктов вызова внешних приложений.
+Comment[sk]=Modul poskytuje jednoduchý spôsob ako pridať externú aplikáciu do menu Nástroje a do panelu nástrojov.
+Comment[sl]=Ta vstavek omogoča preprost način dodajanja zunanjih programov v meni Orodja in v orodjarno.
+Comment[sr]=Овај прикључак обезбеђује лак начин за додавање спољних програма у мени „Алати“ и у траку са алатом.
+Comment[sr@Latn]=Ovaj priključak obezbeđuje lak način za dodavanje spoljnih programa u meni „Alati“ i u traku sa alatom.
+Comment[sv]=Insticksprogrammet tillhandahåller ett enkelt sätt att lägga till yttre program i verktygsmenyn och verktygsraden.
+Comment[ta]=இந்த சொருகி கருவிப்பட்டியல் மற்றும் கருவிப்பட்டையில் வெளிபுற பயன்பாடு எளிய முறையில் சேர்க்கலாம்.
+Comment[tg]=Барои илова намудан дар меню нуқтаҳои ҷеғ задани гузоришҳои берунро имкон медиҳад.
+Comment[zh_CN]=这个插件提供向工具菜单和工具栏添加外部程序的方法。
+Comment[zh_TW]=此外掛程式提供一個簡單的方式,將外部應用程式新增到工具選單與工具列中。
+Name=KDevTools
+Name[da]=KDevelop Værktøjer
+Name[de]="Werkzeug"-Menüerweiterung (KDevelop)
+Name[hi]=के-डेव-टूल्स
+Name[nds]=Warktüüch-Menüverwiedern (KDevelop)
+Name[pl]=KDevNarzędzia
+Name[sk]=KDev nástroje
+Name[sv]=KDevelop verktyg
+Name[ta]=KDev கருவிகள்
+Name[tg]=Асбобҳои KDev
+Name[zh_TW]=KDevelop 工具
+GenericName=Tools Menu Addition
+GenericName[ca]=Afegiment al menú Eines
+GenericName[da]=Værktøjsmenu tilføjelse
+GenericName[de]="Werkzeuge"-Menüerweiterung
+GenericName[el]=Προσθήκη μενού εργαλείων
+GenericName[es]=Añadir al menú Herramientas
+GenericName[et]=Tööriistade menüü lisamine
+GenericName[eu]=Tresnak menuan gehitu
+GenericName[fa]=افزودن گزینگان ابزار
+GenericName[fr]=Ajout au menu « Outils »
+GenericName[gl]=Engadidos ao menú Ferramentas
+GenericName[hu]=Bővítés az Eszközök menühöz
+GenericName[it]=Aggiunte al menu Strumenti
+GenericName[ja]=ツールメニュー追加
+GenericName[nds]=Warktüüch-Menüverwiedern
+GenericName[ne]=उपकरण मेनु अतिरिक्त
+GenericName[nl]=Gereedschapsmenu-toevoeging
+GenericName[pl]=Dodatek do menu Narzędzia
+GenericName[pt]=Adicionar ao Menu de Ferramentas
+GenericName[pt_BR]=Adição ao Menu Ferramentas
+GenericName[ru]=Дополнение меню инструментов
+GenericName[sk]=Prídavky menu Nástroje
+GenericName[sl]=Dodatek menija orodij
+GenericName[sr]=Додаци менију „Алати“
+GenericName[sr@Latn]=Dodaci meniju „Alati“
+GenericName[sv]=Tillägg i verktygsmenyn
+GenericName[ta]=கருவிப்பட்டியல் சேர்ப்பு
+GenericName[tg]=Асбобҳои иловагии меню
+GenericName[tr]=Araçlar Menü Eklemesi
+GenericName[zh_CN]=工具菜单附加
+GenericName[zh_TW]=新增工具選單
+Icon=configure
+ServiceTypes=KDevelop/Plugin
+X-KDE-Library=libkdevtools
+X-KDevelop-Version=5
+X-KDevelop-Scope=Global
+X-KDevelop-Properties=AdditionalTools
diff --git a/parts/tools/tools_part.cpp b/parts/tools/tools_part.cpp
new file mode 100644
index 00000000..f4285546
--- /dev/null
+++ b/parts/tools/tools_part.cpp
@@ -0,0 +1,272 @@
+#include "tools_part.h"
+
+#include <qfile.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <qwhatsthis.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kdialogbase.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kparts/part.h>
+#include <kprocess.h>
+#include <ktexteditor/document.h>
+
+#include "kdevcore.h"
+#include "kdevproject.h"
+#include "kdevpartcontroller.h"
+#include "kdevappfrontend.h"
+#include "kdevplugininfo.h"
+#include "urlutil.h"
+#include "configwidgetproxy.h"
+#include "kdeveditorutil.h"
+
+#include "toolsconfig.h"
+#include "toolsconfigwidget.h"
+
+#define TOOLSSETTINGS 1
+#define EXTRATOOLSSETTINGS 2
+
+static const KDevPluginInfo data("kdevtools");
+K_EXPORT_COMPONENT_FACTORY( libkdevtools, ToolsFactory( data ) )
+
+QMap<int, QString> externalToolMenuEntries;
+
+ToolsPart::ToolsPart(QObject *parent, const char *name, const QStringList &)
+ : KDevPlugin( &data, parent, name ? name : "ToolsPart")
+{
+ setInstance(ToolsFactory::instance());
+
+ setXMLFile("kdevpart_tools.rc");
+
+ m_configProxy = new ConfigWidgetProxy( core() );
+ m_configProxy->createGlobalConfigPage( i18n("Tools Menu"), TOOLSSETTINGS, info()->icon() );
+ m_configProxy->createGlobalConfigPage( i18n("External Tools"), EXTRATOOLSSETTINGS, info()->icon() );
+ connect( m_configProxy, SIGNAL(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )),
+ this, SLOT(insertConfigWidget(const KDialogBase*, QWidget*, unsigned int )) );
+
+ connect(core(), SIGNAL(coreInitialized()), this, SLOT(updateMenu()));
+
+ connect( core(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)) );
+
+ // Apparently action lists can only be plugged after the
+ // xmlgui client has been registered
+ QTimer::singleShot(0, this, SLOT(updateToolsMenu()));
+}
+
+
+ToolsPart::~ToolsPart()
+{
+ delete m_configProxy;
+}
+
+void ToolsPart::insertConfigWidget( const KDialogBase * dlg, QWidget * page, unsigned int pagenumber )
+{
+ if ( pagenumber == TOOLSSETTINGS )
+ {
+ ToolsConfig *w = new ToolsConfig( page, "tools config widget" );
+ connect(dlg, SIGNAL(okClicked()), w, SLOT(accept()));
+ connect(dlg, SIGNAL(destroyed()), this, SLOT(updateMenu()));
+ }
+ else if ( pagenumber == EXTRATOOLSSETTINGS )
+ {
+ ToolsConfigWidget *w2 = new ToolsConfigWidget( page, "tools config widget" );
+ connect(dlg, SIGNAL(okClicked()), w2, SLOT(accept()));
+ connect(dlg, SIGNAL(destroyed()), this, SLOT(updateToolsMenu()));
+ }
+}
+
+void ToolsPart::updateMenu()
+{
+ QPtrList<KAction> actions;
+
+ unplugActionList("tools_list");
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tools");
+
+ QStringList list = config->readListEntry("Tools");
+ for (QStringList::Iterator it = list.begin(); it != list.end(); ++it)
+ {
+ QString name = *it;
+
+ KDesktopFile df(name, true);
+ if (df.readName().isNull())
+ continue;
+
+ KAction *action = new KAction(df.readName(), df.readIcon(), 0,
+ this, SLOT(slotToolActivated()), (QObject*)0, name.latin1());
+ actions.append(action);
+ }
+
+ plugActionList("tools_list", actions);
+}
+
+
+void ToolsPart::slotToolActivated()
+{
+ QString df = sender()->name();
+ kapp->startServiceByDesktopPath(df);
+}
+
+void ToolsPart::startCommand(QString cmdline, bool captured, QString fileName)
+{
+ KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( partController()->activePart() );
+
+ if ( fileName.isNull() && doc )
+ fileName = doc->url().path();
+
+ QString projectDirectory;
+ if (project())
+ projectDirectory = project()->projectDirectory();
+
+ QString selection = KDevEditorUtil::currentSelection( doc );
+ if ( !selection.isEmpty() )
+ selection = KShellProcess::quote( selection );
+
+ QString word = KDevEditorUtil::currentWord( doc );
+
+ // This should really be checked before inserting into the popup
+ if (cmdline.contains("%D") && projectDirectory.isNull())
+ return;
+ cmdline.replace(QRegExp("%D"), projectDirectory);
+
+ if (cmdline.contains("%S") && fileName.isNull())
+ return;
+ cmdline.replace(QRegExp("%S"), fileName);
+
+ if (cmdline.contains("%T") && selection.isNull())
+ return;
+ cmdline.replace(QRegExp("%T"), selection);
+
+ if (cmdline.contains("%W") && word.isNull())
+ return;
+ cmdline.replace(QRegExp("%W"), word);
+
+ if (captured)
+ {
+ if (KDevAppFrontend *appFrontend = extension<KDevAppFrontend>("KDevelop/AppFrontend"))
+ appFrontend->startAppCommand(QString::QString(), cmdline, false);
+ }
+ else
+ {
+ KShellProcess proc;
+ proc << cmdline;
+ proc.start(KProcess::DontCare, KProcess::NoCommunication);
+ }
+}
+
+
+void ToolsPart::updateToolsMenu()
+{
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("External Tools");
+ QStringList l = config->readListEntry("Tool Menu");
+
+
+ QPtrList<KAction> actions;
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it) {
+ QString menutext = *it;
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tool Menu " + menutext);
+ bool isdesktopfile = config->readBoolEntry("DesktopFile");
+ KAction *action = new KAction(*it, 0,
+ this, SLOT(toolsMenuActivated()),
+ (QObject*) 0, menutext.utf8());
+ if (isdesktopfile) {
+ KDesktopFile df(config->readPathEntry("CommandLine"));
+ action->setIcon(df.readIcon());
+ }
+ actions.append(action);
+ }
+
+ unplugActionList("tools2_list");
+ plugActionList("tools2_list", actions);
+}
+
+
+void ToolsPart::contextMenu(QPopupMenu *popup, const Context *context)
+{
+ if (!context->hasType( Context::FileContext ))
+ return;
+
+ const FileContext *fcontext = static_cast<const FileContext*>(context);
+ m_contextPopup = popup;
+ m_contextFileName = fcontext->urls().first().path();
+ externalToolMenuEntries.clear();
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("External Tools");
+ QStringList filecontextList = config->readListEntry("File Context");
+
+ if (URLUtil::isDirectory(m_contextFileName)) {
+ QStringList l = config->readListEntry("Dir Context");
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it)
+ externalToolMenuEntries.insert( popup->insertItem( (*it), this, SLOT(dirContextActivated(int)) ), (*it) );
+ } else {
+ QStringList l = config->readListEntry("File Context");
+ QStringList::ConstIterator it;
+ for (it = l.begin(); it != l.end(); ++it)
+ externalToolMenuEntries.insert( popup->insertItem( (*it), this, SLOT(fileContextActivated(int)) ), (*it) );
+ }
+}
+
+
+void ToolsPart::toolsMenuActivated()
+{
+ QString menutext = sender()->name();
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tool Menu " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool isdesktopfile = config->readBoolEntry("DesktopFile");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "tools:" << "activating " << menutext
+ << "with cmdline " << cmdline
+ << "and desktopfile " << isdesktopfile << endl;
+ if (isdesktopfile)
+ kapp->startServiceByDesktopPath(cmdline);
+ else
+ startCommand(cmdline, captured, QString::null);
+}
+
+
+void ToolsPart::fileContextActivated(int id)
+{
+ QString menutext = externalToolMenuEntries[ id ];
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("File Context " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "filecontext:" << "activating " << menutext
+ << " with cmdline " << cmdline
+ << " on file " << m_contextFileName << endl;
+ startCommand(cmdline, captured, m_contextFileName);
+}
+
+
+void ToolsPart::dirContextActivated(int id)
+{
+ QString menutext = externalToolMenuEntries[ id ];
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Dir Context " + menutext);
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool captured = config->readBoolEntry("Captured");
+ kdDebug() << "dircontext:" << "activating " << menutext
+ << "with cmdline " << cmdline
+ << " on directory " << m_contextFileName << endl;
+ startCommand(cmdline, captured, m_contextFileName);
+}
+
+#include "tools_part.moc"
diff --git a/parts/tools/tools_part.h b/parts/tools/tools_part.h
new file mode 100644
index 00000000..b0d82c99
--- /dev/null
+++ b/parts/tools/tools_part.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2001 Matthias Hoelzer-Kluepfel <mhk@caldera.de>
+ */
+
+
+#ifndef __KDEVPART_TOOLS_H__
+#define __KDEVPART_TOOLS_H__
+
+
+#include <qguardedptr.h>
+#include <kdevplugin.h>
+#include <kdevgenericfactory.h>
+
+
+class QPopupMenu;
+class KDialogBase;
+class Context;
+class ConfigWidgetProxy;
+
+class ToolsWidget;
+
+
+class ToolsPart : public KDevPlugin
+ {
+ Q_OBJECT
+
+public:
+
+ ToolsPart( QObject *parent, const char *name, const QStringList & );
+ ~ToolsPart();
+
+
+private slots:
+ void insertConfigWidget( const KDialogBase * dlg, QWidget * page, unsigned int pagenumber );
+ void updateMenu();
+
+ void slotToolActivated();
+
+ void contextMenu(QPopupMenu *popup, const Context *context);
+ void updateToolsMenu();
+ void toolsMenuActivated();
+ void fileContextActivated(int id);
+ void dirContextActivated(int id);
+
+private:
+ void startCommand(QString cmdline, bool captured, QString fileName);
+
+ QPopupMenu *m_contextPopup;
+ QString m_contextFileName;
+ ConfigWidgetProxy * m_configProxy;
+ };
+
+typedef KDevGenericFactory<ToolsPart> ToolsFactory;
+
+#endif
diff --git a/parts/tools/toolsconfig.cpp b/parts/tools/toolsconfig.cpp
new file mode 100644
index 00000000..523fe388
--- /dev/null
+++ b/parts/tools/toolsconfig.cpp
@@ -0,0 +1,169 @@
+#include "toolsconfig.h"
+
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qheader.h>
+
+#include <kapplication.h>
+#include <kdesktopfile.h>
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "tools_part.h"
+#include "kapplicationtree.h"
+
+
+ToolsConfig::ToolsConfig(QWidget *parent, const char *name)
+ : QWidget(parent, name), _tree(0)
+{
+ _entries.setAutoDelete(true);
+}
+
+
+void ToolsConfig::showEvent(QShowEvent *e)
+{
+ QWidget::showEvent(e);
+
+ if (!_tree)
+ {
+ QApplication::setOverrideCursor(Qt::waitCursor);
+
+ QHBoxLayout *hbox = new QHBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+
+ QVBoxLayout *vbox = new QVBoxLayout(hbox);
+ _tree = new KDevApplicationTree(this);
+ _tree->header()->hide();
+ QLabel *l = new QLabel(_tree, i18n("&Applications:"), this);
+ l->show();
+ _tree->show();
+
+ vbox->addWidget(l);
+ vbox->addWidget(_tree);
+
+ vbox = new QVBoxLayout(hbox);
+
+ _toList = new QPushButton(QApplication::reverseLayout() ? "<<" : ">>", this);
+ _toList->show();
+ vbox->addWidget(_toList);
+
+ connect(_toList, SIGNAL(clicked()), this, SLOT(toList()));
+
+ _toTree = new QPushButton(QApplication::reverseLayout() ? ">>" : "<<", this);
+ _toTree->show();
+ vbox->addWidget(_toTree);
+
+ connect(_toTree, SIGNAL(clicked()), this, SLOT(toTree()));
+
+ vbox = new QVBoxLayout(hbox);
+ _list = new QListBox(this);
+ l = new QLabel(_list, i18n("&Tools menu:"), this);
+ l->show();
+ _list->show();
+ vbox->addWidget(l);
+ vbox->addWidget(_list);
+
+ QApplication::restoreOverrideCursor();
+ }
+
+ fill();
+ checkButtons();
+
+ connect(_tree, SIGNAL(selectionChanged()), this, SLOT(checkButtons()));
+ connect(_list, SIGNAL(selectionChanged()), this, SLOT(checkButtons()));
+}
+
+
+void ToolsConfig::checkButtons()
+{
+ _toList->setEnabled(_tree->selectedItem() && !_tree->selectedItem()->firstChild());
+ _toTree->setEnabled(_list->currentItem() >= 0 && _list->currentItem() < (int)_list->count());
+}
+
+
+void ToolsConfig::fill()
+{
+ _entries.clear();
+
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tools");
+
+ QStringList list = config->readListEntry("Tools");
+
+ for (QStringList::Iterator it = list.begin(); it != list.end(); ++it)
+ add(*it);
+}
+
+
+void ToolsConfig::add(const QString &desktopFile)
+{
+ KDesktopFile df(desktopFile, true);
+ if (df.readName().isEmpty())
+ return;
+
+ Entry *entry = new Entry;
+
+ if (!df.readIcon().isEmpty())
+ entry->icon = BarIcon(df.readIcon());
+ entry->name = df.readName();
+ entry->desktopFile = desktopFile;
+
+ _entries.append(entry);
+
+ updateList();
+
+ checkButtons();
+}
+
+
+void ToolsConfig::toList()
+{
+ KDevAppTreeListItem *item = dynamic_cast<KDevAppTreeListItem*>(_tree->selectedItem());
+ if (item && !item->desktopEntryPath().isEmpty())
+ add(item->desktopEntryPath());
+ checkButtons();
+}
+
+
+void ToolsConfig::toTree()
+{
+ _entries.remove(_list->currentItem());
+ updateList();
+ checkButtons();
+}
+
+
+void ToolsConfig::accept()
+{
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("Tools");
+
+ QStringList l;
+ QPtrListIterator<Entry> it(_entries);
+ for ( ; it.current(); ++it)
+ l.append(it.current()->desktopFile);
+
+ config->writeEntry("Tools", l);
+ config->sync();
+}
+
+
+void ToolsConfig::updateList()
+{
+ _list->setUpdatesEnabled(false);
+
+ _list->clear();
+
+ QPtrListIterator<Entry> it(_entries);
+ for ( ; it.current(); ++it)
+ _list->insertItem(it.current()->icon, it.current()->name);
+
+ _list->setUpdatesEnabled(true);
+ _list->repaint();
+}
+
+
+#include "toolsconfig.moc"
diff --git a/parts/tools/toolsconfig.h b/parts/tools/toolsconfig.h
new file mode 100644
index 00000000..5dc87d70
--- /dev/null
+++ b/parts/tools/toolsconfig.h
@@ -0,0 +1,71 @@
+#ifndef __TOOLS_CONFIG_H__
+#define __TOOLS_CONFIG_H__
+
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qpixmap.h>
+
+
+class QListBox;
+class QPushButton;
+class KDevApplicationTree;
+
+class Entry
+{
+public:
+
+ Entry() {};
+
+ QString name;
+ QString desktopFile;
+ QPixmap icon;
+
+};
+
+
+class ToolsConfig : public QWidget
+ {
+ Q_OBJECT
+
+public:
+
+ ToolsConfig(QWidget *parent = 0, const char *name = 0);
+
+
+public slots:
+
+ void accept();
+
+
+protected:
+
+ void showEvent(QShowEvent *);
+
+ void fill();
+ void add(const QString &desktopFile);
+ void remove(const QString &desktopFile);
+
+
+private slots:
+
+ void checkButtons();
+
+ void toList();
+ void toTree();
+
+ void updateList();
+
+
+private:
+
+ KDevApplicationTree *_tree;
+ QListBox *_list;
+ QPushButton *_toList, *_toTree;
+
+ QPtrList<Entry> _entries;
+
+ };
+
+
+#endif
diff --git a/parts/tools/toolsconfigwidget.cpp b/parts/tools/toolsconfigwidget.cpp
new file mode 100644
index 00000000..72b102be
--- /dev/null
+++ b/parts/tools/toolsconfigwidget.cpp
@@ -0,0 +1,284 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "toolsconfigwidget.h"
+
+#include <qcheckbox.h>
+#include <qlistbox.h>
+#include <qtimer.h>
+
+#include <klineedit.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <kurldrag.h>
+
+#include "addtooldlg.h"
+#include "kapplicationtree.h"
+
+
+struct ToolsConfigEntry
+{
+ QString menutext;
+ QString cmdline;
+ bool isdesktopfile;
+ bool captured;
+ bool isEmpty() const {
+ return ( menutext.isEmpty() && cmdline.isEmpty() );
+ }
+};
+
+
+ToolsConfigWidget::ToolsConfigWidget(QWidget *parent, const char *name)
+ : ToolsConfigWidgetBase(parent, name)
+{
+ m_toolsmenuEntries.setAutoDelete(true);
+ m_filecontextEntries.setAutoDelete(true);
+ m_dircontextEntries.setAutoDelete(true);
+
+ toolsmenuBox->setAcceptDrops(true);
+ toolsmenuBox->installEventFilter(this);
+ toolsmenuBox->viewport()->setAcceptDrops(true);
+ toolsmenuBox->viewport()->installEventFilter(this);
+
+ readConfig();
+}
+
+
+ToolsConfigWidget::~ToolsConfigWidget()
+{}
+
+
+void ToolsConfigWidget::readGroup(const QString &group, QDict<ToolsConfigEntry> *entryDict)
+{
+ KConfig *config = ToolsFactory::instance()->config();
+ config->setGroup("External Tools");
+ QStringList list = config->readListEntry(group);
+
+ QStringList::ConstIterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ config->setGroup(group + " " + (*it));
+ QString cmdline = config->readPathEntry("CommandLine");
+ bool isdesktopfile = config->readBoolEntry("DesktopFile");
+ bool captured = config->readBoolEntry("Captured");
+ ToolsConfigEntry *entry = new ToolsConfigEntry;
+ entry->menutext = (*it);
+ entry->cmdline = cmdline;
+ entry->isdesktopfile = isdesktopfile;
+ entry->captured = captured;
+ entryDict->insert(*it, entry);
+ }
+}
+
+
+void ToolsConfigWidget::storeGroup(const QString &group, const QDict<ToolsConfigEntry> &entryDict)
+{
+ KConfig *config = ToolsFactory::instance()->config();
+
+ QStringList list;
+
+ QDictIterator<ToolsConfigEntry> it(entryDict);
+ for (; it.current(); ++it) {
+ ToolsConfigEntry *entry = it.current();
+ list << entry->menutext;
+ config->setGroup(group + " " + entry->menutext);
+ config->writePathEntry("CommandLine", entry->cmdline);
+ config->writeEntry("DesktopFile", entry->isdesktopfile);
+ config->writeEntry("Captured", entry->captured);
+ }
+
+ config->setGroup("External Tools");
+ config->writeEntry(group, list);
+}
+
+
+
+void ToolsConfigWidget::fillListBox(QListBox *lb, const QDict<ToolsConfigEntry> &entryDict)
+{
+ lb->clear();
+
+ QDictIterator<ToolsConfigEntry> it(entryDict);
+ for (; it.current(); ++it) {
+ ToolsConfigEntry *entry = it.current();
+ if (entry->isdesktopfile) {
+ KDesktopFile df(entry->cmdline);
+ lb->insertItem(SmallIcon(df.readIcon()), entry->menutext);
+ } else {
+ lb->insertItem(entry->menutext);
+ }
+ }
+}
+
+
+bool ToolsConfigWidget::addEntry(ToolsConfigEntry *entry, QDict<ToolsConfigEntry> *entryDict)
+{
+ QString menutext = entry->menutext;
+ if (entryDict->find(menutext)) {
+ delete entry;
+ KMessageBox::sorry(this, i18n("An entry with this title exists already."));
+ return false;
+ }
+
+ entryDict->insert(menutext, entry);
+
+ updateListBoxes();
+ return true;
+}
+
+
+void ToolsConfigWidget::readConfig()
+{
+ readGroup("Tool Menu", &m_toolsmenuEntries);
+ readGroup("File Context", &m_filecontextEntries);
+ readGroup("Dir Context", &m_dircontextEntries);
+
+ updateListBoxes();
+}
+
+
+void ToolsConfigWidget::storeConfig()
+{
+ storeGroup("Tool Menu", m_toolsmenuEntries);
+ storeGroup("File Context", m_filecontextEntries);
+ storeGroup("Dir Context", m_dircontextEntries);
+}
+
+
+void ToolsConfigWidget::updateListBoxes()
+{
+ fillListBox(toolsmenuBox, m_toolsmenuEntries);
+ fillListBox(filecontextBox, m_filecontextEntries);
+ fillListBox(dircontextBox, m_dircontextEntries);
+}
+
+
+void ToolsConfigWidget::toolsmenuaddClicked()
+{
+ AddToolDialog dlg(this);
+ dlg.setCaption(i18n("Add to Tools Menu"));
+ dlg.tree->setFocus();
+ while (dlg.exec()) {
+ ToolsConfigEntry *entry = new ToolsConfigEntry;
+ entry->menutext = dlg.menutextEdit->text();
+ entry->cmdline = dlg.getApp().stripWhiteSpace();
+ entry->isdesktopfile = false;
+ entry->captured = dlg.capturedBox->isChecked();
+ if ( entry->isEmpty() )
+ delete entry;
+ else if (addEntry(entry, &m_toolsmenuEntries))
+ return;
+ }
+}
+
+
+void ToolsConfigWidget::toolsmenuremoveClicked()
+{
+ QString menutext = toolsmenuBox->currentText();
+ m_toolsmenuEntries.remove(menutext);
+ updateListBoxes();
+}
+
+
+void ToolsConfigWidget::filecontextaddClicked()
+{
+ AddToolDialog dlg(this);
+ dlg.setCaption(i18n("Add to File Context Menus"));
+ dlg.tree->setFocus();
+ while (dlg.exec()) {
+ ToolsConfigEntry *entry = new ToolsConfigEntry;
+ entry->menutext = dlg.menutextEdit->text();
+ entry->cmdline = dlg.getApp().stripWhiteSpace();
+ entry->isdesktopfile = false;
+ entry->captured = dlg.capturedBox->isChecked();
+ if ( entry->isEmpty() )
+ delete entry;
+
+ else if (addEntry(entry, &m_filecontextEntries))
+ return;
+ }
+}
+
+
+void ToolsConfigWidget::filecontextremoveClicked()
+{
+ QString menutext = filecontextBox->currentText();
+ m_filecontextEntries.remove(menutext);
+ updateListBoxes();
+}
+
+
+void ToolsConfigWidget::dircontextaddClicked()
+{
+ AddToolDialog dlg(this);
+ dlg.setCaption(i18n("Add to Directory Context Menus"));
+ dlg.tree->setFocus();
+ if (dlg.exec()) {
+ ToolsConfigEntry *entry = new ToolsConfigEntry;
+ entry->menutext = dlg.menutextEdit->text();
+ entry->cmdline = dlg.getApp().stripWhiteSpace();
+ entry->isdesktopfile = false;
+ entry->captured = dlg.capturedBox->isChecked();
+ if ( entry->isEmpty() )
+ delete entry;
+ else if (addEntry(entry, &m_dircontextEntries))
+ return;
+ }
+}
+
+
+void ToolsConfigWidget::dircontextremoveClicked()
+{
+ QString menutext = dircontextBox->currentText();
+ m_dircontextEntries.remove(menutext);
+ updateListBoxes();
+}
+
+
+bool ToolsConfigWidget::eventFilter(QObject *o, QEvent *e)
+{
+ if (e->type() == QEvent::DragEnter || e->type() == QEvent::DragMove) {
+ QDragMoveEvent *dme = static_cast<QDragMoveEvent*>(e);
+ if (KURLDrag::canDecode(dme))
+ dme->accept();
+ return true;
+ } else if (e->type() == QEvent::Drop) {
+ QDropEvent *de = static_cast<QDropEvent*>(e);
+ KURL::List fileList;
+ if (KURLDrag::decode(de, fileList)) {
+ KURL::List::ConstIterator it;
+ for (it = fileList.begin(); it != fileList.end(); ++it) {
+ if ((*it).isLocalFile() && KDesktopFile::isDesktopFile((*it).path())) {
+ KDesktopFile df((*it).path());
+ ToolsConfigEntry *entry = new ToolsConfigEntry;
+ entry->menutext = df.readName();
+ entry->cmdline = (*it).path();
+ entry->isdesktopfile = true;
+ entry->captured = false;
+ addEntry(entry, &m_toolsmenuEntries);
+ }
+ }
+ }
+ return true;
+ }
+
+ return ToolsConfigWidgetBase::eventFilter(o, e);
+}
+
+
+void ToolsConfigWidget::accept()
+{
+ storeConfig();
+}
+#include "toolsconfigwidget.moc"
diff --git a/parts/tools/toolsconfigwidget.h b/parts/tools/toolsconfigwidget.h
new file mode 100644
index 00000000..51e1b005
--- /dev/null
+++ b/parts/tools/toolsconfigwidget.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright (C) 2002 by Bernd Gehrmann *
+ * bernd@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _TOOLSCONFIGWIDGET_H_
+#define _TOOLSCONFIGWIDGET_H_
+
+#include "toolsconfigwidgetbase.h"
+#include "tools_part.h"
+#include <qdict.h>
+
+
+struct ToolsConfigEntry;
+
+
+class ToolsConfigWidget : public ToolsConfigWidgetBase
+{
+ Q_OBJECT
+
+public:
+ ToolsConfigWidget(QWidget *parent=0, const char *name=0);
+ ~ToolsConfigWidget();
+
+public slots:
+ void accept();
+
+private:
+ virtual void toolsmenuaddClicked();
+ virtual void toolsmenuremoveClicked();
+ virtual void filecontextaddClicked();
+ virtual void filecontextremoveClicked();
+ virtual void dircontextaddClicked();
+ virtual void dircontextremoveClicked();
+
+ virtual bool eventFilter(QObject *o, QEvent *e);
+
+ void readGroup(const QString &group, QDict<ToolsConfigEntry> *entryDict);
+ void storeGroup(const QString &group, const QDict<ToolsConfigEntry> &entryDict);
+ void fillListBox(QListBox *lb, const QDict<ToolsConfigEntry> &entryDict);
+ bool addEntry(ToolsConfigEntry *entry, QDict<ToolsConfigEntry> *entryDict);
+
+ void readConfig();
+ void storeConfig();
+ void updateListBoxes();
+
+ QDict<ToolsConfigEntry> m_toolsmenuEntries;
+ QDict<ToolsConfigEntry> m_filecontextEntries;
+ QDict<ToolsConfigEntry> m_dircontextEntries;
+
+ ToolsPart *m_part;
+};
+
+#endif
diff --git a/parts/tools/toolsconfigwidgetbase.ui b/parts/tools/toolsconfigwidgetbase.ui
new file mode 100644
index 00000000..5b8baab0
--- /dev/null
+++ b/parts/tools/toolsconfigwidgetbase.ui
@@ -0,0 +1,410 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>ToolsConfigWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>tools_config_widget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>541</width>
+ <height>376</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>External Tools</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabwidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>toolmenuTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Tools Menu</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <property name="name">
+ <cstring>toolsmenuBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout4_3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer9_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>toolsmenuaddButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>toolsmenuremoveButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer10_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer11_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>filecontextTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;File Context Menu</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <property name="name">
+ <cstring>filecontextBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout4_2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer9_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>filecontextaddButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>filecontextremoveButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer10_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer11_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>dircontextTab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Directory Context Menu</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <property name="name">
+ <cstring>dircontextBox</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>dircontextaddButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Add...</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>dircontextremoveButton</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>Spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>filecontextaddButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>filecontextaddClicked()</slot>
+ </connection>
+ <connection>
+ <sender>dircontextaddButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>dircontextaddClicked()</slot>
+ </connection>
+ <connection>
+ <sender>dircontextremoveButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>dircontextremoveClicked()</slot>
+ </connection>
+ <connection>
+ <sender>filecontextremoveButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>filecontextremoveClicked()</slot>
+ </connection>
+ <connection>
+ <sender>toolsmenuaddButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>toolsmenuaddClicked()</slot>
+ </connection>
+ <connection>
+ <sender>toolsmenuremoveButton</sender>
+ <signal>clicked()</signal>
+ <receiver>tools_config_widget</receiver>
+ <slot>toolsmenuremoveClicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>toolsmenuBox</tabstop>
+ <tabstop>toolsmenuaddButton</tabstop>
+ <tabstop>toolsmenuremoveButton</tabstop>
+ <tabstop>tabwidget</tabstop>
+ <tabstop>filecontextBox</tabstop>
+ <tabstop>filecontextaddButton</tabstop>
+ <tabstop>filecontextremoveButton</tabstop>
+ <tabstop>dircontextBox</tabstop>
+ <tabstop>dircontextaddButton</tabstop>
+ <tabstop>dircontextremoveButton</tabstop>
+</tabstops>
+<includes>
+ <include location="global" impldecl="in implementation">kdialog.h</include>
+</includes>
+<slots>
+ <slot access="protected">dircontextaddClicked()</slot>
+ <slot access="protected">filecontextaddClicked()</slot>
+ <slot access="protected">filecontextremoveClicked()</slot>
+ <slot access="protected">dircontextremoveClicked()</slot>
+ <slot access="protected">toolsmenuaddClicked()</slot>
+ <slot access="protected">toolsmenuremoveClicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>