You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/parts/tools/toolsconfigwidget.cpp

285 lines
8.2 KiB

/***************************************************************************
* 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"