Commits

Anonymous committed 5eb515c Merge

Merged 1.7.3 into development line.

  • Participants
  • Parent commits 02ce75b, 4d5f4e1

Comments (0)

Files changed (158)

 813029b3b2623329d0c43bad58de1d9adbf3e5fa Doxygen-1.7.2
+0354e518f011f91c224c038b8af86906322af9f9 Doxygen-1.7.3

File doxygen/Doxyfile

 GENERATE_TREEVIEW      = YES
 USE_INLINE_TREES       = YES
 TREEVIEW_WIDTH         = 250
-EXT_LINKS_IN_WINDOW    = YES
+EXT_LINKS_IN_WINDOW    = NO
 FORMULA_FONTSIZE       = 10
 SEARCHENGINE           = YES
 SERVER_BASED_SEARCH    = NO
 MSCGEN_PATH            =
 HIDE_UNDOC_RELATIONS   = YES
 HAVE_DOT               = YES
-DOT_FONTNAME           = FreeSans
+DOT_FONTNAME           = Helvetica
 DOT_FONTSIZE           = 10
 DOT_FONTPATH           =
 CLASS_GRAPH            = YES
 CALLER_GRAPH           = NO
 GRAPHICAL_HIERARCHY    = YES
 DIRECTORY_GRAPH        = YES
-DOT_IMAGE_FORMAT       = png
+DOT_IMAGE_FORMAT       = svg
 DOT_PATH               =
 DOTFILE_DIRS           =
 DOT_GRAPH_MAX_NODES    = 50
 DOT_TRANSPARENT        = NO
 DOT_MULTI_TARGETS      = NO
 GENERATE_LEGEND        = YES
-DOT_CLEANUP            = YES
+DOT_CLEANUP            = NO

File doxygen/INSTALL

-DOXYGEN Version 1.7.2
+DOXYGEN Version 1.7.3
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (08 October 2010)
+Dimitri van Heesch (03 January 2011)

File doxygen/README

-DOXYGEN Version 1.7.2
+DOXYGEN Version 1.7.3
 
 Please read INSTALL for compilation instructions.
 
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (08 October 2010)
+Dimitri van Heesch (dimitri@stack.nl) (03 January 2011)

File doxygen/VERSION

-1.7.2
+1.7.3

File doxygen/addon/doxmlparser/examples/metrics/Makefile

 #
-# This file was generated from Makefile.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from Makefile.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 DOXYGEN   = /Users/dimitri/doxygen
 PERL      = /opt/local/bin/perl
 RM        = rm -f
 CP        = cp
-VERSION   = 1.7.1
+VERSION   = 1.7.2
 INSTALL   = /usr/local
 INSTTOOL  = /opt/local/bin/ginstall
 DOXYDOCS  = ..

File doxygen/addon/doxmlparser/examples/metrics/Makefile.metrics

 #############################################################################
 # Makefile for building metrics
-# Generated by tmake at 17:05, 2010/10/08
+# Generated by tmake at 15:08, 2011/01/03
 #     Project: metrics
 #    Template: app.t
 #############################################################################

File doxygen/addon/doxmlparser/examples/metrics/metrics.pro

 #
-# This file was generated from metrics.pro.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from metrics.pro.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 TEMPLATE     =	app.t

File doxygen/addon/doxmlparser/src/Makefile

 #
-# This file was generated from Makefile.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from Makefile.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 DOXYGEN   = /Users/dimitri/doxygen
 PERL      = /opt/local/bin/perl
 RM        = rm -f
 CP        = cp
-VERSION   = 1.7.1
+VERSION   = 1.7.2
 INSTALL   = /usr/local
 INSTTOOL  = /opt/local/bin/ginstall
 DOXYDOCS  = ..

File doxygen/addon/doxmlparser/src/Makefile.doxmlparser

 #############################################################################
 # Makefile for building ../lib/libdoxmlparser.a
-# Generated by tmake at 17:05, 2010/10/08
+# Generated by tmake at 15:08, 2011/01/03
 #     Project: doxmlparser
 #    Template: lib.t
 #############################################################################

File doxygen/addon/doxmlparser/src/doxmlparser.pro

 #
-# This file was generated from doxmlparser.pro.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from doxmlparser.pro.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 TEMPLATE     =	lib.t

File doxygen/addon/doxmlparser/test/Makefile

 #
-# This file was generated from Makefile.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from Makefile.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 DOXYGEN   = /Users/dimitri/doxygen
 PERL      = /opt/local/bin/perl
 RM        = rm -f
 CP        = cp
-VERSION   = 1.7.1
+VERSION   = 1.7.2
 INSTALL   = /usr/local
 INSTTOOL  = /opt/local/bin/ginstall
 DOXYDOCS  = ..

File doxygen/addon/doxmlparser/test/Makefile.xmlparse

 #############################################################################
 # Makefile for building xmlparse
-# Generated by tmake at 17:05, 2010/10/08
+# Generated by tmake at 15:08, 2011/01/03
 #     Project: xmlparse
 #    Template: app.t
 #############################################################################

File doxygen/addon/doxmlparser/test/xmlparse.pro

 #
-# This file was generated from xmlparse.pro.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from xmlparse.pro.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 TEMPLATE     =	app.t

File doxygen/addon/doxywizard/Makefile

 #
-# This file was generated from Makefile.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from Makefile.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 DOXYGEN   = /Users/dimitri/doxygen
 PERL      = /opt/local/bin/perl
 RM        = rm -f
 CP        = cp
-VERSION   = 1.7.1
+VERSION   = 1.7.2
 INSTALL   = /usr/local
 INSTTOOL  = /opt/local/bin/ginstall
 DOXYDOCS  = ..

File doxygen/addon/doxywizard/Makefile.doxywizard

 #############################################################################
 # Makefile for building: ../../bin/doxywizard.app/Contents/MacOS/doxywizard
-# Generated by qmake (2.01a) (Qt 4.6.2) on: Fri Oct 8 12:37:18 2010
+# Generated by qmake (2.01a) (Qt 4.6.2) on: Mon Jan 3 15:08:12 2011
 # Project:  doxywizard.pro
 # Template: app
 # Command: /usr/bin/qmake -spec /usr/local/Qt4.6/mkspecs/macx-g++ -macx -o Makefile.doxywizard doxywizard.pro
 		images/add.png \
 		images/folder.png \
 		images/refresh.png \
+		images/tunecolor.png \
 		images/del.png
 	/Developer/Tools/Qt/rcc -name doxywizard doxywizard.qrc -o rcc/qrc_doxywizard.cpp
 

File doxygen/addon/doxywizard/doxywizard.pro

 #
-# This file was generated from doxywizard.pro.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from doxywizard.pro.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 ######################################################################

File doxygen/addon/doxywizard/doxywizard.qrc

   <file>images/file.png</file>
   <file>images/folder.png</file>
   <file>images/refresh.png</file>
+  <file>images/tunecolor.png</file>
 </qresource>
 </RCC>

File doxygen/addon/doxywizard/expert.cpp

   m_treeWidget = new QTreeWidget;
   m_treeWidget->setColumnCount(1);
   m_topicStack = new QStackedWidget;
+  m_inShowHelp = FALSE;
 
   QFile file(SA(":/config.xml"));
   QString err;
 
 void Expert::showHelp(Input *option)
 {
-  m_helper->setText(
-           QString::fromAscii("<qt><b>")+option->id()+
-           QString::fromAscii("</b><br>")+
-           option->docs().
-           replace(QChar::fromAscii('\n'),QChar::fromAscii(' '))+
-           QString::fromAscii("<qt>")
-          );
+  if (!m_inShowHelp)
+  {
+    m_inShowHelp = TRUE;
+    m_helper->setText(
+        QString::fromAscii("<qt><b>")+option->id()+
+        QString::fromAscii("</b><br>")+
+        option->docs().
+        replace(QChar::fromAscii('\n'),QChar::fromAscii(' '))+
+        QString::fromAscii("<qt>")
+        );
+    m_inShowHelp = FALSE;
+  }
 }
 
 void Expert::nextTopic()

File doxygen/addon/doxywizard/expert.h

     QPushButton             *m_next;
     QPushButton             *m_prev;
     QDomElement              m_rootElement;
+    bool                     m_inShowHelp;
 };
 
 #endif

File doxygen/addon/doxywizard/images/._tunecolor.png

Added
New image

File doxygen/addon/doxywizard/images/tunecolor.png

Added
New image

File doxygen/addon/doxywizard/wizard.cpp

 
 #include <QtGui>
 
-// step1 options
+// options configurable via the wizard
 #define STR_PROJECT_NAME          QString::fromAscii("PROJECT_NAME")
+#define STR_PROJECT_LOGO          QString::fromAscii("PROJECT_LOGO")
+#define STR_PROJECT_BRIEF         QString::fromAscii("PROJECT_BRIEF")
 #define STR_INPUT                 QString::fromAscii("INPUT")
 #define STR_OUTPUT_DIRECTORY      QString::fromAscii("OUTPUT_DIRECTORY")
 #define STR_PROJECT_NUMBER        QString::fromAscii("PROJECT_NUMBER")
 #define STR_INCLUDED_BY_GRAPH     QString::fromAscii("INCLUDED_BY_GRAPH")
 #define STR_CALL_GRAPH            QString::fromAscii("CALL_GRAPH")
 #define STR_CALLER_GRAPH          QString::fromAscii("CALLER_GRAPH")
-
+#define STR_HTML_COLORSTYLE_HUE   QString::fromAscii("HTML_COLORSTYLE_HUE")
+#define STR_HTML_COLORSTYLE_SAT   QString::fromAscii("HTML_COLORSTYLE_SAT")
+#define STR_HTML_COLORSTYLE_GAMMA QString::fromAscii("HTML_COLORSTYLE_GAMMA")
 
 static bool g_optimizeMapping[6][6] = 
 {
   return stringVariantToBool(option->value());
 } 
 
+static int getIntOption(
+    const QHash<QString,Input*>&model,const QString &name)
+{
+  Input *option = model[name];
+  Q_ASSERT(option!=0);
+  return option->value().toInt();
+} 
+
 static QString getStringOption(
     const QHash<QString,Input*>&model,const QString &name)
 {
   }
 }
 
+static void updateIntOption(
+    const QHash<QString,Input*>&model,const QString &name,int iNew)
+{
+  Input *option = model[name];
+  Q_ASSERT(option!=0);
+  int iOld = option->value().toInt();
+  if (iOld!=iNew)
+  {
+    option->value()=QString::fromAscii("%1").arg(iNew);
+    option->update();
+  }
+}
+
+
 static void updateStringOption(
     const QHash<QString,Input*>&model,const QString &name,const QString &s)
 {
 
 //==========================================================================
 
+TuneColorDialog::TuneColorDialog(int hue,int sat,int gamma,QWidget *parent) : QDialog(parent)
+{
+   setWindowTitle(tr("Tune the color of the HTML output"));
+   QGridLayout *layout = new QGridLayout(this);
+   m_image = new QImage(QString::fromAscii(":/images/tunecolor.png"));
+   m_imageLab = new QLabel;
+   updateImage(hue,sat,gamma);
+   layout->addWidget(new QLabel(tr("Example output: use the sliders on the right to adjust the color")),0,0);
+   layout->addWidget(m_imageLab,1,0);
+   QHBoxLayout *buttonsLayout = new QHBoxLayout;
+
+   QPushButton *okButton = new QPushButton(tr("Ok"));
+   connect(okButton,SIGNAL(clicked()),SLOT(accept()));
+   okButton->setDefault(true);
+   QPushButton *cancelButton = new QPushButton(tr("Cancel"));
+   connect(cancelButton,SIGNAL(clicked()),SLOT(reject()));
+
+   ColorPicker *huePicker = new ColorPicker(ColorPicker::Hue);
+   huePicker->setCol(hue,sat,gamma);
+   huePicker->setFixedWidth(20);
+   layout->addWidget(huePicker,1,1);
+   ColorPicker *satPicker = new ColorPicker(ColorPicker::Saturation);
+   satPicker->setCol(hue,sat,gamma);
+   satPicker->setFixedWidth(20);
+   layout->addWidget(satPicker,1,2);
+   ColorPicker *gamPicker = new ColorPicker(ColorPicker::Gamma);
+   gamPicker->setCol(hue,sat,gamma);
+   gamPicker->setFixedWidth(20);
+   layout->addWidget(gamPicker,1,3);
+
+   connect(huePicker,SIGNAL(newHsv(int,int,int)),satPicker,SLOT(setCol(int,int,int)));
+   connect(satPicker,SIGNAL(newHsv(int,int,int)),huePicker,SLOT(setCol(int,int,int)));
+   connect(huePicker,SIGNAL(newHsv(int,int,int)),gamPicker,SLOT(setCol(int,int,int)));
+   connect(satPicker,SIGNAL(newHsv(int,int,int)),gamPicker,SLOT(setCol(int,int,int)));
+   connect(gamPicker,SIGNAL(newHsv(int,int,int)),satPicker,SLOT(setCol(int,int,int)));
+   connect(gamPicker,SIGNAL(newHsv(int,int,int)),huePicker,SLOT(setCol(int,int,int)));
+   connect(huePicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+   connect(satPicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+   connect(gamPicker,SIGNAL(newHsv(int,int,int)),this,SLOT(updateImage(int,int,int)));
+
+   buttonsLayout->addStretch();
+   buttonsLayout->addWidget(okButton);
+   buttonsLayout->addWidget(cancelButton);
+   layout->addLayout(buttonsLayout,5,0,1,4);
+}
+
+void hsl2rgb(double h,double s,double l,
+             double *pRed,double *pGreen,double *pBlue)
+{
+  double v;
+  double r,g,b;
+
+  r = l;   // default to gray
+  g = l;
+  b = l;
+  v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s);
+  if (v > 0)
+  {
+    double m;
+    double sv;
+    int sextant;
+    double fract, vsf, mid1, mid2;
+
+    m       = l + l - v;
+    sv      = (v - m ) / v;
+    h      *= 6.0;
+    sextant = (int)h;
+    fract   = h - sextant;
+    vsf     = v * sv * fract;
+    mid1    = m + vsf;
+    mid2    = v - vsf;
+    switch (sextant)
+    {
+      case 0:
+        r = v;
+        g = mid1;
+        b = m;
+        break;
+      case 1:
+        r = mid2;
+        g = v;
+        b = m;
+        break;
+      case 2:
+        r = m;
+        g = v;
+        b = mid1;
+        break;
+      case 3:
+        r = m;
+        g = mid2;
+        b = v;
+        break;
+      case 4:
+        r = mid1;
+        g = m;
+        b = v;
+        break;
+      case 5:
+        r = v;
+        g = m;
+        b = mid2;
+        break;
+    }
+  }
+  *pRed   = r;
+  *pGreen = g;
+  *pBlue  = b;
+}
+
+
+
+void TuneColorDialog::updateImage(int hue,int sat,int gam)
+{
+  QImage coloredImg(m_image->width(),m_image->height(),QImage::Format_RGB32);
+  uint *srcPixel = (uint *)m_image->scanLine(0);
+  uint *dstPixel = (uint *)coloredImg.scanLine(0);
+  uint nrPixels = coloredImg.width()*coloredImg.height();
+  for (uint i=0;i<nrPixels;i++,srcPixel++,dstPixel++)
+  {
+    QColor c = QColor::fromRgb(*srcPixel);
+    double r,g,b;
+    hsl2rgb(hue/359.0, sat/255.0, pow(c.green()/255.0,gam/100.0),&r,&g,&b);
+    *dstPixel = qRgb((int)(r*255.0),(int)(g*255.0),(int)(b*255.0));
+  }
+  m_imageLab->setPixmap(QPixmap::fromImage(coloredImg));
+  m_hue = hue;
+  m_sat = sat;
+  m_gam = gam;
+}
+
+int TuneColorDialog::getHue() const
+{
+  return m_hue;
+}
+
+int TuneColorDialog::getSaturation() const
+{
+  return m_sat;
+}
+
+int TuneColorDialog::getGamma() const
+{
+  return m_gam;
+}
+
+//==========================================================================
+
+ColorPicker::ColorPicker(Mode m)
+{
+  m_hue = 220;
+  m_gam = 100;
+  m_sat = 100;
+  m_mode = m;
+  m_pix = 0;
+}
+
+ColorPicker::~ColorPicker()
+{
+  delete m_pix;
+}
+
+void ColorPicker::paintEvent(QPaintEvent*)
+{
+  int w = width() - 5;
+
+  QRect r(0, foff, w, height() - 2*foff);
+  int wi = r.width() - 2;
+  int hi = r.height() - 2;
+  if (!m_pix || m_pix->height() != hi || m_pix->width() != wi) 
+  {
+    delete m_pix;
+    QImage img(wi, hi, QImage::Format_RGB32);
+    int y;
+    uint *pixel = (uint *) img.scanLine(0);
+    for (y = 0; y < hi; y++) 
+    {
+      const uint *end = pixel + wi;
+      int yh = y2hue(y+coff);
+      int ys = y2sat(y+coff);
+      int yg = y2gam(y+coff);
+      while (pixel < end) 
+      {
+        QColor c;
+        c.setHsv(yh, ys, (int)(255*pow(0.7,yg/100.0)));
+        *pixel = c.rgb();
+        ++pixel;
+      }
+    }
+    m_pix = new QPixmap(QPixmap::fromImage(img));
+  }
+  QPainter p(this);
+  p.drawPixmap(1, coff, *m_pix);
+  const QPalette &g = palette();
+  qDrawShadePanel(&p, r, g, true);
+  p.setPen(g.foreground().color());
+  p.setBrush(g.foreground());
+  QPolygon a;
+  int y = m_mode==Hue ?        hue2y(m_hue) : 
+          m_mode==Saturation ? sat2y(m_sat) :
+                               gam2y(m_gam);
+  a.setPoints(3, w, y, w+5, y+5, w+5, y-5);
+  p.eraseRect(w, 0, 5, height());
+  p.drawPolygon(a);
+}
+
+void ColorPicker::mouseMoveEvent(QMouseEvent *m)
+{
+  if      (m_mode==Hue)        setHue(y2hue(m->y())); 
+  else if (m_mode==Saturation) setSat(y2sat(m->y()));
+  else                         setGam(y2gam(m->y()));
+}
+
+void ColorPicker::mousePressEvent(QMouseEvent *m)
+{
+  if      (m_mode==Hue)        setHue(y2hue(m->y())); 
+  else if (m_mode==Saturation) setSat(y2sat(m->y()));
+  else                         setGam(y2gam(m->y()));
+}
+
+void ColorPicker::setHue(int h)
+{
+  if (h==m_hue) return;
+  m_hue = qMax(0,qMin(h,359));
+  delete m_pix; m_pix=0;
+  repaint();
+  emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setSat(int s)
+{
+  if (s==m_sat) return;
+  m_sat = qMax(0,qMin(s,255));
+  delete m_pix; m_pix=0;
+  repaint();
+  emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setGam(int g)
+{
+  if (g==m_gam) return;
+  m_gam = qMax(40,qMin(g,240));
+  delete m_pix; m_pix=0;
+  repaint();
+  emit newHsv(m_hue,m_sat,m_gam);
+}
+
+void ColorPicker::setCol(int h, int s, int g)
+{
+  if (m_hue!=h || m_sat!=s || m_gam!=g)
+  {
+    m_hue = h;
+    m_sat = s;
+    m_gam = g;
+    delete m_pix; m_pix=0;
+    repaint();
+  }
+}
+
+int ColorPicker::y2hue(int y)
+{
+  int d = height() - 2*coff - 1;
+  return m_mode==Hue ? (y - coff)*359/d : m_hue;
+}
+
+int ColorPicker::hue2y(int v)
+{
+  int d = height() - 2*coff - 1;
+  return coff + v*d/359;
+}
+
+int ColorPicker::y2sat(int y)
+{
+  int d = height() - 2*coff - 1;
+  return m_mode==Saturation ? 255 - (y - coff)*255/d : m_sat;
+}
+
+int ColorPicker::sat2y(int v)
+{
+  int d = height() - 2*coff - 1;
+  return coff + (255-v)*d/255;
+}
+
+int ColorPicker::y2gam(int y)
+{
+  int d = height() - 2*coff - 1;
+  return m_mode==Gamma ? 240 - (y - coff)*200/d : m_gam;
+}
+
+int ColorPicker::gam2y(int g)
+{
+  int d = height() - 2*coff - 1;
+  return coff + (240-g)*d/200;
+}
+
+//==========================================================================
+
 Step1::Step1(Wizard *wizard,const QHash<QString,Input*> &modelData) : m_wizard(wizard), m_modelData(modelData)
 {
   QVBoxLayout *layout = new QVBoxLayout(this);
               "about the project you are documenting"));
   layout->addWidget(l);
   QWidget *w      = new QWidget( this );
-  QHBoxLayout *bl = new QHBoxLayout(w);
-  bl->setSpacing(10);
+  QGridLayout *grid = new QGridLayout(w);
+  grid->setSpacing(10);
 
-  QWidget *col1 = new QWidget;
-  QVBoxLayout *col1Layout = new QVBoxLayout(col1);
-  col1Layout->setSpacing(8);
+  // project name
   QLabel *projName = new QLabel(this);
   projName->setText(tr("Project name:"));
   projName->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+  // project brief
+  QLabel *projBrief = new QLabel(this);
+  projBrief->setText(tr("Project synopsis:"));
+  projBrief->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+  // project version
   QLabel *projVersion = new QLabel(this);
   projVersion->setText(tr("Project version or id:"));
   projVersion->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
-  col1Layout->addWidget(projName);
-  col1Layout->addWidget(projVersion);
+  // project icon
+  QLabel *projLogo = new QLabel(this);
+  projLogo->setText(tr("Project logo:"));
+  projLogo->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
 
-  QWidget *col2 = new QWidget;
-  QVBoxLayout *col2Layout = new QVBoxLayout(col2);
-  col2Layout->setSpacing(8);
-  m_projName = new QLineEdit;
+  grid->addWidget(projName,0,0);
+  grid->addWidget(projBrief,1,0);
+  grid->addWidget(projVersion,2,0);
+  grid->addWidget(projLogo,3,0);
+
+  m_projName   = new QLineEdit;
+  m_projBrief  = new QLineEdit;
   m_projNumber = new QLineEdit;
-  col2Layout->addWidget(m_projName);
-  col2Layout->addWidget(m_projNumber);
+  QPushButton *projIconSel = new QPushButton(this);
+  projIconSel->setText(tr("Select..."));
+  QPixmap pm(QSize(120,55));
+  pm.fill();
+  m_projIconLab = new QLabel;
+  m_projIconLab->setPixmap(pm);
 
-  bl->addWidget(col1);
-  bl->addWidget(col2);
-  w->setLayout(bl);
+  grid->addWidget(m_projName,0,1,1,2);
+  grid->addWidget(m_projBrief,1,1,1,2);
+  grid->addWidget(m_projNumber,2,1,1,2);
+  grid->addWidget(projIconSel,3,1);
+  grid->addWidget(m_projIconLab,3,2);
+
+  grid->setColumnStretch(2,1);
+
+  w->setLayout(grid);
 
   layout->addWidget(w);
 
   layout->addStretch(1);
   setLayout(layout);
 
+  connect(projIconSel,SIGNAL(clicked()),
+          this,SLOT(selectProjectIcon()));
   connect(m_srcSelectDir,SIGNAL(clicked()),
           this,SLOT(selectSourceDir()));
   connect(m_dstSelectDir,SIGNAL(clicked()),
           this,SLOT(selectDestinationDir()));
   connect(m_projName,SIGNAL(textChanged(const QString &)),SLOT(setProjectName(const QString &)));
+  connect(m_projBrief,SIGNAL(textChanged(const QString &)),SLOT(setProjectBrief(const QString &)));
   connect(m_projNumber,SIGNAL(textChanged(const QString &)),SLOT(setProjectNumber(const QString &)));
   connect(m_sourceDir,SIGNAL(textChanged(const QString &)),SLOT(setSourceDir(const QString &)));
   connect(m_recursive,SIGNAL(stateChanged(int)),SLOT(setRecursiveScan(int)));
   connect(m_destDir,SIGNAL(textChanged(const QString &)),SLOT(setDestinationDir(const QString &)));
 }
 
+void Step1::selectProjectIcon()
+{
+  QString path = QFileInfo(MainWindow::instance().configFileName()).path();
+  QString iconName = QFileDialog::getOpenFileName(this,
+                                    tr("Select project icon/image"),path);
+  QPixmap pm(iconName);
+  if (!pm.isNull())
+  {
+    m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+    updateStringOption(m_modelData,STR_PROJECT_LOGO,iconName);
+  }
+}
+
 void Step1::selectSourceDir()
 {
   QString path = QFileInfo(MainWindow::instance().configFileName()).path();
   updateStringOption(m_modelData,STR_PROJECT_NAME,name);
 }
 
+void Step1::setProjectBrief(const QString &desc)
+{
+  updateStringOption(m_modelData,STR_PROJECT_BRIEF,desc);
+}
+
 void Step1::setProjectNumber(const QString &num)
 {
   updateStringOption(m_modelData,STR_PROJECT_NUMBER,num);
 {
   Input *option;
   m_projName->setText(getStringOption(m_modelData,STR_PROJECT_NAME));
+  m_projBrief->setText(getStringOption(m_modelData,STR_PROJECT_BRIEF));
   m_projNumber->setText(getStringOption(m_modelData,STR_PROJECT_NUMBER));
+  QString iconName = getStringOption(m_modelData,STR_PROJECT_LOGO);
+  if (!iconName.isEmpty())
+  {
+    QPixmap pm(iconName);
+    if (!pm.isNull())
+    {
+      m_projIconLab->setPixmap(pm.scaledToHeight(55,Qt::SmoothTransformation));
+    }
+  }
+  else
+  {
+    QPixmap pm(QSize(120,55));
+    pm.fill();
+    m_projIconLab->setPixmap(pm);
+  }
   option = m_modelData[STR_INPUT];
   if (option->value().toStringList().count()>0)
   {
     m_htmlOptionsGroup->addButton(r, 0);
     vbox = new QVBoxLayout;
     vbox->addWidget(r);
-    r = new QRadioButton(tr("with frames and a navigation tree"));
+    r = new QRadioButton(tr("with navigation panel"));
     m_htmlOptionsGroup->addButton(r, 1);
     // GENERATE_TREEVIEW
     vbox->addWidget(r);
     m_htmlOptionsGroup->addButton(r, 2);
     // GENERATE_HTMLHELP
     vbox->addWidget(r);
-    m_searchEnabled=new QCheckBox(tr("With search function (requires PHP enabled web server)"));
+    m_searchEnabled=new QCheckBox(tr("With search function"));
     vbox->addWidget(m_searchEnabled);
     // SEARCH_ENGINE
+    QHBoxLayout *hbox = new QHBoxLayout;
+    m_tuneColor=new QPushButton(tr("Change color..."));
+    hbox->addWidget(m_tuneColor);
+    hbox->addStretch(1);
+    vbox->addLayout(hbox);
     m_htmlOptions->setLayout(vbox);
     m_htmlOptions->setChecked(true);
   }
           SLOT(setHtmlOptions(int)));
   connect(m_texOptionsGroup,SIGNAL(buttonClicked(int)),
           SLOT(setLatexOptions(int)));
+  connect(m_tuneColor,SIGNAL(clicked()),SLOT(tuneColorDialog()));
+}
+
+void Step3::tuneColorDialog()
+{
+  int hue = getIntOption(m_modelData,STR_HTML_COLORSTYLE_HUE);
+  int sat = getIntOption(m_modelData,STR_HTML_COLORSTYLE_SAT);
+  int gam = getIntOption(m_modelData,STR_HTML_COLORSTYLE_GAMMA);
+  TuneColorDialog tuneColor(hue,sat,gam,this);
+  if (tuneColor.exec()==QDialog::Accepted)
+  {
+    updateIntOption(m_modelData,STR_HTML_COLORSTYLE_HUE,tuneColor.getHue());
+    updateIntOption(m_modelData,STR_HTML_COLORSTYLE_SAT,tuneColor.getSaturation());
+    updateIntOption(m_modelData,STR_HTML_COLORSTYLE_GAMMA,tuneColor.getGamma());
+  }
 }
 
 void Step3::setHtmlEnabled(bool b)

File doxygen/addon/doxywizard/wizard.h

 
 #include <QSplitter>
 #include <QHash>
+#include <QDialog>
 
 class Input;
 class QTreeWidget;
 class QGroupBox;
 class QButtonGroup;
 class Wizard;
+class QImage;
+class QLabel;
 
 enum OptLang     { Lang_Cpp, Lang_C, Lang_Java, Lang_CS };
 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 TuneColorDialog : public QDialog
+{
+    Q_OBJECT
+
+  public:
+    TuneColorDialog(int hue,int sat,int gamma,QWidget *parent=0);
+    int getHue() const;
+    int getSaturation() const;
+    int getGamma() const;
+
+  private slots:
+    void updateImage(int hue,int sat,int val);
+
+  private:
+    QImage *m_image;
+    QLabel *m_imageLab;
+    int m_hue;
+    int m_sat;
+    int m_gam;
+};
+
+class ColorPicker : public QWidget
+{
+    Q_OBJECT
+public:
+    enum Mode { Hue, Saturation, Gamma };
+    ColorPicker(Mode m);
+    ~ColorPicker();
+
+public slots:
+    void setCol(int h, int s, int g);
+    //void setCol(int h, int s);
+
+signals:
+    void newHsv(int h, int s, int g);
+
+protected:
+    void paintEvent(QPaintEvent*);
+    void mouseMoveEvent(QMouseEvent *);
+    void mousePressEvent(QMouseEvent *);
+
+private:
+    enum { foff = 3, coff = 4 }; //frame and contents offset
+    int y2hue(int y);
+    int y2sat(int y);
+    int y2gam(int y);
+    int hue2y(int hue);
+    int sat2y(int sat);
+    int gam2y(int gamma);
+    void setHue(int v);
+    void setSat(int v);
+    void setGam(int v);
+
+    QPixmap *m_pix;
+    Mode m_mode;
+    int m_gam;
+    int m_hue;
+    int m_sat;
+
+};
+
+
 class Step1 : public QWidget
 {
     Q_OBJECT
   private slots:
     void selectSourceDir(); 
     void selectDestinationDir(); 
+    void selectProjectIcon();
     void setProjectName(const QString &name);
+    void setProjectBrief(const QString &desc);
     void setProjectNumber(const QString &num);
     void setSourceDir(const QString &dir);
     void setDestinationDir(const QString &dir);
 
   private:
     QLineEdit *m_projName;
+    QLineEdit *m_projBrief;
     QLineEdit *m_projNumber;
     QLineEdit *m_sourceDir;
     QLineEdit *m_destDir;
+    QLabel    *m_projIconLab;
     QCheckBox *m_recursive;
     QPushButton *m_srcSelectDir;
     QPushButton *m_dstSelectDir;
     void setSearchEnabled(int);
     void setHtmlOptions(int);
     void setLatexOptions(int);
+    void tuneColorDialog();
 
   private:
     QGroupBox *m_texOptions;
     QCheckBox *m_rtfEnabled;
     QCheckBox *m_xmlEnabled;
     QCheckBox *m_searchEnabled;
+    QPushButton *m_tuneColor;
     Wizard    *m_wizard;
     const QHash<QString,Input *> &m_modelData;
 };

File doxygen/configure

 
 doxygen_version_major=1
 doxygen_version_minor=7
-doxygen_version_revision=2
+doxygen_version_revision=3
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
 doxygen_version_mmn=NO

File doxygen/doc/._maintainers.txt

Binary file modified.

File doxygen/doc/Doxyfile

 RECURSIVE         = NO
 TAGFILES          =
 ALLEXTERNALS      = NO
-PERL_PATH         = /usr/local/bin/perl
+PERL_PATH         = /usr/bin/perl
 SEARCHENGINE      = NO
 PDF_HYPERLINKS    = YES
 USE_PDFLATEX      = YES

File doxygen/doc/Makefile

 #
-# This file was generated from Makefile.in on Fri Oct  8 12:02:14 CEST 2010
+# This file was generated from Makefile.in on Fri Dec 31 18:10:31 CET 2010
 #
 
 DOXYGEN   = /Users/dimitri/doxygen
 PERL      = /opt/local/bin/perl
 RM        = rm -f
 CP        = cp
-VERSION   = 1.7.1
+VERSION   = 1.7.2
 INSTALL   = /usr/local
 INSTTOOL  = /opt/local/bin/ginstall
 DOXYDOCS  = ..

File doxygen/doc/arch.doc

 from the correct line in the Makefile:
 
 \verbatim
-#!/usr/local/bin/perl 
+#!/usr/bin/perl 
 
 $file = shift @ARGV;
 print "Toggle debugging mode for $file\n";
   }
   print "Processing Makefile.libdoxygen...\n";
   while (<F>) {
-    if ( s/\(LEX\) -P([a-zA-Z]+)YY -t $file/(LEX) -d -P\1YY -t $file/g ) {
+    if ( s/\(LEX\) (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) -d \1-P\2YY -t $file/g ) {
       print "Enabling debug info for $file\n";
     }
-    elsif ( s/\(LEX\) -d -P([a-zA-Z]+)YY -t $file/(LEX) -P\1YY -t $file/g ) {
+    elsif ( s/\(LEX\) -d (-i )?-P([a-zA-Z]+)YY -t $file/(LEX) \1-P\2YY -t $file/g ) {
       print "Disabling debug info for $file\n";
     }
     print G "$_";
 # touch the file
 $now = time;
 utime $now, $now, $file
+
 \endverbatim
 
 */

File doxygen/doc/commands.doc

 /******************************************************************************
  *
- * 
+ *
  *
  * Copyright (C) 1997-2008 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 
+ * 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.
  *
 \section cmd_intro Introduction
 
 All commands in the documentation start with a backslash (<b>\\</b>) or an
-at-sign (<b>\@</b>). If you prefer you can replace all commands starting with a 
+at-sign (<b>\@</b>). If you prefer you can replace all commands starting with a
 backslash below by their counterparts that start with an at-sign.
 
-Some commands have one or more arguments. 
+Some commands have one or more arguments.
 Each argument has a certain range:
 <ul>
 <li>If \<sharp\> braces are used the argument is a single word.
 <li>If {curly} braces are used the argument extends until the next paragraph.
     Paragraphs are delimited by a blank line or by a section indicator.
 </ul>
-If [square] brackets are used the argument is optional.
-
-Here is an alphabetically sorted list of all commands with references to their 
+If in addition to the aboveargument specifiers [square] brackets are used the argument is optional.
+
+Here is an alphabetically sorted list of all commands with references to their
 documentation:
 \secreflist
 \refitem cmda \\a
 \refitem cmddontinclude \\dontinclude
 \refitem cmddot \\dot
 \refitem cmddotfile \\dotfile
-\refitem cmdmscfile \\mscfile
 \refitem cmde \\e
 \refitem cmdelse \\else
 \refitem cmdelseif \\elseif
 \refitem cmdmanonly \\manonly
 \refitem cmdmemberof \\memberof
 \refitem cmdmsc \\msc
+\refitem cmdmscfile \\mscfile
 \refitem cmdn \\n
 \refitem cmdname \\name
 \refitem cmdnamespace \\namespace
 \refitem cmdrelatesalso \\relatesalso
 \refitem cmdremark \\remark
 \refitem cmdremarks \\remarks
+\refitem cmdresult \\result
 \refitem cmdreturn \\return
 \refitem cmdreturns \\returns
 \refitem cmdretval \\retval
 \refitem cmdhash \\\#
 \refitem cmdperc \\\%
 \refitem cmdquot \\\"
+\refitem cmddcolon \\\::
 \endsecreflist
 
 The following subsections provide a list of all commands that are recognized by
 doxygen. Unrecognized commands are treated as normal text.
 
 
-\htmlonly <center> \endhtmlonly 
+\htmlonly <center> \endhtmlonly
 <h2>
-\htmlonly --- \endhtmlonly 
+\htmlonly --- \endhtmlonly
 Structural indicators
-\htmlonly --- \endhtmlonly 
+\htmlonly --- \endhtmlonly
 </h2>
 \htmlonly </center> \endhtmlonly
 
   but rather one group with a merged documentation and the first title found in
   any of the commands.
 
-  The title is optional, so this command can also be used to add a number of 
+  The title is optional, so this command can also be used to add a number of
   entities to an existing group using \@{ and \@} like this:
 
 \verbatim
    */
 
   /*!
-   *  A function 
+   *  A function
    */
   void func1()
   {
   /*! @} */
 \endverbatim
 
-  \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup" and
+  \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup", and
   \ref cmdweakgroup "\\weakgroup".
 
 <hr>
-\section cmdcallgraph \\callgraph 
+\section cmdcallgraph \\callgraph
 
   \addindex \\callgraph
   When this command is put in a comment block of a function or method
-  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will 
+  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
   generate a call graph for that function (provided the implementation of the
-  function or method calls other documented functions). The call graph will 
+  function or method calls other documented functions). The call graph will be
   generated regardless of the value of \ref cfg_call_graph "CALL_GRAPH".
-  \note The completeness (and correctness) of the call graph depends on the 
+  \note The completeness (and correctness) of the call graph depends on the
   doxygen code parser which is not perfect.
 
+  \sa section \ref cmdcallergraph "\\callergraph".
+
 <hr>
-\section cmdcallergraph \\callergraph 
+\section cmdcallergraph \\callergraph
 
   \addindex \\callergraph
   When this command is put in a comment block of a function or method
-  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will 
+  and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
   generate a caller graph for that function (provided the implementation of the
-  function or method calls other documented functions). The caller graph will 
+  function or method calls other documented functions). The caller graph will be
   generated regardless of the value of \ref cfg_caller_graph "CALLER_GRAPH".
-  \note The completeness (and correctness) of the caller graph depends on the 
+  \note The completeness (and correctness) of the caller graph depends on the
   doxygen code parser which is not perfect.
 
+  \sa section \ref cmdcallgraph "\\callgraph".
+
 <hr>
 \section cmdcategory \\category <name> [<header-file>] [<header-name>]
 
   \addindex \\category
-  For Objective-C only: Indicates that a comment block contains documentation 
-  for a class category with name \<name\>. The arguments are 
+  For Objective-C only: Indicates that a comment block contains documentation
+  for a class category with name \<name\>. The arguments are
   equal to the \\class command.
 
   \sa section \ref cmdclass "\\class".
 
   \addindex \\class
   Indicates that a comment block contains documentation for a
-  class with name \<name\>. Optionally a header file and a header name 
-  can be specified. If the header-file is specified, a link to a verbatim copy 
-  of the header will be included in the HTML documentation. 
-  The \<header-name\> argument can be used to overwrite the 
-  name of the link that is used in the class documentation to something other 
-  than \<header-file\>. This can be useful if the include name is not located 
+  class with name \<name\>. Optionally a header file and a header name
+  can be specified. If the header-file is specified, a link to a verbatim copy
+  of the header will be included in the HTML documentation.
+  The \<header-name\> argument can be used to overwrite the
+  name of the link that is used in the class documentation to something other
+  than \<header-file\>. This can be useful if the include name is not located
   on the default include path (like \<X11/X.h\>). With the \<header-name\>
-  argument you can also specify how the include statement should look like, 
-  by adding either quotes or sharp brackets around the name. 
-  Sharp brackets are used if just the name is given. Note that the 
-  last two arguments can also specified using 
+  argument you can also specify how the include statement should look like,
+  by adding either quotes or sharp brackets around the name.
+  Sharp brackets are used if just the name is given. Note that the
+  last two arguments can also be specified using
   the \ref cmdheaderfile "\\headerfile" command.
-  
-  \par Example: 
-  \verbinclude class.h  
+
+  \par Example:
+  \verbinclude class.h
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/class/html/index.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/class/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 \section cmddef \\def <name>
 
   \addindex \\def
-  Indicates that a comment block contains documentation for a 
-  \c \#define macro. 
+  Indicates that a comment block contains documentation for a
+  \c \#define macro.
 
   \par Example:
-  \verbinclude define.h  
+  \verbinclude define.h
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define_8h.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define_8h.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
   thus building a hierarchy of groups.
 
   The \<name\> argument should be a single-word identifier.
-  
-  \sa page \ref grouping "Grouping", sections \ref cmdingroup "\\ingroup", \ref cmdaddtogroup "\\addtogroup",
+
+  \sa page \ref grouping "Grouping", sections \ref cmdingroup "\\ingroup", \ref cmdaddtogroup "\\addtogroup", and
   \ref cmdweakgroup "\\weakgroup".
 
 <hr>
 \section cmddir \\dir [<path fragment>]
-  
+
   \addindex \\dir
   Indicates that a comment block contains documentation for a directory.
-  The "path fragment" argument should include the directory name and 
-  enough of the path to be unique with respect to the other directories 
+  The "path fragment" argument should include the directory name and
+  enough of the path to be unique with respect to the other directories
   in the project.
-  The \ref cfg_show_dirs "SHOW_DIRECTORIES" option determines whether 
+  The \ref cfg_show_dirs "SHOW_DIRECTORIES" option determines whether
   or not the directory information is shown and the
-  \ref cfg_strip_from_path "STRIP_FROM_PATH" option determines what is 
+  \ref cfg_strip_from_path "STRIP_FROM_PATH" option determines what is
   stripped from the full path before it appears in the output.
 
 <hr>
 \section cmdenum \\enum <name>
 
   \addindex \\enum
-  Indicates that a comment block contains documentation for an 
+  Indicates that a comment block contains documentation for an
   enumeration, with name \<name\>. If the enum is a member of a class and
   the documentation block is located outside the class definition,
   the scope of the class should be specified as well.
   the \\enum comment may be omitted.
 
   \par Note:
-  The type of an anonymous enum cannot be documented, but the values 
+  The type of an anonymous enum cannot be documented, but the values
   of an anonymous enum can.
-  
+
   \par Example:
-  \verbinclude enum.h  
+  \verbinclude enum.h
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 <hr>
 \section cmdexample \\example <file-name>
-  
+
   \addindex \\example
-  Indicates that a comment block contains documentation for a source code 
+  Indicates that a comment block contains documentation for a source code
   example. The name of the source file is \<file-name\>. The text of
-  this file will be included in the documentation, just after the 
+  this file will be included in the documentation, just after the
   documentation contained in the comment block. All examples are placed
   in a list. The source code is scanned for documented members and classes.
-  If any are found, the names are cross-referenced with the documentation. 
-  Source files or directories can be specified using the 
-  \ref cfg_example_path "EXAMPLE_PATH" 
+  If any are found, the names are cross-referenced with the documentation.
+  Source files or directories can be specified using the
+  \ref cfg_example_path "EXAMPLE_PATH"
   tag of doxygen's configuration file.
 
   If \<file-name\> itself is not unique for the set of example files specified
-  by the 
+  by the
   \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part of the absolute path
   to disambiguate it.
 
   Where the example file \c example_test.cpp looks as follows:
   \verbinclude example_test.cpp
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 
   \addindex \\endinternal
   This command ends a documentation fragment that was started with a
-  \ref cmdinternal "\\internal" command. The text between \c \\internal and 
-  \c \\endinternal will only be visible 
+  \ref cmdinternal "\\internal" command. The text between \c \\internal and
+  \c \\endinternal will only be visible
   if \ref cfg_internal_docs "INTERNAL_DOCS" is set to YES.
 
 <hr>
   This command can be used to manually indicate an inheritance relation,
   when the programming language does not support this concept natively
   (e.g. C).
- 
+
   The file \c manual.c in the example directory shows how to use this command.
 
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 
 <hr>
 \section cmdfile \\file [<name>]
-  
+
   \addindex \\file
-  Indicates that a comment block contains documentation for a source or 
+  Indicates that a comment block contains documentation for a source or
   header file with name \<name\>. The file name may include (part of) the
   path if the file-name alone is not unique. If the file name is omitted
-  (i.e. the line after \\file is left blank) then the documentation block that 
+  (i.e. the line after \\file is left blank) then the documentation block that
   contains the \\file command will belong to the file it is located in.
 
   \par Important:
-  The documentation of global functions, variables, typedefs, and enums will 
+  The documentation of global functions, variables, typedefs, and enums will
   only be included in the output if the file they are in is documented as well.
 
   \par Example:
-  \verbinclude file.h  
+  \verbinclude file.h
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file_8h.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file_8h.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 
 <hr>
 \section cmdfn \\fn (function declaration)
- 
+
   \addindex \\fn
   Indicates that a comment block contains documentation for a function
-  (either global or as a member of a class). This command is \em only 
-  needed if a comment block is \e not placed in front (or behind) 
-  the function declaration or definition. 
-  
-  If your comment block \e is in front of the function 
+  (either global or as a member of a class). This command is \em only
+  needed if a comment block is \e not placed in front (or behind)
+  the function declaration or definition.
+
+  If your comment block \e is in front of the function
   declaration or definition this command can (and to avoid redundancy
-  should) be omitted. 
+  should) be omitted.
 
   A full function declaration including arguments should be specified after the
-  \\fn command on a \e single line, since the argument ends at the end 
+  \\fn command on a \e single line, since the argument ends at the end
   of the line!
 
+  This command is equivalent to \\var, \\typedef, and \\property.
+
   \warning Do not use this command
-  if it is not absolutely needed, since it will lead to duplication of 
+  if it is not absolutely needed, since it will lead to duplication of
   information and thus to errors.
 
   \par Example:
-  \verbinclude func.h  
+  \verbinclude func.h
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/func/html/class_test.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/func/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 
-  \sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
+  \sa sections \ref cmdvar "\\var", \ref cmdproperty "\\property", and
+               \ref cmdtypedef "\\typedef".
 
 <hr>
 \section cmdheaderfile \\headerfile <header-file> [<header-name>]
   \addindex \\headerfile
   Intended to be used for class, struct, or union documentation, where
   the documentation is in front of the definition. The arguments of
-  this command are the same as the second and third argument of 
-  \ref cmdclass "\\cmdclass".
-  The header-file name refers to the file that should by included by the 
+  this command are the same as the second and third argument of
+  \ref cmdclass "\\class".
+  The \<header-file\> name refers to the file that should by included by the
   application to obtain the definition of the class, struct, or union.
-  The \<header-name\> argument can be used to overwrite the 
-  name of the link that is used in the class documentation to something other 
-  than \<header-file\>. This can be useful if the include name is not located 
-  on the default include path (like \<X11/X.h\>). 
+  The \<header-name\> argument can be used to overwrite the
+  name of the link that is used in the class documentation to something other
+  than \<header-file\>. This can be useful if the include name is not located
+  on the default include path (like \<X11/X.h\>).
 
   With the \<header-name\>
-  argument you can also specify how the include statement should look like, 
-  by adding either double quotes or sharp brackets around the name. 
-  By default sharp brackets are used if just the name is given. 
-
-  If a pair of double quotes is given for either the header-file or 
-  header-name argument, the current file (in which the command was found) 
+  argument you can also specify how the include statement should look like,
+  by adding either double quotes or sharp brackets around the name.
+  By default sharp brackets are used if just the name is given.
+
+  If a pair of double quotes is given for either the \<header-file\> or
+  \<header-name\> argument, the current file (in which the command was found)
   will be used but with quotes. So for a comment block with a \\headerfile
   command inside a file test.h, the following three commands are equivalent:
   \verbatim
   \headerfile test.h <>
   \headerfile <> \endverbatim
 
-  To globally reverse the default include representation to 
+  To globally reverse the default include representation to
   local includes you can set
   \ref cfg_force_local_includes "FORCE_LOCAL_INCLUDES" to \c YES.
 
   \addindex \\hideinitializer
   By default the value of a define and the initializer of a variable
   are displayed unless they are longer than 30 lines. By putting
-  this command in a comment block of a define or variable, the 
-  initializer is always hidden.
+  this command in a comment block of a define or variable, the
+  initializer is always hidden. The maximum number of initalization linens
+  can be changed by means of the configuration parameter
+  \ref cfg_max_initializer_lines "MAX_INITIALIZER_LINES", the default value is
+  30.
 
   \sa section \ref cmdshowinitializer "\\showinitializer".
 
   This command can be used to manually indicate an inheritance relation,
   when the programming language does not support this concept natively
   (e.g. C).
- 
+
   The file \c manual.c in the example directory shows how to use this command.
 
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
   groups identified by \<groupname\>.
 
   \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup",
-  \ref cmdaddtogroup "\\addtogroup" and \ref cmdweakgroup "\\weakgroup"
+  \ref cmdaddtogroup "\\addtogroup", and \ref cmdweakgroup "\\weakgroup"
 
 <hr>
 \section cmdinterface \\interface <name> [<header-file>] [<header-name>]
 
   \addindex \\interface
   Indicates that a comment block contains documentation for an
-  interface with name \<name\>. The arguments are equal to the \\class
+  interface with name \<name\>. The arguments are equal to the arguments of the \\class
   command.
 
   \sa section \ref cmdclass "\\class".
 
 <hr>
 \section cmdinternal \\internal
-  
+
   \addindex \\internal
   This command starts a documentation fragment that is meant for internal
-  use only. The fragment naturally ends at the end of the comment block. 
-  You can also force the internal section to end earlier using the 
+  use only. The fragment naturally ends at the end of the comment block.
+  You can also force the internal section to end earlier by using the
   \ref cmdendinternal "\\endinternal" command.
 
-  If the \\internal command is put inside a section 
-  (see for example \ref cmdsection "\\section") all subsections after the 
-  command are considered to be internal as well. Only a new section at the 
+  If the \\internal command is put inside a section
+  (see for example \ref cmdsection "\\section") all subsections after the
+  command are considered to be internal as well. Only a new section at the
   same level will end the fragment that is considered internal.
 
   You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file
   to show (\c YES) or hide (\c NO) the internal documentation.
 
+  \sa section \ref cmdendinternal "\\endinternal".
+
 <hr>
 \section cmdmainpage \\mainpage [(title)]
 
   \addindex \\mainpage
 
-  If the \\mainpage command is placed in a comment block the 
+  If the \\mainpage command is placed in a comment block the
   block is used to customize the index page (in HTML) or
-  the first chapter (in \f$\mbox{\LaTeX}\f$). 
+  the first chapter (in \f$\mbox{\LaTeX}\f$).
 
   The title argument is optional and replaces the default title that
   doxygen normally generates. If you do not want any title you can
  * \section install_sec Installation
  *
  * \subsection step1 Step 1: Opening the box
- *  
+ *
  * etc...
  */
 \endverbatim
  You can refer to the main page using \\ref index (if the treeview
  is disabled, otherwise you should use \\ref main).
 
- \sa section \ref cmdsection "\\section", 
-     section \ref cmdsubsection "\\subsection" and 
+ \sa section \ref cmdsection "\\section",
+     section \ref cmdsubsection "\\subsection", and
      section \ref cmdpage "\\page".
 
 <hr>
 \section cmdmemberof \\memberof <name>
 
   \addindex \\memberof
-  This command make a function a member of a class in a similar way
+  This command makes a function a member of a class in a similar way
   as \ref cmdrelates "\\relates" does, only with this command the function
   is represented as a real member of the class.
-  This can be useful when the programming language does not support 
+  This can be useful when the programming language does not support
   the concept of member functions natively (e.g. C).
 
   It is also possible to use this command together with
   \ref cmdpublic "\\public", \ref cmdprotected "\\protected" or
   \ref cmdprivate "\\private".
- 
+
   The file \c manual.c in the example directory shows how to use this command.
 
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/manual/html/index.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
       \ref cmdprivate "\\private".
 
 <hr>
-\section cmdname \\name [(header)]  
+\section cmdname \\name [(header)]
 
   \addindex \\name
 
   This command turns a comment block into a header
   definition of a member group. The
-  comment block should be followed by a 
+  comment block should be followed by a
   <code>//\@{ ... //\@}</code> block containing the
   members of the group.
 
   See section \ref memgroup for an example.
 
 <hr>
-\section cmdnamespace \\namespace <name> 
+\section cmdnamespace \\namespace <name>
 
   \addindex \\namespace
   Indicates that a comment block contains documentation for a
-  namespace with name \<name\>. 
-  
+  namespace with name \<name\>.
+
 <hr>
 \section cmdnosubgrouping \\nosubgrouping
 
   to avoid that doxygen puts a member group as a subgroup of a
   Public/Protected/Private/... section.
 
+  \sa sections \ref cmdpublicsection "\\publicsection",
+      \ref cmdprotectedsection "\\protectedsection" and
+      \ref cmdprivatesection "\\privatesection".
 <hr>
 \section cmdoverload \\overload [(function declaration)]
 
   \addindex \\overload
-  This command can be used to generate the following 
+  This command can be used to generate the following
   standard text for an overloaded member function:
 
-   `This is an overloaded member function, provided for convenience. 
+   `This is an overloaded member function, provided for convenience.
     It differs from the above function only in what argument(s) it accepts.'
 
   If the documentation for the overloaded member function is not located
-  in front of the function declaration or definition, the optional 
+  in front of the function declaration or definition, the optional
   argument should be used to specify the correct function.
- 
+
   Any other documentation that is inside the documentation block will
   by appended after the generated message.
 
   \par Example:
   \verbinclude examples/overload.cpp
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/overload/html/class_test.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/overload/html/class_test.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
 <hr>
 \section cmdpackage \\package <name>
-  
+
   \addindex \\package
   Indicates that a comment block contains documentation for a
-  Java package with name \<name\>. 
+  Java package with name \<name\>.
 
 <hr>
 \section cmdpage \\page <name> (title)
 
   \addindex \\page
   Indicates that a comment block contains a piece of documentation that is
-  not directly related to one specific class, file or member. 
+  not directly related to one specific class, file or member.
   The HTML generator creates a page containing the documentation. The
-  \f$\mbox{\LaTeX}\f$ generator 
+  \f$\mbox{\LaTeX}\f$ generator
   starts a new section in the chapter `Page documentation'.
-  
+
   \par Example:
-  \verbinclude page.doc  
+  \verbinclude page.doc
   \htmlonly
-  Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a> 
+  Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a>
   for the corresponding HTML documentation that is generated by doxygen.
   \endhtmlonly
 
-  \par Note: 
+  \par Note:
      The \<name\> argument consists of a combination of letters and number
-     digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or 
-     mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you 
-     should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable 
-     only if your file system is case sensitive. Otherwise (and for better 
-     portability) you should use all lower case letters (e.g. \c mypage1) 
+     digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or
+     mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you
+     should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable
+     only if your file system is case sensitive. Otherwise (and for better
+     portability) you should use all lower case letters (e.g. \c mypage1)
      for \<name\> in all references to the page.
-  
-  \sa section \ref cmdsection "\\section", section 
-              \ref cmdsubsection "\\subsection", and section 
+
+  \sa section \ref cmdsection "\\section", section
+              \ref cmdsubsection "\\subsection", and section
               \ref cmdref "\\ref".
 
 <hr>
 \section cmdprivate \\private
 
   \addindex \\private
-  \addindex \\privatesection
   Indicates that the member documented in the comment block is private,
   i.e., should only be accessed by other members in the same class.
 
   "private:" class marker in C++, use \\privatesection.
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
-      and \ref cmdprotected "\\protected".
+      \ref cmdprotected "\\protected" and \ref cmdprivatesection "\\privatesection".
+
+<hr>
+\section cmdprivatesection \\privatesection
+
+  \addindex \\privatesection
+  Starting a section of private members, in a way similar to the
+  "private:" class marker in C++.
+  Indicates that the member documented in the comment block is private,
+  i.e., should only be accessed by other members in the same class.
+
+  \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+      \ref cmdprotected "\\protected" and \ref cmdprivate "\\private".
 
 <hr>
 \section cmdproperty \\property (qualified property name)
 
   \addindex \\property
   Indicates that a comment block contains documentation for a
-  property (either global or as a member of a class). 
-  This command is equivalent to \\var and \\fn.
-
-  \sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
+  property (either global or as a member of a class).
+  This command is equivalent to \\var, \\typedef, and \\fn.
+
+  \sa sections \ref cmdfn "\\fn", \ref cmdtypedef "\\typedef", and
+               \ref cmdvar "\\var".
 
 <hr>
 \section cmdprotected \\protected
 
   \addindex \\protected
-  \addindex \\protectedsection
   Indicates that the member documented in the comment block is protected,
   i.e., should only be accessed by other members in the same or derived
   classes.
   "protected:" class marker in C++, use \\protectedsection.
 
   \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
-      and \ref cmdprivate "\\private".
+      \ref cmdprivate "\\private" and \ref cmdprotectedsection "\\protectedsection".
+
+<hr>
+\section cmdprotectedsection \\protectedsection
+
+  \addindex \\protectedsection
+  Starting a section of protected members, in a way similar to the
+  "protected:" class marker in C++.
+  Indicates that the member documented in the comment block is protected,
+  i.e., should only be accessed by other members in the same or derived
+  classes.
+
+  \sa sections \ref cmdmemberof "\\memberof", \ref cmdpublic "\\public",
+      \ref cmdprivate "\\private" and \ref cmdprotected "\\protected".
 
 <hr>
 \section cmdprotocol \\protocol <name> [<header-file>] [<header-name>]
 
   \addindex \\protocol
   Indicates that a comment block contains documentation for a
-  protocol in Objective-C with name \<name\>. The arguments are equal 
+  protocol in Objective-C with name \<name\>. The arguments are equal
   to the \\class command.