diff options
Diffstat (limited to 'addon/doxywizard')
-rw-r--r-- | addon/doxywizard/Makefile.in | 2 | ||||
-rw-r--r-- | addon/doxywizard/README | 6 | ||||
-rw-r--r-- | addon/doxywizard/doxywizard.cpp | 1646 | ||||
-rw-r--r-- | addon/doxywizard/doxywizard.h | 349 | ||||
-rw-r--r-- | addon/doxywizard/doxywizard.pro.in | 10 | ||||
-rw-r--r-- | addon/doxywizard/expert.cpp | 264 | ||||
-rw-r--r-- | addon/doxywizard/expert.h | 82 | ||||
-rw-r--r-- | addon/doxywizard/inputbool.cpp | 29 | ||||
-rw-r--r-- | addon/doxywizard/inputbool.h | 2 | ||||
-rw-r--r-- | addon/doxywizard/inputint.cpp | 6 | ||||
-rw-r--r-- | addon/doxywizard/inputint.h | 3 | ||||
-rw-r--r-- | addon/doxywizard/inputstring.cpp | 23 | ||||
-rw-r--r-- | addon/doxywizard/inputstring.h | 3 | ||||
-rw-r--r-- | addon/doxywizard/inputstrlist.cpp | 26 | ||||
-rw-r--r-- | addon/doxywizard/inputstrlist.h | 3 | ||||
-rw-r--r-- | addon/doxywizard/pagewidget.cpp | 86 | ||||
-rw-r--r-- | addon/doxywizard/pagewidget.h | 63 | ||||
-rw-r--r-- | addon/doxywizard/pixmaps.cpp | 238 | ||||
-rw-r--r-- | addon/doxywizard/pixmaps.h | 27 | ||||
-rw-r--r-- | addon/doxywizard/version.h | 17 |
20 files changed, 1920 insertions, 965 deletions
diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in index 89bcc91..c018de7 100644 --- a/addon/doxywizard/Makefile.in +++ b/addon/doxywizard/Makefile.in @@ -11,7 +11,7 @@ # all: config.h config.l version.cpp Makefile.doxywizard - $(MAKE) -f Makefile.doxywizard $@ + $(MAKE) -f Makefile.doxywizard QTDIR=$(QTDIR) $@ config.h: ../../src/config.h $(CP) ../../src/config.h config.h diff --git a/addon/doxywizard/README b/addon/doxywizard/README index 883b93a..fc9c5aa 100644 --- a/addon/doxywizard/README +++ b/addon/doxywizard/README @@ -1,7 +1,3 @@ Doxywizard is a graphical front-end to read/edit/write doxygen configuration -files. It requires Qt version 2.1.0 or higher. +files. It requires Qt version 3.x or higher. -As a special exception, Dimitri van Heesch gives permission to link this -program with Qt non-commercial edition, and distribute the resulting -executable, without including the source code for the Qt non-commercial -edition in the source distribution. diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index e92509a..9c9737d 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -1,543 +1,1377 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <qmainwindow.h> -#include <qpopupmenu.h> -#include <qfileinfo.h> -#include <qmenubar.h> -#include <qstatusbar.h> -#include <qfiledialog.h> -#include <qmessagebox.h> +#include <qlabel.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qlineedit.h> #include <qapplication.h> -#include <qwhatsthis.h> +#include <qcheckbox.h> +#include <qpushbutton.h> +#include <qbuttongroup.h> +#include <qradiobutton.h> #include <qlayout.h> -#include <qtabwidget.h> -#include <qtoolbar.h> -#include <qtoolbutton.h> +#include <qcombobox.h> +#include <qfiledialog.h> +#include <qmessagebox.h> +#include <qtextedit.h> +#include <qprocess.h> +#include <qtimer.h> +#include <qstatusbar.h> +#include <qfileinfo.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtooltip.h> + +#if defined(Q_OS_MACX) +#include <CoreFoundation/CFBundle.h> +#include <ApplicationServices/ApplicationServices.h> +#undef check +#endif #include "doxywizard.h" -#include "pagewidget.h" -#include "inputbool.h" -#include "inputstring.h" -#include "inputstrlist.h" -#include "inputint.h" +#include "expert.h" #include "config.h" -#include "version.h" -#include "pixmaps.h" -QString configFileName; -const int messageTimeout = 4000; //!< status bar message timeout in millisec. +const int messageTimeout = 5000; //!< status bar message timeout in millisec. + +#if defined(Q_OS_MACX) +QCString getResourcePath() +{ + // todo: use qApp->applicationDirPath() + QCString result; + CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle()); + CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle); + result = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding()); + result+="/Contents/Resources/"; + return result; +} +#endif -//------------------------------------------------------------------------- -static bool loadConfig( QString loadFile ) +//========================================================================== + +Step1::Step1(QWidget *parent) : QWidget(parent,"Step1") { - QFileInfo fi( loadFile ); - if ( !fi.exists() ) - { - QMessageBox::warning(0, - "Warning","Input file "+loadFile+ - " does not exist! Starting new file.", - "ok" - ); - return FALSE; - } + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setMargin(4); + layout->setSpacing(8); + layout->addWidget(new QLabel( "Provide some information " + "about the project you are documenting",this)); + QWidget *w = new QWidget( this ); + QHBoxLayout *bl = new QHBoxLayout(w,10); - // set config values to their defaults - Config::instance()->init(); + QVBox *col1 = new QVBox( w ); + col1->setSpacing(8); + (new QLabel("Project name:",col1))->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + (new QLabel("Project version or id:",col1))->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - // parse the config file - // this will initialize the various Config data members - if (!Config::instance()->parse(loadFile)) - { - QMessageBox::warning(0, - "Warning","Cannot open or read input "+loadFile+"!", - "abort" - ); - return FALSE; - } - - Config::instance()->convertStrToVal(); + QVBox *col2 = new QVBox( w ); + col2->setSpacing(8); + m_projName = new QLineEdit(col2); + m_projNumber = new QLineEdit(col2); + + bl->addWidget(col1); + bl->addWidget(col2); + + layout->addWidget(w); - return TRUE; + //--------------------------------------------------- + QFrame *f = new QFrame( this ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + layout->addWidget(f); + + layout->addWidget(new QLabel( "Specify the directory to " + "scan for source code", this)); + QHBox *row = new QHBox( this ); + row->setSpacing(10); + new QLabel("Source code directory:",row); + m_sourceDir = new QLineEdit(row); + m_srcSelectDir = new QPushButton("Select...",row); + layout->addWidget(row); + + m_recursive = new QCheckBox("Scan recursively",this); + m_recursive->setChecked(TRUE); + layout->addWidget(m_recursive); + + //--------------------------------------------------- + f = new QFrame( this ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + layout->addWidget(f); + + layout->addWidget(new QLabel( + "Specify the directory where doxygen should " + "put the generated documentation",this + )); + row = new QHBox( this ); + row->setSpacing(10); + new QLabel("Destination directory:",row); + m_destDir = new QLineEdit(row); + m_dstSelectDir = new QPushButton("Select...",row); + layout->addWidget(row); + layout->addStretch(1); + + connect(m_srcSelectDir,SIGNAL(clicked()), + this,SLOT(selectSourceDir())); + connect(m_dstSelectDir,SIGNAL(clicked()), + this,SLOT(selectDestinationDir())); } -static bool saveConfig( QString saveFile ) +void Step1::selectSourceDir() { - QFile f( saveFile ); - if ( !f.open(IO_WriteOnly) ) - { - QMessageBox::warning(0, - "Warning","Cannot open file "+saveFile+ - " for writing. Nothing saved!.", - "ok" - ); - return FALSE; // failure - } + m_sourceDir->setText(QFileDialog::getExistingDirectory(m_sourceDir->text(),this)); +} - QTextStream t(&f); - Config::instance()->writeTemplate(t,TRUE,FALSE); // write brief config file +void Step1::selectDestinationDir() +{ + m_destDir->setText(QFileDialog::getExistingDirectory(m_destDir->text(),this)); +} - return TRUE; // success +QString Step1::getProjectName() const +{ + return m_projName->text(); } -//-------------------------------------------------------------------------- +QString Step1::getProjectNumber() const +{ + return m_projNumber->text(); +} -Wizard::Wizard(int argc,char **argv) : - QMainWindow( 0, (QCString)"DoxyWizard v"+versionString ) +QString Step1::getSourceDir() const { - // File popupmenu + return m_sourceDir->text(); +} + +bool Step1::scanRecursively() const +{ + return m_recursive->isChecked(); +} + +QString Step1::getDestinationDir() const +{ + return m_destDir->text(); +} + +void Step1::setProjectName(const QString &name) +{ + m_projName->setText(name); +} + +void Step1::setProjectNumber(const QString &num) +{ + m_projNumber->setText(num); +} - hasChanged=FALSE; - - fileTools = new QToolBar( this, "file operations" ); - fileTools->setLabel( "File Operations" ); +void Step1::setSourceDir(const QString &dir) +{ + m_sourceDir->setText(dir); +} - new QToolButton( QPixmap( file_xpm ), "New File", QString::null, - this, SLOT(newFile()), fileTools, "new file" ); +void Step1::setRecursiveScan(bool enable) +{ + m_recursive->setChecked(enable); +} - //QToolButton * fileOpen = - new QToolButton( QPixmap( fileopen_xpm ), "Open File", QString::null, - this, SLOT(loadFile()), fileTools, "open file" ); +void Step1::setDestinationDir(const QString &dir) +{ + m_destDir->setText(dir); +} - //QToolButton * fileSave = - new QToolButton( QPixmap( filesave_xpm ), "Save File", QString::null, - this, SLOT(saveFile()), fileTools, "save file" ); - //Micha: QToolButton * = - new QToolButton( QPixmap( rundoxygen_xpm ), "Save and Run doxygen", QString::null, - this, SLOT(runDoxygen()), fileTools, "save and run doxygen" ); +//========================================================================== +Step2::Step2(QWidget *parent) : QWidget(parent,"Step2") +{ + QVBoxLayout *layout = new QVBoxLayout(this); + layout->setSpacing(8); - QWhatsThis::whatsThisButton( fileTools ); + m_extractMode = new QButtonGroup("Select the desired extraction mode:",this); + QGridLayout *gbox = new QGridLayout( m_extractMode, 4, 1, 8, 0 ); + gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 ); + gbox->addWidget(new QRadioButton("Documented entities only",m_extractMode),1,0); + gbox->addWidget(new QRadioButton("All entities",m_extractMode),2,0); + gbox->addWidget(m_crossRef = new QCheckBox("Include cross-referenced source code in the output",m_extractMode),3,0); + m_extractMode->setButton(0); + layout->addWidget(m_extractMode); - QPopupMenu* file = new QPopupMenu; - file->insertItem( QIconSet(QPixmap(file_xpm)), - "&New", this, SLOT(newFile()), CTRL+Key_N ); - file->insertItem( QIconSet(QPixmap(fileopen_xpm)), - "&Load", this, SLOT(loadFile()), CTRL+Key_O ); - file->insertSeparator(); - file->insertItem( QIconSet(QPixmap(filesave_xpm)), - "&Save", this, SLOT(saveFile()), CTRL+Key_S ); - file->insertItem( "&Save as ...", this, SLOT(saveAsFile()) ); - file->insertSeparator(); - file->insertItem( "&Quit", this, SLOT(quit()), CTRL+Key_Q ); - - // Doxygen popupmenu - QPopupMenu* doxygen = new QPopupMenu; - int itemIndex = doxygen->insertItem( QIconSet(QPixmap(rundoxygen_xpm)), - "&Run", this, SLOT(runDoxygen()), CTRL+Key_R ); - doxygen->setWhatsThis ( itemIndex, "Run doxygen with the current configuration file..." ); - - // Help popupmenu - QPopupMenu* help = new QPopupMenu; - help->insertItem( "&About", this, SLOT(about()), Key_F1 ); - help->insertItem( "What's &This", this , SLOT(whatsThis()), SHIFT+Key_F1); - - // menubar definition - menuBar()->insertItem( "&File", file ); - menuBar()->insertItem( "&Doxygen", doxygen ); - menuBar()->insertSeparator(); - menuBar()->insertItem( "&Help", help ); - - statusBar()->message("Welcome to DoxyWizard",messageTimeout); - - cw = new ConfigFile( this ); - connect(cw,SIGNAL(changed()),this,SLOT(changed())); - setCentralWidget( cw ); - cw->show(); - - if (argc==2) - { - loadFile(argv[1]); + //--------------------------------------------------- + QFrame *f = new QFrame( this ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + layout->addWidget(f); + + m_optimizeLang = new QButtonGroup("Select programming language to optimize the results for",this); + gbox = new QGridLayout( m_optimizeLang, 4, 1, 8, 0 ); + gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 ); + gbox->addWidget(new QRadioButton("Optimize for C++ output",m_optimizeLang),1,0); + gbox->addWidget(new QRadioButton("Optimize for Java output",m_optimizeLang),2,0); + gbox->addWidget(new QRadioButton("Optimize for C output",m_optimizeLang),3,0); + m_optimizeLang->setButton(0); + layout->addWidget(m_optimizeLang); + + layout->addStretch(1); + + connect(m_crossRef,SIGNAL(stateChanged(int)), + parent,SLOT(changeCrossRefState(int))); +} + +bool Step2::crossReferencingEnabled() const +{ + return m_crossRef->isOn(); +} + +void Step2::enableCrossReferencing() +{ + m_crossRef->setChecked(TRUE); +} + +bool Step2::extractAll() const +{ + return m_extractMode->selectedId()==1; +} + +bool Step2::crossReferencing() const +{ + return m_crossRef->isChecked(); +} + +OptLang Step2::optimizeFor() const +{ + switch (m_optimizeLang->selectedId()) + { + case 0: return Lang_Cpp; + case 1: return Lang_Java; + case 2: return Lang_C; } - else + return Lang_Cpp; +} + +void Step2::setExtractAll(bool enable) +{ + m_extractMode->setButton(enable?1:0); +} + +void Step2::setCrossReferencing(bool enable) +{ + m_crossRef->setChecked(enable); +} + +void Step2::setOptimizeFor(OptLang lang) +{ + switch (lang) { - newFile(); + case Lang_Cpp: m_optimizeLang->setButton(0); break; + case Lang_Java: m_optimizeLang->setButton(1); break; + case Lang_C: m_optimizeLang->setButton(2); break; } - refreshCaption(); - - resize( 640, 480 ); +} +//========================================================================== + +Step3::Step3(QWidget *parent) : QWidget(parent,"Step3") +{ + QVBoxLayout *layout = new QVBoxLayout(this); + QButtonGroup *bg = new QButtonGroup("Output format(s) to generate",this); + QGridLayout *gbox = new QGridLayout( bg, 8, 1, 8, 0 ); + gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 ); + gbox->addWidget(m_htmlEnabled=new QCheckBox("HTML",bg),1,0); + QWidget *w = new QWidget(bg); + QHBoxLayout *bl = new QHBoxLayout(w); + m_htmlOptions = new QButtonGroup(w); + m_htmlOptions->hide(); + m_htmlOptionBox = new QVBox(w); + m_htmlOptions->insert(new QRadioButton("plain HTML",m_htmlOptionBox)); + m_htmlOptions->insert(new QRadioButton("with frames and a navigation tree",m_htmlOptionBox)); + m_htmlOptions->insert(new QRadioButton("prepare for compressed HTML (.chm)",m_htmlOptionBox)); + m_htmlOptions->insert(m_searchEnabled=new QCheckBox("With search function (requires PHP enabled web server)",m_htmlOptionBox)); + bl->addSpacing(30); + bl->addWidget(m_htmlOptionBox); + m_htmlOptions->setButton(0); + m_htmlOptionBox->setEnabled(TRUE); + gbox->addWidget(w,2,0); + + gbox->addWidget(m_latexEnabled=new QCheckBox("LaTeX",bg),3,0); + w = new QWidget(bg); + bl = new QHBoxLayout(w); + m_texOptions = new QButtonGroup(w); + m_texOptions->hide(); + m_texOptionBox = new QVBox(w); + m_texOptions->insert(new QRadioButton("as intermediate format for hyperlinked PDF",m_texOptionBox)); + m_texOptions->insert(new QRadioButton("as intermediate format for PDF",m_texOptionBox)); + m_texOptions->insert(new QRadioButton("as intermediate format for PostScript",m_texOptionBox)); + bl->addSpacing(30); + bl->addWidget(m_texOptionBox); + m_texOptions->setButton(0); + m_texOptionBox->setEnabled(FALSE); + gbox->addWidget(w,4,0); + + gbox->addWidget(m_manEnabled=new QCheckBox("Man pages",bg),5,0); + gbox->addWidget(m_rtfEnabled=new QCheckBox("Rich Text Format (RTF)",bg),6,0); + gbox->addWidget(m_xmlEnabled=new QCheckBox("XML",bg),7,0); + bg->setButton(0); + layout->addWidget(bg); + + //w = new QWidget( this ); + //bl = new QHBoxLayout(w); + //bl->addWidget(new QLabel("Select the output language:",w)); + //m_outputLang = new QComboBox(w); + //m_outputLang->setMinimumSize(m_outputLang->sizeHint()); + //bl->setSpacing(10); + //bl->addWidget(m_outputLang); + //bl->addStretch(1); + //m_outputLang->insertItem("English"); + //m_outputLang->insertItem("Dutch"); + //m_outputLang->insertItem("German"); + //m_outputLang->insertItem("Spanish"); + //m_outputLang->insertItem("French"); + //m_outputLang->insertItem("Chinese"); + //m_outputLang->insertItem("Japanese"); + //m_outputLang->insertItem("Korean"); + //layout->addWidget(w); + + layout->addStretch(1); + + connect(m_latexEnabled,SIGNAL(stateChanged(int)), + this,SLOT(latexStateChange(int))); + connect(m_htmlEnabled,SIGNAL(stateChanged(int)), + this,SLOT(htmlStateChange(int))); } -void Wizard::newFile() +void Step3::latexStateChange(int state) { - if (hasChanged) + if (state==QButton::On) { - switch( QMessageBox::warning( this, "DoxyWizard", - "Start a new file and lose changes?", - "Yes", "No", 0, 0, 1 )) - { - case 0: - break; - default: // command aborted by the user - return; - } + m_texOptionBox->setEnabled(TRUE); + } + else if (state==QButton::Off) + { + m_texOptionBox->setEnabled(FALSE); } - Config::instance()->init(); - configFileName="Doxyfile"; - cw->init(); } -void Wizard::loadFile(const char *fileName) +void Step3::htmlStateChange(int state) { - if (fileName==0) + if (state==QButton::On) { - configFileName = QFileDialog::getOpenFileName(); + m_htmlOptionBox->setEnabled(TRUE); } - else + else if (state==QButton::Off) + { + m_htmlOptionBox->setEnabled(FALSE); + } +} + +bool Step3::htmlEnabled() const +{ + return m_htmlEnabled->isChecked(); +} + +bool Step3::latexEnabled() const +{ + return m_latexEnabled->isChecked(); +} + +bool Step3::manEnabled() const +{ + return m_manEnabled->isChecked(); +} + +bool Step3::rtfEnabled() const +{ + return m_rtfEnabled->isChecked(); +} + +bool Step3::xmlEnabled() const +{ + return m_xmlEnabled->isChecked(); +} + +bool Step3::searchEnabled() const +{ + return m_searchEnabled->isChecked(); +} + +HtmlStyle Step3::htmlStyle() const +{ + switch (m_htmlOptions->selectedId()) { - configFileName = fileName; + case 0: return HS_Plain; + case 1: return HS_TreeView; + case 2: return HS_CHM; } + return HS_Plain; +} - if ( !configFileName.isNull() ) +TexStyle Step3::texStyle() const +{ + switch (m_texOptions->selectedId()) { - //initData( configFileName ); - loadConfig(configFileName); - cw->init(); + case 0: return TS_PDFHyper; + case 1: return TS_PDF; + case 2: return TS_PS; + } + return TS_PDFHyper; +} - statusBar()->message(configFileName, messageTimeout); - } +void Step3::setHtmlEnabled(bool enable) +{ + m_htmlEnabled->setChecked(enable); } -void Wizard::loadFile() +void Step3::setLatexEnabled(bool enable) { - if (hasChanged) + m_latexEnabled->setChecked(enable); +} + +void Step3::setManEnabled(bool enable) +{ + m_manEnabled->setChecked(enable); +} + +void Step3::setRtfEnabled(bool enable) +{ + m_rtfEnabled->setChecked(enable); +} + +void Step3::setXmlEnabled(bool enable) +{ + m_xmlEnabled->setChecked(enable); +} + +void Step3::setSearchEnabled(bool enable) +{ + m_searchEnabled->setChecked(enable); +} + +void Step3::setHtmlStyle(HtmlStyle style) +{ + switch(style) { - switch( QMessageBox::warning( - this, "DoxyWizard", "Load a new file and lose changes?", - "Yes", "No", 0, 0, 1 )) - { - case 0: - break; - default: // command aborted by the user - return; - } + case HS_Plain: m_htmlOptions->setButton(0); break; + case HS_TreeView: m_htmlOptions->setButton(1); break; + case HS_CHM: m_htmlOptions->setButton(2); break; } - loadFile(0); } -void Wizard::saveFile() +void Step3::setTexStyle(TexStyle style) { - //printf("configFileName=`%s'\n",configFileName.data()); - if (configFileName.isEmpty()) + switch(style) { - saveAsFile(); - return; + case TS_PDFHyper: m_texOptions->setButton(0); break; + case TS_PDF: m_texOptions->setButton(1); break; + case TS_PS: m_texOptions->setButton(2); break; } - else +} + + +//========================================================================== + +Step4::Step4(QWidget *parent) : QWidget(parent,"Step4") +{ + QVBoxLayout *layout = new QVBoxLayout(this); + m_diagramMode = new QButtonGroup("Diagrams to generate",this); + QGridLayout *gbox = new QGridLayout( m_diagramMode, 5, 1, 8, 0 ); + gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 ); + gbox->addWidget(new QRadioButton("No diagrams",m_diagramMode),1,0); + gbox->addWidget(new QRadioButton("Use built-in class diagram generator",m_diagramMode),2,0); + gbox->addWidget(new QRadioButton("Use dot tool from the GraphViz package to generate",m_diagramMode),3,0); + QWidget *w = new QWidget(m_diagramMode); + QHBoxLayout *bl = new QHBoxLayout(w); + QButtonGroup *dotGroup = new QButtonGroup(w); + dotGroup->hide(); + m_dotOptions = new QVBox(w); + dotGroup->insert(m_dotClass=new QCheckBox("Class diagrams",m_dotOptions)); + dotGroup->insert(m_dotCollaboration=new QCheckBox("Collaboration diagrams",m_dotOptions)); + dotGroup->insert(m_dotInclude=new QCheckBox("Include dependency graphs",m_dotOptions)); + dotGroup->insert(m_dotIncludedBy=new QCheckBox("Included by dependency graphs",m_dotOptions)); + dotGroup->insert(m_dotInheritance=new QCheckBox("Overall Class hierarchy",m_dotOptions)); + dotGroup->insert(m_dotCall=new QCheckBox("Call graphs",m_dotOptions)); + bl->addSpacing(30); + bl->addWidget(m_dotOptions); + dotGroup->setButton(0); + m_dotOptions->setEnabled(FALSE); + gbox->addWidget(w,4,0); + m_diagramMode->setButton(1); + layout->addWidget(m_diagramMode); + layout->addStretch(1); + + connect(m_diagramMode,SIGNAL(clicked(int)), + this,SLOT(diagramModeChanged(int))); + connect(m_dotCall,SIGNAL(stateChanged(int)), + parent,SLOT(changeCallGraphState(int))); +} + +void Step4::diagramModeChanged(int buttonId) +{ + m_dotOptions->setEnabled(buttonId==2); +} + +void Step4::disableCallGraphs() +{ + m_dotCall->setChecked(FALSE); +} + +bool Step4::callGraphEnabled() const +{ + return m_dotCall->isOn(); +} + +DiagramMode Step4::diagramMode() const +{ + switch(m_diagramMode->selectedId()) { - saveConfig(configFileName); - statusBar()->message(configFileName + " saved", messageTimeout); + case 0: return DM_None; + case 1: return DM_Builtin; + case 2: return DM_Dot; } - hasChanged = FALSE; - refreshCaption(); + return DM_None; +} + +bool Step4::classDiagram() const +{ + return m_dotClass->isChecked(); +} + +bool Step4::collaborationDiagram() const +{ + return m_dotCollaboration->isChecked(); +} + +bool Step4::includeGraph() const +{ + return m_dotInclude->isChecked(); +} + +bool Step4::includedByGraph() const +{ + return m_dotIncludedBy->isChecked(); +} + +bool Step4::inheritanceGraph() const +{ + return m_dotInheritance->isChecked(); } -void Wizard::saveAsFile() +bool Step4::callGraph() const { - configFileName = QFileDialog::getSaveFileName(); - if (configFileName.isNull()) + return m_dotCall->isChecked(); +} + +void Step4::setDiagramMode(DiagramMode mode) +{ + switch(mode) { - statusBar()->message("Save aborted", messageTimeout ); - return; // operation cancelled by the user + case DM_None: m_diagramMode->setButton(0); break; + case DM_Builtin: m_diagramMode->setButton(1); break; + case DM_Dot: m_diagramMode->setButton(2); break; } +} - saveConfig(configFileName); - statusBar()->message("Saved as "+ configFileName, messageTimeout ); +void Step4::setClassDiagram(bool enable) +{ + m_dotClass->setChecked(enable); } -//Micha -// TODO: Use QProcess to show the output in a window -void Wizard::runDoxygen() +void Step4::setCollaborationDiagram(bool enable) { - saveFile(); - QString orgDir = QDir::currentDirPath(); - QFileInfo fi(configFileName); - // cd to the config dir - QDir::setCurrent(fi.dirPath()); - // run doxygen on the config file - QString s = "doxygen \"" + fi.fileName() + "\""; - // actually run the exe - system((const char*)s); - statusBar()->message("doxygen completed: "+ configFileName, messageTimeout ); - hasChanged = FALSE; - refreshCaption(); - QDir::setCurrent(orgDir); -} + m_dotCollaboration->setChecked(enable); +} + +void Step4::setIncludeGraph(bool enable) +{ + m_dotInclude->setChecked(enable); +} + +void Step4::setIncludedByGraph(bool enable) +{ + m_dotIncludedBy->setChecked(enable); +} + +void Step4::setInheritanceGraph(bool enable) +{ + m_dotInheritance->setChecked(enable); +} + +void Step4::setCallGraph(bool enable) +{ + m_dotCall->setChecked(enable); +} -void Wizard::quit() +//========================================================================== + +Wizard::Wizard(QWidget *parent=0) : QTabDialog(parent) +{ + addTab( m_step1 = new Step1(this),"Project"); + addTab( m_step2 = new Step2(this),"Mode"); + addTab( m_step3 = new Step3(this),"Output"); + addTab( m_step4 = new Step4(this),"Diagrams"); + setCancelButton(); +} + +void Wizard::changeCallGraphState(int state) { - if (hasChanged) + if (state==QButton::On && !m_step2->crossReferencingEnabled()) { - switch( QMessageBox::warning( this, "DoxyWizard", "Quit and lose changes?", - "Yes", "No", 0, 0, 1 )) + if (QMessageBox::question(this,"This option depends on another option", + "The call graph option requires that cross-referencing " + "of source code is enabled.\nDo you want to enable this " + "option?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes) { - case 0: - qApp->quit(); - break; - case 1: - break; + m_step2->enableCrossReferencing(); + } + else + { + m_step4->disableCallGraphs(); } } - else +} + +void Wizard::changeCrossRefState(int state) +{ + if (state==QButton::Off && m_step4->callGraphEnabled()) { - qApp->quit(); + if (QMessageBox::question(this,"Another option depends on this one", + "The call graph option requires that cross-referencing " + "of source code is enabled.\nDo you want to disable the call " + "graph option?",QMessageBox::Yes,QMessageBox::No + )==QMessageBox::Yes + ) + { + m_step4->disableCallGraphs(); + } + else + { + m_step2->enableCrossReferencing(); + } } } -void Wizard::changed() +//========================================================================== + +MainWidget::MainWidget(QWidget *parent) + : QMainWindow(parent,"MainWidget") { - hasChanged = TRUE; - refreshCaption(); + setCaption("Doxygen GUI frontend"); + + // initialize config settings + Config::instance()->init(); + Config::instance()->check(); + + QWidget *w = new QWidget(this); + setCentralWidget(w); + QVBoxLayout *layout = new QVBoxLayout(w); + layout->setMargin(10); + + QPopupMenu *file = new QPopupMenu(this); + file->insertItem("Open...", this, SLOT(loadConfigFile()), CTRL+Key_O); + file->insertItem("Save As...", this, SLOT(saveConfigFile()), CTRL+Key_S); + m_recentMenu = new QPopupMenu; + file->insertItem( "&Recent configurations", m_recentMenu ); + connect(m_recentMenu,SIGNAL(activated(int)),this,SLOT(openRecent(int))); + file->insertItem("Set as default...",this,SLOT(saveDefaults()) ); + file->insertItem("Reset...",this,SLOT(resetConfig()) ); + file->insertItem("Quit", this, SLOT(quit()), CTRL+Key_Q); + QPopupMenu *help = new QPopupMenu(this); +#if defined(Q_OS_MACX) + help->insertItem("Online manual", this, SLOT(manual()), Key_F1); +#endif + help->insertItem("About", this, SLOT(about()) ); + menuBar()->insertItem("File",file); + menuBar()->insertItem("Help",help); + + //--------------------------------------------------- + QVBox *heading = new QVBox(w); + QLabel *l = new QLabel("Step 1: Configure doxygen",heading); + QFrame *f = new QFrame( heading ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height()); + layout->addWidget(heading); + layout->addSpacing(10); + + l = new QLabel("Choose one of the following ways to configure doxygen",w); + layout->addWidget(l); + layout->addSpacing(5); + QHBoxLayout *hbl = new QHBoxLayout(layout); + hbl->setSpacing(8); + + m_wizard = new QPushButton("Wizard...",w); + QToolTip::add(m_wizard,"Quickly configure the most important settings"); + hbl->addWidget(m_wizard); + + m_expert = new QPushButton("Expert...",w); + QToolTip::add(m_expert,"Determine all configuration settings in detail"); + hbl->addWidget(m_expert); + + m_load = new QPushButton("Load...",w); + QToolTip::add(m_load,"Load the configuration settings from file"); + hbl->addWidget(m_load); + + hbl->addStretch(1); + + //--------------------------------------------------- + heading = new QVBox(w); + l = new QLabel("Step 2: Save the configuration file",heading); + f = new QFrame( heading ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height()); + layout->addSpacing(15); + layout->addWidget(heading); + layout->addSpacing(5); + + QGridLayout *grid = new QGridLayout(layout,1,2,10); + m_save = new QPushButton("Save...",w); + m_save->setFixedSize(m_save->sizeHint()); + grid->addWidget(m_save,0,0); + grid->addWidget(m_saveStatus=new QLabel(w),0,1); + m_saveStatus->setTextFormat(Qt::RichText); + + //--------------------------------------------------- + heading = new QVBox(w); + l = new QLabel("Step 3: Specify the directory from which to run doxygen",heading); + f = new QFrame( heading ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height()); + layout->addSpacing(15); + layout->addWidget(heading); + layout->addSpacing(5); + + QHBoxLayout *row = new QHBoxLayout( layout ); + row->setSpacing(10); + row->addWidget(new QLabel("Working directory:",w)); + m_workingDir = new QLineEdit(w); + m_selWorkingDir = new QPushButton("Select...",w); + row->addWidget(m_workingDir,1); + row->addWidget(m_selWorkingDir); + + //--------------------------------------------------- + heading = new QVBox(w); + l = new QLabel("Step 4: Run doxygen",heading); + f = new QFrame( heading ); + f->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height()); + layout->addSpacing(15); + layout->addWidget(heading); + layout->addSpacing(5); + + row = new QHBoxLayout( layout ); + row->setSpacing(10); + m_run = new QPushButton("Start",w); + row->addWidget(m_run); + row->addWidget(m_runStatus = new QLabel("Status: not running",w)); + row->addStretch(1); + m_run->setEnabled(FALSE); + m_runStatus->setEnabled(FALSE); + + m_saveLog = new QPushButton("Save log...",w); + m_saveLog->setEnabled(FALSE); + row->addWidget(m_saveLog); + + layout->addSpacing(8); + layout->addWidget(m_outputHeading=new QLabel("Output produced by doxygen",w)); + grid = new QGridLayout(layout,1,1,3); + m_outputLog = new QTextEdit(w); + m_outputLog->setReadOnly(TRUE); + m_outputLog->setMinimumWidth(600); + grid->addWidget(m_outputLog,0,0); + grid->setColStretch(0,1); + grid->setRowStretch(0,1); + m_outputLog->setEnabled(FALSE); + m_outputHeading->setEnabled(FALSE); + + // make connections + connect(m_wizard,SIGNAL(clicked()), + this,SLOT(launchWizard())); + connect(m_expert,SIGNAL(clicked()), + this,SLOT(launchExpert())); + connect(m_load,SIGNAL(clicked()), + this,SLOT(loadConfigFile())); + connect(m_save,SIGNAL(clicked()), + this,SLOT(saveConfigFile())); + connect(m_selWorkingDir,SIGNAL(clicked()), + this,SLOT(selectWorkingDir())); + connect(m_workingDir,SIGNAL(textChanged(const QString&)), + this,SLOT(updateRunnable(const QString&))); + connect(m_run,SIGNAL(clicked()), + this,SLOT(runDoxygen())); + connect(m_saveLog,SIGNAL(clicked()), + this,SLOT(saveLog())); + + // load default settings + m_settings.setPath("www.doxygen.org","Doxygen GUI"); + bool ok; + QString config = m_settings.readEntry("/config/default",QString::null,&ok); + if (ok && !config.isEmpty()) + { + Config::instance()->parseString("default settings",config); + } + QString workingDir = m_settings.readEntry("/config/workingdir",QString::null,&ok); + if (ok && !workingDir.isEmpty()) + { + m_workingDir->setText(workingDir); + } + setConfigSaved(FALSE); + for (int i=0;i<10;i++) + { + QString entry = m_settings.readEntry(QString().sprintf("/recent/config%d",i)); + if (!entry.isEmpty()) + { + addRecentFile(entry); + } + } + + m_runProcess = new QProcess; + connect(m_runProcess,SIGNAL(readyReadStdout()),this,SLOT(readStdout())); + connect(m_runProcess,SIGNAL(processExited()),this,SLOT(runComplete())); + m_running = FALSE; + m_timer = new QTimer; + connect(m_timer,SIGNAL(timeout()),this,SLOT(readStdout())); + + statusBar()->message("Welcome to Doxygen",messageTimeout); } -void Wizard::refreshCaption() +MainWidget::~MainWidget() { - QString s; - if (hasChanged) s=" *"; - setCaption("Doxywizard - ["+configFileName+s+"]"); + delete m_runProcess; } -void Wizard::about() +void MainWidget::selectWorkingDir() { - QCString text(4096); - text.sprintf( "<qt><center>A tool to create and edit configuration files " - "that can be read by doxygen version %s.</center><p>" - "<center>Written by Dimitri van Heesch</center><p>" - "<center>(c) 2000-2003</center></qt>",versionString - ); - QMessageBox::about(this, "DoxyWizard",text); + QString selectedDir = QFileDialog::getExistingDirectory(m_workingDir->text()); + if (!selectedDir.isEmpty()) + { + m_workingDir->setText(selectedDir); + } } -//---------------------------------------------------------------------- - +void MainWidget::updateRunnable(const QString &newDirName) +{ + if (m_running) return; + QFileInfo fi(newDirName); + bool isRunnable = fi.exists() && fi.isDir() && m_configSaved; + m_run->setEnabled(isRunnable); + m_runStatus->setEnabled(isRunnable); + m_outputHeading->setEnabled(isRunnable); + m_outputLog->setEnabled(isRunnable); + m_saveLog->setEnabled(isRunnable && !m_outputLog->text().isEmpty()); +} -ConfigFile::ConfigFile( QWidget *parent ) : QWidget( parent ) +void MainWidget::launchWizard() { + Wizard wizard(this); - m_dependencies = new QDict< QList<IInput> >(257); - m_dependencies->setAutoDelete(TRUE); - m_inputWidgets = new QDict< IInput >; - m_switches = new QDict< QObject >; + // -------- Initialize the dialog ---------------- - QVBoxLayout *layout = new QVBoxLayout( this ); + // step1 + wizard.setProjectName(Config_getString("PROJECT_NAME")); + wizard.setProjectNumber(Config_getString("PROJECT_NUMBER")); + if (Config_getList("INPUT").count()==1) + { + QString dirName=Config_getList("INPUT").getFirst(); + QFileInfo fi(dirName); + if (fi.exists() && fi.isDir()) + { + wizard.setSourceDir(dirName); + } + } + wizard.setRecursiveScan(Config_getBool("RECURSIVE")); + wizard.setDestinationDir(Config_getString("OUTPUT_DIRECTORY")); - // QTabWidget definition - QTabWidget *tab = new QTabWidget( this ); - layout->addWidget( tab ); + // step2 + wizard.setExtractAll(Config_getBool("EXTRACT_ALL")); + wizard.setCrossReferencing(Config_getBool("SOURCE_BROWSER")); + if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) + { + wizard.setOptimizeFor(Lang_Java); + } + else if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + wizard.setOptimizeFor(Lang_C); + } + else + { + wizard.setOptimizeFor(Lang_Cpp); + } - QListIterator<ConfigOption> options = Config::instance()->iterator(); - PageWidget *page = 0; - ConfigOption *option = 0; - for (options.toFirst();(option=options.current());++options) + // step3 + wizard.setHtmlEnabled(Config_getBool("GENERATE_HTML")); + wizard.setLatexEnabled(Config_getBool("GENERATE_LATEX")); + wizard.setManEnabled(Config_getBool("GENERATE_MAN")); + wizard.setRtfEnabled(Config_getBool("GENERATE_RTF")); + wizard.setXmlEnabled(Config_getBool("GENERATE_XML")); + wizard.setSearchEnabled(Config_getBool("SEARCHENGINE")); + if (Config_getBool("GENERATE_HTMLHELP")) { - switch(option->kind()) + wizard.setHtmlStyle(HS_CHM); + } + else if (Config_getBool("GENERATE_TREEVIEW")) + { + wizard.setHtmlStyle(HS_TreeView); + } + else + { + wizard.setHtmlStyle(HS_Plain); + } + if (Config_getBool("USE_PDFLATEX")) + { + if (Config_getBool("PDF_HYPERLINKS")) { - case ConfigOption::O_Info: - if (page) page->addStretch(1); - page = new PageWidget( tab, option->name() ); - QWhatsThis::add(page, option->docs().simplifyWhiteSpace() ); - break; - case ConfigOption::O_String: - { - ASSERT(page!=0); - InputString::StringMode sm=InputString::StringFree; - switch(((ConfigString *)option)->widgetType()) - { - case ConfigString::String: sm=InputString::StringFree; break; - case ConfigString::File: sm=InputString::StringFile; break; - case ConfigString::Dir: sm=InputString::StringDir; break; - } - InputString *inputString = new InputString( - option->name(), // name - page, // widget - *((ConfigString *)option)->valueRef(), // variable - sm // type - ); - QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() ); - connect(inputString,SIGNAL(changed()),SIGNAL(changed())); - m_inputWidgets->insert(option->name(),inputString); - addDependency(m_switches,option->dependsOn(),option->name()); - } - break; - case ConfigOption::O_Enum: - { - ASSERT(page!=0); - InputString *inputString = new InputString( - option->name(), // name - page, // widget - *((ConfigEnum *)option)->valueRef(), // variable - InputString::StringFixed // type - ); - QStrListIterator sli=((ConfigEnum *)option)->iterator(); - for (sli.toFirst();sli.current();++sli) - { - inputString->addValue(sli.current()); - } - QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() ); - connect(inputString,SIGNAL(changed()),SIGNAL(changed())); - m_inputWidgets->insert(option->name(),inputString); - addDependency(m_switches,option->dependsOn(),option->name()); - } + wizard.setTexStyle(TS_PDFHyper); + } + else + { + wizard.setTexStyle(TS_PDF); + } + } + else + { + wizard.setTexStyle(TS_PS); + } + + // step4 + if (Config_getBool("HAVE_DOT")) + { + wizard.setDiagramMode(DM_Dot); + } + else if (Config_getBool("CLASS_DIAGRAMS")) + { + wizard.setDiagramMode(DM_Builtin); + } + else + { + wizard.setDiagramMode(DM_None); + } + wizard.setClassDiagram(Config_getBool("CLASS_GRAPH")); + wizard.setCollaborationDiagram(Config_getBool("COLLABORATION_GRAPH")); + wizard.setIncludeGraph(Config_getBool("INCLUDE_GRAPH")); + wizard.setIncludedByGraph(Config_getBool("INCLUDED_BY_GRAPH")); + wizard.setInheritanceGraph(Config_getBool("GRAPHICAL_HIERARCHY")); + wizard.setCallGraph(Config_getBool("CALL_GRAPH")); + + // -------- Run the dialog ---------------- + + if (wizard.exec()==QDialog::Accepted) + { + // -------- Store the results ---------------- + + // step1 + Config_getString("PROJECT_NAME")=wizard.getProjectName(); + Config_getString("PROJECT_NUMBER")=wizard.getProjectNumber(); + Config_getList("INPUT").clear(); + Config_getList("INPUT").append(wizard.getSourceDir()); + Config_getBool("RECURSIVE")=wizard.scanRecursively(); + Config_getString("OUTPUT_DIRECTORY")=wizard.getDestinationDir(); + + // step2 + if (wizard.extractAll()) + { + Config_getBool("EXTRACT_ALL")=TRUE; + Config_getBool("EXTRACT_PRIVATE")=TRUE; + Config_getBool("EXTRACT_STATIC")=TRUE; + Config_getBool("EXTRACT_LOCAL_CLASSES")=TRUE; + Config_getBool("HIDE_UNDOC_MEMBERS")=FALSE; + Config_getBool("HIDE_UNDOC_CLASSES")=FALSE; + } + else + { + Config_getBool("EXTRACT_ALL")=FALSE; + Config_getBool("EXTRACT_PRIVATE")=FALSE; + Config_getBool("EXTRACT_STATIC")=FALSE; + Config_getBool("EXTRACT_LOCAL_CLASSES")=TRUE; + Config_getBool("HIDE_UNDOC_MEMBERS")=TRUE; + Config_getBool("HIDE_UNDOC_CLASSES")=TRUE; + } + + if (wizard.crossReferencing()) + { + Config_getBool("SOURCE_BROWSER")=TRUE; + Config_getBool("REFERENCED_BY_RELATION")=TRUE; + Config_getBool("REFERENCES_RELATION")=TRUE; + Config_getBool("VERBATIM_HEADERS")=TRUE; + } + else + { + Config_getBool("SOURCE_BROWSER")=FALSE; + Config_getBool("REFERENCED_BY_RELATION")=FALSE; + Config_getBool("REFERENCES_RELATION")=FALSE; + Config_getBool("VERBATIM_HEADERS")=FALSE; + } + + switch(wizard.optimizeFor()) + { + case Lang_Cpp: + Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=FALSE; + Config_getBool("OPTIMIZE_OUTPUT_JAVA")=FALSE; break; - case ConfigOption::O_List: - { - ASSERT(page!=0); - InputStrList::ListMode lm=InputStrList::ListString; - switch(((ConfigList *)option)->widgetType()) - { - case ConfigList::String: lm=InputStrList::ListString; break; - case ConfigList::File: lm=InputStrList::ListFile; break; - case ConfigList::Dir: lm=InputStrList::ListDir; break; - case ConfigList::FileAndDir: lm=InputStrList::ListFileDir; break; - } - InputStrList *inputStrList = new InputStrList( - option->name(), // name - page, // widget - *((ConfigList *)option)->valueRef(), // variable - lm // type - ); - QWhatsThis::add(inputStrList, option->docs().simplifyWhiteSpace() ); - connect(inputStrList,SIGNAL(changed()),SIGNAL(changed())); - m_inputWidgets->insert(option->name(),inputStrList); - addDependency(m_switches,option->dependsOn(),option->name()); - } + case Lang_Java: + Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=FALSE; + Config_getBool("OPTIMIZE_OUTPUT_JAVA")=TRUE; break; + case Lang_C: + Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=TRUE; + Config_getBool("OPTIMIZE_OUTPUT_JAVA")=FALSE; break; - case ConfigOption::O_Bool: - { - ASSERT(page!=0); - InputBool *inputBool = new InputBool( - option->name(), // name - page, // widget - *((ConfigBool *)option)->valueRef() // variable - ); - QWhatsThis::add(inputBool, option->docs().simplifyWhiteSpace() ); - connect(inputBool,SIGNAL(changed()),SIGNAL(changed())); - m_inputWidgets->insert(option->name(),inputBool); - addDependency(m_switches,option->dependsOn(),option->name()); - } + } + + // step3 + Config_getBool("GENERATE_HTML")=wizard.htmlEnabled(); + Config_getBool("GENERATE_LATEX")=wizard.latexEnabled(); + Config_getBool("GENERATE_MAN")=wizard.manEnabled(); + Config_getBool("GENERATE_RTF")=wizard.rtfEnabled(); + Config_getBool("GENERATE_XML")=wizard.xmlEnabled(); + Config_getBool("SEARCHENGINE")=wizard.searchEnabled(); + if (wizard.htmlEnabled()) + { + switch (wizard.htmlStyle()) + { + case HS_Plain: + Config_getBool("GENERATE_HTMLHELP")=FALSE; + Config_getBool("GENERATE_TREEVIEW")=FALSE; + break; + case HS_TreeView: + Config_getBool("GENERATE_HTMLHELP")=FALSE; + Config_getBool("GENERATE_TREEVIEW")=TRUE; + break; + case HS_CHM: + Config_getBool("GENERATE_HTMLHELP")=TRUE; + Config_getBool("GENERATE_TREEVIEW")=FALSE; + break; + } + } + if (wizard.latexEnabled()) + { + switch (wizard.texStyle()) + { + case TS_PDFHyper: + Config_getBool("USE_PDFLATEX")=TRUE; + Config_getBool("PDF_HYPERLINKS")=TRUE; + break; + case TS_PDF: + Config_getBool("USE_PDFLATEX")=TRUE; + Config_getBool("PDF_HYPERLINKS")=FALSE; + break; + case TS_PS: + Config_getBool("USE_PDFLATEX")=FALSE; + Config_getBool("PDF_HYPERLINKS")=FALSE; + break; + } + } + + // step4 + switch (wizard.diagramMode()) + { + case DM_None: + Config_getBool("CLASS_DIAGRAMS")=FALSE; + Config_getBool("HAVE_DOT")=FALSE; break; - case ConfigOption::O_Int: - { - ASSERT(page!=0); - InputInt *inputInt = new InputInt( - option->name(), // name - page, // widget - *((ConfigInt *)option)->valueRef(), // variable - ((ConfigInt *)option)->minVal(), // min value - ((ConfigInt *)option)->maxVal() // max value - ); - QWhatsThis::add(inputInt, option->docs().simplifyWhiteSpace() ); - connect(inputInt,SIGNAL(changed()),SIGNAL(changed())); - m_inputWidgets->insert(option->name(),inputInt); - addDependency(m_switches,option->dependsOn(),option->name()); - } + case DM_Builtin: + Config_getBool("CLASS_DIAGRAMS")=TRUE; + Config_getBool("HAVE_DOT")=FALSE; break; - case ConfigOption::O_Obsolete: + case DM_Dot: + Config_getBool("CLASS_DIAGRAMS")=FALSE; + Config_getBool("HAVE_DOT")=TRUE; + Config_getBool("CLASS_GRAPH")=wizard.classDiagram(); + Config_getBool("COLLABORATION_GRAPH")=wizard.collaborationDiagram(); + Config_getBool("INCLUDE_GRAPH")=wizard.includeGraph(); + Config_getBool("INCLUDED_BY_GRAPH")=wizard.includedByGraph(); + Config_getBool("GRAPHICAL_HIERARCHY")=wizard.inheritanceGraph(); + Config_getBool("CALL_GRAPH")=wizard.callGraph(); break; - } + } +#if defined(Q_OS_MACX) + Config_getString("DOT_PATH")=getResourcePath(); +#endif + setConfigSaved(FALSE); } - if (page) page->addStretch(1); +} - QDictIterator<QObject> di(*m_switches); - QObject *obj = 0; - for (di.toFirst();(obj=di.current());++di) +void MainWidget::loadConfigFromFile(const QString &fn) +{ + if (!Config::instance()->parse(fn)) { - connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool))); - // UGLY HACK: assumes each item depends on a boolean without checking! - emit toggle(di.currentKey(),((InputBool *)obj)->getState()); + QMessageBox::warning(0,"Warning", + "Could not open or read config file "+fn+"!", + "abort" + ); + } + else + { + Config::instance()->convertStrToVal(); +#if defined(Q_OS_MACX) + if (Config_getString("DOT_PATH")!=getResourcePath()) + { + Config_getString("DOT_PATH")=getResourcePath(); + setConfigSaved(FALSE); + } + else + { + setConfigSaved(TRUE); + } +#else + setConfigSaved(TRUE); +#endif + addRecentFile(fn); + m_workingDir->setText(QFileInfo(fn).dirPath(TRUE)); + m_configFileName = fn; + statusBar()->message("New configuration loaded",messageTimeout); + } +} + +void MainWidget::loadConfigFile() +{ + QString fn = QFileDialog::getOpenFileName(m_workingDir->text(),QString::null,this); + if (!fn.isEmpty()) + { + loadConfigFromFile(fn); } - } -ConfigFile::~ConfigFile() +void MainWidget::launchExpert() { - delete m_dependencies; - delete m_inputWidgets; - delete m_switches; + Expert expert(this); + expert.init(); + expert.exec(); +#if defined(Q_OS_MACX) + Config_getString("DOT_PATH")=getResourcePath(); +#endif + setConfigSaved(FALSE); } -void ConfigFile::addDependency(QDict<QObject> *switches, - const QCString &dep,const QCString &name) +void MainWidget::saveDefaults() { - if (!dep.isEmpty()) + if (QMessageBox::question(this,"Store settings as defaults", + "Do you wish to use the " + "current configuration settings as the default settings?", + QMessageBox::Yes, QMessageBox::No)==QMessageBox::Yes) { - //printf("ConfigFile::addDependency(%s)\n",name.data()); - IInput *parent = m_inputWidgets->find(dep); - ASSERT(parent!=0); - IInput *child = m_inputWidgets->find(name); - ASSERT(child!=0); - if (switches->find(dep)==0) + QString newConfig; + QTextStream t(&newConfig,IO_WriteOnly); + Config::instance()->writeTemplate(t,TRUE,FALSE); + m_settings.writeEntry("/config/default",newConfig); + m_settings.writeEntry("/config/workingdir",m_workingDir->text()); + statusBar()->message("Current configuration saved as default",messageTimeout); + } +} + +void MainWidget::saveConfigFile() +{ + QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/Doxyfile",QString::null,this); + if (!fn.isEmpty()) + { + QFile f(fn); + if (f.open(IO_WriteOnly)) { - switches->insert(dep,parent->qobject()); + QTextStream t(&f); + Config::instance()->writeTemplate(t,TRUE,FALSE); + m_configFileName = fn; + setConfigSaved(TRUE); + addRecentFile(fn); + statusBar()->message("Configuration saved",messageTimeout); } - QList<IInput> *list = m_dependencies->find(dep); - if (list==0) + else { - list = new QList<IInput>; - m_dependencies->insert(dep,list); + QMessageBox::warning(0,"Warning", + "Cannot open file "+fn+" for writing. Nothing saved!","ok"); } - list->append(child); } } -void ConfigFile::toggle(const char *name,bool state) +void MainWidget::resetConfig() { - QList<IInput> *inputs = m_dependencies->find(name); - ASSERT(inputs!=0); - IInput *input = inputs->first(); - while (input) + if (QMessageBox::question(this,"Reset settings to their defaults", + "Do you wish to reset the " + "current configuration settings to their factory defaults?", + QMessageBox::Yes, QMessageBox::No)==QMessageBox::Yes) { - input->setEnabled(state); - input = inputs->next(); + // initialize config settings + Config::instance()->init(); + m_configFileName = ""; + setConfigSaved(FALSE); + statusBar()->message("Configuration settings reset to their defaults",messageTimeout); } } -void ConfigFile::init() +void MainWidget::setConfigSaved(bool enable) { - QDictIterator<IInput> di(*m_inputWidgets); - IInput *input = 0; - for (di.toFirst();(input=di.current());++di) + m_configSaved=enable; + if (m_configSaved) { - input->init(); + m_saveStatus->setText("Status: saved"); } - QDictIterator<QObject> dio(*m_switches); - QObject *obj = 0; - for (dio.toFirst();(obj=dio.current());++dio) + else { - connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool))); - // UGLY HACK: assumes each item depends on a boolean without checking! - emit toggle(dio.currentKey(),((InputBool *)obj)->getState()); + m_saveStatus->setText("Status: <font color=\"red\">not saved</font>"); + } + updateRunnable(m_workingDir->text()); +} + +void MainWidget::runDoxygen() +{ + if (!m_running) + { + QString doxygenPath; +#if defined(Q_OS_MACX) + doxygenPath = getResourcePath(); +#else + // TODO: get the right value if not in the search path +#endif + //printf("Trying to run doxygen from path %s\n",doxygenPath.data()); + + m_runProcess->setCommunication(QProcess::Stdout| + QProcess::Stderr| + QProcess::DupStderr + ); + m_runProcess->setWorkingDirectory(QDir(m_workingDir->text())); + m_runProcess->clearArguments(); + m_runProcess->addArgument(doxygenPath+"doxygen"); + m_runProcess->addArgument("-b"); + m_runProcess->addArgument(m_configFileName); + m_outputLog->clear(); + if (!m_runProcess->start()) + { + m_outputLog->append(QString("*** Failed to run doxygen\n")); + } + else + { + m_running=TRUE; + m_run->setText("Cancel"); + m_runStatus->setText("Status: running"); + m_timer->start(1000); + } + } + else + { + m_running=FALSE; + m_run->setText("Start"); + m_runStatus->setText("Status: not running"); + m_runProcess->kill(); + m_timer->stop(); + updateRunnable(m_workingDir->text()); + } +} + +void MainWidget::readStdout() +{ + m_outputLog->append(QString(m_runProcess->readStdout())); +} + +void MainWidget::runComplete() +{ + if (m_running) + { + m_outputLog->append(QString("*** Doxygen has finished\n")); + } + else + { + m_outputLog->append(QString("*** Cancelled by user\n")); + } + m_run->setText("Start"); + m_runStatus->setText("Status: not running"); + m_running=FALSE; + updateRunnable(m_workingDir->text()); +} + +void MainWidget::about() +{ + QString msg; + QTextStream t(&msg,IO_WriteOnly); + t << "<qt><center>A tool to configure and run doxygen " + "on your source files.</center><p><br>" + "<center>Written by<br> Dimitri van Heesch<br>© 2000-2004</center><p>" + "</qt>"; + QMessageBox::about(this,"Doxygen GUI",msg); +} + +void MainWidget::manual() +{ +#if defined(Q_OS_MACX) + const char *urlBytes = "http://www.doxygen.org/manual.html"; + CFURLRef url = CFURLCreateWithBytes ( + NULL, // allocator + (UInt8*)urlBytes, // bytes + strlen(urlBytes), // length + kCFStringEncodingASCII, // encoding + NULL // baseURL + ); + LSOpenCFURLRef(url,0); + CFRelease(url); +#endif +} + +void MainWidget::addRecentFile(const QString &file) +{ + QStringList::Iterator it = m_recentFiles.find(file); + if (it!=m_recentFiles.end()) + { + // already found => move to top + m_recentFiles.remove(it); + m_recentFiles.prepend(file); + } + else + { + // not found + if (m_recentFiles.count() < 10) // append + { + m_recentFiles.prepend(file); + } + else // add + drop last item + { + m_recentFiles.remove(m_recentFiles.last()); + m_recentFiles.prepend(file); + } + } + + m_recentMenu->clear(); + int i=0; + for ( it = m_recentFiles.begin(); it != m_recentFiles.end(); ++it, ++i ) + { + m_recentMenu->insertItem(*it); + m_settings.writeEntry(QString().sprintf("/recent/config%d",i),*it); } - } -//---------------------------------------------------------------------- + +void MainWidget::openRecent(int id) +{ + loadConfigFromFile(m_recentMenu->text(id)); +} + +void MainWidget::quit() +{ + if (!m_configSaved && + QMessageBox::warning( this, "DoxyWizard", "Quit and lose changes?", + QMessageBox::Yes, QMessageBox::No)==QMessageBox::No + ) return; // Quit cancelled by user + + qApp->quit(); +} + +void MainWidget::saveLog() +{ + QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/doxygen_log.txt",QString::null,this); + if (!fn.isEmpty()) + { + QFile f(fn); + if (f.open(IO_WriteOnly)) + { + QTextStream t(&f); + t << m_outputLog->text(); + statusBar()->message("Output log saved",messageTimeout); + } + else + { + QMessageBox::warning(0,"Warning", + "Cannot open file "+fn+" for writing. Nothing saved!","ok"); + } + } +} + +//========================================================================== int main(int argc,char **argv) -{ - QApplication::setColorSpec( QApplication::NormalColor ); - QApplication app(argc,argv); - Wizard wizard(argc,argv); - app.setMainWidget( &wizard ); - wizard.show(); - return app.exec(); +{ + QApplication a(argc,argv); + MainWidget main; + a.setMainWidget(&main); + main.show(); + return a.exec(); } + diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h index 7b40ec8..6964cfe 100644 --- a/addon/doxywizard/doxywizard.h +++ b/addon/doxywizard/doxywizard.h @@ -1,111 +1,292 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#ifndef _DOXWIZARD_H -#define _DOXWIZARD_H +#ifndef DOXYWIZARD_H +#define DOXYWIZARD_H +#include <qvbox.h> +#include <qtabdialog.h> #include <qmainwindow.h> -#include <qlist.h> -#include <qdict.h> - -class IInput; -class QToolBar; -class QWidget; -class QObject; -class ConfigFile; -class InputBool; -class InputString; -class InputStrList; -class InputFile; -class InputDir; -class InputInt; - -class Wizard : public QMainWindow +#include <qsettings.h> +#include <qstringlist.h> + +class QLineEdit; +class QCheckBox; +class QPushButton; +class QComboBox; +class QButtonGroup; +class QTextEdit; +class QLabel; +class QProcess; +class QTimer; +class QPopupMenu; + +enum OptLang { Lang_Cpp, Lang_C, Lang_Java }; +enum HtmlStyle { HS_Plain, HS_TreeView, HS_CHM }; +enum TexStyle { TS_PDFHyper, TS_PDF, TS_PS }; +enum DiagramMode { DM_None, DM_Builtin, DM_Dot }; + +class Step1 : public QWidget { - Q_OBJECT + Q_OBJECT public: - Wizard(int argc,char **argv); - ~Wizard(){}; - void loadFile(const char *s); + Step1(QWidget *parent); + + QString getProjectName() const; + QString getProjectNumber() const; + QString getSourceDir() const; + bool scanRecursively() const; + QString getDestinationDir() const; + + void setProjectName(const QString &name); + void setProjectNumber(const QString &num); + void setSourceDir(const QString &dir); + void setRecursiveScan(bool enable); + void setDestinationDir(const QString &dir); private slots: - void newFile(); - void loadFile(); - void saveFile(); - void saveAsFile(); - void quit(); - void changed(); - void about(); - void runDoxygen(); // Micha + void selectSourceDir(); + void selectDestinationDir(); + + private: + QLineEdit *m_projName; + QLineEdit *m_projNumber; + QLineEdit *m_sourceDir; + QLineEdit *m_destDir; + QCheckBox *m_recursive; + QPushButton *m_srcSelectDir; + QPushButton *m_dstSelectDir; +}; - signals: +class Step2 : public QWidget +{ + public: + Step2(QWidget *parent); + bool crossReferencingEnabled() const; + void enableCrossReferencing(); + + bool extractAll() const; + bool crossReferencing() const; + OptLang optimizeFor() const; + + void setExtractAll(bool enable); + void setCrossReferencing(bool enable); + void setOptimizeFor(OptLang lang); private: - void refreshCaption(); - QToolBar *fileTools; - bool hasChanged; - ConfigFile *cw; + QButtonGroup *m_extractMode; + QButtonGroup *m_optimizeLang; + QCheckBox *m_crossRef; }; -class ConfigWidget +class Step3 : public QWidget { + Q_OBJECT + public: - enum Kind { Int, String, StrList, Bool }; - - ConfigWidget(QWidget *w,Kind k) : m_widget(w), m_kind(k) {} - - Kind kind() const { return m_kind; } - - InputString *getString() const - { return m_kind==String ? (InputString *)m_widget : 0; } - - InputBool *getBool() const - { return m_kind==Bool ? (InputBool *)m_widget : 0; } - - InputStrList *getStrList() const - { return m_kind==StrList ? (InputStrList *)m_widget : 0; } - - InputInt *getInt() const - { return m_kind==Int ? (InputInt *)m_widget : 0; } + Step3(QWidget *parent); + + bool htmlEnabled() const; + bool latexEnabled() const; + bool manEnabled() const; + bool rtfEnabled() const; + bool xmlEnabled() const; + bool searchEnabled() const; + HtmlStyle htmlStyle() const; + TexStyle texStyle() const; + + void setHtmlEnabled(bool); + void setLatexEnabled(bool); + void setManEnabled(bool); + void setRtfEnabled(bool); + void setXmlEnabled(bool); + void setSearchEnabled(bool); + void setHtmlStyle(HtmlStyle); + void setTexStyle(TexStyle); + + + private slots: + void latexStateChange(int state); + void htmlStateChange(int state); + + private: + QButtonGroup *m_texOptions; + QVBox *m_texOptionBox; + QButtonGroup *m_htmlOptions; + QVBox *m_htmlOptionBox; + QCheckBox *m_htmlEnabled; + QCheckBox *m_latexEnabled; + QCheckBox *m_manEnabled; + QCheckBox *m_rtfEnabled; + QCheckBox *m_xmlEnabled; + QCheckBox *m_searchEnabled; +}; + +class Step4 : public QWidget +{ + Q_OBJECT + + public: + Step4(QWidget *parent); + void disableCallGraphs(); + bool callGraphEnabled() const; + + DiagramMode diagramMode() const; + bool classDiagram() const; + bool collaborationDiagram() const; + bool includeGraph() const; + bool includedByGraph() const; + bool inheritanceGraph() const; + bool callGraph() const; + + void setDiagramMode(DiagramMode mode); + void setClassDiagram(bool enable); + void setCollaborationDiagram(bool enable); + void setIncludeGraph(bool enable); + void setIncludedByGraph(bool enable); + void setInheritanceGraph(bool enable); + void setCallGraph(bool enable); + + private slots: + void diagramModeChanged(int); private: - QWidget *m_widget; - Kind m_kind; + QButtonGroup *m_diagramMode; + QVBox *m_dotOptions; + QCheckBox *m_dotClass; + QCheckBox *m_dotCollaboration; + QCheckBox *m_dotInclude; + QCheckBox *m_dotIncludedBy; + QCheckBox *m_dotInheritance; + QCheckBox *m_dotCall; }; -class ConfigFile : public QWidget +class Wizard : public QTabDialog { - Q_OBJECT + Q_OBJECT public: - ConfigFile(QWidget *parent=0); - ~ConfigFile(); - void init(); - void addDependency(QDict<QObject> *switches, - const QCString &dep,const QCString &name); - - signals: - void changed(); + Wizard(QWidget *parent); + void disableCallGraphs(); + + // step1 + QString getProjectName() const { return m_step1->getProjectName(); } + QString getProjectNumber() const { return m_step1->getProjectNumber(); } + QString getSourceDir() const { return m_step1->getSourceDir(); } + bool scanRecursively() const { return m_step1->scanRecursively(); } + QString getDestinationDir() const { return m_step1->getDestinationDir(); } + + void setProjectName(const QString &name) { m_step1->setProjectName(name); } + void setProjectNumber(const QString &num) { m_step1->setProjectNumber(num); } + void setSourceDir(const QString &dir) { m_step1->setSourceDir(dir); } + void setRecursiveScan(bool enable) { m_step1->setRecursiveScan(enable); } + void setDestinationDir(const QString &dir) { m_step1->setDestinationDir(dir); } + + // step2 + bool extractAll() const { return m_step2->extractAll(); } + bool crossReferencing() const { return m_step2->crossReferencing(); } + OptLang optimizeFor() const { return m_step2->optimizeFor(); } + + void setExtractAll(bool enable) { m_step2->setExtractAll(enable); } + void setCrossReferencing(bool enable) { m_step2->setCrossReferencing(enable); } + void setOptimizeFor(OptLang lang) { m_step2->setOptimizeFor(lang); } - private slots: - void toggle(const char *,bool); + // step3 + bool htmlEnabled() const { return m_step3->htmlEnabled(); } + bool latexEnabled() const { return m_step3->latexEnabled(); } + bool manEnabled() const { return m_step3->manEnabled(); } + bool rtfEnabled() const { return m_step3->rtfEnabled(); } + bool xmlEnabled() const { return m_step3->xmlEnabled(); } + bool searchEnabled() const { return m_step3->searchEnabled(); } + HtmlStyle htmlStyle() const { return m_step3->htmlStyle(); } + TexStyle texStyle() const { return m_step3->texStyle(); } + + void setHtmlEnabled(bool enable) { m_step3->setHtmlEnabled(enable); } + void setLatexEnabled(bool enable) { m_step3->setLatexEnabled(enable); } + void setManEnabled(bool enable) { m_step3->setManEnabled(enable); } + void setRtfEnabled(bool enable) { m_step3->setRtfEnabled(enable); } + void setXmlEnabled(bool enable) { m_step3->setXmlEnabled(enable); } + void setSearchEnabled(bool enable) { m_step3->setSearchEnabled(enable); } + void setHtmlStyle(HtmlStyle style) { m_step3->setHtmlStyle(style); } + void setTexStyle(TexStyle style) { m_step3->setTexStyle(style); } + // step4 + DiagramMode diagramMode() const { return m_step4->diagramMode(); } + bool classDiagram() const { return m_step4->classDiagram(); } + bool collaborationDiagram() const { return m_step4->collaborationDiagram(); } + bool includeGraph() const { return m_step4->includeGraph(); } + bool includedByGraph() const { return m_step4->includedByGraph(); } + bool inheritanceGraph() const { return m_step4->inheritanceGraph(); } + bool callGraph() const { return m_step4->callGraph(); } + + void setDiagramMode(DiagramMode mode) { m_step4->setDiagramMode(mode); } + void setClassDiagram(bool enable) { m_step4->setClassDiagram(enable); } + void setCollaborationDiagram(bool enable) { m_step4->setCollaborationDiagram(enable); } + void setIncludeGraph(bool enable) { m_step4->setIncludeGraph(enable); } + void setIncludedByGraph(bool enable) { m_step4->setIncludedByGraph(enable); } + void setInheritanceGraph(bool enable) { m_step4->setInheritanceGraph(enable); } + void setCallGraph(bool enable) { m_step4->setCallGraph(enable); } + + public slots: + void changeCallGraphState(int state); + void changeCrossRefState(int state); + + private: + Step1 *m_step1; + Step2 *m_step2; + Step3 *m_step3; + Step4 *m_step4; +}; + +class MainWidget : public QMainWindow +{ + Q_OBJECT + public: + MainWidget(QWidget *parent=0); + ~MainWidget(); + + private slots: + void launchWizard(); + void launchExpert(); + void loadConfigFile(); + void selectWorkingDir(); + void updateRunnable(const QString &newDirName); + void saveDefaults(); + void saveConfigFile(); + void runDoxygen(); + void readStdout(); + void runComplete(); + void about(); + void manual(); + void resetConfig(); + void openRecent(int); + void quit(); + void saveLog(); + private: - QDict<IInput> *m_inputWidgets; - QDict< QList<IInput> > *m_dependencies; - QDict<QObject> *m_switches; + void setConfigSaved(bool); + void loadConfigFromFile(const QString &); + void addRecentFile(const QString &); + + QPushButton *m_wizard; + QPushButton *m_expert; + QPushButton *m_load; + QPushButton *m_save; + QPushButton *m_defaults; + QLineEdit *m_workingDir; + QPushButton *m_selWorkingDir; + QPushButton *m_run; + QPushButton *m_saveLog; + QLabel *m_runStatus; + QProcess *m_runProcess; + QLabel *m_saveStatus; + QLabel *m_outputHeading; + QTextEdit *m_outputLog; + QTimer *m_timer; + QSettings m_settings; + QPopupMenu *m_recentMenu; + bool m_configSaved; + bool m_running; + QString m_configFileName; + QStringList m_recentFiles; }; #endif diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in index ae7a8a4..78f32f9 100644 --- a/addon/doxywizard/doxywizard.pro.in +++ b/addon/doxywizard/doxywizard.pro.in @@ -23,23 +23,21 @@ CONFIG = qt warn_on $extraopts # header file for the project HEADERS = doxywizard.h \ version.h \ - pagewidget.h \ inputstring.h \ inputbool.h \ inputstrlist.h \ inputint.h \ - pixmaps.h \ + expert.h \ config.h # source flle for the project SOURCES = doxywizard.cpp \ version.cpp \ - pagewidget.cpp \ inputstring.cpp \ inputbool.cpp \ inputstrlist.cpp \ inputint.cpp \ - pixmaps.cpp \ + expert.cpp \ config.cpp # where to put the objects @@ -52,8 +50,10 @@ MOC_DIR = moc INCLUDEPATH += ../../src win32:TMAKE_CXXFLAGS += -DQT_DLL win32:INCLUDEPATH += . +macosx-c++:LIBS+=-framework CoreFoundation -framework ApplicationServices # extra link options -win32:TMAKE_LIBS = $(QTDIR)\lib\qtmain.lib $(QTDIR)\lib\qt-mt230nc.lib user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib +win32:TMAKE_LFLAGS = /NODEFAULTLIB:msvcrt.lib +win32:TMAKE_LIBS = $(QTDIR)\lib\qtmain.lib $(QTDIR)\lib\qt-mt332.lib user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib win32:TMAKE_LIBS_QT = diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp new file mode 100644 index 0000000..8e439e7 --- /dev/null +++ b/addon/doxywizard/expert.cpp @@ -0,0 +1,264 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2004 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <qmainwindow.h> +#include <qpopupmenu.h> +#include <qfileinfo.h> +#include <qmenubar.h> +#include <qstatusbar.h> +#include <qfiledialog.h> +#include <qmessagebox.h> +#include <qapplication.h> +#include <qwhatsthis.h> +#include <qlayout.h> +#include <qtabwidget.h> +#include <qtoolbar.h> +#include <qtoolbutton.h> +#include <qscrollview.h> +#include <qlayout.h> + +#include "expert.h" +#include "inputbool.h" +#include "inputstring.h" +#include "inputstrlist.h" +#include "inputint.h" +#include "config.h" +#include "version.h" + +//------------------------------------------------------------------------- + +Expert::Expert( QWidget *parent ) : QTabDialog( parent ) +{ + + m_dependencies = new QDict< QList<IInput> >(257); + m_dependencies->setAutoDelete(TRUE); + m_inputWidgets = new QDict< IInput >; + m_switches = new QDict< QObject >; + + setHelpButton(); + + QListIterator<ConfigOption> options = Config::instance()->iterator(); + QVBoxLayout *pageLayout = 0; + QFrame *page = 0; + ConfigOption *option = 0; + for (options.toFirst();(option=options.current());++options) + { + switch(option->kind()) + { + case ConfigOption::O_Info: + { + if (pageLayout) pageLayout->addStretch(1); + QScrollView *view = new QScrollView(this); + view->setVScrollBarMode(QScrollView::Auto); + view->setHScrollBarMode(QScrollView::AlwaysOff); + view->setResizePolicy(QScrollView::AutoOneFit); + page = new QFrame( view->viewport(), option->name() ); + pageLayout = new QVBoxLayout(page); + pageLayout->setMargin(10); + view->addChild(page); + addTab(view,option->name()); + QWhatsThis::add(page, option->docs().simplifyWhiteSpace() ); + } + break; + case ConfigOption::O_String: + { + ASSERT(page!=0); + InputString::StringMode sm=InputString::StringFree; + switch(((ConfigString *)option)->widgetType()) + { + case ConfigString::String: sm=InputString::StringFree; break; + case ConfigString::File: sm=InputString::StringFile; break; + case ConfigString::Dir: sm=InputString::StringDir; break; + } + InputString *inputString = new InputString( + option->name(), // name + page, // widget + *((ConfigString *)option)->valueRef(), // variable + sm // type + ); + pageLayout->addWidget(inputString); + QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() ); + connect(inputString,SIGNAL(changed()),SIGNAL(changed())); + m_inputWidgets->insert(option->name(),inputString); + addDependency(m_switches,option->dependsOn(),option->name()); + } + break; + case ConfigOption::O_Enum: + { + ASSERT(page!=0); + InputString *inputString = new InputString( + option->name(), // name + page, // widget + *((ConfigEnum *)option)->valueRef(), // variable + InputString::StringFixed // type + ); + pageLayout->addWidget(inputString); + QStrListIterator sli=((ConfigEnum *)option)->iterator(); + for (sli.toFirst();sli.current();++sli) + { + inputString->addValue(sli.current()); + } + inputString->init(); + QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() ); + connect(inputString,SIGNAL(changed()),SIGNAL(changed())); + m_inputWidgets->insert(option->name(),inputString); + addDependency(m_switches,option->dependsOn(),option->name()); + } + break; + case ConfigOption::O_List: + { + ASSERT(page!=0); + InputStrList::ListMode lm=InputStrList::ListString; + switch(((ConfigList *)option)->widgetType()) + { + case ConfigList::String: lm=InputStrList::ListString; break; + case ConfigList::File: lm=InputStrList::ListFile; break; + case ConfigList::Dir: lm=InputStrList::ListDir; break; + case ConfigList::FileAndDir: lm=InputStrList::ListFileDir; break; + } + InputStrList *inputStrList = new InputStrList( + option->name(), // name + page, // widget + *((ConfigList *)option)->valueRef(), // variable + lm // type + ); + pageLayout->addWidget(inputStrList); + QWhatsThis::add(inputStrList, option->docs().simplifyWhiteSpace() ); + connect(inputStrList,SIGNAL(changed()),SIGNAL(changed())); + m_inputWidgets->insert(option->name(),inputStrList); + addDependency(m_switches,option->dependsOn(),option->name()); + } + break; + break; + case ConfigOption::O_Bool: + { + ASSERT(page!=0); + InputBool *inputBool = new InputBool( + option->name(), // name + page, // widget + *((ConfigBool *)option)->valueRef() // variable + ); + pageLayout->addWidget(inputBool); + QWhatsThis::add(inputBool, option->docs().simplifyWhiteSpace() ); + connect(inputBool,SIGNAL(changed()),SIGNAL(changed())); + m_inputWidgets->insert(option->name(),inputBool); + addDependency(m_switches,option->dependsOn(),option->name()); + } + break; + case ConfigOption::O_Int: + { + ASSERT(page!=0); + InputInt *inputInt = new InputInt( + option->name(), // name + page, // widget + *((ConfigInt *)option)->valueRef(), // variable + ((ConfigInt *)option)->minVal(), // min value + ((ConfigInt *)option)->maxVal() // max value + ); + pageLayout->addWidget(inputInt); + QWhatsThis::add(inputInt, option->docs().simplifyWhiteSpace() ); + connect(inputInt,SIGNAL(changed()),SIGNAL(changed())); + m_inputWidgets->insert(option->name(),inputInt); + addDependency(m_switches,option->dependsOn(),option->name()); + } + break; + case ConfigOption::O_Obsolete: + break; + } + } + if (pageLayout) pageLayout->addStretch(1); + + QDictIterator<QObject> di(*m_switches); + QObject *obj = 0; + for (di.toFirst();(obj=di.current());++di) + { + connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool))); + // UGLY HACK: assumes each item depends on a boolean without checking! + emit toggle(di.currentKey(),((InputBool *)obj)->getState()); + } + + connect(this,SIGNAL(helpButtonPressed()), + this,SLOT(handleHelp())); + +} + +Expert::~Expert() +{ + delete m_dependencies; + delete m_inputWidgets; + delete m_switches; +} + +void Expert::handleHelp() +{ + QWhatsThis::enterWhatsThisMode(); +} + +void Expert::addDependency(QDict<QObject> *switches, + const QCString &dep,const QCString &name) +{ + if (!dep.isEmpty()) + { + //printf("Expert::addDependency(%s)\n",name.data()); + IInput *parent = m_inputWidgets->find(dep); + ASSERT(parent!=0); + IInput *child = m_inputWidgets->find(name); + ASSERT(child!=0); + if (switches->find(dep)==0) + { + switches->insert(dep,parent->qobject()); + } + QList<IInput> *list = m_dependencies->find(dep); + if (list==0) + { + list = new QList<IInput>; + m_dependencies->insert(dep,list); + } + list->append(child); + } +} + +void Expert::toggle(const char *name,bool state) +{ + QList<IInput> *inputs = m_dependencies->find(name); + ASSERT(inputs!=0); + IInput *input = inputs->first(); + while (input) + { + input->setEnabled(state); + input = inputs->next(); + } +} + +void Expert::init() +{ + QDictIterator<IInput> di(*m_inputWidgets); + IInput *input = 0; + for (di.toFirst();(input=di.current());++di) + { + input->init(); + } + QDictIterator<QObject> dio(*m_switches); + QObject *obj = 0; + for (dio.toFirst();(obj=dio.current());++dio) + { + connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool))); + // UGLY HACK: assumes each item depends on a boolean without checking! + emit toggle(dio.currentKey(),((InputBool *)obj)->getState()); + } + +} + diff --git a/addon/doxywizard/expert.h b/addon/doxywizard/expert.h new file mode 100644 index 0000000..7deeb17 --- /dev/null +++ b/addon/doxywizard/expert.h @@ -0,0 +1,82 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2004 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +#ifndef EXPERT_H +#define EXPERT_H + +#include <qtabdialog.h> +#include <qlist.h> +#include <qdict.h> + +class IInput; +class QWidget; +class QObject; +class InputBool; +class InputString; +class InputStrList; +class InputFile; +class InputDir; +class InputInt; + +class ConfigWidget +{ + public: + enum Kind { Int, String, StrList, Bool }; + + ConfigWidget(QWidget *w,Kind k) : m_widget(w), m_kind(k) {} + + Kind kind() const { return m_kind; } + + InputString *getString() const + { return m_kind==String ? (InputString *)m_widget : 0; } + + InputBool *getBool() const + { return m_kind==Bool ? (InputBool *)m_widget : 0; } + + InputStrList *getStrList() const + { return m_kind==StrList ? (InputStrList *)m_widget : 0; } + + InputInt *getInt() const + { return m_kind==Int ? (InputInt *)m_widget : 0; } + + private: + QWidget *m_widget; + Kind m_kind; +}; + +class Expert : public QTabDialog +{ + Q_OBJECT + + public: + Expert(QWidget *parent=0); + ~Expert(); + void init(); + void addDependency(QDict<QObject> *switches, + const QCString &dep,const QCString &name); + + signals: + void changed(); + + private slots: + void toggle(const char *,bool); + void handleHelp(); + + private: + QDict<IInput> *m_inputWidgets; + QDict< QList<IInput> > *m_dependencies; + QDict<QObject> *m_switches; +}; + +#endif diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp index e73b605..e1f16a1 100644 --- a/addon/doxywizard/inputbool.cpp +++ b/addon/doxywizard/inputbool.cpp @@ -13,35 +13,32 @@ */ #include "inputbool.h" -#include "pagewidget.h" -#if QT_VERSION >= 300 -#include <qstylefactory.h> -#else -#include <qwindowsstyle.h> -#endif +//#if QT_VERSION >= 300 +//#include <qstylefactory.h> +//#else +//#include <qwindowsstyle.h> +//#endif #include <qlayout.h> -InputBool::InputBool( const QString & text, PageWidget * parent, bool &flag ) - : /*QCheckBox( text, parent->getLayout() )*/ QWidget(parent->getLayout()), state(flag) +InputBool::InputBool( const QString & text, QWidget * parent, bool &flag ) + : QWidget(parent), state(flag) { QBoxLayout *layout = new QHBoxLayout(this); cb = new QCheckBox(text,this); layout->addWidget(cb); layout->addStretch(10); -#if QT_VERSION >= 300 - QStyle *winStyle = QStyleFactory::create("windows"); -#else - QWindowsStyle *winStyle = new QWindowsStyle(); -#endif +//#if QT_VERSION >= 300 +// QStyle *winStyle = QStyleFactory::create("windows"); +//#else +// QWindowsStyle *winStyle = new QWindowsStyle(); +//#endif cb->setChecked( flag ); - if (winStyle) cb->setStyle( winStyle ); +// if (winStyle) cb->setStyle( winStyle ); cb->setMinimumSize( sizeHint() ); connect( cb, SIGNAL(toggled(bool)), SLOT(setState(bool)) ); - parent->addWidget(this); - layout->activate(); } diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h index 978d136..5a56d83 100644 --- a/addon/doxywizard/inputbool.h +++ b/addon/doxywizard/inputbool.h @@ -27,7 +27,7 @@ class InputBool : public QWidget, /*QCheckBox,*/ public IInput Q_OBJECT public: - InputBool( const QString &text, PageWidget *parent, bool &flag ); + InputBool( const QString &text, QWidget *parent, bool &flag ); ~InputBool(){}; void init(); void setEnabled(bool b) { cb->setEnabled(b); } diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp index e5d98ac..c3bd11f 100644 --- a/addon/doxywizard/inputint.cpp +++ b/addon/doxywizard/inputint.cpp @@ -13,7 +13,6 @@ */ #include "inputint.h" -#include "pagewidget.h" #include <stdio.h> #include <stdlib.h> @@ -22,8 +21,8 @@ #include <qwindowsstyle.h> #include <qspinbox.h> -InputInt::InputInt( const QString & label, PageWidget *parent, int &val, int minVal,int maxVal ) - : QWidget( parent->getLayout() ), m_val(val), m_minVal(minVal), m_maxVal(maxVal) +InputInt::InputInt( const QString & label, QWidget *parent, int &val, int minVal,int maxVal ) + : QWidget( parent), m_val(val), m_minVal(minVal), m_maxVal(maxVal) { QHBoxLayout *layout = new QHBoxLayout( this, 5 ); @@ -44,7 +43,6 @@ InputInt::InputInt( const QString & label, PageWidget *parent, int &val, int min connect(sp, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)) ); - parent->addWidget(this); } void InputInt::valueChanged(int val) diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h index 44719c4..fbe3813 100644 --- a/addon/doxywizard/inputint.h +++ b/addon/doxywizard/inputint.h @@ -22,14 +22,13 @@ class QLabel; class QSpinBox; -class PageWidget; class InputInt : public QWidget, public IInput { Q_OBJECT public: - InputInt( const QString &text, PageWidget *parent, int &val, + InputInt( const QString &text, QWidget *parent, int &val, int minVal, int maxVal ); ~InputInt(){}; void setEnabled(bool); diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp index 27ca564..6450cb9 100644 --- a/addon/doxywizard/inputstring.cpp +++ b/addon/doxywizard/inputstring.cpp @@ -13,8 +13,7 @@ */ #include "inputstring.h" -#include "pagewidget.h" -#include "pixmaps.h" +//#include "pixmaps.h" #include <qlabel.h> #include <qlayout.h> @@ -28,8 +27,8 @@ InputString::InputString( const QString & label, - PageWidget *parent, QCString &s, StringMode m ) - : QWidget( parent->getLayout() ), str(s), sm(m), m_values(0), m_index(0) + QWidget *parent, QCString &s, StringMode m ) + : QWidget( parent ), str(s), sm(m), m_values(0), m_index(0) { if (m==StringFixed) { @@ -38,6 +37,7 @@ InputString::InputString( const QString & label, lab->setMinimumSize( lab->sizeHint() ); layout->addWidget( lab ); com = new QComboBox( this ); + com->setMinimumSize(com->sizeHint()); layout->addWidget( com ); layout->addStretch( 1 ); le=0; @@ -57,16 +57,21 @@ InputString::InputString( const QString & label, layout->addWidget( le,0,1 ); if (m==StringFile || m==StringDir) { - QPixmap pixmap = QPixmap(m==StringFile ? - file_xpm : - folder_xpm ); + //QPixmap pixmap = QPixmap(m==StringFile ? + // file_xpm : + // folder_xpm ); br = new QPushButton( this ); - br->setPixmap(pixmap); br->setMinimumSize( br->sizeHint() ); if (m==StringFile) + { + br->setText("File..."); QToolTip::add(br,"Browse to a file"); + } else + { + br->setText("Folder..."); QToolTip::add(br,"Browse to a folder"); + } layout->addWidget( br,0,2 ); } else @@ -83,8 +88,6 @@ InputString::InputString( const QString & label, if (br) connect( br, SIGNAL(clicked()), this, SLOT(browse()) ); if (com) connect( com, SIGNAL(activated(const QString &)), this, SLOT(textChanged(const QString &)) ); - - parent->addWidget(this); } InputString::~InputString() diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h index 657bfa7..cd2ac91 100644 --- a/addon/doxywizard/inputstring.h +++ b/addon/doxywizard/inputstring.h @@ -26,7 +26,6 @@ class QLabel; class QLineEdit; class QPushButton; class QComboBox; -class PageWidget; class InputString : public QWidget, public IInput { @@ -39,7 +38,7 @@ class InputString : public QWidget, public IInput StringFixed=3 }; - InputString( const QString &text, PageWidget *parent, QCString &s, + InputString( const QString &text, QWidget *parent, QCString &s, StringMode m=StringFree ); ~InputString(); void setEnabled(bool); diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp index 25d3ca3..f8e4888 100644 --- a/addon/doxywizard/inputstrlist.cpp +++ b/addon/doxywizard/inputstrlist.cpp @@ -13,8 +13,7 @@ */ #include "inputstrlist.h" -#include "pagewidget.h" -#include "pixmaps.h" +//#include "pixmaps.h" #include <qlabel.h> #include <qlayout.h> @@ -27,8 +26,8 @@ #include <qtooltip.h> InputStrList::InputStrList( const QString & label, - PageWidget *parent, QStrList &sl, ListMode lm) - : QWidget(parent->getLayout()), strList(sl) + QWidget *parent, QStrList &sl, ListMode lm) + : QWidget(parent), strList(sl) { QGridLayout *layout = new QGridLayout( this, 2, 2, 5 ); lab = new QLabel( label, this ); @@ -42,19 +41,22 @@ InputStrList::InputStrList( const QString & label, boxlayout->addWidget( le, 1 ); add = new QPushButton( dw ); - add->setPixmap( QPixmap( add_xpm )); + //add->setPixmap( QPixmap( add_xpm )); + add->setText( "+" ); add->setMinimumSize( add->sizeHint() ); QToolTip::add(add,"Add item"); boxlayout->addWidget( add ); del = new QPushButton( dw ); - del->setPixmap( QPixmap( del_xpm )); + //del->setPixmap( QPixmap( del_xpm )); + del->setText( "-" ); del->setMinimumSize( del->sizeHint() ); QToolTip::add(del,"Delete selected item"); boxlayout->addWidget( del ); upd = new QPushButton( dw ); - upd->setPixmap( QPixmap( update_xpm )); + //upd->setPixmap( QPixmap( update_xpm )); + upd->setText( "*" ); upd->setMinimumSize( upd->sizeHint() ); QToolTip::add(upd,"Update selected item"); boxlayout->addWidget( upd ); @@ -72,7 +74,8 @@ InputStrList::InputStrList( const QString & label, if (lm&ListFile) { brFile = new QPushButton(dw); - brFile->setPixmap( QPixmap(file_xpm) ); + //brFile->setPixmap( QPixmap(file_xpm) ); + brFile->setText("Select..."); brFile->setMinimumSize(brFile->sizeHint()); QToolTip::add(brFile,"Browse to a file"); boxlayout->addWidget( brFile ); @@ -80,7 +83,8 @@ InputStrList::InputStrList( const QString & label, if (lm&ListDir) { brDir = new QPushButton(dw); - brDir->setPixmap( QPixmap(folder_xpm) ); + //brDir->setPixmap( QPixmap(folder_xpm) ); + brDir->setText("Select..."); brDir->setMinimumSize(brDir->sizeHint()); QToolTip::add(brDir,"Browse to a folder"); boxlayout->addWidget( brDir ); @@ -111,10 +115,6 @@ InputStrList::InputStrList( const QString & label, } connect(lb, SIGNAL(selected(const QString &)), this, SLOT(selectText(const QString &))); - - parent->addWidget(this); - - strList=sl; } void InputStrList::addString() diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h index 1b351ea..6d23910 100644 --- a/addon/doxywizard/inputstrlist.h +++ b/addon/doxywizard/inputstrlist.h @@ -24,7 +24,6 @@ class QLabel; class QLineEdit; class QPushButton; class QListBox; -class PageWidget; class QStrList; class InputStrList : public QWidget, public IInput @@ -38,7 +37,7 @@ class InputStrList : public QWidget, public IInput ListFileDir=ListFile|ListDir }; - InputStrList( const QString &text, PageWidget *parent, + InputStrList( const QString &text, QWidget *parent, QStrList &sl, ListMode v=ListString ); ~InputStrList() {}; void setEnabled(bool); diff --git a/addon/doxywizard/pagewidget.cpp b/addon/doxywizard/pagewidget.cpp deleted file mode 100644 index 9e5a2fe..0000000 --- a/addon/doxywizard/pagewidget.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#include <stdio.h> - -#include <qtabwidget.h> -#include <qlayout.h> -#include "pagewidget.h" - -FrameLayout::FrameLayout(QWidget *parent,const char *name,WFlags f) - : QFrame(parent,name,f) -{ - lay = new QVBoxLayout(this,5,3,name); -} - -FrameLayout::~FrameLayout() -{ -} - -void FrameLayout::addStretch(int stretch) -{ - lay->addStretch(stretch); -} - -void FrameLayout::addWidget(QWidget *w) -{ - lay->addWidget(w); -} - -PageWidget::PageWidget( QTabWidget *parent, const char *name ) - : QScrollView ( parent,name ) -{ - // the Qt docs say that one has to insert the viewport() as a parent - // here but this does not work! Insert 0 does give the proper result! - lay = new FrameLayout(this); - addChild(lay); - setVScrollBarMode(QScrollView::Auto); - setHScrollBarMode(QScrollView::AlwaysOff); - m_parent=parent; - m_parent->addTab( this, name ); -} - -void PageWidget::addStretch(int stretch) -{ - lay->addStretch(stretch); - //printf("Viewport SizeHint %d,%d\n",viewport()->sizeHint().width(),viewport()->sizeHint().height()); -} - -void PageWidget::addWidget(QWidget *w) -{ - //printf("Adding widget height=%d\n",w->sizeHint().height()); - lay->addWidget(w); -} - -QWidget *PageWidget::getLayout() const -{ - return lay; -} - -void PageWidget::resizeEvent(QResizeEvent *e) -{ - QScrollView::resizeEvent(e); - //printf("PageWidget::resizeEvent!\n"); - lay->resize(viewport()->width(),QMAX(lay->height(),viewport()->height())); -} - -void PageWidget::paintEvent(QPaintEvent *e) -{ - QScrollView::paintEvent(e); - //printf("PageWidget::paintEvent()\n"); - lay->resize(viewport()->width(),QMAX(lay->height(),viewport()->height())); -} - - - diff --git a/addon/doxywizard/pagewidget.h b/addon/doxywizard/pagewidget.h deleted file mode 100644 index 6da0ee4..0000000 --- a/addon/doxywizard/pagewidget.h +++ /dev/null @@ -1,63 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#ifndef _PAGEWIDGET_H -#define _PAGEWIDGET_H - -#include <qscrollview.h> - -class QTabWidget; -class QVBoxLayout; - -class FrameLayout : public QFrame -{ - Q_OBJECT - - public: - FrameLayout(QWidget *parent=0, const char *name=0, WFlags g=0); - ~FrameLayout(); - void addStretch(int s=0); - void addWidget(QWidget *w); - - private: - QVBoxLayout *lay; -}; - -class PageWidget : public QScrollView -{ - Q_OBJECT - - public: - PageWidget( QTabWidget *parent, const char *name ); - ~PageWidget() {}; - //void frameChanged() - //{ - // if (!layout()) return; - // layout()->setMargin(frameWidth()); - //} - void addStretch(int stretch=0); - void addWidget(QWidget *w); - QWidget *getLayout() const; - - protected: - void resizeEvent(QResizeEvent *e); - void paintEvent(QPaintEvent *e); - - private: - FrameLayout *lay; - QTabWidget *m_parent; - -}; - -#endif diff --git a/addon/doxywizard/pixmaps.cpp b/addon/doxywizard/pixmaps.cpp deleted file mode 100644 index 822edf6..0000000 --- a/addon/doxywizard/pixmaps.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#include "pixmaps.h" - -static const char * const folder_xpm_data[] = -{ - "16 16 6 1", - ". c None", - "b c #ffff00", - "d c #000000", - "* c #999999", - "a c #cccccc", - "c c #ffffff", - "................", - "................", - "..*****.........", - ".*ababa*........", - "*abababa******..", - "*cccccccccccc*d.", - "*cbababababab*d.", - "*cabababababa*d.", - "*cbababababab*d.", - "*cabababababa*d.", - "*cbababababab*d.", - "*cabababababa*d.", - "*cbababababab*d.", - "**************d.", - ".dddddddddddddd.", - "................" -}; -const char **folder_xpm = (const char **)folder_xpm_data; - -static const char* const file_xpm_data[] = -{ - "16 16 5 1", - ". c #7f7f7f", - "# c None", - "c c #000000", - "b c #bfbfbf", - "a c #ffffff", - "################", - "#..........#####", - "#.aaaaaaaab.####", - "#.aaaaaaaaba.###", - "#.aaaaaaaacccc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.aaaaaaaaaabc##", - "#.bbbbbbbbbbbc##", - "#ccccccccccccc##", - "################" -}; -const char **file_xpm = (const char **)file_xpm_data; - -static const char * const add_xpm_data[] = -{ - "16 16 5 1", - ". c None", - "* c #0328f9", - "# c #354396", - "a c #353740", - "c c #999999", - "................", - "......###.......", - "......#*ac......", - "......#*ac......", - "......#*ac......", - "......#*ac......", - ".######*a#####..", - ".#***********ac.", - ".#aaaaa*aaaaaac.", - "..cccc#*acccccc.", - "......#*ac......", - "......#*ac......", - "......#*ac......", - "......#aac......", - ".......ccc......", - "................" -}; -const char **add_xpm = (const char **)add_xpm_data; - -static const char * const del_xpm_data[] = -{ - "16 16 5 1", - ". c None", - "* c #0328f9", - "# c #354396", - "a c #353740", - "c c #999999", - "................", - "................", - "................", - "................", - "................", - "................", - ".#############..", - ".#***********ac.", - ".aaaaaaaaaaaaac.", - "..ccccccccccccc.", - "................", - "................", - "................", - "................", - "................", - "................" -}; -const char **del_xpm = (const char **)del_xpm_data; - -static char *update_xpm_data[] = -{ - "16 16 5 1", - /* colors */ - ". c #0328f9", - "# c #354396", - "a c #353740", - "b c None", - "c c #999999", - /* pixels */ - "bbbbbbbbbbbbbbbb", - "bbbbbbbb#####acb", - "bbbbbbbb#....abb", - "bbc##cbb#...acbb", - "bb#..abb#....abb", - "bc#..abb#.a..acb", - "b#..acbbaac#..ab", - "b#..abbbcbb#..ab", - "b#..abbbbbb#..ab", - "b#..acbbbbc#..ab", - "bc#..#cbbc#..acb", - "bb#...####...acb", - "bbca........acbb", - "bbbbaa....aaccbb", - "bbbbbcaaaaccbbbb", - "bbbbbbbbbbbbbbbb" -}; -const char **update_xpm = (const char **)update_xpm_data; - - -static const char *fileopen_xpm_data[] = -{ - "16 13 5 1", - ". c #040404", - "# c #808304", - "a c None", - "b c #f3f704", - "c c #f3f7f3", - "aaaaaaaaa...aaaa", - "aaaaaaaa.aaa.a.a", - "aaaaaaaaaaaaa..a", - "a...aaaaaaaa...a", - ".bcb.......aaaaa", - ".cbcbcbcbc.aaaaa", - ".bcbcbcbcb.aaaaa", - ".cbcb...........", - ".bcb.#########.a", - ".cb.#########.aa", - ".b.#########.aaa", - "..#########.aaaa", - "...........aaaaa" -}; -const char **fileopen_xpm = (const char **)fileopen_xpm_data; - -/* XPM */ -static const char *filesave_xpm_data[] = -{ - "14 14 4 1", - ". c #040404", - "# c #808304", - "a c #bfc2bf", - "b c None", - "..............", - ".#.aaaaaaaa.a.", - ".#.aaaaaaaa...", - ".#.aaaaaaaa.#.", - ".#.aaaaaaaa.#.", - ".#.aaaaaaaa.#.", - ".#.aaaaaaaa.#.", - ".##........##.", - ".############.", - ".##.........#.", - ".##......aa.#.", - ".##......aa.#.", - ".##......aa.#.", - "b............." -}; -const char **filesave_xpm = (const char **)filesave_xpm_data; -/* XPM */ -static const char *rundoxygen_xpm_data[] = -{ - "16 16 11 1", -" c None", -". c #000000", -"+ c #DCDCDC", -"@ c #A0A0A0", -"# c #C3C3C3", -"$ c #808080", -"% c #FFA858", -"& c #FFDCA8", -"* c #FFFFC0", -"= c #FFFFFF", -"- c #585858", -" .. ", -" .. .++. .. ", -" .+@.@##@.@+. ", -" .@+$@%%@$+@. ", -" .$%%&%&%$. ", -" ..+@%&$$%&@+.. ", -".+#@%&%@@&*%@#+.", -".$@+$&*&&=*$+@$.", -" .--+$&*=&$+--. ", -" .$#++$$++#$. ", -" .@=$-$++$-$=@. ", -" .+@-..@@..-@+. ", -" ... .+=. ... ", -" .-$. ", -" .. ", -" " -}; - -const char **rundoxygen_xpm = (const char **)rundoxygen_xpm_data; - diff --git a/addon/doxywizard/pixmaps.h b/addon/doxywizard/pixmaps.h deleted file mode 100644 index fa85382..0000000 --- a/addon/doxywizard/pixmaps.h +++ /dev/null @@ -1,27 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2004 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - */ - -#ifndef _PIXMAPS_H -#define _PIXMAPS_H - -extern const char** folder_xpm; -extern const char** file_xpm; -extern const char** add_xpm; -extern const char** del_xpm; -extern const char** update_xpm; -extern const char** fileopen_xpm; -extern const char** filesave_xpm; -extern const char** rundoxygen_xpm; - -#endif diff --git a/addon/doxywizard/version.h b/addon/doxywizard/version.h index d7d5f13..382b523 100644 --- a/addon/doxywizard/version.h +++ b/addon/doxywizard/version.h @@ -1,3 +1,20 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2004 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + #ifndef VERSION_H #define VERSION_H |