Commit c1605e5b authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3.7-20040704

parent 6b195c8d
# 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
......
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)
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.3.7-20040617
1.3.7-20040704
......@@ -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
......
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.
/******************************************************************************
*
*
*
* 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>&copy; 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();
}
/******************************************************************************
*
*
*
* 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
......@@ -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 =
/******************************************************************************
*
*
*
* 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());
}
}
......@@ -12,52 +12,71 @@
*
*/
#ifndef _PAGEWIDGET_H
#define _PAGEWIDGET_H
#ifndef EXPERT_H
#define EXPERT_H
#include <qscrollview.h>
#include <qtabdialog.h>
#include <qlist.h>
#include <qdict.h>
class QTabWidget;
class QVBoxLayout;
class IInput;
class QWidget;
class QObject;
class InputBool;
class InputString;
class InputStrList;
class InputFile;
class InputDir;
class InputInt;
class FrameLayout : public QFrame
class ConfigWidget
{
Q_OBJECT
public:
FrameLayout(QWidget *parent=0, const char *name=0, WFlags g=0);
~FrameLayout();
void addStretch(int s=0);
void addWidget(QWidget *w);
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:
QVBoxLayout *lay;
QWidget *m_widget;
Kind m_kind;
};
class PageWidget : public QScrollView
class Expert : public QTabDialog
{
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);
Expert(QWidget *parent=0);
~Expert();
void init();
void addDependency(QDict<QObject> *switches,
const QCString &dep,const QCString &name);
private:
FrameLayout *lay;
QTabWidget *m_parent;
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
......@@ -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();
}
......
......@@ -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); }
......
......@@ -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)
......
......@@ -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);
......
......@@ -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()
......
......@@ -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);
......
......@@ -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()
......
......@@ -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);
......
/******************************************************************************
*
*
*
* 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()));
}
/******************************************************************************
*
*
*
* 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;
/******************************************************************************
*
*
*
* 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
/******************************************************************************
*
*
*
* 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
......
......@@ -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
......
......@@ -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,
......
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
......
......@@ -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",
......
......@@ -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,
......
......@@ -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;
......
......@@ -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
{
......
......@@ -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);
......
......@@ -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
......@@ -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
......@@ -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()
......
......@@ -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
......@@ -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";
}
};
......
......@@ -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));
}
}
}
......
......@@ -1557,6 +1557,7 @@ void generateXML()
}
}
QDir xmlDir(outputDirectory);
createSubDirs(xmlDir);
QCString fileName=outputDirectory+"/index.xsd";
QFile f(fileName);
if (!f.open(IO_WriteOnly))
......
......@@ -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
......
......@@ -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
......
......@@ -40,6 +40,7 @@ TMAKE_LFLAGS_SONAME = -Wl,-soname,
TMAKE_LIBS =
TMAKE_LIBS_QT = -lqt
TMAKE_LIBS_QT_MT = -lqt-mt
TMAKE_MOC = moc
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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") ) {
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment