diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2004-07-04 18:58:02 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2004-07-04 18:58:02 (GMT) |
commit | 285d9c6265b673238b1a97bb7da5ea48aff16beb (patch) | |
tree | 664f7eba133cf2b4d4e8add25229777806fc9b8c | |
parent | d3c3bbd02543280d12a763d82aa5b54ce516c57f (diff) | |
download | Doxygen-285d9c6265b673238b1a97bb7da5ea48aff16beb.zip Doxygen-285d9c6265b673238b1a97bb7da5ea48aff16beb.tar.gz Doxygen-285d9c6265b673238b1a97bb7da5ea48aff16beb.tar.bz2 |
Release-1.3.7-20040704
73 files changed, 2220 insertions, 1093 deletions
@@ -1,4 +1,4 @@ -# Doxyfile 1.3.5 +# Doxyfile 1.3.7 #--------------------------------------------------------------------------- # Project related configuration options @@ -6,6 +6,7 @@ PROJECT_NAME = Doxygen PROJECT_NUMBER = OUTPUT_DIRECTORY = doxygen_docs +CREATE_SUBDIRS = YES OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES @@ -15,6 +16,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = $(PWD)/ +STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO @@ -33,6 +35,7 @@ EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO @@ -44,6 +47,7 @@ SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES @@ -1,7 +1,7 @@ -DOXYGEN Version 1.3.7-20040617 +DOXYGEN Version 1.3.7-20040704 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (17 June 2004) +Dimitri van Heesch (04 July 2004) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.3.7_20040617 +DOXYGEN Version 1.3.7_20040704 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (17 June 2004) +Dimitri van Heesch (dimitri@stack.nl) (04 July 2004) @@ -1 +1 @@ -1.3.7-20040617 +1.3.7-20040704 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 @@ -27,6 +27,7 @@ f_prefix=/usr/local f_insttool=NO f_english=NO f_wizard=NO +f_thread=NO f_langs=nl,se,cz,fr,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,br,dk,sk,ua,gr,tw,sr,ca,lt while test -n "$1"; do @@ -233,21 +234,21 @@ if test "$f_wizard" = YES; then if test -d "/usr/lib/qt3/lib"; then if test -d "/usr/lib/qt3/include"; then if test -x "/usr/lib/qt3/bin/moc"; then - QTDIR="/usr/lib/qt3"; + QTDIR="/usr/lib/qt3" fi fi fi if test -d "/usr/lib/qt2/lib"; then if test -d "/usr/lib/qt2/include"; then if test -x "/usr/lib/qt2/bin/moc"; then - QTDIR="/usr/lib/qt2"; + QTDIR="/usr/lib/qt2" fi fi fi if test -d "/usr/lib/qt/lib"; then if test -d "/usr/lib/qt/include"; then if test -x "/usr/lib/qt/bin/moc"; then - QTDIR="/usr/lib/qt"; + QTDIR="/usr/lib/qt" fi fi fi @@ -260,19 +261,22 @@ if test "$f_wizard" = YES; then exit 2 else if test ! -d "$QTDIR/lib"; then - echo "QTDIR is set, but library directory does not exist!" + echo "QTDIR is set to $QTDIR, but library directory $QTDIR/lib does not exist!" exit 2 fi if test ! -d "$QTDIR/include"; then - echo "QTDIR is set, but include directory does not exist!" + echo "QTDIR is set to $QTDIR, but include directory $QTDIR/include does not exist!" exit 2 fi if test ! -x "$QTDIR/bin/moc"; then - echo "QTDIR is set, but the moc tool could not be found in $QTDIR/bin!" + echo "QTDIR is set to $QTDIR, but the moc tool could not be found in $QTDIR/bin!" exit 2 fi echo " headers $QTDIR/include," echo " libraries $QTDIR/lib" + if test -n "`ls $QTDIR/lib/* | grep qt-mt`"; then + f_thread=YES + fi fi fi @@ -418,6 +422,7 @@ INSTALL = $f_prefix INSTTOOL = $f_insttool DOXYDOCS = .. DOCDIR = $f_docdir +QTDIR = $QTDIR EOF if test "$f_dot" != NO; then @@ -505,10 +510,14 @@ for i in $f_inprofiles ; do EOF if test "$f_debug" = NO; then - cat $SRC .tmakeconfig | sed -e "s/\$extraopts/release/g" >> $DST + realopts="release" else - cat $SRC .tmakeconfig | sed -e "s/\$extraopts/debug/g" >> $DST + realopts="debug" + fi + if test "$f_thread" = YES; then + realopts="$realopts thread" fi + cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" >> $DST echo " Created $DST from $SRC..." done diff --git a/doc/config.doc b/doc/config.doc index f71e636..437a56e 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -239,7 +239,7 @@ followed by the descriptions of the tags grouped by category. <dt>\c CREATE_SUBDIRS <dd> \addindex CREATE_SUBDIRS If the \c CREATE_SUBDIRS tag is set to \c YES, then doxygen will create - 2 levels of 10 sub-directories under the output directory of each output + 4096 sub-directories (in 2 levels) under the output directory of each output format and will distribute the generated files over these directories. Enabling this option can be useful when feeding doxygen a huge amount of source files, where putting all generated files in the same directory would otherwise diff --git a/doc/language.doc b/doc/language.doc index 0f94ac5..6f4df69 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other than English (the default). The output language is chosen through the configuration file (with default name and known as Doxyfile). -Currently (version 1.3.7-20040616), 29 languages +Currently (version 1.3.7), 29 languages are supported (sorted alphabetically): Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French, German, Greek, diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index 07d5f4d..06555d7 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,6 +1,6 @@ Summary: A documentation system for C/C++. Name: doxygen -Version: 1.3.7_20040617 +Version: 1.3.7_20040704 Release: 1 Epoch: 1 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz diff --git a/src/config.l b/src/config.l index 59260ea..5b644a3 100644 --- a/src/config.l +++ b/src/config.l @@ -1348,7 +1348,7 @@ void Config::create() cb = addBool( "CREATE_SUBDIRS", "If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n" - "2 levels of 10 sub-directories under the output directory of each output \n" + "4096 sub-directories (in 2 levels) under the output directory of each output \n" "format and will distribute the generated files over these directories. \n" "Enabling this option can be useful when feeding doxygen a huge amount of source \n" "files, where putting all generated files in the same directory would otherwise \n" @@ -1361,10 +1361,11 @@ void Config::create() "documentation generated by doxygen is written. Doxygen will use this \n" "information to generate all constant output in the proper language. \n" "The default language is English, other supported languages are: \n" - "Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n" - "Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n" - "(Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, \n" - "Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n", + "Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, \n" + "Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, \n" + "Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, \n" + "Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, \n" + "Swedish, and Ukrainian.\n", "English" ); #ifdef LANG_BR @@ -1513,7 +1514,7 @@ void Config::create() "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n" "path before files name in the file list and in the header files. If set \n" "to NO the shortest path that makes the file name unique will be used. \n", - FALSE + TRUE ); cl = addList( "STRIP_FROM_PATH", diff --git a/src/dot.cpp b/src/dot.cpp index c9f54d0..7ebc1dd 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -193,6 +193,48 @@ static bool convertMapFile(QTextStream &t,const char *mapName, return TRUE; } +static QArray<int> * s_newNumber = new QArray<int>(); +static int s_max_newNumber=0; + +inline int reNumberNode(int number, bool doReNumbering) +{ + if (!doReNumbering) + { + return number; + } + else + { + int s = s_newNumber->size(); + if (number>=s) + { + int ns=0; + ns = s * 3 / 2 + 5; // new size + if (number>=ns) // number still doesn't fit + { + ns = number * 3 / 2 + 5; + } + s_newNumber->resize(ns); + for (int i=s;i<ns;i++) // clear new part of the array + { + s_newNumber->at(i)=0; + } + } + int i = s_newNumber->at(number); + if (i == 0) // not yet mapped + { + i = ++s_max_newNumber; // start from 1 + s_newNumber->at(number) = i; + } + return i; + } +} + +static void resetReNumbering() +{ + s_max_newNumber=0; + s_newNumber->resize(s_max_newNumber); +} + static bool readBoundingBoxDot(const char *fileName,int *width,int *height) { QFile f(fileName); @@ -497,14 +539,15 @@ static void writeBoxMemberList(QTextStream &t,char prot,MemberList &ml,ClassDef void DotNode::writeBox(QTextStream &t, GraphType gt, GraphOutputFormat /*format*/, - bool hasNonReachableChildren) + bool hasNonReachableChildren, + bool reNumber) { const char *labCol = m_url.isEmpty() ? "grey75" : // non link ( (hasNonReachableChildren) ? "red" : "black" ); - t << " Node" << m_number << " [label=\""; + t << " Node" << reNumberNode(m_number,reNumber) << " [label=\""; if (Config_getBool("UML_LOOK") && (gt==Inheritance || gt==Collaboration)) { @@ -567,13 +610,14 @@ void DotNode::writeArrow(QTextStream &t, DotNode *cn, EdgeInfo *ei, bool topDown, - bool pointBack + bool pointBack, + bool reNumber ) { t << " Node"; - if (topDown) t << cn->number(); else t << m_number; + if (topDown) t << reNumberNode(cn->number(),reNumber); else t << reNumberNode(m_number,reNumber); t << " -> Node"; - if (topDown) t << m_number; else t << cn->number(); + if (topDown) t << reNumberNode(m_number,reNumber); else t << reNumberNode(cn->number(),reNumber); t << " ["; if (pointBack) t << "dir=back,"; t << "color=\"" << edgeColorMap[ei->m_color] @@ -603,7 +647,8 @@ void DotNode::write(QTextStream &t, bool topDown, bool toChildren, int distance, - bool backArrows + bool backArrows, + bool reNumber ) { //printf("DotNode::write(%d) name=%s this=%p written=%d\n",distance,m_label.data(),this,m_written); @@ -620,7 +665,7 @@ void DotNode::write(QTextStream &t, if (cn->m_distance>distance) hasNonReachableChildren=TRUE; } } - writeBox(t,gt,format,hasNonReachableChildren); + writeBox(t,gt,format,hasNonReachableChildren,reNumber); m_written=TRUE; if (nl) { @@ -634,9 +679,9 @@ void DotNode::write(QTextStream &t, if (cn->m_distance<=distance) { //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data()); - writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows); + writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows,reNumber); } - cn->write(t,gt,format,topDown,toChildren,distance,backArrows); + cn->write(t,gt,format,topDown,toChildren,distance,backArrows,reNumber); } } else // render parents @@ -654,10 +699,11 @@ void DotNode::write(QTextStream &t, pn, pn->m_edgeInfo->at(pn->m_children->findRef(this)), FALSE, - backArrows + backArrows, + reNumber ); } - pn->write(t,gt,format,TRUE,FALSE,distance,backArrows); + pn->write(t,gt,format,TRUE,FALSE,distance,backArrows,reNumber); } } } @@ -946,9 +992,10 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) { if (node->m_subgraphId==n->m_subgraphId) { - node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE); + node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE,TRUE); } } + resetReNumbering(); uchar md5_sig[16]; QCString sigStr(33); MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig); @@ -974,11 +1021,12 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) { if (node->m_subgraphId==n->m_subgraphId) { - node->write(t,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE); + node->write(t,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE,TRUE); } } writeGraphFooter(t); f.close(); + resetReNumbering(); QCString dotArgs(maxCmdLine); dotArgs.sprintf("\"%s\" -T%s -o \"%s\" -Timap -o \"%s\"", @@ -1407,7 +1455,8 @@ void writeDotGraph(DotNode *root, bool lrRank, bool renderParents, int distance, - bool backArrows + bool backArrows, + bool reNumber ) { // generate the graph description for dot @@ -1423,7 +1472,7 @@ void writeDotGraph(DotNode *root, t << " rankdir=LR;" << endl; } root->clearWriteFlag(); - root->write(t,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows); + root->write(t,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows,reNumber); if (renderParents && root->m_parents) { //printf("rendering parents!\n"); @@ -1439,10 +1488,11 @@ void writeDotGraph(DotNode *root, pn, pn->m_edgeInfo->at(pn->m_children->findRef(root)), FALSE, - backArrows + backArrows, + reNumber ); } - pn->write(t,gt,format,TRUE,FALSE,distance,backArrows); + pn->write(t,gt,format,TRUE,FALSE,distance,backArrows,reNumber); } } writeGraphFooter(t); @@ -1462,6 +1512,8 @@ QCString computeMd5Signature(DotNode *root, bool backArrows ) { + bool reNumber=TRUE; + //printf("computeMd5Signature\n"); QString buf; QTextStream md5stream(&buf,IO_WriteOnly); @@ -1470,7 +1522,7 @@ QCString computeMd5Signature(DotNode *root, md5stream << "rankdir=LR;" << endl; } root->clearWriteFlag(); - root->write(md5stream,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows); + root->write(md5stream,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows,reNumber); if (renderParents && root->m_parents) { QListIterator<DotNode> dnli(*root->m_parents); @@ -1485,16 +1537,21 @@ QCString computeMd5Signature(DotNode *root, pn, pn->m_edgeInfo->at(pn->m_children->findRef(root)), FALSE, - backArrows + backArrows, + reNumber ); } - pn->write(md5stream,gt,format,TRUE,FALSE,distance,backArrows); + pn->write(md5stream,gt,format,TRUE,FALSE,distance,backArrows,reNumber); } } uchar md5_sig[16]; QCString sigStr(33); MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig); MD5SigToString(md5_sig,sigStr.data(),33); + if (reNumber) + { + resetReNumbering(); + } //printf("md5: %s | file: %s\n",sigStr,baseName.data()); return sigStr; } @@ -1510,6 +1567,7 @@ static bool findMaximalDotGraph(DotNode *root, bool backArrows /*=TRUE*/ ) { + bool reNumber=TRUE; int minDistance=1; // min distance that shows only direct children. int curDistance; //=QMIN(2,maxDist); // current distance to try int maxDistance=maxDist; // max distance that show whole graph @@ -1526,7 +1584,7 @@ static bool findMaximalDotGraph(DotNode *root, curDistance = (minDistance+maxDistance)/2; writeDotGraph(root,gt,format,baseName,lrRank,renderParents, - curDistance,backArrows); + curDistance,backArrows,reNumber); QCString dotArgs(maxCmdLine); // create annotated dot file @@ -1576,8 +1634,13 @@ static bool findMaximalDotGraph(DotNode *root, hasLRRank, renderParents, lastFit, - backArrows + backArrows, + reNumber ); + if (reNumber) + { + resetReNumbering(); + } return TRUE; } @@ -65,7 +65,7 @@ class DotNode void removeChild(DotNode *n); void removeParent(DotNode *n); void write(QTextStream &t,GraphType gt,GraphOutputFormat f, - bool topDown,bool toChildren,int maxDistance,bool backArrows); + bool topDown,bool toChildren,int maxDistance,bool backArrows,bool reNumber); int m_subgraphId; void clearWriteFlag(); void writeXML(QTextStream &t,bool isClassGraph); @@ -76,9 +76,9 @@ class DotNode private: void colorConnectedNodes(int curColor); void writeBox(QTextStream &t,GraphType gt,GraphOutputFormat f, - bool hasNonReachableChildren); + bool hasNonReachableChildren, bool reNumber=FALSE); void writeArrow(QTextStream &t,GraphType gt,GraphOutputFormat f,DotNode *cn, - EdgeInfo *ei,bool topDown, bool pointBack=TRUE); + EdgeInfo *ei,bool topDown, bool pointBack=TRUE, bool reNumber=FALSE); const DotNode *findDocNode() const; // only works for acyclic graphs! int m_number; QCString m_label; //!< label text @@ -102,7 +102,7 @@ class DotNode DotNode *root, GraphType gt, GraphOutputFormat f, const QCString &baseName, bool lrRank, bool renderParents, - int distance, bool backArrows + int distance, bool backArrows, bool reNumber ); friend QCString computeMd5Signature( DotNode *root, GraphType gt, diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 9449a10..15f10d9 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -810,9 +810,9 @@ static void addClassToContext(Entry *root) } } - // if the class is not in a namespace then we insert - // it in the file definition - if (!found && fd && (root->section & Entry::COMPOUND_MASK)) + // add the class to the file (we do this even if we have already inserted + // it into the namespace) + if (fd && (root->section & Entry::COMPOUND_MASK)) { //printf(">> Inserting class `%s' in file `%s' (root->fileName=`%s')\n", // cd->name().data(), @@ -1677,14 +1677,13 @@ static MemberDef *addVariableToFile( nd->insertMember(md); md->setNamespace(nd); } - else + + // add member to the file (we do this even if we have already inserted + // it into the namespace. + if (fd) { - // find file definition - if (fd) - { - fd->insertMember(md); - md->setFileDef(fd); - } + fd->insertMember(md); + md->setFileDef(fd); } // add member definition to the list of globals @@ -1739,6 +1738,8 @@ static bool isVarWithConstructor(Entry *root) Definition *ctx = 0; FileDef *fd = 0; bool ambig; + int ti; + if (root->parent && root->parent->section&Entry::COMPOUND_MASK) { // inside a class result=FALSE; @@ -1760,6 +1761,10 @@ static bool isVarWithConstructor(Entry *root) type = root->type; if (type.left(6)=="const ") type=type.right(type.length()-6); typeIsClass=getResolvedClass(ctx,fd,type)!=0; + if (!typeIsClass && (ti=type.find('<'))!=-1) + { + typeIsClass=getResolvedClass(ctx,fd,type.left(ti))!=0; + } if (typeIsClass) // now we still have to check if the arguments are // types or values. Since we do not have complete type info // we need to rely on heuristics :-( @@ -2453,9 +2458,11 @@ static void buildFunctionList(Entry *root) nd->insertMember(md); md->setNamespace(nd); } - else if (fd) + + if (fd) { - // add member to the file + // add member to the file (we do this even if we have already + // inserted it into the namespace) fd->insertMember(md); md->setFileDef(fd); } @@ -5367,10 +5374,14 @@ static void findEnums(Entry *root) nd->insertMember(md); md->setNamespace(nd); } - else if (isGlobal) + + // even if we have already added the enum to a namespace, we still + // also want to add it to other appropriate places such as file + // or class. + if (isGlobal) { md->setDefinition(name); - if (fd==0 && root->tagInfo) + if (fd==0 && root->parent) { bool ambig; QCString filePathName = root->parent->fileName; diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 189c102..dd1f6df 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -27,6 +27,9 @@ #include "message.h" #include "config.h" +#define PREFRAG_START "<div class=\"fragment\"><pre>" +#define PREFRAG_END "</pre></div" + static QString htmlAttribsToString(const HtmlAttribList &attribs) { QString result; @@ -189,14 +192,14 @@ void HtmlDocVisitor::visit(DocVerbatim *s) switch(s->type()) { case DocVerbatim::Code: // fall though - m_t << "<pre><div class=\"fragment\">"; + m_t << PREFRAG_START; parseCode(m_ci,s->context(),s->text().latin1(),s->isExample(),s->exampleFile()); - m_t << "</div></pre>"; + m_t << PREFRAG_END; break; case DocVerbatim::Verbatim: - m_t << "<pre><div class=\"fragment\">"; + m_t << PREFRAG_START; filter(s->text()); - m_t << "</div></pre>"; + m_t << PREFRAG_END; break; case DocVerbatim::HtmlOnly: m_t << s->text(); @@ -246,17 +249,17 @@ void HtmlDocVisitor::visit(DocInclude *inc) switch(inc->type()) { case DocInclude::Include: - m_t << "<pre><div class=\"fragment\">"; + m_t << PREFRAG_START; parseCode(m_ci,inc->context(),inc->text().latin1(),inc->isExample(),inc->exampleFile()); - m_t << "</div></pre>"; + m_t << PREFRAG_END; break; case DocInclude::IncWithLines: { - m_t << "<pre><div class=\"fragment\">"; + m_t << PREFRAG_START; QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath(), cfi.fileName() ); parseCode(m_ci,inc->context(),inc->text().latin1(),inc->isExample(),inc->exampleFile(), &fd); - m_t << "</div></pre>"; + m_t << PREFRAG_END; } break; case DocInclude::DontInclude: @@ -265,9 +268,9 @@ void HtmlDocVisitor::visit(DocInclude *inc) m_t << inc->text(); break; case DocInclude::VerbInclude: - m_t << "<pre><div class=\"fragment\">"; + m_t << PREFRAG_START; filter(inc->text()); - m_t << "</div></pre>"; + m_t << PREFRAG_END; break; } } @@ -278,7 +281,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) // op->type(),op->isFirst(),op->isLast(),op->text().data()); if (op->isFirst()) { - if (!m_hide) m_t << "<pre><div class=\"fragment\">"; + if (!m_hide) m_t << PREFRAG_START; pushEnabled(); m_hide=TRUE; } @@ -292,7 +295,7 @@ void HtmlDocVisitor::visit(DocIncOperator *op) if (op->isLast()) { popEnabled(); - if (!m_hide) m_t << "</div></pre>"; + if (!m_hide) m_t << PREFRAG_END; } else { diff --git a/src/scanner.l b/src/scanner.l index 08c116c..16bcd73 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -5500,12 +5500,23 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] } <Doc>"*/" { checkDocs(); - current->doc += "\n\n"; //printf("End of docs at line %d: %s\n",yyLineNr,current->doc.data()); - if (lastDocContext==SkipCurly && Config_getBool("HIDE_IN_BODY_DOCS")) + if (lastDocContext==SkipCurly) { + if (!Config_getBool("HIDE_IN_BODY_DOCS")) + { + if (!previous->doc.isEmpty()) + { + previous->doc+="<p>"; + } + previous->doc += current->doc; + } current->doc.resize(0); } + else + { + current->doc += "\n\n"; + } if (current->section==Entry::GROUPDOC_SEC) { current_root->addSubEntry(current); diff --git a/src/translator_adapter.h b/src/translator_adapter.h index ed33d4a..bf30e2c 100644 --- a/src/translator_adapter.h +++ b/src/translator_adapter.h @@ -352,19 +352,4 @@ class TranslatorAdapter_1_2_2 : public TranslatorAdapter_1_2_4 { return english.trPropertyDocumentation(); } }; -/*! \brief Translator adapter class for release 1.2.1 - * - * Translator adapter for dealing with translator changes since - * release 1.2.1 - */ -class TranslatorAdapter_1_2_1 : public TranslatorAdapter_1_2_2 -{ - public: - virtual QCString updateNeededMessage() - { return createUpdateNeededMessage(idLanguage(),"release 1.2.1"); } - - virtual QCString trDCOPMethods() - { return english.trDCOPMethods(); } -}; - #endif diff --git a/src/translator_cz.h b/src/translator_cz.h index 1280e5c..b7f8e7a 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -18,7 +18,7 @@ #ifndef TRANSLATOR_CZ_H #define TRANSLATOR_CZ_H -// $Id$ +// // // The first translation from English to Czech was started by // Vlastimil Havran (1999--2000). The prototype version of Czech strings @@ -129,6 +129,7 @@ // 2003/08/13 - Four new methods "since 1.3.3" implemented. // 2004/02/26 - trLegendDocs() updated. // 2004/02/27 - Text inside the trCallGraph() corrected. +// 2004/06/16 - The new method "since 1.3.8" implemented. // Todo // ---- @@ -148,7 +149,7 @@ // Windows version. The version which does not call the function is // probably slightly faster. -class TranslatorCzech : public TranslatorAdapter_1_3_8 +class TranslatorCzech : public Translator { private: /*! The decode() inline assumes the source written in the @@ -1660,6 +1661,18 @@ class TranslatorCzech : public TranslatorAdapter_1_3_8 { return decode("Nalezená slova:"); } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return decode("Zdrojový soubor ") + filename; + } + }; #endif // TRANSLATOR_CZ_H diff --git a/src/translator_es.h b/src/translator_es.h index 9aae1fa..06bb493 100644 --- a/src/translator_es.h +++ b/src/translator_es.h @@ -25,7 +25,7 @@ #ifndef TRANSLATOR_ES_H #define TRANSLATOR_ES_H -class TranslatorSpanish : public TranslatorAdapter_1_3_3 +class TranslatorSpanish : public TranslatorAdapter_1_3_8 { public: virtual QCString idLanguage() diff --git a/src/translator_it.h b/src/translator_it.h index 545e734..a94f54e 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -19,6 +19,7 @@ * * Revision history * + * 2004/06: translated new items used since version 1.3.8 * 2003/11: translated new items used since version 1.3.3 * 2003/06: translated new items used since version 1.3.1 * 2003/04: translated new items used since version 1.3 @@ -70,7 +71,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public TranslatorAdapter_1_3_8 +class TranslatorItalian : public Translator { public: @@ -1504,6 +1505,17 @@ class TranslatorItalian : public TranslatorAdapter_1_3_8 return "Corrispondenze:"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return " File sorgente " + filename ; + } + }; #endif diff --git a/src/translator_nl.h b/src/translator_nl.h index 68a5142..11d5ddc 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -18,7 +18,7 @@ #ifndef TRANSLATOR_NL_H #define TRANSLATOR_NL_H -class TranslatorDutch : public TranslatorAdapter_1_3_8 +class TranslatorDutch : public Translator { public: QCString idLanguage() @@ -1143,6 +1143,17 @@ class TranslatorDutch : public TranslatorAdapter_1_3_8 return "Gevonden:"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return filename + " Bron Bestand"; + } + }; diff --git a/src/util.cpp b/src/util.cpp index 1f7bef8..9b89748 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -21,6 +21,8 @@ #include <windows.h> #endif +#include <md5.h> + #include "qtbc.h" #include <qregexp.h> #include <qfileinfo.h> @@ -60,6 +62,19 @@ extern char **environ; //------------------------------------------------------------------------ +// selects one of the name to sub-dir mapping algorithms that is used +// to select a sub directory when CREATE_SUBDIRS is set to YES. + +#define ALGO_COUNT 1 +#define ALGO_CRC16 2 +#define ALGO_MD5 3 + +//#define MAP_ALGO ALGO_COUNT +//#define MAP_ALGO ALGO_CRC16 +#define MAP_ALGO ALGO_MD5 + +//------------------------------------------------------------------------ + struct LookupInfo { LookupInfo(ClassDef *cd=0,MemberDef *td=0,QCString ts="") @@ -326,24 +341,6 @@ QCString replaceAnonymousScopes(const QCString &s) // strip annonymous left hand side part of the scope QCString stripAnonymousNamespaceScope(const QCString &s) { -#if 0 - int oi=0,i=0,p=0; - p=s.find('@'); - if (p==-1) return s; - while (s.at(p)=='@' && (i=s.find("::@",p))!=-1 && - Doxygen::namespaceDict[s.left(i)]!=0) { oi=i; p=i+2; } - if (oi==0) - { - //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.data()); - return s; - } - else - { - //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),s.right(s.length()-oi-2).data()); - return s.right(s.length()-oi-2); - } -#endif - int i,p=0,l; QCString newScope; while ((i=getScopeFragment(s,p,&l))!=-1) @@ -3639,6 +3636,11 @@ QCString convertNameToFile(const char *name,bool allowDots) } if (createSubdirs) { + int l1Dir=0,l2Dir=0; + +#if MAP_ALGO==ALGO_COUNT + // old algorithm, has the problem that after regeneration the + // output can be located in a different dir. if (Doxygen::htmlDirMap==0) { Doxygen::htmlDirMap=new QDict<int>(100003); @@ -3646,20 +3648,31 @@ QCString convertNameToFile(const char *name,bool allowDots) } static int curDirNum=0; int *dirNum = Doxygen::htmlDirMap->find(result); - int l1Dir=0,l2Dir=0; if (dirNum==0) // new name { Doxygen::htmlDirMap->insert(result,new int(curDirNum)); - l1Dir = (curDirNum)%10; - l2Dir = ((curDirNum)/10)%10; + l1Dir = (curDirNum)&0xf; // bits 0-3 + l2Dir = (curDirNum>>4)&0xff; // bits 4-11 curDirNum++; } else // existing name { - l1Dir = (*dirNum)%10; - l2Dir = ((*dirNum)/10)%10; - } - result.prepend(QCString().sprintf("d%d/d%d/",l1Dir,l2Dir)); + l1Dir = (*dirNum)&0xf; // bits 0-3 + l2Dir = ((*dirNum)>>4)&0xff; // bits 4-11 + } +#elif MAP_ALGO==ALGO_CRC16 + // second algorithm based on CRC-16 checksum + int dirNum = qChecksum(result,result.length()); + l1Dir = dirNum&0xf; + l2Dir = (dirNum>>4)&0xff; +#elif MAP_ALGO==ALGO_MD5 + // third algorithm based on MD5 hash + uchar md5_sig[16]; + MD5Buffer((const unsigned char *)result.data(),result.length(),md5_sig); + l1Dir = md5_sig[14]&0xf; + l2Dir = md5_sig[15]; +#endif + result.prepend(QCString().sprintf("d%x/d%02x/",l1Dir,l2Dir)); } return result; } @@ -3690,14 +3703,14 @@ void createSubDirs(QDir &d) { if (Config_getBool("CREATE_SUBDIRS")) { - // create 100 subdirectories + // create 4096 subdirectories int l1,l2; - for (l1=0;l1<10;l1++) + for (l1=0;l1<16;l1++) { - d.mkdir(QString().sprintf("d%d",l1)); - for (l2=0;l2<10;l2++) + d.mkdir(QString().sprintf("d%x",l1)); + for (l2=0;l2<256;l2++) { - d.mkdir(QString().sprintf("d%d/d%d",l1,l2)); + d.mkdir(QString().sprintf("d%x/d%02x",l1,l2)); } } } diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index a1caf10..7ad162d 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -1557,6 +1557,7 @@ void generateXML() } } QDir xmlDir(outputDirectory); + createSubDirs(xmlDir); QCString fileName=outputDirectory+"/index.xsd"; QFile f(fileName); if (!f.open(IO_WriteOnly)) diff --git a/tmake/lib/aix-g++/tmake.conf b/tmake/lib/aix-g++/tmake.conf index b7b0a52..897d509 100755 --- a/tmake/lib/aix-g++/tmake.conf +++ b/tmake/lib/aix-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/aix-xlc/tmake.conf b/tmake/lib/aix-xlc/tmake.conf index e226c14..ef65b37 100755 --- a/tmake/lib/aix-xlc/tmake.conf +++ b/tmake/lib/aix-xlc/tmake.conf @@ -51,6 +51,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/beos-g++/tmake.conf b/tmake/lib/beos-g++/tmake.conf index 14172d6..b6649c9 100755 --- a/tmake/lib/beos-g++/tmake.conf +++ b/tmake/lib/beos-g++/tmake.conf @@ -40,6 +40,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_MOC = moc diff --git a/tmake/lib/bsdi-g++/tmake.conf b/tmake/lib/bsdi-g++/tmake.conf index c3b6de4..65f7316 100755 --- a/tmake/lib/bsdi-g++/tmake.conf +++ b/tmake/lib/bsdi-g++/tmake.conf @@ -48,6 +48,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/dgux-g++/tmake.conf b/tmake/lib/dgux-g++/tmake.conf index f7756e1..f4132d1 100755 --- a/tmake/lib/dgux-g++/tmake.conf +++ b/tmake/lib/dgux-g++/tmake.conf @@ -46,6 +46,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-h, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/freebsd-g++/tmake.conf b/tmake/lib/freebsd-g++/tmake.conf index dd3b3a2..0b3c497 100755 --- a/tmake/lib/freebsd-g++/tmake.conf +++ b/tmake/lib/freebsd-g++/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SHLIB = -shared TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/gnu-g++/tmake.conf b/tmake/lib/gnu-g++/tmake.conf index ef09a86..635bc5c 100755 --- a/tmake/lib/gnu-g++/tmake.conf +++ b/tmake/lib/gnu-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/hpux-acc/tmake.conf b/tmake/lib/hpux-acc/tmake.conf index a8f539d..dbd0c8e 100755 --- a/tmake/lib/hpux-acc/tmake.conf +++ b/tmake/lib/hpux-acc/tmake.conf @@ -46,6 +46,7 @@ TMAKE_HPUX_SHLIB = 1 TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl -lGL TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu TMAKE_LIBS_YACC = -ly diff --git a/tmake/lib/hpux-cc/tmake.conf b/tmake/lib/hpux-cc/tmake.conf index 85b37d0..b5881ec 100755 --- a/tmake/lib/hpux-cc/tmake.conf +++ b/tmake/lib/hpux-cc/tmake.conf @@ -46,6 +46,7 @@ TMAKE_HPUX_SHLIB = 1 TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/hpux-g++/tmake.conf b/tmake/lib/hpux-g++/tmake.conf index cde6172..fb39414 100755 --- a/tmake/lib/hpux-g++/tmake.conf +++ b/tmake/lib/hpux-g++/tmake.conf @@ -46,6 +46,7 @@ TMAKE_HPUX_SHLIB = 1 TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/irix-64/tmake.conf b/tmake/lib/irix-64/tmake.conf index b2027d1..ac0e2fa 100755 --- a/tmake/lib/irix-64/tmake.conf +++ b/tmake/lib/irix-64/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/irix-dcc/tmake.conf b/tmake/lib/irix-dcc/tmake.conf index ae2e504..0fcbaa8 100755 --- a/tmake/lib/irix-dcc/tmake.conf +++ b/tmake/lib/irix-dcc/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/irix-g++/tmake.conf b/tmake/lib/irix-g++/tmake.conf index 4b90f46..2192c71 100755 --- a/tmake/lib/irix-g++/tmake.conf +++ b/tmake/lib/irix-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/irix-n32/tmake.conf b/tmake/lib/irix-n32/tmake.conf index bc05cd2..9d8bcb4 100755 --- a/tmake/lib/irix-n32/tmake.conf +++ b/tmake/lib/irix-n32/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl -lGL TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/irix-o32/tmake.conf b/tmake/lib/irix-o32/tmake.conf index c090518..89b8728 100755 --- a/tmake/lib/irix-o32/tmake.conf +++ b/tmake/lib/irix-o32/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/linux-g++/tmake.conf b/tmake/lib/linux-g++/tmake.conf index c063a01..9f69008 100755 --- a/tmake/lib/linux-g++/tmake.conf +++ b/tmake/lib/linux-g++/tmake.conf @@ -46,6 +46,7 @@ TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_X11SM = -lICE -lSM TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf index c876dbd..39f7845 100755 --- a/tmake/lib/macosx-c++/tmake.conf +++ b/tmake/lib/macosx-c++/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SHLIB = -shared TMAKE_LIBS = TMAKE_LIBS_X11 = TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/netbsd-g++/tmake.conf b/tmake/lib/netbsd-g++/tmake.conf index 5150e64..cad7876 100755 --- a/tmake/lib/netbsd-g++/tmake.conf +++ b/tmake/lib/netbsd-g++/tmake.conf @@ -48,6 +48,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/openbsd-g++/tmake.conf b/tmake/lib/openbsd-g++/tmake.conf index 23e0286..89cdc9b 100755 --- a/tmake/lib/openbsd-g++/tmake.conf +++ b/tmake/lib/openbsd-g++/tmake.conf @@ -48,6 +48,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/osf1-cxx/tmake.conf b/tmake/lib/osf1-cxx/tmake.conf index 44a8493..b3f9a5d 100755 --- a/tmake/lib/osf1-cxx/tmake.conf +++ b/tmake/lib/osf1-cxx/tmake.conf @@ -47,6 +47,7 @@ END TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/osf1-g++/tmake.conf b/tmake/lib/osf1-g++/tmake.conf index 0723af2..e23713e 100755 --- a/tmake/lib/osf1-g++/tmake.conf +++ b/tmake/lib/osf1-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname, TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/qnx-g++/tmake.conf b/tmake/lib/qnx-g++/tmake.conf index 441ec50..4846d68 100755 --- a/tmake/lib/qnx-g++/tmake.conf +++ b/tmake/lib/qnx-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = -lunix TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/sco-g++/tmake.conf b/tmake/lib/sco-g++/tmake.conf index e3946e8..c571f98 100755 --- a/tmake/lib/sco-g++/tmake.conf +++ b/tmake/lib/sco-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/solaris-cc-gcc/tmake.conf b/tmake/lib/solaris-cc-gcc/tmake.conf index 5b0e063..de013a0 100755 --- a/tmake/lib/solaris-cc-gcc/tmake.conf +++ b/tmake/lib/solaris-cc-gcc/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = -lC TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/solaris-cc/tmake.conf b/tmake/lib/solaris-cc/tmake.conf index a9054d0..3dbe810 100755 --- a/tmake/lib/solaris-cc/tmake.conf +++ b/tmake/lib/solaris-cc/tmake.conf @@ -46,6 +46,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl -lGL TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/solaris-g++/tmake.conf b/tmake/lib/solaris-g++/tmake.conf index 5723a91..f4adbcd 100755 --- a/tmake/lib/solaris-g++/tmake.conf +++ b/tmake/lib/solaris-g++/tmake.conf @@ -46,6 +46,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/sunos-g++/tmake.conf b/tmake/lib/sunos-g++/tmake.conf index 322725c..52f9e2d 100755 --- a/tmake/lib/sunos-g++/tmake.conf +++ b/tmake/lib/sunos-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu diff --git a/tmake/lib/ultrix-g++/tmake.conf b/tmake/lib/ultrix-g++/tmake.conf index 8e02cd5..59813eb 100755 --- a/tmake/lib/ultrix-g++/tmake.conf +++ b/tmake/lib/ultrix-g++/tmake.conf @@ -45,6 +45,7 @@ TMAKE_LFLAGS_DEBUG = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu diff --git a/tmake/lib/unix/generic.t b/tmake/lib/unix/generic.t index 53f4e0a..04f7b97 100755 --- a/tmake/lib/unix/generic.t +++ b/tmake/lib/unix/generic.t @@ -47,7 +47,11 @@ if ( !((Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG")) ) { Project("TMAKE_LIBDIR_QT") && Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_QT'); - Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT'); + if ( Config("thread") ) { + Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_MT'); + } else { + Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT'); + } } } if ( Config("opengl") ) { diff --git a/tmake/lib/unixware-g++/tmake.conf b/tmake/lib/unixware-g++/tmake.conf index 3ce338a..d4e063f 100755 --- a/tmake/lib/unixware-g++/tmake.conf +++ b/tmake/lib/unixware-g++/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = -lc TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt diff --git a/tmake/lib/unixware7-cc/tmake.conf b/tmake/lib/unixware7-cc/tmake.conf index 71a2fba..6e239dc 100755 --- a/tmake/lib/unixware7-cc/tmake.conf +++ b/tmake/lib/unixware7-cc/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt diff --git a/tmake/lib/unixware7-g++/tmake.conf b/tmake/lib/unixware7-g++/tmake.conf index bb09eec..44f30a5 100755 --- a/tmake/lib/unixware7-g++/tmake.conf +++ b/tmake/lib/unixware7-g++/tmake.conf @@ -47,6 +47,7 @@ TMAKE_LFLAGS_SONAME = TMAKE_LIBS = -lc TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm TMAKE_LIBS_QT = -lqt +TMAKE_LIBS_QT_MT = -lqt-mt TMAKE_LIBS_QT_OPENGL = -lqgl TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt |