Blame addon/doxywizard/doxywizard.cpp

Packit 1c1d7e
#include "doxywizard.h"
Packit 1c1d7e
#include "version.h"
Packit 1c1d7e
#include "expert.h"
Packit 1c1d7e
#include "wizard.h"
Packit 1c1d7e
Packit 1c1d7e
#include <QMenu>
Packit 1c1d7e
#include <QMenuBar>
Packit 1c1d7e
#include <QPushButton>
Packit 1c1d7e
#include <QMessageBox>
Packit 1c1d7e
#include <QVBoxLayout>
Packit 1c1d7e
#include <QLineEdit>
Packit 1c1d7e
#include <QLabel>
Packit 1c1d7e
#include <QTextBrowser>
Packit 1c1d7e
#include <QStatusBar>
Packit 1c1d7e
#include <QProcess>
Packit 1c1d7e
#include <QTimer>
Packit 1c1d7e
#include <QCloseEvent>
Packit 1c1d7e
#include <QApplication>
Packit 1c1d7e
#include <QDir>
Packit 1c1d7e
#include <QFileDialog>
Packit 1c1d7e
#include <QDesktopServices>
Packit 1c1d7e
#include <QUrl>
Packit 1c1d7e
#include <QTextStream>
Packit 1c1d7e
#include <QDebug>
Packit 1c1d7e
Packit 1c1d7e
#ifdef WIN32
Packit 1c1d7e
#include <windows.h>
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
#define MAX_RECENT_FILES 10
Packit 1c1d7e
Packit 1c1d7e
const int messageTimeout = 5000; //!< status bar message timeout in milliseconds.
Packit 1c1d7e
Packit 1c1d7e
#define APPQT(x) QString::fromLatin1("<qt>
") + x + QString::fromLatin1("
</qt>")
Packit 1c1d7e
Packit 1c1d7e
static QString text1  = QString::fromLatin1("");
Packit 1c1d7e
Packit 1c1d7e
MainWindow &MainWindow::instance()
Packit 1c1d7e
{
Packit 1c1d7e
  static MainWindow *theInstance = new MainWindow;
Packit 1c1d7e
  return *theInstance;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MainWindow::MainWindow()
Packit 1c1d7e
  : m_settings(QString::fromLatin1("Doxygen.org"), QString::fromLatin1("Doxywizard"))
Packit 1c1d7e
{
Packit 1c1d7e
  QMenu *file = menuBar()->addMenu(tr("File"));
Packit 1c1d7e
  file->addAction(tr("Open..."), 
Packit 1c1d7e
                  this, SLOT(openConfig()), Qt::CTRL+Qt::Key_O);
Packit 1c1d7e
  m_recentMenu = file->addMenu(tr("Open recent"));
Packit 1c1d7e
  file->addAction(tr("Save"), 
Packit 1c1d7e
                  this, SLOT(saveConfig()), Qt::CTRL+Qt::Key_S);
Packit 1c1d7e
  file->addAction(tr("Save as..."), 
Packit 1c1d7e
                  this, SLOT(saveConfigAs()), Qt::SHIFT+Qt::CTRL+Qt::Key_S);
Packit 1c1d7e
  file->addAction(tr("Quit"),  
Packit 1c1d7e
                  this, SLOT(quit()), Qt::CTRL+Qt::Key_Q);
Packit 1c1d7e
Packit 1c1d7e
  QMenu *settings = menuBar()->addMenu(tr("Settings"));
Packit 1c1d7e
  settings->addAction(tr("Reset to factory defaults"),
Packit 1c1d7e
                  this,SLOT(resetToDefaults()));
Packit 1c1d7e
  settings->addAction(tr("Use current settings at startup"),
Packit 1c1d7e
                  this,SLOT(makeDefaults()));
Packit 1c1d7e
  settings->addAction(tr("Clear recent list"),
Packit 1c1d7e
                  this,SLOT(clearRecent()));
Packit 1c1d7e
Packit 1c1d7e
  QMenu *help = menuBar()->addMenu(tr("Help"));
Packit 1c1d7e
  help->addAction(tr("Online manual"), 
Packit 1c1d7e
                  this, SLOT(manual()), Qt::Key_F1);
Packit 1c1d7e
  help->addAction(tr("About"), 
Packit 1c1d7e
                  this, SLOT(about()) );
Packit 1c1d7e
Packit 1c1d7e
  m_expert = new Expert;
Packit 1c1d7e
  m_wizard = new Wizard(m_expert->modelData());
Packit 1c1d7e
Packit 1c1d7e
  // ----------- top part ------------------
Packit 1c1d7e
  QWidget *topPart = new QWidget;
Packit 1c1d7e
  QVBoxLayout *rowLayout = new QVBoxLayout(topPart);
Packit 1c1d7e
Packit 1c1d7e
  // select working directory
Packit 1c1d7e
  QHBoxLayout *dirLayout = new QHBoxLayout;
Packit 1c1d7e
  m_workingDir = new QLineEdit;
Packit 1c1d7e
  m_selWorkingDir = new QPushButton(tr("Select..."));
Packit 1c1d7e
  dirLayout->addWidget(m_workingDir);
Packit 1c1d7e
  dirLayout->addWidget(m_selWorkingDir);
Packit 1c1d7e
Packit 1c1d7e
  //------------- bottom part --------------
Packit 1c1d7e
  QWidget *runTab = new QWidget;
Packit 1c1d7e
  QVBoxLayout *runTabLayout = new QVBoxLayout(runTab);
Packit 1c1d7e
Packit 1c1d7e
  // run doxygen
Packit 1c1d7e
  QHBoxLayout *runLayout = new QHBoxLayout;
Packit 1c1d7e
  m_run = new QPushButton(tr("Run doxygen"));
Packit 1c1d7e
  m_run->setEnabled(false);
Packit 1c1d7e
  m_runStatus = new QLabel(tr("Status: not running"));
Packit 1c1d7e
  m_saveLog = new QPushButton(tr("Save log..."));
Packit 1c1d7e
  m_saveLog->setEnabled(false);
Packit 1c1d7e
  QPushButton *showSettings = new QPushButton(tr("Show configuration"));
Packit 1c1d7e
  runLayout->addWidget(m_run);
Packit 1c1d7e
  runLayout->addWidget(m_runStatus);
Packit 1c1d7e
  runLayout->addStretch(1);
Packit 1c1d7e
  runLayout->addWidget(showSettings);
Packit 1c1d7e
  runLayout->addWidget(m_saveLog);
Packit 1c1d7e
Packit 1c1d7e
  // output produced by Doxygen
Packit 1c1d7e
  runTabLayout->addLayout(runLayout);
Packit 1c1d7e
  runTabLayout->addWidget(new QLabel(tr("Output produced by doxygen")));
Packit 1c1d7e
  QGridLayout *grid = new QGridLayout;
Packit 1c1d7e
  //m_outputLog = new QTextEdit;
Packit 1c1d7e
  m_outputLog = new QTextBrowser;
Packit 1c1d7e
  //m_outputLog = new QPlainTextEdit;
Packit 1c1d7e
  m_outputLog->setReadOnly(true);
Packit 1c1d7e
  m_outputLog->setFontFamily(QString::fromLatin1("courier"));
Packit 1c1d7e
  m_outputLog->setMinimumWidth(600);
Packit 1c1d7e
  grid->addWidget(m_outputLog,0,0);
Packit 1c1d7e
  grid->setColumnStretch(0,1);
Packit 1c1d7e
  grid->setRowStretch(0,1);
Packit 1c1d7e
  QHBoxLayout *launchLayout = new QHBoxLayout;
Packit 1c1d7e
  m_launchHtml = new QPushButton(tr("Show HTML output"));
Packit 1c1d7e
  launchLayout->addWidget(m_launchHtml);
Packit 1c1d7e
Packit 1c1d7e
  launchLayout->addStretch(1);
Packit 1c1d7e
  grid->addLayout(launchLayout,1,0);
Packit 1c1d7e
  runTabLayout->addLayout(grid);
Packit 1c1d7e
Packit 1c1d7e
  m_tabs = new QTabWidget;
Packit 1c1d7e
  m_tabs->addTab(m_wizard,tr("Wizard"));
Packit 1c1d7e
  m_tabs->addTab(m_expert,tr("Expert"));
Packit 1c1d7e
  m_tabs->addTab(runTab,tr("Run"));
Packit 1c1d7e
Packit 1c1d7e
  rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run")));
Packit 1c1d7e
  rowLayout->addLayout(dirLayout);
Packit 1c1d7e
  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")));
Packit 1c1d7e
  rowLayout->addWidget(m_tabs);
Packit 1c1d7e
Packit 1c1d7e
  setCentralWidget(topPart);
Packit 1c1d7e
  statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout);
Packit 1c1d7e
Packit 1c1d7e
  m_runProcess = new QProcess;
Packit 1c1d7e
  m_running = false;
Packit 1c1d7e
  m_timer = new QTimer;
Packit 1c1d7e
Packit 1c1d7e
  // connect signals and slots
Packit 1c1d7e
  connect(m_tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int)));
