summaryrefslogtreecommitdiffstats
path: root/addon/doxywizard/doxywizard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'addon/doxywizard/doxywizard.cpp')
-rw-r--r--addon/doxywizard/doxywizard.cpp1626
1 files changed, 403 insertions, 1223 deletions
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 160ba9c..6d88624 100644
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -1,1415 +1,595 @@
-#include <qlabel.h>
-#include <qhbox.h>
-#include <qvbox.h>
-#include <qlineedit.h>
-#include <qapplication.h>
-#include <qcheckbox.h>
-#include <qpushbutton.h>
-#include <qbuttongroup.h>
-#include <qradiobutton.h>
-#include <qlayout.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>
-
-#include <stdlib.h>
-
-#if defined(Q_OS_MACX)
-#include <CoreFoundation/CFBundle.h>
-#include <ApplicationServices/ApplicationServices.h>
-#undef check
-#endif
-
+#include <QtGui>
#include "doxywizard.h"
-#include "expert.h"
-#include "config.h"
#include "version.h"
+#include "expert.h"
+#include "wizard.h"
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;
-}
-
-void setDotPath()
-{
- // TODO: enable this if we ship dot with doxygen again...
-// Config_getString("DOT_PATH")=getResourcePath();
-}
-
-bool setMscgenPath()
-{
- if (Config_getString("MSCGEN_PATH")!=getResourcePath())
- {
- Config_getString("MSCGEN_PATH")=getResourcePath();
- return TRUE;
- }
- return FALSE;
-}
+MainWindow &MainWindow::instance()
+{
+ static MainWindow theInstance;
+ return theInstance;
+}
+
+MainWindow::MainWindow()
+ : m_settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"))
+{
+ QMenu *file = menuBar()->addMenu(tr("File"));
+ file->addAction(tr("Open..."),
+ this, SLOT(openConfig()), Qt::CTRL+Qt::Key_O);
+ m_recentMenu = file->addMenu(tr("Open recent"));
+ file->addAction(tr("Save"),
+ this, SLOT(saveConfig()), Qt::CTRL+Qt::Key_S);
+ file->addAction(tr("Save as..."),
+ this, SLOT(saveConfigAs()), Qt::SHIFT+Qt::CTRL+Qt::Key_S);
+ file->addAction(tr("Quit"),
+ this, SLOT(quit()), Qt::CTRL+Qt::Key_Q);
+
+ QMenu *settings = menuBar()->addMenu(tr("Settings"));
+ settings->addAction(tr("Reset to factory defaults"),
+ this,SLOT(resetToDefaults()));
+ settings->addAction(tr("Use current settings at startup"),
+ this,SLOT(makeDefaults()));
+
+ QMenu *help = menuBar()->addMenu(tr("Help"));
+ help->addAction(tr("Online manual"),
+ this, SLOT(manual()), Qt::Key_F1);
+ help->addAction(tr("About"),
+ this, SLOT(about()) );
+
+ m_expert = new Expert;
+ m_wizard = new Wizard(m_expert->modelData());
+
+ // ----------- top part ------------------
+ QWidget *topPart = new QWidget;
+ QVBoxLayout *rowLayout = new QVBoxLayout(topPart);
+
+ // select working directory
+ QHBoxLayout *dirLayout = new QHBoxLayout;
+ m_workingDir = new QLineEdit;
+ m_selWorkingDir = new QPushButton(tr("Select..."));
+ dirLayout->addWidget(m_workingDir);
+ dirLayout->addWidget(m_selWorkingDir);
+
+ //------------- bottom part --------------
+ QWidget *runTab = new QWidget;
+ QVBoxLayout *runTabLayout = new QVBoxLayout(runTab);
+
+ // run doxygen
+ QHBoxLayout *runLayout = new QHBoxLayout;
+ m_run = new QPushButton(tr("Run doxygen"));
+ m_run->setEnabled(false);
+ m_runStatus = new QLabel(tr("Status: not running"));
+ m_saveLog = new QPushButton(tr("Save log..."));
+ m_saveLog->setEnabled(false);
+ QPushButton *showSettings = new QPushButton(tr("Show configuration"));
+ runLayout->addWidget(m_run);
+ runLayout->addWidget(m_runStatus);
+ runLayout->addStretch(1);
+ runLayout->addWidget(showSettings);
+ runLayout->addWidget(m_saveLog);
+
+ // output produced by doxygen
+ runTabLayout->addLayout(runLayout);
+ runTabLayout->addWidget(new QLabel(tr("Output produced by doxygen")));
+ QGridLayout *grid = new QGridLayout;
+ m_outputLog = new QTextEdit;
+ m_outputLog->setReadOnly(true);
+ m_outputLog->setFontFamily(QString::fromAscii("courier"));
+ m_outputLog->setMinimumWidth(600);
+ grid->addWidget(m_outputLog,0,0);
+ grid->setColumnStretch(0,1);
+ grid->setRowStretch(0,1);
+ QHBoxLayout *launchLayout = new QHBoxLayout;
+ m_launchHtml = new QPushButton(tr("Show HTML output"));
+ launchLayout->addWidget(m_launchHtml);
+#if 0
+ m_launchPdf = new QPushButton(tr("Show PDF output"));
+ launchLayout->addWidget(m_launchPdf);
#endif
+ launchLayout->addStretch(1);
+ grid->addLayout(launchLayout,1,0);
+ runTabLayout->addLayout(grid);
+ QTabWidget *tabs = new QTabWidget;
+ tabs->addTab(m_wizard,tr("Wizard"));
+ tabs->addTab(m_expert,tr("Expert"));
+ tabs->addTab(runTab,tr("Run"));
-//==========================================================================
-
-Step1::Step1(QWidget *parent) : QWidget(parent,"Step1")
-{
- 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);
-
- 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);
-
- QVBox *col2 = new QVBox( w );
- col2->setSpacing(8);
- m_projName = new QLineEdit(col2);
- m_projNumber = new QLineEdit(col2);
+ rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run")));
+ rowLayout->addLayout(dirLayout);
+ rowLayout->addWidget(new QLabel(tr("Step 2: Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation")));
+ rowLayout->addWidget(tabs);
- bl->addWidget(col1);
- bl->addWidget(col2);
+ setCentralWidget(topPart);
+ statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout);
+ loadSettings();
- layout->addWidget(w);
-
- //---------------------------------------------------
- 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()));
-}
-
-void Step1::selectSourceDir()
-{
- m_sourceDir->setText(QFileDialog::getExistingDirectory(m_sourceDir->text(),this));
-}
-
-void Step1::selectDestinationDir()
-{
- m_destDir->setText(QFileDialog::getExistingDirectory(m_destDir->text(),this));
-}
-
-QString Step1::getProjectName() const
-{
- return m_projName->text();
-}
-
-QString Step1::getProjectNumber() const
-{
- return m_projNumber->text();
-}
-
-QString Step1::getSourceDir() const
-{
- 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);
-}
-
-void Step1::setSourceDir(const QString &dir)
-{
- m_sourceDir->setText(dir);
-}
-
-void Step1::setRecursiveScan(bool enable)
-{
- m_recursive->setChecked(enable);
-}
-
-void Step1::setDestinationDir(const QString &dir)
-{
- m_destDir->setText(dir);
-}
-
-
-//==========================================================================
-
-Step2::Step2(QWidget *parent) : QWidget(parent,"Step2")
-{
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->setSpacing(8);
-
- 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);
-
- //---------------------------------------------------
- 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, 5, 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);
- gbox->addWidget(new QRadioButton("Optimize for C# output",m_optimizeLang),4,0);
- m_optimizeLang->setButton(0);
- layout->addWidget(m_optimizeLang);
-
- layout->addStretch(1);
-}
+ m_runProcess = new QProcess;
+ m_running = false;
+ m_timer = new QTimer;
+ updateLaunchButtonState();
+ m_modified = false;
+ updateTitle();
-bool Step2::crossReferencingEnabled() const
-{
- //printf("Step2::crossReferencingEnabled()=%d\n",m_crossRef->isOn());
- return m_crossRef->isOn();
+ // connect signals and slots
+ connect(tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int)));
+ connect(m_selWorkingDir,SIGNAL(clicked()),SLOT(selectWorkingDir()));
+ connect(m_recentMenu,SIGNAL(triggered(QAction*)),SLOT(openRecent(QAction*)));
+ connect(m_workingDir,SIGNAL(returnPressed()),SLOT(updateWorkingDir()));
+ connect(m_runProcess,SIGNAL(readyReadStandardOutput()),SLOT(readStdout()));
+ connect(m_runProcess,SIGNAL(finished(int, QProcess::ExitStatus)),SLOT(runComplete()));
+ connect(m_timer,SIGNAL(timeout()),SLOT(readStdout()));
+ connect(m_run,SIGNAL(clicked()),SLOT(runDoxygen()));
+ connect(m_launchHtml,SIGNAL(clicked()),SLOT(showHtmlOutput()));
+ connect(m_saveLog,SIGNAL(clicked()),SLOT(saveLog()));
+ connect(showSettings,SIGNAL(clicked()),SLOT(showSettings()));
+ connect(m_expert,SIGNAL(changed()),SLOT(configChanged()));
}
-void Step2::enableCrossReferencing()
+void MainWindow::closeEvent(QCloseEvent *event)
{
- //printf("Step2::enableCrossReferencing()\n");
- m_crossRef->setChecked(TRUE);
+ if (discardUnsavedChanges())
+ {
+ saveSettings();
+ event->accept();
+ }
+ else
+ {
+ event->ignore();
+ }
}
-bool Step2::extractAll() const
+void MainWindow::quit()
{
- //printf("Step2::extractAll()=%d\n",m_extractMode->find(1)->isOn());
- return m_extractMode->find(1)->isOn();
+ if (discardUnsavedChanges())
+ {
+ saveSettings();
+ }
+ QApplication::exit(0);
}
-bool Step2::crossReferencing() const
+void MainWindow::setWorkingDir(const QString &dirName)
{
- return m_crossRef->isChecked();
+ QDir::setCurrent(dirName);
+ m_workingDir->setText(dirName);
+ m_run->setEnabled(!dirName.isEmpty());
}
-OptLang Step2::optimizeFor() const
+void MainWindow::selectWorkingDir()
{
- switch (m_optimizeLang->selectedId())
+ QString dirName = QFileDialog::getExistingDirectory(this,
+ tr("Select working directory"),m_workingDir->text());
+ if (!dirName.isEmpty())
{
- case 0: return Lang_Cpp;
- case 1: return Lang_Java;
- case 2: return Lang_C;
- case 3: return Lang_CS;
+ setWorkingDir(dirName);
}
- return Lang_Cpp;
-}
-
-void Step2::setExtractAll(bool enable)
-{
- //printf("Step2::setExtractAll(%d)\n",enable);
- m_extractMode->setButton(enable?1:0);
}
-void Step2::setCrossReferencing(bool enable)
+void MainWindow::updateWorkingDir()
{
- //printf("Step2::setCrossReferencing(%d)\n",enable);
- m_crossRef->setChecked(enable);
+ setWorkingDir(m_workingDir->text());
}
-void Step2::setOptimizeFor(OptLang lang)
+void MainWindow::manual()
{
- switch (lang)
- {
- case Lang_Cpp: m_optimizeLang->setButton(0); break;
- case Lang_Java: m_optimizeLang->setButton(1); break;
- case Lang_C: m_optimizeLang->setButton(2); break;
- case Lang_CS: m_optimizeLang->setButton(3); break;
- }
+ QDesktopServices::openUrl(QUrl(QString::fromAscii("http://www.doxygen.org/manual.html")));
}
-//==========================================================================
-
-Step3::Step3(QWidget *parent) : QWidget(parent,"Step3")
+void MainWindow::about()
{
- 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);
-
- layout->addStretch(1);
-
- connect(m_latexEnabled,SIGNAL(stateChanged(int)),
- this,SLOT(latexStateChange(int)));
- connect(m_htmlEnabled,SIGNAL(stateChanged(int)),
- this,SLOT(htmlStateChange(int)));
+ QString msg;
+ QTextStream t(&msg,QIODevice::WriteOnly);
+ t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+
+ QString::fromAscii(versionString)+
+ QString::fromAscii(" on your source files.</center><p><br>"
+ "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2008</center><p>"
+ "</qt>");
+ QMessageBox::about(this,tr("Doxygen GUI"),msg);
}
-void Step3::latexStateChange(int state)
+void MainWindow::openConfig()
{
- if (state==QButton::On)
- {
- m_texOptionBox->setEnabled(TRUE);
- }
- else if (state==QButton::Off)
+ if (discardUnsavedChanges(false))
{
- m_texOptionBox->setEnabled(FALSE);
+ QString fn = QFileDialog::getOpenFileName(this,
+ tr("Open configuration file"),
+ m_workingDir->text());
+ if (!fn.isEmpty())
+ {
+ loadConfigFromFile(fn);
+ }
}
}
-void Step3::htmlStateChange(int state)
+void MainWindow::updateConfigFileName(const QString &fileName)
{
- if (state==QButton::On)
- {
- m_htmlOptionBox->setEnabled(TRUE);
- }
- else if (state==QButton::Off)
+ if (m_fileName!=fileName)
{
- m_htmlOptionBox->setEnabled(FALSE);
+ m_fileName = fileName;
+ QString curPath = QFileInfo(fileName).path();
+ setWorkingDir(curPath);
+ addRecentFile(fileName);
+ updateTitle();
}
}
-bool Step3::htmlEnabled() const
-{
- return m_htmlEnabled->isChecked();
-}
-
-bool Step3::latexEnabled() const
+void MainWindow::loadConfigFromFile(const QString & fileName)
{
- return m_latexEnabled->isChecked();
+ m_expert->loadConfig(fileName);
+ m_wizard->refresh();
+ updateConfigFileName(fileName);
+ updateLaunchButtonState();
+ m_modified = false;
+ updateTitle();
}
-bool Step3::manEnabled() const
+void MainWindow::saveConfig(const QString &fileName)
{
- return m_manEnabled->isChecked();
+ if (fileName.isEmpty()) return;
+ QFile f(fileName);
+ if (!f.open(QIODevice::WriteOnly)) return;
+ QTextStream t(&f);
+ m_expert->writeConfig(t,false);
+ updateConfigFileName(fileName);
+ m_modified = false;
+ updateTitle();
}
-bool Step3::rtfEnabled() const
+bool MainWindow::saveConfig()
{
- return m_rtfEnabled->isChecked();
-}
-
-bool Step3::xmlEnabled() const
-{
- return m_xmlEnabled->isChecked();
-}
-
-bool Step3::searchEnabled() const
-{
- return m_searchEnabled->isChecked();
-}
-
-HtmlStyle Step3::htmlStyle() const
-{
- if (m_htmlOptions->find(0)->isOn())
- {
- return HS_Plain;
- }
- else if (m_htmlOptions->find(1)->isOn())
+ if (m_fileName.isEmpty())
{
- return HS_TreeView;
+ return saveConfigAs();
}
- else if (m_htmlOptions->find(2)->isOn())
- {
- return HS_CHM;
- }
- // broken radio button logic
- return HS_Plain;
-}
-
-TexStyle Step3::texStyle() const
-{
- switch (m_texOptions->selectedId())
+ else
{
- case 0: return TS_PDFHyper;
- case 1: return TS_PDF;
- case 2: return TS_PS;
+ saveConfig(m_fileName);
+ return true;
}
- return TS_PDFHyper;
-}
-
-void Step3::setHtmlEnabled(bool enable)
-{
- m_htmlEnabled->setChecked(enable);
-}
-
-void Step3::setLatexEnabled(bool enable)
-{
- m_latexEnabled->setChecked(enable);
}
-void Step3::setManEnabled(bool enable)
+bool MainWindow::saveConfigAs()
{
- m_manEnabled->setChecked(enable);
+ QString fileName = QFileDialog::getSaveFileName(this, QString(),
+ m_workingDir->text()+QString::fromAscii("/Doxyfile"));
+ if (fileName.isEmpty()) return false;
+ saveConfig(fileName);
+ return true;
}
-void Step3::setRtfEnabled(bool enable)
+void MainWindow::makeDefaults()
{
- 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)
+ if (QMessageBox::question(this,tr("Use current setting at startup?"),
+ tr("Do you want to save the current settings "
+ "and use them next time Doxywizard starts?"),
+ QMessageBox::Save|
+ QMessageBox::Cancel)==QMessageBox::Save)
{
- case HS_Plain: m_htmlOptions->setButton(0); break;
- case HS_TreeView: m_htmlOptions->setButton(1); break;
- case HS_CHM: m_htmlOptions->setButton(2); break;
+ //printf("MainWindow:makeDefaults()\n");
+ m_expert->saveSettings(&m_settings);
+ m_settings.setValue(QString::fromAscii("wizard/loadsettings"), true);
}
}
-void Step3::setTexStyle(TexStyle style)
+void MainWindow::resetToDefaults()
{
- switch(style)
+ if (QMessageBox::question(this,tr("Reset settings to their default values?"),
+ tr("Do you want to revert all settings back "
+ "to their original values?"),
+ QMessageBox::Reset|
+ QMessageBox::Cancel)==QMessageBox::Reset)
{
- case TS_PDFHyper: m_texOptions->setButton(0); break;
- case TS_PDF: m_texOptions->setButton(1); break;
- case TS_PS: m_texOptions->setButton(2); break;
+ //printf("MainWindow:resetToDefaults()\n");
+ m_expert->resetToDefaults();
+ m_settings.setValue(QString::fromAscii("wizard/loadsettings"), false);
+ m_wizard->refresh();
}
}
-
-//==========================================================================
-
-Step4::Step4(QWidget *parent) : QWidget(parent,"Step4")
+void MainWindow::loadSettings()
{
- 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);
+ QVariant geometry = m_settings.value(QString::fromAscii("main/geometry"), QVariant::Invalid);
+ QVariant state = m_settings.value(QString::fromAscii("main/state"), QVariant::Invalid);
+ QVariant expState = m_settings.value(QString::fromAscii("expert/state"), QVariant::Invalid);
+ QVariant expState2 = m_settings.value(QString::fromAscii("expert/state2"), QVariant::Invalid);
+ QVariant wizState = m_settings.value(QString::fromAscii("wizard/state"), QVariant::Invalid);
+ QVariant loadSettings = m_settings.value(QString::fromAscii("wizard/loadsettings"), QVariant::Invalid);
+ //QVariant workingDir = m_settings.value(QString::fromAscii("main/defdir"), QVariant::Invalid);
-//#if defined(Q_OS_MACX) // we bundle dot with the mac package
-// m_diagramMode->setButton(2);
-//#else
- m_diagramMode->setButton(1);
-//#endif
- 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())
+ if (geometry !=QVariant::Invalid) restoreGeometry(geometry.toByteArray());
+ if (state !=QVariant::Invalid) restoreState (state.toByteArray());
+ if (expState !=QVariant::Invalid) m_expert->restoreState(expState.toByteArray());
+ if (expState2 !=QVariant::Invalid) m_expert->restoreInnerState(expState2.toByteArray());
+ if (wizState !=QVariant::Invalid) m_wizard->restoreState(wizState.toByteArray());
+ //if (workingDir!=QVariant::Invalid)
+ //{
+ // QString dir = workingDir.toString();
+ // m_workingDir->setText(dir);
+ // QDir::setCurrent(dir);
+ // m_run->setEnabled(!dir.isEmpty());
+ //}
+ if (loadSettings!=QVariant::Invalid && loadSettings.toBool())
{
- case 0: return DM_None;
- case 1: return DM_Builtin;
- case 2: return DM_Dot;
+ m_expert->loadSettings(&m_settings);
}
- 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();
-}
-
-bool Step4::callGraph() const
-{
- return m_dotCall->isChecked();
-}
-
-void Step4::setDiagramMode(DiagramMode mode)
-{
- switch(mode)
+ for (int i=0;i<10;i++)
{
- case DM_None: m_diagramMode->setButton(0); diagramModeChanged(0); break;
- case DM_Builtin: m_diagramMode->setButton(1); diagramModeChanged(1); break;
- case DM_Dot: m_diagramMode->setButton(2); diagramModeChanged(2); break;
+ QString entry = m_settings.value(QString().sprintf("recent/config%d",i)).toString();
+ if (!entry.isEmpty()) addRecentFile(entry);
}
-}
-void Step4::setClassDiagram(bool enable)
-{
- m_dotClass->setChecked(enable);
-}
-
-void Step4::setCollaborationDiagram(bool enable)
-{
- m_dotCollaboration->setChecked(enable);
}
-void Step4::setIncludeGraph(bool enable)
+void MainWindow::saveSettings()
{
- m_dotInclude->setChecked(enable);
-}
+ QSettings settings(QString::fromAscii("Doxygen.org"), QString::fromAscii("Doxywizard"));
-void Step4::setIncludedByGraph(bool enable)
-{
- m_dotIncludedBy->setChecked(enable);
+ m_settings.setValue(QString::fromAscii("main/geometry"), saveGeometry());
+ m_settings.setValue(QString::fromAscii("main/state"), saveState());
+ m_settings.setValue(QString::fromAscii("expert/state"), m_expert->saveState());
+ m_settings.setValue(QString::fromAscii("expert/state2"), m_expert->saveInnerState());
+ m_settings.setValue(QString::fromAscii("wizard/state"), m_wizard->saveState());
}
-void Step4::setInheritanceGraph(bool enable)
+void MainWindow::selectTab(int id)
{
- m_dotInheritance->setChecked(enable);
+ if (id==0) m_wizard->refresh();
}
-void Step4::setCallGraph(bool enable)
+void MainWindow::addRecentFile(const QString &fileName)
{
- m_dotCall->setChecked(enable);
-}
-
-
-//==========================================================================
-
-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();
-}
-
-//==========================================================================
-
-MainWidget::MainWidget(QWidget *parent)
- : QMainWindow(parent,"MainWidget")
-{
- setCaption("Doxygen GUI frontend");
-
- // initialize config settings
- Config::instance()->init();
- Config::instance()->check();
- Config_getBool("HAVE_DOT")=TRUE;
-#if defined(Q_OS_MACX)
- setDotPath();
- setMscgenPath();
-#endif
+ int i=m_recentFiles.indexOf(fileName);
+ if (i!=-1) m_recentFiles.removeAt(i);
- 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("/doxywizard/config/default",QString::null,&ok);
- if (ok && !config.isEmpty())
+ // not found
+ if (m_recentFiles.count() < 10) // append
{
- Config::instance()->parseString("default settings",config);
+ m_recentFiles.prepend(fileName);
}
- QString workingDir = m_settings.readEntry("/doxywizard/config/workingdir",QString::null,&ok);
- if (ok && !workingDir.isEmpty())
+ else // add + drop last item
{
- m_workingDir->setText(workingDir);
+ m_recentFiles.removeLast();
+ m_recentFiles.prepend(fileName);
}
- setConfigSaved(FALSE);
- for (int i=0;i<10;i++)
+ m_recentMenu->clear();
+ i=0;
+ foreach( QString str, m_recentFiles )
{
- QString entry = m_settings.readEntry(QString().sprintf("/doxywizard/recent/config%d",i));
- if (!entry.isEmpty())
- {
- addRecentFile(entry);
- }
+ m_recentMenu->addAction(str);
+ m_settings.setValue(QString().sprintf("recent/config%d",i++),str);
}
-
- 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);
-}
-
-MainWidget::~MainWidget()
-{
- delete m_runProcess;
}
-void MainWidget::selectWorkingDir()
+void MainWindow::openRecent(QAction *action)
{
- QString selectedDir = QFileDialog::getExistingDirectory(m_workingDir->text());
- if (!selectedDir.isEmpty())
+ if (discardUnsavedChanges(false))
{
- m_workingDir->setText(selectedDir);
+ loadConfigFromFile(action->text());
}
}
-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());
-}
-
-void MainWidget::launchWizard()
+void MainWindow::runDoxygen()
{
- Wizard wizard(this);
-
- // -------- Initialize the dialog ----------------
-
- // step1
- wizard.setProjectName(QString::fromLocal8Bit(Config_getString("PROJECT_NAME")));
- wizard.setProjectNumber(QString::fromLocal8Bit(Config_getString("PROJECT_NUMBER")));
- if (Config_getList("INPUT").count()>0)
- {
- QString dirName=Config_getList("INPUT").getFirst();
- QFileInfo fi(dirName);
- if (fi.exists() && fi.isDir())
- {
- wizard.setSourceDir(dirName);
- }
- }
- wizard.setRecursiveScan(Config_getBool("RECURSIVE"));
- wizard.setDestinationDir(QString::fromLocal8Bit(Config_getString("OUTPUT_DIRECTORY")));
-
- // 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);
- }
-
- // 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"))
- {
- wizard.setHtmlStyle(HS_CHM);
- }
- else if (Config_getEnum("GENERATE_TREEVIEW")!="NONE")
- {
- wizard.setHtmlStyle(HS_TreeView);
- }
- else
- {
- wizard.setHtmlStyle(HS_Plain);
- }
- if (Config_getBool("USE_PDFLATEX"))
- {
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- wizard.setTexStyle(TS_PDFHyper);
- }
- else
- {
- wizard.setTexStyle(TS_PDF);
- }
- }
- else
+ if (!m_running)
{
- wizard.setTexStyle(TS_PS);
- }
+ QString doxygenPath;
+#if defined(Q_OS_MACX)
+ doxygenPath = qApp->applicationDirPath()+QString::fromAscii("/../Resources/");
+ qDebug() << tr("Doxygen path: ") << doxygenPath;
+ if ( !QFile(doxygenPath + QString::fromAscii("doxygen")).exists() ) {
+ // No doygen binary in the resources, if there is a system doxygen binary, use that instead
+ if ( QFile(QString::fromAscii("/usr/local/bin/doxygen")).exists() )
+ doxygenPath = QString::fromAscii("/usr/local/bin/");
+ else {
+ qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
+ doxygenPath = QString::fromAscii("");
+ }
+ }
+ qDebug() << tr("Getting doxygen from: ") << doxygenPath;
+#endif
- // 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 ----------------
+ m_runProcess->setReadChannel(QProcess::StandardOutput);
+ m_runProcess->setProcessChannelMode(QProcess::MergedChannels);
+ m_runProcess->setWorkingDirectory(m_workingDir->text());
+ QStringList env=QProcess::systemEnvironment();
+ // set PWD environment variable to m_workingDir
+ env.replaceInStrings(QRegExp(QString::fromAscii("^PWD=(.*)"),Qt::CaseInsensitive),
+ QString::fromAscii("PWD=")+m_workingDir->text());
+ m_runProcess->setEnvironment(env);
- if (wizard.exec()==QDialog::Accepted)
- {
- // -------- Store the results ----------------
+ QStringList args;
+ args << QString::fromAscii("-b"); // make stdout unbuffered
+ args << QString::fromAscii("-"); // read config from stdin
- // step1
- Config_getString("PROJECT_NAME")=wizard.getProjectName().local8Bit();
- 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().local8Bit();
+ m_outputLog->clear();
+ m_runProcess->start(doxygenPath + QString::fromAscii("doxygen"), args);
- // step2
- if (wizard.extractAll())
+ if (!m_runProcess->waitForStarted())
{
- 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;
+ m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
+ return;
}
+ QTextStream t(m_runProcess);
+ m_expert->writeConfig(t,false);
+ m_runProcess->closeWriteChannel();
- if (wizard.crossReferencing())
+ if (m_runProcess->state() == QProcess::NotRunning)
{
- Config_getBool("SOURCE_BROWSER")=TRUE;
- Config_getBool("REFERENCED_BY_RELATION")=TRUE;
- Config_getBool("REFERENCES_RELATION")=TRUE;
- Config_getBool("VERBATIM_HEADERS")=TRUE;
+ m_outputLog->append(QString::fromAscii("*** Failed to run doxygen\n"));
}
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 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 Lang_CS:
- Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=FALSE;
- Config_getBool("OPTIMIZE_OUTPUT_JAVA")=TRUE;
- Config_getBool("EXTRACT_STATIC")=TRUE;
- Config_getBool("EXTRACT_LOCAL_CLASSES")=TRUE;
- break;
- }
-
- // 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_getEnum("GENERATE_TREEVIEW")="NONE";
- break;
- case HS_TreeView:
- Config_getBool("GENERATE_HTMLHELP")=FALSE;
- Config_getEnum("GENERATE_TREEVIEW")="ALL";
- break;
- case HS_CHM:
- Config_getBool("GENERATE_HTMLHELP")=TRUE;
- Config_getEnum("GENERATE_TREEVIEW")="NONE";
- 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 DM_Builtin:
- Config_getBool("CLASS_DIAGRAMS")=TRUE;
- Config_getBool("HAVE_DOT")=FALSE;
- break;
- 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)
- if (Config_getString("DOT_PATH").isEmpty())
- {
- setDotPath();
- }
- if (Config_getString("MSCGEN_PATH").isEmpty())
- {
- setMscgenPath();
+ m_saveLog->setEnabled(false);
+ m_running=true;
+ m_run->setText(tr("Stop doxygen"));
+ m_runStatus->setText(tr("Status: running"));
+ m_timer->start(1000);
}
-#endif
- setConfigSaved(FALSE);
- }
-}
-
-void MainWidget::loadConfigFromFile(const QString &fn)
-{
- if (!Config::instance()->parse(fn))
- {
- QMessageBox::warning(0,"Warning",
- "Could not open or read config file "+fn+"!",
- "abort"
- );
}
else
{
- Config::instance()->convertStrToVal();
-#if 0 //defined(Q_OS_MACX)
- if (checkIfDotInstalled() &&
- qstricmp(Config_getString("DOT_PATH"),DOT_PATH)!=0
- )
- {
- Config_getString("DOT_PATH")=DOT_PATH;
- setConfigSaved(FALSE);
- }
- else
- {
- setConfigSaved(TRUE);
- }
-#else
- setConfigSaved(TRUE);
-#endif
- addRecentFile(fn);
- m_workingDir->setText(QFileInfo(fn).dirPath(TRUE));
- m_configFileName = fn;
-#if defined(Q_OS_MACX)
- //if (Config_getString("DOT_PATH").isEmpty())
- //{
- // setDotPath();
- // setConfigSaved(FALSE);
- //}
- if (Config_getString("MSCGEN_PATH").isEmpty())
- {
- setMscgenPath();
- setConfigSaved(FALSE);
- }
-#endif
- statusBar()->message("New configuration loaded",messageTimeout);
+ m_running=false;
+ m_run->setText(tr("Run doxygen"));
+ m_runStatus->setText(tr("Status: not running"));
+ m_runProcess->kill();
+ m_timer->stop();
+ //updateRunnable(m_workingDir->text());
}
}
-void MainWidget::loadConfigFile()
+void MainWindow::readStdout()
{
- QString fn = QFileDialog::getOpenFileName(m_workingDir->text(),QString::null,this);
- if (!fn.isEmpty())
+ if (m_running)
{
- loadConfigFromFile(fn);
- // set current dir to where the config file is located
- QDir::setCurrent(QFileInfo(fn).dirPath(TRUE));
+ QByteArray data = m_runProcess->readAllStandardOutput();
+ QString text = QString::fromLocal8Bit(data);
+ if (!text.isEmpty())
+ {
+ m_outputLog->append(text.trimmed());
+ }
}
}
-void MainWidget::launchExpert()
-{
- Expert expert(this);
- expert.init();
- expert.exec();
-//#if defined(Q_OS_MACX)
-// setDotPath();
-//#endif
- if (expert.hasChanged()) setConfigSaved(FALSE);
-}
-
-void MainWidget::saveDefaults()
+void MainWindow::runComplete()
{
- 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)
+ if (m_running)
{
- QString newConfig;
- QTextStream t(&newConfig,IO_WriteOnly);
- Config::instance()->writeTemplate(t,TRUE,FALSE);
- m_settings.writeEntry("/doxywizard/config/default",newConfig);
- m_settings.writeEntry("/doxywizard/config/workingdir",m_workingDir->text());
- statusBar()->message("Current configuration saved as default",messageTimeout);
+ m_outputLog->append(tr("*** Doxygen has finished\n"));
}
-}
-
-void MainWidget::saveConfigFile()
-{
- QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/Doxyfile",QString::null,this);
- if (!fn.isEmpty())
+ else
{
- QFile f(fn);
- if (f.exists() && QMessageBox::question(this,
- "Overwrite file? -- Doxywizard",
- "A file called "+fn+" already exists. Do you want to overwrite it?",
- "&Yes","&no",
- QString::null, 0, 1)
- )
- {
- statusBar()->message("Save request aborted",messageTimeout);
- return;
- }
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- Config::instance()->writeTemplate(t,TRUE,FALSE);
- m_configFileName = fn;
- setConfigSaved(TRUE);
- addRecentFile(fn);
- statusBar()->message("Configuration saved",messageTimeout);
- }
- else
- {
- QMessageBox::warning(0,"Warning",
- "Cannot open file "+fn+" for writing. Nothing saved!","ok");
- }
+ m_outputLog->append(tr("*** Cancelled by user\n"));
}
+ m_outputLog->ensureCursorVisible();
+ m_run->setText(tr("Run doxygen"));
+ m_runStatus->setText(tr("Status: not running"));
+ m_running=false;
+ updateLaunchButtonState();
+ //updateRunnable(m_workingDir->text());
+ m_saveLog->setEnabled(true);
}
-void MainWidget::resetConfig()
+void MainWindow::updateLaunchButtonState()
{
- 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)
- {
- // initialize config settings
- Config::instance()->init();
-#if defined(Q_OS_MACX)
- setDotPath();
- setMscgenPath();
+ m_launchHtml->setEnabled(m_expert->htmlOutputPresent(m_workingDir->text()));
+#if 0
+ m_launchPdf->setEnabled(m_expert->pdfOutputPresent(m_workingDir->text()));
#endif
-
- m_configFileName = "";
- setConfigSaved(FALSE);
- statusBar()->message("Configuration settings reset to their defaults",messageTimeout);
- }
}
-void MainWidget::setConfigSaved(bool enable)
+void MainWindow::showHtmlOutput()
{
- m_configSaved=enable;
- if (m_configSaved)
- {
- m_saveStatus->setText("Status: saved");
- }
- else
- {
- m_saveStatus->setText("Status: <font color=\"red\">not saved</font>");
- }
- updateRunnable(m_workingDir->text());
+ QString indexFile = m_expert->getHtmlOutputIndex(m_workingDir->text());
+ QFileInfo fi(indexFile);
+ QString indexUrl(QString::fromAscii("file://")+fi.absoluteFilePath());
+ QDesktopServices::openUrl(QUrl(indexUrl));
}
-void MainWidget::runDoxygen()
+void MainWindow::saveLog()
{
- if (!m_running)
+ QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"),
+ m_workingDir->text()+
+ QString::fromAscii("/doxygen_log.txt"));
+ if (!fn.isEmpty())
{
- 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())
+ QFile f(fn);
+ if (f.open(QIODevice::WriteOnly))
{
- m_outputLog->append(QString("*** Failed to run doxygen\n"));
+ QTextStream t(&f);
+ t << m_outputLog->toPlainText();
+ statusBar()->showMessage(tr("Output log saved"),messageTimeout);
}
else
{
- m_running=TRUE;
- m_run->setText("Cancel");
- m_runStatus->setText("Status: running");
- m_timer->start(1000);
+ QMessageBox::warning(0,tr("Warning"),
+ tr("Cannot open file ")+fn+tr(" for writing. Nothing saved!"),tr("ok"));
}
}
- 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()
+void MainWindow::showSettings()
{
- m_outputLog->append(QString(m_runProcess->readStdout()));
+ QString text;
+ QTextStream t(&text);
+ m_expert->writeConfig(t,true);
+ m_outputLog->clear();
+ m_outputLog->append(text);
+ m_outputLog->ensureCursorVisible();
+ m_saveLog->setEnabled(true);
}
-void MainWidget::runComplete()
+void MainWindow::configChanged()
{
- 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 << QString("<qt><center>A tool to configure and run doxygen version ")+versionString+
- " on your source files.</center><p><br>"
- "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2008</center><p>"
- "</qt>";
- QMessageBox::about(this,"Doxygen GUI",msg);
+ m_modified = true;
+ updateTitle();
}
-void MainWidget::manual()
+void MainWindow::updateTitle()
{
-#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
+ QString title = tr("Doxygen GUI frontend");
+ if (m_modified)
{
- // 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);
- }
+ title+=QString::fromAscii(" +");
}
-
- m_recentMenu->clear();
- int i=0;
- for ( it = m_recentFiles.begin(); it != m_recentFiles.end(); ++it, ++i )
+ if (!m_fileName.isEmpty())
{
- m_recentMenu->insertItem(*it);
- m_settings.writeEntry(QString().sprintf("/doxywizard/recent/config%d",i),*it);
+ title+=QString::fromAscii(" (")+m_fileName+QString::fromAscii(")");
}
+ setWindowTitle(title);
}
-
-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()
+bool MainWindow::discardUnsavedChanges(bool saveOption)
{
- QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/doxygen_log.txt",QString::null,this);
- if (!fn.isEmpty())
+ if (m_modified)
{
- QFile f(fn);
- if (f.open(IO_WriteOnly))
+ QMessageBox::StandardButton button;
+ if (saveOption)
{
- QTextStream t(&f);
- t << m_outputLog->text();
- statusBar()->message("Output log saved",messageTimeout);
+ button = QMessageBox::question(this,
+ tr("Unsaved changes"),
+ tr("Unsaved changes will be lost! Do you want to save the configuration file?"),
+ QMessageBox::Save |
+ QMessageBox::Discard |
+ QMessageBox::Cancel
+ );
+ if (button==QMessageBox::Save)
+ {
+ return saveConfig();
+ }
}
else
{
- QMessageBox::warning(0,"Warning",
- "Cannot open file "+fn+" for writing. Nothing saved!","ok");
+ button = QMessageBox::question(this,
+ tr("Unsaved changes"),
+ tr("Unsaved changes will be lost! Do you want to continue?"),
+ QMessageBox::Discard |
+ QMessageBox::Cancel
+ );
}
+ return button==QMessageBox::Discard;
}
+ return true;
}
-//==========================================================================
+//-----------------------------------------------------------------------
int main(int argc,char **argv)
{
QApplication a(argc,argv);
- MainWidget main;
+ MainWindow &main = MainWindow::instance();
if (argc==2 && argv[1][0]!='-') // name of config file as an argument
{
- main.loadConfigFromFile(argv[1]);
+ main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
}
else if (argc>1)
{
printf("Usage: %s [config file]\n",argv[0]);
exit(1);
}
- a.setMainWidget(&main);
main.show();
return a.exec();
}
-