KDevelop API Documentation

toolsconfigwidget.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2002 by Bernd Gehrmann                                  *
00003  *   bernd@kdevelop.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00012 #include "toolsconfigwidget.h"
00013 
00014 #include <qcheckbox.h>
00015 #include <qlineedit.h>
00016 #include <qlistbox.h>
00017 #include <qtimer.h>
00018 
00019 #include <kconfig.h>
00020 #include <kdeversion.h>
00021 #include <kdebug.h>
00022 #include <kdesktopfile.h>
00023 #include <kiconloader.h>
00024 #include <kmessagebox.h>
00025 #include <kurl.h>
00026 #include <kurldrag.h>
00027 
00028 #include "addtooldlg.h"
00029 #include "kapplicationtree.h"
00030 
00031 
00032 struct ToolsConfigEntry
00033 {
00034     QString menutext;
00035     QString cmdline;
00036     bool isdesktopfile;
00037     bool captured;
00038     bool isEmpty() const {
00039         return ( menutext.isEmpty() && cmdline.isEmpty() );
00040     }
00041 };
00042 
00043 
00044 ToolsConfigWidget::ToolsConfigWidget(QWidget *parent, const char *name)
00045     : ToolsConfigWidgetBase(parent, name)
00046 {
00047     m_toolsmenuEntries.setAutoDelete(true);
00048     m_filecontextEntries.setAutoDelete(true);
00049     m_dircontextEntries.setAutoDelete(true);
00050 
00051     toolsmenuBox->setAcceptDrops(true);
00052     toolsmenuBox->installEventFilter(this);
00053     toolsmenuBox->viewport()->setAcceptDrops(true);
00054     toolsmenuBox->viewport()->installEventFilter(this);
00055 
00056     readConfig();
00057 }
00058 
00059 
00060 ToolsConfigWidget::~ToolsConfigWidget()
00061 {}
00062 
00063 
00064 void ToolsConfigWidget::readGroup(const QString &group, QDict<ToolsConfigEntry> *entryDict)
00065 {
00066     KConfig *config = ToolsFactory::instance()->config();
00067     config->setGroup("External Tools");
00068     QStringList list = config->readListEntry(group);
00069 
00070     QStringList::ConstIterator it;
00071     for (it = list.begin(); it != list.end(); ++it) {
00072         config->setGroup(group + " " + (*it));
00073         QString cmdline = config->readPathEntry("CommandLine");
00074         bool isdesktopfile = config->readBoolEntry("DesktopFile");
00075         bool captured = config->readBoolEntry("Captured");
00076         ToolsConfigEntry *entry = new ToolsConfigEntry;
00077         entry->menutext = (*it);
00078         entry->cmdline = cmdline;
00079         entry->isdesktopfile = isdesktopfile;
00080         entry->captured = captured;
00081         entryDict->insert(*it, entry);
00082     }
00083 }
00084 
00085 
00086 void ToolsConfigWidget::storeGroup(const QString &group, const QDict<ToolsConfigEntry> &entryDict)
00087 {
00088     KConfig *config = ToolsFactory::instance()->config();
00089 
00090     QStringList list;
00091 
00092     QDictIterator<ToolsConfigEntry> it(entryDict);
00093     for (; it.current(); ++it) {
00094         ToolsConfigEntry *entry = it.current();
00095         list << entry->menutext;
00096         config->setGroup(group + " " + entry->menutext);
00097 #if defined(KDE_IS_VERSION)
00098 # if KDE_IS_VERSION(3,1,3)
00099 #  ifndef _KDE_3_1_3_
00100 #   define _KDE_3_1_3_
00101 #  endif
00102 # endif
00103 #endif
00104 #if defined(_KDE_3_1_3_)
00105         config->writePathEntry("CommandLine", entry->cmdline);
00106 #else
00107         config->writeEntry("CommandLine", entry->cmdline);
00108 #endif
00109         config->writeEntry("DesktopFile", entry->isdesktopfile);
00110         config->writeEntry("Captured", entry->captured);
00111     }
00112 
00113     config->setGroup("External Tools");
00114     config->writeEntry(group, list);
00115 }
00116 
00117 
00118 
00119 void ToolsConfigWidget::fillListBox(QListBox *lb, const QDict<ToolsConfigEntry> &entryDict)
00120 {
00121     lb->clear();
00122 
00123     QDictIterator<ToolsConfigEntry> it(entryDict);
00124     for (; it.current(); ++it) {
00125         ToolsConfigEntry *entry = it.current();
00126         if (entry->isdesktopfile) {
00127             KDesktopFile df(entry->cmdline);
00128             lb->insertItem(SmallIcon(df.readIcon()), entry->menutext);
00129         } else {
00130             lb->insertItem(entry->menutext);
00131         }
00132     }
00133 }
00134 
00135 
00136 bool ToolsConfigWidget::addEntry(ToolsConfigEntry *entry, QDict<ToolsConfigEntry> *entryDict)
00137 {
00138     QString menutext = entry->menutext;
00139     if (entryDict->find(menutext)) {
00140         delete entry;
00141         KMessageBox::sorry(this, i18n("An entry with this title exists already."));
00142         return false;
00143     }
00144 
00145     entryDict->insert(menutext, entry);
00146 
00147     updateListBoxes();
00148     return true;
00149 }
00150 
00151 
00152 void ToolsConfigWidget::readConfig()
00153 {
00154     readGroup("Tool Menu", &m_toolsmenuEntries);
00155     readGroup("File Context", &m_filecontextEntries);
00156     readGroup("Dir Context", &m_dircontextEntries);
00157 
00158     updateListBoxes();
00159 }
00160 
00161 
00162 void ToolsConfigWidget::storeConfig()
00163 {
00164     storeGroup("Tool Menu", m_toolsmenuEntries);
00165     storeGroup("File Context", m_filecontextEntries);
00166     storeGroup("Dir Context", m_dircontextEntries);
00167 }
00168 
00169 
00170 void ToolsConfigWidget::updateListBoxes()
00171 {
00172     fillListBox(toolsmenuBox, m_toolsmenuEntries);
00173     fillListBox(filecontextBox, m_filecontextEntries);
00174     fillListBox(dircontextBox, m_dircontextEntries);
00175 }
00176 
00177 
00178 void ToolsConfigWidget::toolsmenuaddClicked()
00179 {
00180     AddToolDialog dlg(this);
00181     dlg.setCaption(i18n("Add to Tools Menu"));
00182     dlg.tree->setFocus();
00183     while (dlg.exec()) {
00184         ToolsConfigEntry *entry = new ToolsConfigEntry;
00185         entry->menutext = dlg.menutextEdit->text();
00186         entry->cmdline = dlg.getApp().stripWhiteSpace();
00187         entry->isdesktopfile = false;
00188         entry->captured = dlg.capturedBox->isChecked();
00189         if ( entry->isEmpty() )
00190             delete entry;
00191         else if (addEntry(entry, &m_toolsmenuEntries))
00192             return;
00193     }
00194 }
00195 
00196 
00197 void ToolsConfigWidget::toolsmenuremoveClicked()
00198 {
00199     QString menutext = toolsmenuBox->currentText();
00200     m_toolsmenuEntries.remove(menutext);
00201     updateListBoxes();
00202 }
00203 
00204 
00205 void ToolsConfigWidget::filecontextaddClicked()
00206 {
00207     AddToolDialog dlg(this);
00208     dlg.setCaption(i18n("Add to File Context Menus"));
00209     dlg.tree->setFocus();
00210     while (dlg.exec()) {
00211         ToolsConfigEntry *entry = new ToolsConfigEntry;
00212         entry->menutext = dlg.menutextEdit->text();
00213         entry->cmdline = dlg.getApp().stripWhiteSpace();
00214         entry->isdesktopfile = false;
00215         entry->captured = dlg.capturedBox->isChecked();
00216         if ( entry->isEmpty() )
00217             delete entry;
00218 
00219         else if (addEntry(entry, &m_filecontextEntries))
00220             return;
00221     }
00222 }
00223 
00224 
00225 void ToolsConfigWidget::filecontextremoveClicked()
00226 {
00227     QString menutext = filecontextBox->currentText();
00228     m_filecontextEntries.remove(menutext);
00229     updateListBoxes();
00230 }
00231 
00232 
00233 void ToolsConfigWidget::dircontextaddClicked()
00234 {
00235     AddToolDialog dlg(this);
00236     dlg.setCaption(i18n("Add to Directory Context Menus"));
00237     dlg.tree->setFocus();
00238     if (dlg.exec()) {
00239         ToolsConfigEntry *entry = new ToolsConfigEntry;
00240         entry->menutext = dlg.menutextEdit->text();
00241         entry->cmdline = dlg.getApp().stripWhiteSpace();
00242         entry->isdesktopfile = false;
00243         entry->captured = dlg.capturedBox->isChecked();
00244         if ( entry->isEmpty() )
00245             delete entry;
00246         else if (addEntry(entry, &m_dircontextEntries))
00247             return;
00248     }
00249 }
00250 
00251 
00252 void ToolsConfigWidget::dircontextremoveClicked()
00253 {
00254     QString menutext = dircontextBox->currentText();
00255     m_dircontextEntries.remove(menutext);
00256     updateListBoxes();
00257 }
00258 
00259 
00260 bool ToolsConfigWidget::eventFilter(QObject *o, QEvent *e)
00261 {
00262     if (e->type() == QEvent::DragEnter || e->type() == QEvent::DragMove) {
00263         QDragMoveEvent *dme = static_cast<QDragMoveEvent*>(e);
00264         if (KURLDrag::canDecode(dme))
00265             dme->accept();
00266         return true;
00267     } else if (e->type() == QEvent::Drop) {
00268         QDropEvent *de = static_cast<QDropEvent*>(e);
00269         KURL::List fileList;
00270         if (KURLDrag::decode(de, fileList)) {
00271             KURL::List::ConstIterator it;
00272             for (it = fileList.begin(); it != fileList.end(); ++it) {
00273                 if ((*it).isLocalFile() && KDesktopFile::isDesktopFile((*it).path())) {
00274                     KDesktopFile df((*it).path());
00275                     ToolsConfigEntry *entry = new ToolsConfigEntry;
00276                     entry->menutext = df.readName();
00277                     entry->cmdline = (*it).path();
00278                     entry->isdesktopfile = true;
00279                     entry->captured = false;
00280                     addEntry(entry, &m_toolsmenuEntries);
00281                 }
00282             }
00283         }
00284         return true;
00285     }
00286 
00287     return ToolsConfigWidgetBase::eventFilter(o, e);
00288 }
00289 
00290 
00291 void ToolsConfigWidget::accept()
00292 {
00293     storeConfig();
00294 }
00295 #include "toolsconfigwidget.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:58 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003