Packit 1c1d7e
  connect(m_selWorkingDir,SIGNAL(clicked()),SLOT(selectWorkingDir()));
Packit 1c1d7e
  connect(m_recentMenu,SIGNAL(triggered(QAction*)),SLOT(openRecent(QAction*)));
Packit 1c1d7e
  connect(m_workingDir,SIGNAL(returnPressed()),SLOT(updateWorkingDir()));
Packit 1c1d7e
  connect(m_runProcess,SIGNAL(readyReadStandardOutput()),SLOT(readStdout()));
Packit 1c1d7e
  connect(m_runProcess,SIGNAL(finished(int, QProcess::ExitStatus)),SLOT(runComplete()));
Packit 1c1d7e
  connect(m_timer,SIGNAL(timeout()),SLOT(readStdout()));
Packit 1c1d7e
  connect(m_run,SIGNAL(clicked()),SLOT(runDoxygen()));
Packit 1c1d7e
  connect(m_launchHtml,SIGNAL(clicked()),SLOT(showHtmlOutput()));
Packit 1c1d7e
  connect(m_saveLog,SIGNAL(clicked()),SLOT(saveLog()));
Packit 1c1d7e
  connect(showSettings,SIGNAL(clicked()),SLOT(showSettings()));
Packit 1c1d7e
  connect(m_expert,SIGNAL(changed()),SLOT(configChanged()));
