KDevelop API Documentation

doxygenconfigwidget.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2000 by Dimitri van Heesch                              *
00003  *   dimitri@stack.nl                                                      *
00004  *   Copyright (C) 2001 by Bernd Gehrmann                                  *
00005  *   bernd@kdevelop.org                                                    *
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012 ***************************************************************************/
00013 
00014 #include "doxygenconfigwidget.h"
00015 
00016 #include <qscrollview.h>
00017 #include <qvbox.h>
00018 #include <qwhatsthis.h>
00019 #include <qtextstream.h>
00020 
00021 #include <klocale.h>
00022 #include <kdebug.h>
00023 #include <kmessagebox.h>
00024 
00025 #include "config.h"
00026 #include "input.h"
00027 #include "messages.h"
00028 
00029 
00030 DoxygenConfigWidget::DoxygenConfigWidget(const QString &fileName, QWidget *parent, const char *name)
00031     : QTabWidget(parent, name)
00032 {
00033     m_hasChanged = false;
00034     m_dependencies = new QDict< QPtrList<IInput> >(257);
00035     m_dependencies->setAutoDelete(true);
00036     m_inputWidgets = new QDict< IInput >;
00037     m_switches = new QDict< QObject >;
00038    
00039     QPtrListIterator<ConfigOption> options = Config::instance()->iterator();
00040     QScrollView *page = 0;
00041     QVBox *pagebox = 0;
00042     ConfigOption *option = 0;
00043     for (options.toFirst(); (option=options.current()); ++options) {
00044         switch(option->kind())
00045             {
00046             case ConfigOption::O_Info:
00047                 page = new QScrollView(this, option->name());
00048                 page->viewport()->setBackgroundMode(PaletteBackground);
00049                 pagebox = new QVBox(0);
00050                 Q_ASSERT(pagebox!=0);
00051                 page->addChild(pagebox);
00052                 addTab(page, message(option->name()));
00053                 QWhatsThis::add(page, option->docs().simplifyWhiteSpace() );
00054                 break;
00055             case ConfigOption::O_String:
00056                 {
00057                     Q_ASSERT(pagebox!=0);
00058                     InputString::StringMode sm = InputString::StringFree;
00059                     switch (((ConfigString *)option)->widgetType()) {
00060                     case ConfigString::String: sm = InputString::StringFree; break;
00061                     case ConfigString::File:   sm = InputString::StringFile; break;
00062                     case ConfigString::Dir:    sm = InputString::StringDir;  break;
00063                     }
00064                     InputString *inputString = new InputString
00065                         ( message(option->name()),               // name
00066                           pagebox,                               // widget
00067                           *((ConfigString *)option)->valueRef(), // variable 
00068                           sm                                     // type
00069                           );
00070                     QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace());
00071                     connect(inputString, SIGNAL(changed()), this, SLOT(changed()));
00072                     m_inputWidgets->insert(option->name(), inputString);
00073                     addDependency(m_switches, option->dependsOn(), option->name());
00074                 }
00075                 break;
00076             case ConfigOption::O_Enum:
00077                 {
00078                     Q_ASSERT(pagebox!=0);
00079                     InputString *inputString = new InputString
00080                         ( message(option->name()),               // name
00081                           pagebox,                               // widget
00082                           *((ConfigEnum *)option)->valueRef(),   // variable 
00083                           InputString::StringFixed               // type
00084                           );
00085                     QStrListIterator sli=((ConfigEnum *)option)->iterator();
00086                     for (sli.toFirst(); sli.current(); ++sli)
00087                         inputString->addValue(sli.current());
00088                     QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace());
00089                     connect(inputString, SIGNAL(changed()), this, SLOT(changed()));
00090                     m_inputWidgets->insert(option->name(),inputString);
00091                     addDependency(m_switches, option->dependsOn(), option->name());
00092                 }
00093                 break;
00094             case ConfigOption::O_List:
00095                 {
00096                     Q_ASSERT(pagebox!=0);
00097                     InputStrList::ListMode lm = InputStrList::ListString;
00098                     switch(((ConfigList *)option)->widgetType())
00099                         {
00100                         case ConfigList::String:     lm=InputStrList::ListString;  break;
00101                         case ConfigList::File:       lm=InputStrList::ListFile;    break;
00102                         case ConfigList::Dir:        lm=InputStrList::ListDir;     break;
00103                         case ConfigList::FileAndDir: lm=InputStrList::ListFileDir; break;
00104                         }
00105                     InputStrList *inputStrList = new InputStrList
00106                         ( message(option->name()),                // name
00107                           pagebox,                                // widget
00108                           *((ConfigList *)option)->valueRef(),    // variable
00109                           lm                                      // type
00110                           );
00111                     QWhatsThis::add(inputStrList, option->docs().simplifyWhiteSpace());
00112                     connect(inputStrList, SIGNAL(changed()), this, SLOT(changed()));
00113                     m_inputWidgets->insert(option->name(),inputStrList);
00114                     addDependency(m_switches, option->dependsOn(), option->name());
00115                 }
00116                 break;
00117             case ConfigOption::O_Bool:
00118                 {
00119                     Q_ASSERT(pagebox!=0);
00120                     InputBool *inputBool = new InputBool
00121                         ( option->name(),                         // key
00122                           message(option->name()),                // name
00123                           pagebox,                                // widget
00124                           *((ConfigBool *)option)->valueRef()     // variable
00125                           );
00126                     QWhatsThis::add(inputBool, option->docs().simplifyWhiteSpace());
00127                     connect(inputBool, SIGNAL(changed()), this, SLOT(changed()));
00128                     m_inputWidgets->insert(option->name(), inputBool);
00129                     addDependency(m_switches, option->dependsOn(), option->name());
00130                 }
00131                 break;
00132             case ConfigOption::O_Int:
00133                 {
00134                     Q_ASSERT(pagebox!=0);
00135                     InputInt *inputInt = new InputInt
00136                         ( message(option->name()),                // name
00137                           pagebox,                                // widget
00138                           *((ConfigInt *)option)->valueRef(),     // variable
00139                           ((ConfigInt *)option)->minVal(),        // min value
00140                           ((ConfigInt *)option)->maxVal()         // max value
00141                           );
00142                     QWhatsThis::add(inputInt, option->docs().simplifyWhiteSpace());
00143                     connect(inputInt, SIGNAL(changed()), this, SLOT(changed()));
00144                     m_inputWidgets->insert(option->name(), inputInt);
00145                     addDependency(m_switches, option->dependsOn(), option->name());
00146                 }
00147                 break;
00148             case ConfigOption::O_Obsolete:
00149                 break;
00150             }
00151     }
00152     
00153     QDictIterator<QObject> di(*m_switches);
00154     for (; di.current(); ++di) {
00155         QObject *obj = di.current();
00156         connect(obj, SIGNAL(toggle(const QString&, bool)), this, SLOT(toggle(const QString&, bool)));
00157         // UGLY HACK: assumes each item depends on a boolean without checking!
00158         emit toggle(di.currentKey(), ((InputBool *)obj)->getState());
00159     }
00160    
00161     m_fileName = fileName;
00162     loadFile();
00163 }
00164 
00165 
00166 DoxygenConfigWidget::~DoxygenConfigWidget()
00167 {
00168     delete m_dependencies;
00169     delete m_inputWidgets;
00170     delete m_switches;
00171 }
00172 
00173 
00174 QSize DoxygenConfigWidget::sizeHint() const
00175 {
00176     // without this the whole dialog becomes much too large
00177     return QSize(QTabWidget::sizeHint().width(), 1);
00178 }
00179 
00180 
00181 void DoxygenConfigWidget::addDependency(QDict<QObject> *switches,
00182                                         const QCString &dep, const QCString &name)
00183 {
00184     if (dep.isEmpty())
00185         return;
00186     
00187     IInput *parent = m_inputWidgets->find(dep);
00188     Q_ASSERT(parent!=0);
00189     IInput *child = m_inputWidgets->find(name);
00190     Q_ASSERT(child!=0);
00191     if (!switches->find(dep))
00192         switches->insert(dep, parent->qobject());
00193     QPtrList<IInput> *list = m_dependencies->find(dep);
00194     if (!list) {
00195         list = new QPtrList<IInput>;
00196         m_dependencies->insert(dep, list);
00197     }
00198     list->append(child);
00199 }
00200 
00201 
00202 void DoxygenConfigWidget::toggle(const QString &name, bool state)
00203 {
00204     QPtrList<IInput> *inputs = m_dependencies->find(name);
00205     Q_ASSERT(inputs!=0);
00206     IInput *input = inputs->first();
00207     while (input) {
00208         input->setEnabled(state);
00209         input = inputs->next();
00210     }
00211 }
00212 
00213 
00214 void DoxygenConfigWidget::changed()
00215 {
00216     m_hasChanged = true;
00217 }
00218 
00219 
00220 void DoxygenConfigWidget::init()
00221 {
00222     QDictIterator<IInput> di(*m_inputWidgets);
00223     for (; di.current(); ++di)
00224         di.current()->init();
00225     
00226     QDictIterator<QObject> dio(*m_switches);
00227     for (; dio.current(); ++dio) {
00228         QObject *obj = dio.current();
00229         connect(obj, SIGNAL(toggle(const QString&, bool)), this, SLOT(toggle(const QString&, bool)));
00230         // UGLY HACK: assumes each item depends on a boolean without checking!
00231         emit toggle(dio.currentKey(), ((InputBool *)obj)->getState());
00232     }
00233 }
00234 
00235 
00236 void DoxygenConfigWidget::loadFile()
00237 {
00238     Config::instance()->init();
00239 
00240     QFile f(m_fileName);
00241     if (f.open(IO_ReadOnly)) {
00242         QTextStream is(&f);
00243 
00244         Config::instance()->parse(QFile::encodeName(m_fileName));
00245         Config::instance()->convertStrToVal();
00246 
00247         f.close();
00248     }
00249 
00250     init();
00251 }
00252 
00253 
00254 void DoxygenConfigWidget::saveFile()
00255 {
00256     QFile f(m_fileName);
00257     if (!f.open(IO_WriteOnly)) {
00258         KMessageBox::information(0, i18n("Cannot write Doxyfile."));
00259     } else {
00260         Config::instance()->writeTemplate(&f, true, false);
00261 
00262         f.close();
00263     }
00264 }
00265 
00266 
00267 void DoxygenConfigWidget::accept()
00268 {
00269     if (m_hasChanged)
00270         saveFile();
00271 }
00272 
00273 #include "doxygenconfigwidget.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:56 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003