summaryrefslogtreecommitdiffstats
path: root/kio/kfile/kcustommenueditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kio/kfile/kcustommenueditor.cpp')
-rw-r--r--kio/kfile/kcustommenueditor.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/kio/kfile/kcustommenueditor.cpp b/kio/kfile/kcustommenueditor.cpp
new file mode 100644
index 000000000..edbca55e3
--- /dev/null
+++ b/kio/kfile/kcustommenueditor.cpp
@@ -0,0 +1,242 @@
+/* This file is part of the KDE libraries
+ Copyright (C) 2002 Waldo Bastian ([email protected])
+
+ 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; version 2
+ of the License.
+
+ 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., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qhbox.h>
+#include <qregexp.h>
+#include <qimage.h>
+#include <qpushbutton.h>
+#include <qdir.h>
+
+#include <kbuttonbox.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <kservice.h>
+#include <kstandarddirs.h>
+#include <kconfigbase.h>
+#include <kopenwith.h>
+
+#include "kcustommenueditor.h"
+
+class KCustomMenuEditor::Item : public QListViewItem
+{
+public:
+ Item(QListView *parent, KService::Ptr service)
+ : QListViewItem(parent),
+ s(service)
+ {
+ init();
+ }
+
+ Item(QListViewItem *parent, KService::Ptr service)
+ : QListViewItem(parent),
+ s(service)
+ {
+ init();
+ }
+
+ void init()
+ {
+ QString serviceName = s->name();
+
+ // item names may contain ampersands. To avoid them being converted
+ // to accelators, replace them with two ampersands.
+ serviceName.replace("&", "&&");
+
+ QPixmap normal = KGlobal::instance()->iconLoader()->loadIcon(s->icon(), KIcon::Small,
+ 0, KIcon::DefaultState, 0L, true);
+
+ // make sure they are not larger than 16x16
+ if (normal.width() > 16 || normal.height() > 16) {
+ QImage tmp = normal.convertToImage();
+ tmp = tmp.smoothScale(16, 16);
+ normal.convertFromImage(tmp);
+ }
+ setText(0, serviceName);
+ setPixmap(0, normal);
+ }
+
+ KService::Ptr s;
+};
+
+class KCustomMenuEditor::KCustomMenuEditorPrivate
+{
+public:
+ QPushButton * pbRemove;
+ QPushButton * pbMoveUp;
+ QPushButton * pbMoveDown;
+};
+
+KCustomMenuEditor::KCustomMenuEditor(QWidget *parent)
+ : KDialogBase(parent, "custommenueditor", true, i18n("Menu Editor"), Ok|Cancel, Ok, true),
+ m_listView(0)
+{
+ d = new KCustomMenuEditorPrivate;
+ QHBox *page = makeHBoxMainWidget();
+ m_listView = new KListView(page);
+ m_listView->addColumn(i18n("Menu"));
+ m_listView->setFullWidth(true);
+ m_listView->setSorting(-1);
+ KButtonBox *buttonBox = new KButtonBox(page, Vertical);
+ buttonBox->addButton(i18n("New..."), this, SLOT(slotNewItem()));
+ d->pbRemove=buttonBox->addButton(i18n("Remove"), this, SLOT(slotRemoveItem()));
+ d->pbMoveUp=buttonBox->addButton(i18n("Move Up"), this, SLOT(slotMoveUp()));
+ d->pbMoveDown=buttonBox->addButton(i18n("Move Down"), this, SLOT(slotMoveDown()));
+ buttonBox->layout();
+ connect( m_listView, SIGNAL( selectionChanged () ), this, SLOT( refreshButton() ) );
+ refreshButton();
+}
+
+KCustomMenuEditor::~KCustomMenuEditor()
+{
+ delete d;
+ d=0;
+}
+
+void KCustomMenuEditor::refreshButton()
+{
+ QListViewItem *item = m_listView->currentItem();
+ d->pbRemove->setEnabled( item );
+ d->pbMoveUp->setEnabled( item && item->itemAbove() );
+ d->pbMoveDown->setEnabled( item && item->itemBelow() );
+}
+
+void
+KCustomMenuEditor::load(KConfigBase *cfg)
+{
+ cfg->setGroup(QString::null);
+ int count = cfg->readNumEntry("NrOfItems");
+ QListViewItem *last = 0;
+ for(int i = 0; i < count; i++)
+ {
+ QString entry = cfg->readPathEntry(QString("Item%1").arg(i+1));
+ if (entry.isEmpty())
+ continue;
+
+ // Try KSycoca first.
+ KService::Ptr menuItem = KService::serviceByDesktopPath( entry );
+ if (!menuItem)
+ menuItem = KService::serviceByDesktopName( entry );
+ if (!menuItem)
+ menuItem = new KService( entry );
+
+ if (!menuItem->isValid())
+ continue;
+
+ QListViewItem *item = new Item(m_listView, menuItem);
+ item->moveItem(last);
+ last = item;
+ }
+}
+
+void
+KCustomMenuEditor::save(KConfigBase *cfg)
+{
+ // First clear the whole config file.
+ QStringList groups = cfg->groupList();
+ for(QStringList::ConstIterator it = groups.begin();
+ it != groups.end(); ++it)
+ {
+ cfg->deleteGroup(*it);
+ }
+
+ cfg->setGroup(QString::null);
+ Item * item = (Item *) m_listView->firstChild();
+ int i = 0;
+ while(item)
+ {
+ i++;
+ QString path = item->s->desktopEntryPath();
+ if (QDir::isRelativePath(path) || QDir::isRelativePath(KGlobal::dirs()->relativeLocation("xdgdata-apps", path)))
+ path = item->s->desktopEntryName();
+ cfg->writePathEntry(QString("Item%1").arg(i), path);
+ item = (Item *) item->nextSibling();
+ }
+ cfg->writeEntry("NrOfItems", i);
+}
+
+void
+KCustomMenuEditor::slotNewItem()
+{
+ QListViewItem *item = m_listView->currentItem();
+
+ KOpenWithDlg dlg(this);
+ dlg.setSaveNewApplications(true);
+
+ if (dlg.exec())
+ {
+ KService::Ptr s = dlg.service();
+ if (s && s->isValid())
+ {
+ Item *newItem = new Item(m_listView, s);
+ newItem->moveItem(item);
+ }
+ refreshButton();
+ }
+}
+
+void
+KCustomMenuEditor::slotRemoveItem()
+{
+ QListViewItem *item = m_listView->currentItem();
+ if (!item)
+ return;
+
+ delete item;
+ refreshButton();
+}
+
+void
+KCustomMenuEditor::slotMoveUp()
+{
+ QListViewItem *item = m_listView->currentItem();
+ if (!item)
+ return;
+
+ QListViewItem *searchItem = m_listView->firstChild();
+ while(searchItem)
+ {
+ QListViewItem *next = searchItem->nextSibling();
+ if (next == item)
+ {
+ searchItem->moveItem(item);
+ break;
+ }
+ searchItem = next;
+ }
+ refreshButton();
+}
+
+void
+KCustomMenuEditor::slotMoveDown()
+{
+ QListViewItem *item = m_listView->currentItem();
+ if (!item)
+ return;
+
+ QListViewItem *after = item->nextSibling();
+ if (!after)
+ return;
+
+ item->moveItem( after );
+ refreshButton();
+}
+
+#include "kcustommenueditor.moc"