Packit 1c1d7e
  connect(m_wizard,SIGNAL(done()),SLOT(selectRunTab()));
Packit 1c1d7e
  connect(m_expert,SIGNAL(done()),SLOT(selectRunTab()));
Packit 1c1d7e
Packit 1c1d7e
  loadSettings();
Packit 1c1d7e
  updateLaunchButtonState();
Packit 1c1d7e
  m_modified = false;
Packit 1c1d7e
  updateTitle();
Packit 1c1d7e
  m_wizard->refresh();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::closeEvent(QCloseEvent *event)
Packit 1c1d7e
{
Packit 1c1d7e
  if (discardUnsavedChanges())
Packit 1c1d7e
  {
Packit 1c1d7e
    saveSettings();
Packit 1c1d7e
    event->accept();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    event->ignore();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::quit()
Packit 1c1d7e
{
Packit 1c1d7e
  if (discardUnsavedChanges())
Packit 1c1d7e
  {
Packit 1c1d7e
    saveSettings();
Packit 1c1d7e
  }
Packit 1c1d7e
  QApplication::exit(0);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::setWorkingDir(const QString &dirName)
Packit 1c1d7e
{
Packit 1c1d7e
    QDir::setCurrent(dirName);
Packit 1c1d7e
    m_workingDir->setText(dirName);
Packit 1c1d7e
    m_run->setEnabled(!dirName.isEmpty());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::selectWorkingDir()
Packit 1c1d7e
{
Packit 1c1d7e
  QString dirName = QFileDialog::getExistingDirectory(this,
Packit 1c1d7e
        tr("Select working directory"),m_workingDir->text());
Packit 1c1d7e
  if (!dirName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    setWorkingDir(dirName);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::updateWorkingDir()
Packit 1c1d7e
{
Packit 1c1d7e
  setWorkingDir(m_workingDir->text());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::manual()
Packit 1c1d7e
{
Packit 1c1d7e
  QDesktopServices::openUrl(QUrl(QString::fromLatin1("http://www.doxygen.org/manual.html")));
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::about()
Packit 1c1d7e
{
Packit 1c1d7e
  QString msg;
Packit 1c1d7e
  QTextStream t(&msg,QIODevice::WriteOnly);
Packit 1c1d7e
  t << QString::fromLatin1("<qt><center>A tool to configure and run doxygen version ")+
Packit 1c1d7e
       QString::fromLatin1(versionString)+
Packit 1c1d7e
       QString::fromLatin1(" on your source files.</center>


"

Packit 1c1d7e
       "<center>Written by
Dimitri van Heesch
© 2000-2015</center>

"

Packit 1c1d7e
       "</qt>");
Packit 1c1d7e
  QMessageBox::about(this,tr("Doxygen GUI"),msg);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::openConfig()
Packit 1c1d7e
{
Packit 1c1d7e
  if (discardUnsavedChanges(false))
Packit 1c1d7e
  {
Packit 1c1d7e
    QString fn = QFileDialog::getOpenFileName(this,
Packit 1c1d7e
        tr("Open configuration file"),
Packit 1c1d7e
        m_workingDir->text());
Packit 1c1d7e
    if (!fn.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      loadConfigFromFile(fn);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::updateConfigFileName(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_fileName!=fileName)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_fileName = fileName;
Packit 1c1d7e
    QString curPath = QFileInfo(fileName).path();
Packit 1c1d7e
    setWorkingDir(curPath);
Packit 1c1d7e
    addRecentFile(fileName);
Packit 1c1d7e
    updateTitle();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::loadConfigFromFile(const QString & fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  // save full path info of original file
Packit 1c1d7e
  QString absFileName = QFileInfo(fileName).absoluteFilePath();
Packit 1c1d7e
  // updates the current directory
Packit 1c1d7e
  updateConfigFileName(fileName);
Packit 1c1d7e
  // open the specified configuration file
Packit 1c1d7e
  m_expert->loadConfig(absFileName);
Packit 1c1d7e
  m_wizard->refresh();
Packit 1c1d7e
  updateLaunchButtonState();
Packit 1c1d7e
  m_modified = false;
Packit 1c1d7e
  updateTitle();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::saveConfig(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (fileName.isEmpty()) return;
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(QIODevice::WriteOnly)) 
Packit 1c1d7e
  {
Packit 1c1d7e
    QMessageBox::warning(this,
Packit 1c1d7e
        tr("Error saving"),
Packit 1c1d7e
        tr("Error: cannot open the file ")+fileName+tr(" for writing!\n")+
Packit 1c1d7e
        tr("Reason given: ")+f.error());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  QTextStream t(&f);
Packit 1c1d7e
  m_expert->writeConfig(t,false);
Packit 1c1d7e
  updateConfigFileName(fileName);
Packit 1c1d7e
  m_modified = false;
Packit 1c1d7e
  updateTitle();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool MainWindow::saveConfig()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_fileName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    return saveConfigAs();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    saveConfig(m_fileName);
Packit 1c1d7e
    return true;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool MainWindow::saveConfigAs()
Packit 1c1d7e
{
Packit 1c1d7e
  QString fileName = QFileDialog::getSaveFileName(this, QString(), 
Packit 1c1d7e
             m_workingDir->text()+QString::fromLatin1("/Doxyfile"));
Packit 1c1d7e
  if (fileName.isEmpty()) return false;
Packit 1c1d7e
  saveConfig(fileName);
Packit 1c1d7e
  return true;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::makeDefaults()
Packit 1c1d7e
{
Packit 1c1d7e
  if (QMessageBox::question(this,tr("Use current setting at startup?"),
Packit 1c1d7e
                        tr("Do you want to save the current settings "
Packit 1c1d7e
                           "and use them next time Doxywizard starts?"),
Packit 1c1d7e
                        QMessageBox::Save|
Packit 1c1d7e
                        QMessageBox::Cancel)==QMessageBox::Save)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("MainWindow:makeDefaults()\n");
Packit 1c1d7e
    m_expert->saveSettings(&m_settings);
Packit 1c1d7e
    m_settings.setValue(QString::fromLatin1("wizard/loadsettings"), true);
Packit 1c1d7e
    m_settings.sync();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::clearRecent()
Packit 1c1d7e
{
Packit 1c1d7e
  if (QMessageBox::question(this,tr("Clear the list of recent files?"),
Packit 1c1d7e
                        tr("Do you want to clear the list of recently "
Packit 1c1d7e
                           "loaded configuration files?"),
Packit 1c1d7e
                        QMessageBox::Yes|
Packit 1c1d7e
                        QMessageBox::Cancel)==QMessageBox::Yes)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_recentMenu->clear();
Packit 1c1d7e
    m_recentFiles.clear();
Packit 1c1d7e
    for (int i=0;i
Packit 1c1d7e
    {
Packit 1c1d7e
      m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
Packit 1c1d7e
    }
Packit 1c1d7e
    m_settings.sync();
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::resetToDefaults()
Packit 1c1d7e
{
Packit 1c1d7e
  if (QMessageBox::question(this,tr("Reset settings to their default values?"),
Packit 1c1d7e
                        tr("Do you want to revert all settings back "
Packit 1c1d7e
                           "to their original values?"),
Packit 1c1d7e
                        QMessageBox::Reset|
Packit 1c1d7e
                        QMessageBox::Cancel)==QMessageBox::Reset)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("MainWindow:resetToDefaults()\n");
Packit 1c1d7e
    m_expert->resetToDefaults();
Packit 1c1d7e
    m_settings.setValue(QString::fromLatin1("wizard/loadsettings"), false);
Packit 1c1d7e
    m_settings.sync();
Packit 1c1d7e
    m_wizard->refresh();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::loadSettings()
Packit 1c1d7e
{
Packit 1c1d7e
  QVariant geometry     = m_settings.value(QString::fromLatin1("main/geometry"), QVariant::Invalid);
Packit 1c1d7e
  QVariant state        = m_settings.value(QString::fromLatin1("main/state"),    QVariant::Invalid);
Packit 1c1d7e
  QVariant wizState     = m_settings.value(QString::fromLatin1("wizard/state"),  QVariant::Invalid);
Packit 1c1d7e
  QVariant loadSettings = m_settings.value(QString::fromLatin1("wizard/loadsettings"),  QVariant::Invalid);
Packit 1c1d7e
  QVariant workingDir   = m_settings.value(QString::fromLatin1("wizard/workingdir"), QVariant::Invalid);
Packit 1c1d7e
Packit 1c1d7e
  if (geometry  !=QVariant::Invalid) restoreGeometry(geometry.toByteArray());
Packit 1c1d7e
  if (state     !=QVariant::Invalid) restoreState   (state.toByteArray());
Packit 1c1d7e
  if (wizState  !=QVariant::Invalid) m_wizard->restoreState(wizState.toByteArray());
Packit 1c1d7e
  if (loadSettings!=QVariant::Invalid && loadSettings.toBool())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_expert->loadSettings(&m_settings);
Packit 1c1d7e
    if (workingDir!=QVariant::Invalid && QDir(workingDir.toString()).exists())
Packit 1c1d7e
    {
Packit 1c1d7e
      setWorkingDir(workingDir.toString());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  /* due to prepend use list in reversed order */
Packit 1c1d7e
  for (int i=MAX_RECENT_FILES;i>=0;i--)
Packit 1c1d7e
  {
Packit 1c1d7e
    QString entry = m_settings.value(QString().sprintf("recent/config%d",i)).toString();
Packit 1c1d7e
    if (!entry.isEmpty() && QFileInfo(entry).exists())
Packit 1c1d7e
    {
Packit 1c1d7e
      addRecentFileList(entry);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  updateRecentFile();
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::saveSettings()
Packit 1c1d7e
{
Packit 1c1d7e
  QSettings settings(QString::fromLatin1("Doxygen.org"), QString::fromLatin1("Doxywizard"));
Packit 1c1d7e
Packit 1c1d7e
  m_settings.setValue(QString::fromLatin1("main/geometry"), saveGeometry());
Packit 1c1d7e
  m_settings.setValue(QString::fromLatin1("main/state"),    saveState());
Packit 1c1d7e
  m_settings.setValue(QString::fromLatin1("wizard/state"),  m_wizard->saveState());
Packit 1c1d7e
  m_settings.setValue(QString::fromLatin1("wizard/workingdir"), m_workingDir->text());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::selectTab(int id)
Packit 1c1d7e
{
Packit 1c1d7e
  if (id==0) m_wizard->refresh();
Packit 1c1d7e
  else if (id==1) m_expert->refresh();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::selectRunTab()
Packit 1c1d7e
{
Packit 1c1d7e
  m_tabs->setCurrentIndex(2);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::addRecentFile(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  addRecentFileList(fileName);
Packit 1c1d7e
  updateRecentFile();
Packit 1c1d7e
}
Packit 1c1d7e
void MainWindow::addRecentFileList(const QString &fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  int i=m_recentFiles.indexOf(fileName);
Packit 1c1d7e
  if (i!=-1) m_recentFiles.removeAt(i);
Packit 1c1d7e
  
Packit 1c1d7e
  // not found
Packit 1c1d7e
  if (m_recentFiles.count() < MAX_RECENT_FILES) // append
Packit 1c1d7e
  {
Packit 1c1d7e
    m_recentFiles.prepend(fileName);
Packit 1c1d7e
  }
Packit 1c1d7e
  else // add + drop last item
Packit 1c1d7e
  {
Packit 1c1d7e
    m_recentFiles.removeLast();
Packit 1c1d7e
    m_recentFiles.prepend(fileName);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
void MainWindow::updateRecentFile(void)
Packit 1c1d7e
{
Packit 1c1d7e
  m_recentMenu->clear();
Packit 1c1d7e
  int i=0;
Packit 1c1d7e
  foreach( QString str, m_recentFiles ) 
Packit 1c1d7e
  {
Packit 1c1d7e
    m_recentMenu->addAction(str);
Packit 1c1d7e
    m_settings.setValue(QString().sprintf("recent/config%d",i++),str);
Packit 1c1d7e
  }
Packit 1c1d7e
  for (;i
Packit 1c1d7e
  {
Packit 1c1d7e
    m_settings.setValue(QString().sprintf("recent/config%d",i++),QString::fromLatin1(""));
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::openRecent(QAction *action)
Packit 1c1d7e
{
Packit 1c1d7e
  if (discardUnsavedChanges(false))
Packit 1c1d7e
  {
Packit 1c1d7e
    loadConfigFromFile(action->text());
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::runDoxygen()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_running)
Packit 1c1d7e
  {
Packit 1c1d7e
    QString doxygenPath; 
Packit 1c1d7e
#if defined(Q_OS_MACX)
Packit 1c1d7e
    doxygenPath = qApp->applicationDirPath()+QString::fromLatin1("/../Resources/");
Packit 1c1d7e
    qDebug() << tr("Doxygen path: ") << doxygenPath;
Packit 1c1d7e
    if ( !QFile(doxygenPath + QString::fromLatin1("doxygen")).exists() ) 
Packit 1c1d7e
    {
Packit 1c1d7e
      // No Doxygen binary in the resources, if there is a system Doxygen binary, use that instead
Packit 1c1d7e
      if ( QFile(QString::fromLatin1("/usr/local/bin/doxygen")).exists() )
Packit 1c1d7e
      {
Packit 1c1d7e
        doxygenPath = QString::fromLatin1("/usr/local/bin/");
Packit 1c1d7e
      }
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
        qDebug() << tr("Can't find the doxygen command, make sure it's in your $$PATH");
Packit 1c1d7e
        doxygenPath = QString::fromLatin1("");
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    qDebug() << tr("Getting doxygen from: ") << doxygenPath;
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
    m_runProcess->setReadChannel(QProcess::StandardOutput);
Packit 1c1d7e
    m_runProcess->setProcessChannelMode(QProcess::MergedChannels);
Packit 1c1d7e
    m_runProcess->setWorkingDirectory(m_workingDir->text());
Packit 1c1d7e
    QStringList env=QProcess::systemEnvironment();
Packit 1c1d7e
    // set PWD environment variable to m_workingDir
Packit 1c1d7e
    env.replaceInStrings(QRegExp(QString::fromLatin1("^PWD=(.*)"),Qt::CaseInsensitive), 
Packit 1c1d7e
                         QString::fromLatin1("PWD=")+m_workingDir->text());
Packit 1c1d7e
    m_runProcess->setEnvironment(env);
Packit 1c1d7e
Packit 1c1d7e
    QStringList args;
Packit 1c1d7e
    args << QString::fromLatin1("-b"); // make stdout unbuffered
Packit 1c1d7e
    args << QString::fromLatin1("-");  // read config from stdin
Packit 1c1d7e
Packit 1c1d7e
    m_outputLog->clear();
Packit 1c1d7e
    text1  = QString::fromLatin1("");
Packit 1c1d7e
    m_runProcess->start(doxygenPath + QString::fromLatin1("doxygen"), args);
Packit 1c1d7e
Packit 1c1d7e
    if (!m_runProcess->waitForStarted())
Packit 1c1d7e
    {
Packit 1c1d7e
      m_outputLog->append(APPQT(QString::fromLatin1("*** Failed to run doxygen\n")));
Packit 1c1d7e
      return;
Packit 1c1d7e
    }
Packit 1c1d7e
    QTextStream t(m_runProcess);
Packit 1c1d7e
    m_expert->writeConfig(t,false);
Packit 1c1d7e
    m_runProcess->closeWriteChannel();
Packit 1c1d7e
Packit 1c1d7e
    if (m_runProcess->state() == QProcess::NotRunning)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_outputLog->append(APPQT(QString::fromLatin1("*** Failed to run doxygen\n")));
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      m_saveLog->setEnabled(false);
Packit 1c1d7e
      m_running=true;
Packit 1c1d7e
      m_run->setText(tr("Stop doxygen"));
Packit 1c1d7e
      m_runStatus->setText(tr("Status: running"));
Packit 1c1d7e
      m_timer->start(1000);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_running=false;
Packit 1c1d7e
    m_run->setText(tr("Run doxygen"));
Packit 1c1d7e
    m_runStatus->setText(tr("Status: not running"));
Packit 1c1d7e
    m_runProcess->kill();
Packit 1c1d7e
    m_timer->stop();
Packit 1c1d7e
    //updateRunnable(m_workingDir->text());
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::readStdout()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_running)
Packit 1c1d7e
  {
Packit 1c1d7e
    QByteArray data = m_runProcess->readAllStandardOutput();
Packit 1c1d7e
    QString text = QString::fromUtf8(data);
Packit 1c1d7e
    if (!text.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      text1 += text;
Packit 1c1d7e
      m_outputLog->clear();
Packit 1c1d7e
      m_outputLog->append(APPQT(text1.trimmed()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::runComplete()
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_running)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_outputLog->append(APPQT(tr("*** Doxygen has finished\n")));
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_outputLog->append(APPQT(tr("*** Cancelled by user\n")));
Packit 1c1d7e
  }
Packit 1c1d7e
  m_outputLog->ensureCursorVisible();
Packit 1c1d7e
  m_run->setText(tr("Run doxygen"));
Packit 1c1d7e
  m_runStatus->setText(tr("Status: not running"));
Packit 1c1d7e
  m_running=false;
Packit 1c1d7e
  updateLaunchButtonState();
Packit 1c1d7e
  //updateRunnable(m_workingDir->text());
Packit 1c1d7e
  m_saveLog->setEnabled(true);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::updateLaunchButtonState()
Packit 1c1d7e
{
Packit 1c1d7e
  m_launchHtml->setEnabled(m_expert->htmlOutputPresent(m_workingDir->text()));
Packit 1c1d7e
#if 0
Packit 1c1d7e
  m_launchPdf->setEnabled(m_expert->pdfOutputPresent(m_workingDir->text()));
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::showHtmlOutput()
Packit 1c1d7e
{
Packit 1c1d7e
  QString indexFile = m_expert->getHtmlOutputIndex(m_workingDir->text());
Packit 1c1d7e
  QFileInfo fi(indexFile);
Packit 1c1d7e
  // TODO: the following doesn't seem to work with IE
Packit 1c1d7e
#ifdef WIN32
Packit 1c1d7e
  //QString indexUrl(QString::fromLatin1("file:///"));
Packit 1c1d7e
  ShellExecute(NULL, L"open", (LPCWSTR)fi.absoluteFilePath().utf16(), NULL, NULL, SW_SHOWNORMAL);
Packit 1c1d7e
#else
Packit 1c1d7e
  QString indexUrl(QString::fromLatin1("file://"));
Packit 1c1d7e
  indexUrl+=fi.absoluteFilePath();
Packit 1c1d7e
  QDesktopServices::openUrl(QUrl(indexUrl));
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::saveLog()
Packit 1c1d7e
{
Packit 1c1d7e
  QString fn = QFileDialog::getSaveFileName(this, tr("Save log file"), 
Packit 1c1d7e
        m_workingDir->text()+
Packit 1c1d7e
        QString::fromLatin1("/doxygen_log.txt"));
Packit 1c1d7e
  if (!fn.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    QFile f(fn);
Packit 1c1d7e
    if (f.open(QIODevice::WriteOnly))
Packit 1c1d7e
    {
Packit 1c1d7e
      QTextStream t(&f);
Packit 1c1d7e
      t << m_outputLog->toPlainText();
Packit 1c1d7e
      statusBar()->showMessage(tr("Output log saved"),messageTimeout);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      QMessageBox::warning(0,tr("Warning"),
Packit 1c1d7e
          tr("Cannot open file ")+fn+tr(" for writing. Nothing saved!"),tr("ok"));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::showSettings()
Packit 1c1d7e
{
Packit 1c1d7e
  QString text;
Packit 1c1d7e
  QTextStream t(&text);
Packit 1c1d7e
  m_expert->writeConfig(t,true);
Packit 1c1d7e
  m_outputLog->clear();
Packit 1c1d7e
  m_outputLog->append(APPQT(text));
Packit 1c1d7e
  m_outputLog->ensureCursorVisible();
Packit 1c1d7e
  m_saveLog->setEnabled(true);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::configChanged()
Packit 1c1d7e
{
Packit 1c1d7e
  m_modified = true;
Packit 1c1d7e
  updateTitle();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void MainWindow::updateTitle()
Packit 1c1d7e
{
Packit 1c1d7e
  QString title = tr("Doxygen GUI frontend");
Packit 1c1d7e
  if (m_modified)
Packit 1c1d7e
  {
Packit 1c1d7e
    title+=QString::fromLatin1(" +");
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!m_fileName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    title+=QString::fromLatin1(" (")+m_fileName+QString::fromLatin1(")");
Packit 1c1d7e
  }
Packit 1c1d7e
  setWindowTitle(title);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool MainWindow::discardUnsavedChanges(bool saveOption)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_modified)
Packit 1c1d7e
  {
Packit 1c1d7e
    QMessageBox::StandardButton button;
Packit 1c1d7e
    if (saveOption)
Packit 1c1d7e
    {
Packit 1c1d7e
      button = QMessageBox::question(this,
Packit 1c1d7e
          tr("Unsaved changes"),
Packit 1c1d7e
          tr("Unsaved changes will be lost! Do you want to save the configuration file?"),
Packit 1c1d7e
          QMessageBox::Save    |
Packit 1c1d7e
          QMessageBox::Discard |
Packit 1c1d7e
          QMessageBox::Cancel
Packit 1c1d7e
          );
Packit 1c1d7e
      if (button==QMessageBox::Save)
Packit 1c1d7e
      {
Packit 1c1d7e
        return saveConfig();
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      button = QMessageBox::question(this,
Packit 1c1d7e
          tr("Unsaved changes"),
Packit 1c1d7e
          tr("Unsaved changes will be lost! Do you want to continue?"),
Packit 1c1d7e
          QMessageBox::Discard |
Packit 1c1d7e
          QMessageBox::Cancel
Packit 1c1d7e
          );
Packit 1c1d7e
    }
Packit 1c1d7e
    return button==QMessageBox::Discard;
Packit 1c1d7e
  }
Packit 1c1d7e
  return true;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------------------
Packit 1c1d7e
int main(int argc,char **argv)
Packit 1c1d7e
{
Packit 1c1d7e
  QApplication a(argc,argv);
Packit 1c1d7e
  if (argc == 2)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!qstrcmp(argv[1],"--help"))
Packit 1c1d7e
    {
Packit 1c1d7e
      QMessageBox msgBox;
Packit 1c1d7e
      msgBox.setText(QString().sprintf("Usage: %s [config file]",argv[0]));
Packit 1c1d7e
      msgBox.exec();
Packit 1c1d7e
      exit(0);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (argc > 2)
Packit 1c1d7e
  {
Packit 1c1d7e
    QMessageBox msgBox;
Packit 1c1d7e
    msgBox.setText(QString().sprintf("Too many arguments specified\n\nUsage: %s [config file]",argv[0]));
Packit 1c1d7e
    msgBox.exec();
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    MainWindow &main = MainWindow::instance();
Packit 1c1d7e
    if (argc==2 && argv[1][0]!='-') // name of config file as an argument
Packit 1c1d7e
    {
Packit 1c1d7e
      main.loadConfigFromFile(QString::fromLocal8Bit(argv[1]));
Packit 1c1d7e
    }
Packit 1c1d7e
    main.show();
Packit 1c1d7e
    return a.exec();
Packit 1c1d7e
  }
Packit 1c1d7e
}