From 6e8975abdb6b52477a5788bca969e13e467814dd Mon Sep 17 00:00:00 2001
From: dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>
Date: Tue, 3 Aug 2004 16:49:33 +0000
Subject: Release-1.3.8-20040803

---
 Doxyfile                                 |   2 +-
 INSTALL                                  |   4 +-
 PLATFORMS                                |   1 +
 README                                   |   4 +-
 VERSION                                  |   2 +-
 addon/doxywizard/doxywizard.cpp          |   4 +-
 configure                                |  13 ++-
 doc/Doxyfile                             |   5 +-
 doc/doxygen_manual.tex                   |   4 +-
 doc/index.doc                            |   8 +-
 doc/language.doc                         |  14 ++--
 libpng/pngrutil.c                        |  36 ++++----
 packages/rpm/doxygen.spec                |   2 +-
 qtools/qglobal.h                         |   2 +
 src/compound.xsd                         |   2 +
 src/compound_xsd.h                       |   2 +
 src/docparser.cpp                        | 106 ++++++++++++++---------
 src/docparser.h                          |  10 ++-
 src/doxygen.cpp                          | 101 +++++++++++++---------
 src/entry.cpp                            |   2 +
 src/entry.h                              |   2 +
 src/filedef.cpp                          | 139 +++++++++++++++++--------------
 src/filedef.h                            |   8 +-
 src/htmldocvisitor.cpp                   |   4 +-
 src/htmlgen.cpp                          |  14 ++--
 src/memberdef.h                          |   8 ++
 src/pre.l                                |  15 ++--
 src/scanner.l                            |  76 ++++++++---------
 src/tagreader.cpp                        |   4 +-
 src/translator_cn.h                      |  17 +++-
 src/translator_de.h                      |  19 ++++-
 src/translator_dk.h                      |  15 +++-
 src/translator_se.h                      |  51 +++++++++++-
 src/util.cpp                             |  18 ++--
 src/xmlgen.cpp                           |   9 ++
 tmake/lib/m68k-atari-mint-g++/app.t      |   2 +
 tmake/lib/m68k-atari-mint-g++/lib.t      |   2 +
 tmake/lib/m68k-atari-mint-g++/subdirs.t  |   2 +
 tmake/lib/m68k-atari-mint-g++/tmake.conf |  59 +++++++++++++
 wintools/qtools.dsp                      |   4 +
 40 files changed, 535 insertions(+), 257 deletions(-)
 create mode 100755 tmake/lib/m68k-atari-mint-g++/app.t
 create mode 100755 tmake/lib/m68k-atari-mint-g++/lib.t
 create mode 100755 tmake/lib/m68k-atari-mint-g++/subdirs.t
 create mode 100755 tmake/lib/m68k-atari-mint-g++/tmake.conf

diff --git a/Doxyfile b/Doxyfile
index dabab8c..c7da9e2 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -166,7 +166,7 @@ MAN_LINKS              = NO
 #---------------------------------------------------------------------------
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
-GENERATE_XML           = YES
+GENERATE_XML           = NO
 XML_OUTPUT             = xml
 XML_SCHEMA             = 
 XML_DTD                = 
diff --git a/INSTALL b/INSTALL
index ea70031..88f2d0a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.3.8
+DOXYGEN Version 1.3.8-20040803
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (25 July 2004)
+Dimitri van Heesch (03 August 2004)
diff --git a/PLATFORMS b/PLATFORMS
index adc7520..8f87302 100644
--- a/PLATFORMS
+++ b/PLATFORMS
@@ -13,6 +13,7 @@ irix-g++
 irix-n32      
 linux-g++      
 macosx-c++
+m68k-atari-mint-g++
 netbsd-g++    
 openbsd-g++    
 osf1-cxx      
diff --git a/README b/README
index 8abd960..4cdd66f 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.3.8
+DOXYGEN Version 1.3.8_20040803
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (25 July 2004)
+Dimitri van Heesch (dimitri@stack.nl) (03 August 2004)
diff --git a/VERSION b/VERSION
index e05cb33..cda99f6 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.8
+1.3.8-20040803
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
index 9462296..7060242 100644
--- a/addon/doxywizard/doxywizard.cpp
+++ b/addon/doxywizard/doxywizard.cpp
@@ -850,7 +850,7 @@ void MainWidget::launchWizard()
   // step1
   wizard.setProjectName(Config_getString("PROJECT_NAME"));
   wizard.setProjectNumber(Config_getString("PROJECT_NUMBER"));
-  if (Config_getList("INPUT").count()==1)
+  if (Config_getList("INPUT").count()>0)
   {
     QString dirName=Config_getList("INPUT").getFirst();
     QFileInfo fi(dirName);
@@ -1109,6 +1109,8 @@ void MainWidget::loadConfigFile()
   if (!fn.isEmpty())
   {
     loadConfigFromFile(fn);
+    // set current dir to where the config file is located
+    QDir::setCurrent(QFileInfo(fn).dirPath(TRUE));
   }
 }
 
diff --git a/configure b/configure
index 00bc2d7..b1f02ee 100755
--- a/configure
+++ b/configure
@@ -194,6 +194,9 @@ if test -z "$f_platform"; then
     Cygwin:*)
       f_platform=win32-g++
       ;;
+    *MiNT:*)
+      f_platform=m68k-atari-mint-g++
+      ;;
     *)
     echo
     echo "Your platform was not recognised by this configure script"
@@ -431,6 +434,13 @@ HAVE_DOT  = $f_dot
 EOF
 fi
 
+if test "$f_platform" = "m68k-atari-mint-g++"; then
+  cat >> .makeconfig <<EOF
+TMAKE += -unix
+EOF
+fi
+
+
 touch .tmakeconfig
 if test "$f_shared" = NO; then
   if test "$f_platform" = "osf1-cxx" -o "$f_platform" = "irix-n32"; then
@@ -526,8 +536,7 @@ done
 echo -n "  Generating src/lang_cfg.h..."
 echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>); 
         chomp @l; 
-	@allowed=(NL,SE,CZ,FR,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,BR,
-		  DK,SK,UA,GR,TW,SR,CA,LT,ZA);
+	@allowed=(split(/,/,"NL,SE,CZ,FR,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA"));
 	foreach my $elem (@l){ 
 	     $elem =~ tr/a-z/A-Z/;
 	     $r=0;
diff --git a/doc/Doxyfile b/doc/Doxyfile
index f44f52e..8c0cedb 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -33,10 +33,9 @@ CASE_SENSE_NAMES  = NO
 IMAGE_PATH        = .
 INPUT             = index.doc install.doc starting.doc docblocks.doc lists.doc \
                     grouping.doc formulas.doc diagrams.doc preprocessing.doc \
-                    external.doc faq.doc trouble.doc history.doc features.doc \
+                    autolink.doc output.doc external.doc faq.doc trouble.doc history.doc features.doc \
 		    doxygen_usage.doc doxytag_usage.doc \
-                    doxywizard_usage.doc \
-                    installdox_usage.doc output.doc autolink.doc \
+                    doxywizard_usage.doc installdox_usage.doc \
 		    config.doc commands.doc htmlcmds.doc language.doc \
                     perlmod.doc perlmod_tree.doc arch.doc 
 FILE_PATTERNS     = *.cpp *.h *.doc
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index 034e03c..0514222 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -54,6 +54,8 @@ Written by Dimitri van Heesch\\[2ex]
 \input{formulas}
 \input{diagrams}
 \input{preprocessing}
+\input{autolink}
+\input{output}
 \input{external}
 \input{faq}
 \input{trouble}
@@ -64,8 +66,6 @@ Written by Dimitri van Heesch\\[2ex]
 \input{doxytag_usage}
 \input{doxywizard_usage}
 \input{installdox_usage}
-\input{output}
-\input{autolink}
 \input{config}
 \input{commands}
 \input{htmlcmds}
diff --git a/doc/index.doc b/doc/index.doc
index 6aa4c19..e878106 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -71,6 +71,10 @@ The first part forms a user manual:
 <li>Section \ref formulas shows how to insert formulas in the documentation.
 <li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate.
 <li>Section \ref preprocessing explains how doxygen deals with macro definitions.
+<li>Section \ref autolink shows how to put links to files, classes, 
+                 and members in the documentation.
+<li>Section \ref output shows how to generate the various output formats
+                 supported by doxygen.
 <li>Section \ref external explains how to let doxygen create links to externally generated documentation.
 <li>Section \ref faq gives answers to frequently asked questions. 
 <li>Section \ref trouble tells you what to do when you have problems.
@@ -87,10 +91,6 @@ The second part forms a reference manual:
 <li>Section \ref doxywizard_usage shows how to use the \c doxywizard program. 
 <li>Section \ref installdox_usage shows how to use the \c installdox
                  script that is generated by doxygen if you use tag files. 
-<li>Section \ref output shows how to generate the various output formats
-                 supported by doxygen.
-<li>Section \ref autolink shows how to put links to files, classes, 
-                 and members in the documentation.
 <li>Section \ref config shows how to fine-tune doxygen, so it 
               generates the documentation you want.
 <li>Section \ref commands shows an overview of the special commands that can be 
diff --git a/doc/language.doc b/doc/language.doc
index 456cf66..d7c42dd 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
 than English (the default). The output language is chosen through the
 configuration file (with default name and known as Doxyfile).
 
-Currently (version 1.3.7-20040719), 30 languages 
+Currently (version 1.3.8), 30 languages 
 are supported (sorted alphabetically):
 Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
 Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
@@ -72,7 +72,7 @@ when the translator was updated.
     <td>Chinese</td>
     <td>Li Daobing<br>Wei Liu</td>
     <td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td>
-    <td>1.3.08</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Chinese Traditional</td>
@@ -126,7 +126,7 @@ when the translator was updated.
     <td>German</td>
     <td>Jens Seidel</td>
     <td>jensseidel at users dot sf dot net</td>
-    <td>1.3.8</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Greek</td>
@@ -234,7 +234,7 @@ when the translator was updated.
     <td>Swedish</td>
     <td>Mikael Hallin</td>
     <td>mikaelhallin at yahoo dot se</td>
-    <td>1.3.3</td>
+    <td>1.3.8</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Ukrainian</td>
@@ -263,7 +263,7 @@ when the translator was updated.
   \hline
   Catalan & Albert Mora & {\tt\tiny amora@iua.upf.es} & 1.2.17 \\
   \hline
-  Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.3.08 \\
+  Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & up-to-date \\
   ~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\
   \hline
   Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & 1.3.8 \\
@@ -283,7 +283,7 @@ when the translator was updated.
   \hline
   French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & 1.3.8 \\
   \hline
-  German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & 1.3.8 \\
+  German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & up-to-date \\
   \hline
   Greek & Harry Kalogirou & {\tt\tiny harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
   \hline
@@ -326,7 +326,7 @@ when the translator was updated.
   \hline
   Spanish & Francisco Oltra Thennet & {\tt\tiny foltra@puc.cl} & 1.3.8 \\
   \hline
-  Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.3.3 \\
+  Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.3.8 \\
   \hline
   Ukrainian & Olexij Tkatchenko & {\tt\tiny olexij.tkatchenko@gmx.de} & 1.2.11 \\
   \hline
diff --git a/libpng/pngrutil.c b/libpng/pngrutil.c
index dca7c65..e9dc1a4 100644
--- a/libpng/pngrutil.c
+++ b/libpng/pngrutil.c
@@ -790,16 +790,18 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
 #endif
 
 #if defined(PNG_READ_sRGB_SUPPORTED)
+#undef  png_abs
+#define png_abs(x) (((x)>0)?(x):-(x))
    if (info_ptr->valid & PNG_INFO_sRGB)
       {
-      if (abs(int_x_white - 31270L) > 1000 ||
-          abs(int_y_white - 32900L) > 1000 ||
-          abs(int_x_red   - 64000L) > 1000 ||
-          abs(int_y_red   - 33000L) > 1000 ||
-          abs(int_x_green - 30000L) > 1000 ||
-          abs(int_y_green - 60000L) > 1000 ||
-          abs(int_x_blue  - 15000L) > 1000 ||
-          abs(int_y_blue  -  6000L) > 1000)
+      if (png_abs(int_x_white - 31270L) > 1000 ||
+          png_abs(int_y_white - 32900L) > 1000 ||
+          png_abs(int_x_red   - 64000L) > 1000 ||
+          png_abs(int_y_red   - 33000L) > 1000 ||
+          png_abs(int_x_green - 30000L) > 1000 ||
+          png_abs(int_y_green - 60000L) > 1000 ||
+          png_abs(int_x_blue  - 15000L) > 1000 ||
+          png_abs(int_y_blue  -  6000L) > 1000)
          {
 
             png_warning(png_ptr,
@@ -925,15 +927,17 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
 
 #ifdef PNG_READ_cHRM_SUPPORTED
 #ifdef PNG_FIXED_POINT_SUPPORTED
+#undef  png_abs
+#define png_abs(x) (((x)>0)?(x):-(x))
    if (info_ptr->valid & PNG_INFO_cHRM)
-      if (abs(info_ptr->int_x_white - 31270L) > 1000 ||
-          abs(info_ptr->int_y_white - 32900L) > 1000 ||
-          abs(info_ptr->int_x_red   - 64000L) > 1000 ||
-          abs(info_ptr->int_y_red   - 33000L) > 1000 ||
-          abs(info_ptr->int_x_green - 30000L) > 1000 ||
-          abs(info_ptr->int_y_green - 60000L) > 1000 ||
-          abs(info_ptr->int_x_blue  - 15000L) > 1000 ||
-          abs(info_ptr->int_y_blue  -  6000L) > 1000)
+      if (png_abs(info_ptr->int_x_white - 31270L) > 1000 ||
+          png_abs(info_ptr->int_y_white - 32900L) > 1000 ||
+          png_abs(info_ptr->int_x_red   - 64000L) > 1000 ||
+          png_abs(info_ptr->int_y_red   - 33000L) > 1000 ||
+          png_abs(info_ptr->int_x_green - 30000L) > 1000 ||
+          png_abs(info_ptr->int_y_green - 60000L) > 1000 ||
+          png_abs(info_ptr->int_x_blue  - 15000L) > 1000 ||
+          png_abs(info_ptr->int_y_blue  -  6000L) > 1000)
          {
             png_warning(png_ptr,
               "Ignoring incorrect cHRM value when sRGB is also present");
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index ac3640a..7a358d5 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,6 +1,6 @@
 Summary: A documentation system for C/C++.
 Name: doxygen
-Version: 1.3.8
+Version: 1.3.8_20040803
 Release: 1
 Epoch: 1
 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
index ed00758..2b766db 100644
--- a/qtools/qglobal.h
+++ b/qtools/qglobal.h
@@ -132,6 +132,8 @@
 #define _OS_CYGWIN_
 #elif defined(__BEOS__)
 #define _OS_BEOS_
+#elif defined(__MINT__)
+#define _OS_MINT_
 #else
 #error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
 #endif
diff --git a/src/compound.xsd b/src/compound.xsd
index c5fea76..f9e0abe 100644
--- a/src/compound.xsd
+++ b/src/compound.xsd
@@ -119,6 +119,8 @@
       <xsd:element name="definition" minOccurs="0" />
       <xsd:element name="argsstring" minOccurs="0" />
       <xsd:element name="name" />
+      <xsd:element name="read" minOccurs="0" />
+      <xsd:element name="write" minOccurs="0" />
       <xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
       <xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
       <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
index 90409f7..3aad39c 100644
--- a/src/compound_xsd.h
+++ b/src/compound_xsd.h
@@ -119,6 +119,8 @@
 "      <xsd:element name=\"definition\" minOccurs=\"0\" />\n"
 "      <xsd:element name=\"argsstring\" minOccurs=\"0\" />\n"
 "      <xsd:element name=\"name\" />\n"
+"      <xsd:element name=\"read\" minOccurs=\"0\" />\n"
+"      <xsd:element name=\"write\" minOccurs=\"0\" />\n"
 "      <xsd:element name=\"reimplements\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
 "      <xsd:element name=\"reimplementedby\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
 "      <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 3f74dcf..2f6a55f 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -667,6 +667,48 @@ static void handleInitialStyleCommands(DocPara *parent,QList<DocNode> &children)
   }
 }
 
+static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
+{
+  HtmlAttribListIterator li(tagHtmlAttribs);
+  HtmlAttrib *opt;
+  int index=0;
+  int retval = RetVal_OK;
+  for (li.toFirst();(opt=li.current());++li,++index)
+  {
+    if (opt->name=="name") // <a name=label> tag
+    {
+      if (!opt->value.isEmpty())
+      {
+        DocAnchor *anc = new DocAnchor(parent,opt->value,TRUE);
+        children.append(anc);
+        break; // stop looking for other tag attribs
+      }
+      else
+      {
+        warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <a> tag with name option but without value!");
+      }
+    }
+    else if (opt->name=="href") // <a href=url>..</a> tag
+    {
+      // copy attributes
+      HtmlAttribList attrList = tagHtmlAttribs;
+      // and remove the href attribute
+      bool result = attrList.remove(index);
+      ASSERT(result);
+      DocHRef *href = new DocHRef(parent,attrList,opt->value);
+      children.append(href);
+      g_insideHtmlLink=TRUE;
+      retval = href->parse();
+      g_insideHtmlLink=FALSE;
+      break;
+    }
+    else // unsupported option for tag a
+    {
+    }
+  }
+  return retval;
+}
+
 const char *DocStyleChange::styleString() const
 {
   switch (m_style)
@@ -1924,6 +1966,11 @@ endlink:
 
 //---------------------------------------------------------------------------
 
+DocDotFile::DocDotFile(DocNode *parent,const QString &name) : 
+      m_parent(parent), m_name(name), m_relPath(g_relPath)
+{
+}
+
 void DocDotFile::parse()
 {
   g_nodeStack.push(this);
@@ -2001,6 +2048,12 @@ void DocDotFile::parse()
 
 //---------------------------------------------------------------------------
 
+DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) : 
+      m_parent(parent), m_attribs(attribs), m_name(name), 
+      m_type(t), m_relPath(g_relPath)
+{
+}
+
 void DocImage::parse()
 {
   g_nodeStack.push(this);
@@ -2134,11 +2187,24 @@ int DocHtmlHeader::parse()
               }
               goto endheader;
             }
+            else if (tagId==HTML_A)
+            {
+              if (!g_token->endTag)
+              {
+                handleAHref(this,m_children,g_token->attribs);
+              }
+            }
+            else if (tagId==HTML_BR)
+            {
+              DocLineBreak *lb = new DocLineBreak(this);
+              m_children.append(lb);
+            }
             else
             {
               warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <h%d> context",
                   g_token->endTag?"/":"",g_token->name.data(),m_level);
             }
+            
           }
           break;
         case TK_SYMBOL: 
@@ -4042,44 +4108,7 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
       }
       break;
     case HTML_A:
-      {
-        HtmlAttribListIterator li(tagHtmlAttribs);
-        HtmlAttrib *opt;
-        int index=0;
-        for (li.toFirst();(opt=li.current());++li,++index)
-        {
-          if (opt->name=="name") // <a name=label> tag
-          {
-            if (!opt->value.isEmpty())
-            {
-              DocAnchor *anc = new DocAnchor(this,opt->value,TRUE);
-              m_children.append(anc);
-              break; // stop looking for other tag attribs
-            }
-            else
-            {
-              warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <a> tag with name option but without value!");
-            }
-          }
-          else if (opt->name=="href") // <a href=url>..</a> tag
-          {
-            // copy attributes
-            HtmlAttribList attrList = tagHtmlAttribs;
-            // and remove the href attribute
-            bool result = attrList.remove(index);
-            ASSERT(result);
-            DocHRef *href = new DocHRef(this,attrList,opt->value);
-            m_children.append(href);
-            g_insideHtmlLink=TRUE;
-            retval = href->parse();
-            g_insideHtmlLink=FALSE;
-            break;
-          }
-          else // unsupported option for tag a
-          {
-          }
-        }
-      }
+      retval=handleAHref(this,m_children,tagHtmlAttribs);
       break;
     case HTML_H1:
       retval=handleHtmlHeader(tagHtmlAttribs,1);
@@ -4273,6 +4302,7 @@ int DocPara::handleHtmlEndTag(const QString &tagName)
       break;
     default:
       // we should not get here!
+      warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end tag %s\n",tagName.data());
       ASSERT(0);
       break;
   }
diff --git a/src/docparser.h b/src/docparser.h
index 84fe830..b5467c2 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -568,8 +568,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
 {
   public:
     enum Type { Html, Latex, Rtf };
-    DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) : 
-      m_parent(parent), m_attribs(attribs), m_name(name), m_type(t) {}
+    DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t);
     Kind kind() const          { return Kind_Image; }
     Type type() const          { return m_type; }
     QString name() const       { return m_name; }
@@ -577,6 +576,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
     bool hasCaption() const    { return !m_children.isEmpty(); }
     QString width() const      { return m_width; }
     QString height() const     { return m_height; }
+    QString relPath() const    { return m_relPath; }
     const HtmlAttribList &attribs() const { return m_attribs; }
     void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
     void parse();
@@ -588,18 +588,19 @@ class DocImage : public CompAccept<DocImage>, public DocNode
     Type     m_type;
     QString  m_width;
     QString  m_height;
+    QString  m_relPath;
 };
 
 /*! @brief Node representing a dot file */
 class DocDotFile : public CompAccept<DocDotFile>, public DocNode
 {
   public:
-    DocDotFile(DocNode *parent,const QString &name) : 
-      m_parent(parent), m_name(name) { }
+    DocDotFile(DocNode *parent,const QString &name);
     void parse();
     Kind kind() const          { return Kind_DotFile; }
     QString name() const       { return m_name; }
     QString file() const       { return m_file; }
+    QString relPath() const    { return m_relPath; }
     bool hasCaption() const    { return !m_children.isEmpty(); }
     QString width() const      { return m_width; }
     QString height() const     { return m_height; }
@@ -609,6 +610,7 @@ class DocDotFile : public CompAccept<DocDotFile>, public DocNode
     DocNode *m_parent;
     QString  m_name;
     QString  m_file;
+    QString  m_relPath;
     QString  m_width;
     QString  m_height;
 };
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index cd5d557..e923082 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1081,8 +1081,9 @@ static void findUsingDirectives(Entry *root)
   {
     //printf("Found using directive %s at line %d of %s\n",
     //    root->name.data(),root->startLine,root->fileName.data());
+    QCString name=substitute(root->name,".","::");
     bool ambig;
-    if (!root->name.isEmpty())
+    if (!name.isEmpty())
     {
       NamespaceDef *usingNd = 0;
       NamespaceDef *nd = 0;
@@ -1109,8 +1110,8 @@ static void findUsingDirectives(Entry *root)
       {
         QCString scope=scopeOffset>0 ? 
                       nsName.left(scopeOffset)+"::" : QCString();
-        usingNd = getResolvedNamespace(scope+root->name);
-        //printf("Trying with scope=`%s' usingNd=%p\n",(scope+root->name).data(),usingNd);
+        usingNd = getResolvedNamespace(scope+name);
+        //printf("Trying with scope=`%s' usingNd=%p\n",(scope+name).data(),usingNd);
         if (scopeOffset==0)
         {
           scopeOffset=-1;
@@ -1121,7 +1122,7 @@ static void findUsingDirectives(Entry *root)
         }
       } while (scopeOffset>=0 && usingNd==0);
 
-      //printf("%s -> %p\n",root->name.data(),usingNd);
+      //printf("%s -> %p\n",name.data(),usingNd);
 
       // add the namespace the correct scope
       if (usingNd)
@@ -1141,7 +1142,7 @@ static void findUsingDirectives(Entry *root)
       else // unknown namespace, but add it anyway.
       {
         NamespaceDef *nd=new NamespaceDef(
-            root->fileName,root->startLine,root->name);
+            root->fileName,root->startLine,name);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         nd->addSectionsToDefinition(root->anchors);
@@ -1169,7 +1170,7 @@ static void findUsingDirectives(Entry *root)
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
         nd->insertUsedFile(root->fileName);
         // add class to the list
-        Doxygen::namespaceSDict.inSort(root->name,nd);
+        Doxygen::namespaceSDict.inSort(name,nd);
         nd->setRefItems(root->sli);
       }
     }
@@ -1490,6 +1491,8 @@ static MemberDef *addVariableToClass(
   md->setMaxInitLines(root->initLines);
   md->setMemberGroupId(root->mGrpId);
   md->setMemberSpecifiers(root->memSpec);
+  md->setReadAccessor(root->read);
+  md->setWriteAccessor(root->write);
   md->enableCallGraph(root->callGraph);
   addMemberToGroups(root,md);
   //if (root->mGrpId!=-1) 
@@ -2928,18 +2931,18 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co
   return templateNames;
 }
 
-/*! Searches a class from within the context of \a cd and returns its
+/*! Searches a class from within \a context and \a cd and returns its
  *  definition if found (otherwise 0 is returned).
- *  This function differs from getResolvedClass in that it also takes 
- *  using declarations and definition into account.
  */
-static ClassDef *findClassWithinClassContext(ClassDef *cd,const QCString &name)
+static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,const QCString &name)
 {
+  
+#if 0
   ClassDef *result=0;
 
+  FileDef *fd=cd->getFileDef();
   // try using of namespaces in namespace scope
   NamespaceDef *nd=cd->getNamespaceDef();
-  FileDef *fd=cd->getFileDef();
   if (nd) // class is inside a namespace
   {
     QCString fName = nd->name()+"::"+name;
@@ -3029,8 +3032,21 @@ static ClassDef *findClassWithinClassContext(ClassDef *cd,const QCString &name)
       }
     }
   }
+#endif
 
-  return getResolvedClass(cd,fd,name);
+  FileDef *fd=cd->getFileDef();
+  ClassDef *result=0;
+  if (context)
+  {
+    result = getResolvedClass(context,0,name);
+    //printf("** Trying to find %s within context %s result=%s\n",
+    //    name.data(),context->name().data(),result ? result->name().data() : "<none>");
+  }
+  if (result==0)
+  {
+    result = getResolvedClass(cd,fd,name);
+  }
+  return result;
 }
 
 enum FindBaseClassRelation_Mode 
@@ -3042,6 +3058,7 @@ enum FindBaseClassRelation_Mode
 
 static bool findClassRelation(
                            Entry *root,
+                           Definition *context,
                            ClassDef *cd,
                            BaseInfo *bi,
                            QDict<int> *templateNames,
@@ -3052,6 +3069,7 @@ static bool findClassRelation(
 
 
 static void findUsedClassesForClass(Entry *root,
+                           Definition *context,
                            ClassDef *masterCd,
                            ClassDef *instanceCd,
                            bool isArtificial,
@@ -3072,6 +3090,7 @@ static void findUsedClassesForClass(Entry *root,
       MemberDef *md=mi->memberDef;
       if (md->isVariable()) // for each member variable in this class
       {
+        //printf("Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
         QCString type=removeRedundantWhiteSpace(md->typeString());
         int pos=0;
         QCString usedClassName;
@@ -3082,10 +3101,10 @@ static void findUsedClassesForClass(Entry *root,
         {
           type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
         }
-        //printf("findUsedClassesForClass(%s)=%s\n",masterCd->name().data(),type.data());
+        //printf("  template substitution gives=%s\n",type.data());
         while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec))
         {
-          //printf("Found used class %s\n",usedClassName.data());
+          //printf("  found used class %s\n",usedClassName.data());
           // the name could be a type definition, resolve it
           QCString typeName = resolveTypeDef(masterCd,usedClassName);
           //printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data());
@@ -3105,8 +3124,8 @@ static void findUsedClassesForClass(Entry *root,
             replaceNamespaceAliases(usedClassName,si);
           }
           // add any template arguments to the class
-          QCString usedName = usedClassName+templSpec;
-          //printf("usedName=%s\n",usedName.data());
+          QCString usedName = removeRedundantWhiteSpace(usedClassName+templSpec);
+          //printf("    usedName=%s\n",usedName.data());
 
           bool delTempNames=FALSE;
           if (templateNames==0)
@@ -3115,7 +3134,7 @@ static void findUsedClassesForClass(Entry *root,
             delTempNames=TRUE;
           }
           BaseInfo bi(usedName,Public,Normal);
-          findClassRelation(root,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
+          findClassRelation(root,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
 
           if (masterCd->templateArguments())
           {
@@ -3150,8 +3169,9 @@ static void findUsedClassesForClass(Entry *root,
 
           if (!found)
           {
-            ClassDef *usedCd=findClassWithinClassContext(masterCd,usedName);
-            //printf("Looking for used class: result=%p master=%p\n",usedCd,masterCd);
+            ClassDef *usedCd=findClassWithinClassContext(context,masterCd,usedName);
+            //printf("Looking for used class %s: result=%s master=%s\n",
+            //    usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
 
             if (usedCd) 
             {
@@ -3197,6 +3217,7 @@ static void findUsedClassesForClass(Entry *root,
 
 static void findBaseClassesForClass(
       Entry *root,
+      Definition *context,
       ClassDef *masterCd,
       ClassDef *instanceCd,
       FindBaseClassRelation_Mode mode,
@@ -3235,18 +3256,18 @@ static void findBaseClassesForClass(
       if (mode==DocumentedOnly)
       {
         // find a documented base class in the correct scope
-        if (!findClassRelation(root,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
+        if (!findClassRelation(root,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
         {
           if (!Config_getBool("HIDE_UNDOC_RELATIONS"))
           {
             // no documented base class -> try to find an undocumented one
-            findClassRelation(root,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
+            findClassRelation(root,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
           }
         }
       }
       else if (mode==TemplateInstances)
       {
-        findClassRelation(root,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
+        findClassRelation(root,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
       }
       if (delTempNames)
       {
@@ -3260,6 +3281,7 @@ static void findBaseClassesForClass(
 //----------------------------------------------------------------------
 
 static bool findTemplateInstanceRelation(Entry *root,
+            Definition *context,
             ClassDef *templateClass,const QCString &templSpec,
             QDict<int> *templateNames,
             bool isArtificial)
@@ -3302,10 +3324,10 @@ static bool findTemplateInstanceRelation(Entry *root,
       Debug::print(Debug::Classes,0,"        template root found %s!\n",templateRoot->name.data());
       ArgumentList *templArgs = new ArgumentList;
       stringToArgumentList(templSpec,templArgs);
-      findBaseClassesForClass(templateRoot,templateClass,instanceClass,
+      findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
           TemplateInstances,isArtificial,templArgs,templateNames);
 
-      findUsedClassesForClass(templateRoot,templateClass,instanceClass,
+      findUsedClassesForClass(templateRoot,context,templateClass,instanceClass,
           isArtificial,templArgs,templateNames);
       delete templArgs;
     }
@@ -3339,6 +3361,7 @@ static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
 
 static bool findClassRelation(
                            Entry *root,
+                           Definition *context,
                            ClassDef *cd,
                            BaseInfo *bi,
                            QDict<int> *templateNames,
@@ -3416,10 +3439,10 @@ static bool findClassRelation(
             (bi->virt==Normal)?"normal":"virtual"
            );
 
-        int i;
-        int si=baseClassName.findRev("::");
+        int i=baseClassName.find('<');
+        int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
         if (si==-1) si=0;
-        if (baseClass==0 && (i=baseClassName.find('<',si))!=-1) 
+        if (baseClass==0 && i!=-1) 
           // base class has template specifiers
         {
           // TODO: here we should try to find the correct template specialization
@@ -3467,7 +3490,7 @@ static bool findClassRelation(
         //NamespaceDef *nd=cd->getNamespaceDef();
         if (!found)
         {
-          baseClass=findClassWithinClassContext(cd,baseClassName);
+          baseClass=findClassWithinClassContext(context,cd,baseClassName);
           //printf("findClassWithinClassContext(%s,%s)=%p\n",
           //    cd->name().data(),baseClassName.data(),baseClass);
           found = baseClass!=0 && baseClass!=cd;
@@ -3490,7 +3513,7 @@ static bool findClassRelation(
           // relations.
           if (!templSpec.isEmpty() && mode==TemplateInstances)
           {
-            findTemplateInstanceRelation(root,baseClass,templSpec,templateNames,isArtificial);
+            findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,isArtificial);
           }
           else if (mode==DocumentedOnly)
           {
@@ -3643,7 +3666,7 @@ static void findInheritedTemplateInstances()
     if ((cd=getClass(bName)))
     {
       //printf("Class %s %d\n",cd->name().data(),root->extends->count());
-      findBaseClassesForClass(root,cd,cd,TemplateInstances,FALSE);
+      findBaseClassesForClass(root,cd,cd,cd,TemplateInstances,FALSE);
     }
   }
 }
@@ -3663,7 +3686,7 @@ static void findUsedTemplateInstances()
     Debug::print(Debug::Classes,0,"  Class %s : \n",bName.data());
     if ((cd=getClass(bName)))
     {
-      findUsedClassesForClass(root,cd,cd,TRUE);
+      findUsedClassesForClass(root,cd,cd,cd,TRUE);
     }
   }
 }
@@ -3683,7 +3706,7 @@ static void computeClassRelations()
     Debug::print(Debug::Classes,0,"  Class %s : \n",bName.data());
     if ((cd=getClass(bName)))
     {
-      findBaseClassesForClass(root,cd,cd,DocumentedOnly,FALSE);
+      findBaseClassesForClass(root,cd,cd,cd,DocumentedOnly,FALSE);
     }
     if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) && 
         bName.right(2)!="::")
@@ -3762,10 +3785,10 @@ static void computeTemplateClassRelations()
             
             tbi.name = substituteTemplateArgumentsInString(bi->name,tl,templArgs);
             // find a documented base class in the correct scope
-            if (!findClassRelation(root,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
+            if (!findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
             {
               // no documented base class -> try to find an undocumented one
-              findClassRelation(root,tcd,&tbi,actualTemplateNames,Undocumented,FALSE);
+              findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,Undocumented,FALSE);
             }
             delete actualTemplateNames;
           }
@@ -6194,14 +6217,15 @@ static void findSectionsInDocumentation()
 
 static void flushCachedTemplateRelations()
 {
-  // remove all references to template classes from the cache
-  // as there can be new template instances that should be linked
-  // to instead.
+  // remove all references to classes from the cache
+  // as there can be new template instances in the inheritance path
+  // to this class. Optimization: only remove those classes that
+  // have inheritance instances as direct or indirect sub classes.
   QCacheIterator<LookupInfo> ci(Doxygen::lookupCache);
   LookupInfo *li=0;
   for (ci.toFirst();(li=ci.current());++ci)
   {
-    if (li->classDef && li->classDef->isTemplate())
+    if (li->classDef)
     {
       Doxygen::lookupCache.remove(ci.currentKey());
     }
@@ -8244,6 +8268,7 @@ void parseInput()
   
   msg("Building file list...\n");
   buildFileList(root);
+  //generateFileTree();
   
   msg("Searching for included using directives...\n");
   findIncludedUsingDirectives();
diff --git a/src/entry.cpp b/src/entry.cpp
index 2f2f237..02fa578 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -70,6 +70,8 @@ Entry::Entry(const Entry &e)
   docFile     = e.docFile.copy();
   relates     = e.relates.copy();
   relatesDup  = e.relatesDup;
+  read        = e.read.copy();
+  write       = e.write.copy();
   brief       = e.brief.copy();
   briefLine   = e.briefLine;
   briefFile   = e.briefFile.copy();
diff --git a/src/entry.h b/src/entry.h
index d18d7e7..2d7d49a 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -289,6 +289,8 @@ class Entry
     QCString     inbodyFile;  //!< file in which the body doc was found
     QCString     relates;     //!< related class (doc block)
     bool         relatesDup;  //!< keep duplicate doc in original file also
+    QCString     read;        //!< property read accessor
+    QCString     write;       //!< property write accessor
     QCString     inside;      //!< name of the class in which documents are found
     QCString     exception;   //!< throw specification
     int          bodyLine;    //!< line number of the definition in the source
diff --git a/src/filedef.cpp b/src/filedef.cpp
index ad3a216..2dabcc9 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -240,6 +240,12 @@ void FileDef::writeDocumentation(OutputList &ol)
     ol.startTextBlock(); 
     writeDetailedDocumentation(ol);
     ol.endTextBlock();
+
+    ol.pushGeneratorState();
+    ol.disable(OutputGenerator::Man);
+    ol.disable(OutputGenerator::RTF);
+    ol.newParagraph();
+    ol.popGeneratorState();
   }
   else if (!briefDescription().isEmpty()) 
   {
@@ -275,11 +281,15 @@ void FileDef::writeDocumentation(OutputList &ol)
                       fd->name().right(5)==".java";
       }
       ol.startTypewriter();
-      if (isIDLorJava)
+      if (isIDLorJava) // IDL/Java include
       {
         ol.docify("import ");
       }
-      else
+      else if (ii->imported) // Objective-C include
+      {
+        ol.docify("#import ");
+      }
+      else // C/C++ include
       {
         ol.docify("#include ");
       }
@@ -302,12 +312,13 @@ void FileDef::writeDocumentation(OutputList &ol)
             0,ii->includeName);
         if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fd->isReference()) 
         {
-          const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
+          const char *locStr = (ii->local    || isIDLorJava) ? "yes" : "no";
+          const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
           Doxygen::tagFile << "    <includes id=\"" 
-                           << convertToXML(fd->getOutputFileBase()) 
-                           << "\" name=\"" 
-                           << convertToXML(fd->name())
-                           << "\" local=\"" << locStr << "\">" 
+                           << convertToXML(fd->getOutputFileBase()) << "\" "
+                           << "name=\"" << convertToXML(fd->name()) << "\" "
+                           << "local=\"" << locStr << "\" "
+                           << "imported=\"" << impStr << "\">"
                            << convertToXML(ii->includeName)
                            << "</includes>" 
                            << endl;
@@ -543,66 +554,30 @@ void FileDef::insertMember(MemberDef *md)
   {
     case MemberDef::Variable:     
     case MemberDef::Property:     
-      if (sortBriefDocs)
-        decVarMembers.inSort(md);
-      else
-        decVarMembers.append(md);
-      if (sortMemberDocs)
-        docVarMembers.inSort(md); 
-      else
-        docVarMembers.append(md);
+      if (sortBriefDocs)  decVarMembers.inSort(md); else decVarMembers.append(md);
+      if (sortMemberDocs) docVarMembers.inSort(md); else docVarMembers.append(md);
       break;
     case MemberDef::Function: 
-      if (sortBriefDocs)
-        decFuncMembers.inSort(md);
-      else
-        decFuncMembers.append(md);
-      if (sortMemberDocs)    
-        docFuncMembers.inSort(md); 
-      else
-        docFuncMembers.append(md);
+      if (sortBriefDocs)  decFuncMembers.inSort(md); else decFuncMembers.append(md);
+      if (sortMemberDocs) docFuncMembers.inSort(md); else docFuncMembers.append(md);
       break;
     case MemberDef::Typedef:      
-      if (sortBriefDocs)
-        decTypedefMembers.inSort(md);
-      else
-        decTypedefMembers.append(md);
-      if (sortMemberDocs)
-        docTypedefMembers.inSort(md); 
-      else
-        docTypedefMembers.append(md);
+      if (sortBriefDocs)  decTypedefMembers.inSort(md); else decTypedefMembers.append(md);
+      if (sortMemberDocs) docTypedefMembers.inSort(md); else docTypedefMembers.append(md);
       break;
     case MemberDef::Enumeration:  
-      if (sortBriefDocs)
-        decEnumMembers.inSort(md);
-      else
-        decEnumMembers.append(md);
-      if (sortMemberDocs)
-        docEnumMembers.inSort(md); 
-      else
-        docEnumMembers.append(md);
+      if (sortBriefDocs)  decEnumMembers.inSort(md); else decEnumMembers.append(md);
+      if (sortMemberDocs) docEnumMembers.inSort(md); else docEnumMembers.append(md);
       break;
     case MemberDef::EnumValue:    // enum values are shown inside their enums
       break;
     case MemberDef::Prototype:    
-      if (sortBriefDocs)
-        decProtoMembers.inSort(md);
-      else
-        decProtoMembers.append(md);
-      if (sortMemberDocs)
-        docProtoMembers.inSort(md); 
-      else
-        docProtoMembers.append(md);
+      if (sortBriefDocs)  decProtoMembers.inSort(md); else decProtoMembers.append(md);
+      if (sortMemberDocs) docProtoMembers.inSort(md); else docProtoMembers.append(md);
       break;
     case MemberDef::Define:       
-      if (sortBriefDocs)
-        decDefineMembers.inSort(md);
-      else
-        decDefineMembers.append(md);
-      if (sortMemberDocs)
-        docDefineMembers.inSort(md); 
-      else
-        docDefineMembers.append(md);
+      if (sortBriefDocs)  decDefineMembers.inSort(md); else decDefineMembers.append(md);
+      if (sortMemberDocs) docDefineMembers.inSort(md); else docDefineMembers.append(md);
       break;
     default:
        err("FileDef::insertMembers(): "
@@ -693,7 +668,8 @@ void FileDef::addUsingDeclaration(Definition *d)
   }
 }
 
-void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local)
+void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
+                                   bool imported)
 {
   //printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
   QCString iName = fd ? fd->absFilePath().data() : incName;
@@ -703,6 +679,7 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local)
     ii->fileDef     = fd;
     ii->includeName = incName;
     ii->local       = local;
+    ii->imported    = imported;
     includeList->append(ii);
     includeDict->insert(iName,ii);
   }
@@ -759,7 +736,8 @@ void FileDef::addIncludedUsingDirectives()
 }
 
 
-void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,bool local)
+void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
+                                      bool local,bool imported)
 {
   //printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
   QCString iName = fd ? fd->absFilePath().data() : incName;
@@ -769,6 +747,7 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,bool local
     ii->fileDef     = fd;
     ii->includeName = incName;
     ii->local       = local;
+    ii->imported    = imported;
     includedByList->append(ii);
     includedByDict->insert(iName,ii);
   }
@@ -970,7 +949,7 @@ static void generateIndent(QTextStream &t,DirEntry *de,int level)
   }
 }
 
-
+#if 0
 static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
 {
   QCString indent;
@@ -1001,12 +980,43 @@ static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
     }
   }
 }
+#endif
 
-void generateFileTree(QTextStream &t)
+static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
+{
+  GroupDef *gd=0;
+  if (root->kind()==DirEntry::Dir)
+  {
+    gd = new GroupDef("<generated>",
+                      1,
+                      root->name(), // name
+                      root->name()  // title
+                     );
+    if (parent) 
+    {
+      parent->addGroup(gd);
+    }
+    else
+    {
+      Doxygen::groupSDict.append(root->name(),gd);
+    }
+  }
+  QListIterator<DirEntry> dli(root->children());
+  DirEntry *de;
+  for (dli.toFirst();(de=dli.current());++dli)
+  {
+    if (de->kind()==DirEntry::Dir)
+    {
+      addDirsAsGroups((Directory *)de,gd,level+1);
+    }
+  }
+}
+
+void generateFileTree()
 {
   FTVHelp::generateTreeViewImages();
   
-  Directory *root=new Directory(0,"");
+  Directory *root=new Directory(0,"root");
   root->setLast(TRUE);
   FileNameListIterator fnli(Doxygen::inputNameList); 
   FileName *fn;
@@ -1019,12 +1029,15 @@ void generateFileTree(QTextStream &t)
       mergeFileDef(root,fd);
     }
   }
-  t << "<div class=\"directory\">\n";
-  writeDirTreeNode(t,root,0);
-  t << "</div>\n";
+  //t << "<div class=\"directory\">\n";
+  //writeDirTreeNode(t,root,0);
+  //t << "</div>\n";
+  addDirsAsGroups(root,0,0);
   delete root;
 }
 
+//-------------------------------------------------------------------
+
 void FileDef::combineUsingRelations()
 {
   if (visited) return; // already done
diff --git a/src/filedef.h b/src/filedef.h
index 5d64763..c96f321 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -46,6 +46,7 @@ struct IncludeInfo
   FileDef *fileDef;
   QCString includeName;
   bool local;
+  bool imported;
 };
 
 /*! \class FileDef filedef.h
@@ -140,8 +141,8 @@ class FileDef : public Definition
 
     bool generateSourceFile() const;
 
-    void addIncludeDependency(FileDef *fd,const char *incName,bool local);
-    void addIncludedByDependency(FileDef *fd,const char *incName,bool local);
+    void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported);
+    void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
     QList<IncludeInfo> *includeFileList() const { return includeList; }
     QList<IncludeInfo> *includedByFileList() const { return includedByList; }
 
@@ -286,7 +287,8 @@ class Directory : public DirEntry
     QList<DirEntry> m_children;
 };
 
-void generateFileTree(QTextStream &t);
+//void generateFileTree(QTextStream &t);
+void generateFileTree();
 
 #endif
 
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index de1dba2..5b59560 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -709,7 +709,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
       baseName=baseName.right(baseName.length()-i-1);
     }
     m_t << "<div align=\"center\">" << endl;
-    m_t << "<img src=\"" << img->name() << "\" alt=\"" 
+    m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\"" 
       << baseName << "\"" << htmlAttribsToString(img->attribs()) << ">" << endl;
     if (img->hasCaption())
     {
@@ -743,7 +743,7 @@ void HtmlDocVisitor::visitPost(DocImage *img)
 void HtmlDocVisitor::visitPre(DocDotFile *df)
 {
   if (m_hide) return;
-  writeDotFile(df->file(),"");
+  writeDotFile(df->file(),df->relPath());
   m_t << "<div align=\"center\">" << endl;
   if (df->hasCaption())
   { 
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 5866c39..69dd955 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -309,6 +309,12 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
 static void writeDefaultHeaderFile(QTextStream &t, const char *title,
                                    const char *relPath,bool usePathCmd)
 {
+  QString relPathStr;
+  if (usePathCmd) 
+    relPathStr="$relpath$";
+  else
+    relPathStr=relPath;
+
   t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
     "<html><head>" 
     "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=" 
@@ -320,11 +326,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
   t << "href=\"";
   if (Config_getString("HTML_STYLESHEET").isEmpty())
   {
-    if (usePathCmd) 
-      t << "$relpath$";
-    else
-      t << relPath;
-    t << "doxygen.css";
+    t << relPathStr << "doxygen.css";
   }
   else
   {
@@ -334,7 +336,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
     {
       err("Error: user specified HTML style sheet file does not exist!\n");
     }
-    t << cssfi.fileName();
+    t << relPathStr << cssfi.fileName();
   }
   t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
     "</head><body>\n";
diff --git a/src/memberdef.h b/src/memberdef.h
index 0208746..34c7164 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -93,6 +93,10 @@ class MemberDef : public Definition
     NamespaceDef* getNamespaceDef() const { return nspace; }
     //Definition *getCompoundDef() const;
 
+    // grabbing the property read/write accessor names
+    const char *getReadAccessor() const      { return read; }
+    const char *getWriteAccessor() const     { return write; }
+    
     // querying the grouping definition
     GroupDef *getGroupDef() const            { return group; }
     Grouping::GroupPri_t getGroupPri() const { return grouppri; }
@@ -161,6 +165,8 @@ class MemberDef : public Definition
     void setSectionList(Definition *d,MemberList *sl);
     void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
     void setExplicitExternal(bool b)      { explExt=b; }
+    void setReadAccessor(const char *r)   { read=r; }
+    void setWriteAccessor(const char *w)  { write=w; }
     
     void makeRelated()                    { related=TRUE; } 
 
@@ -307,6 +313,8 @@ class MemberDef : public Definition
     QCString type;            // return type
     QCString args;            // function arguments/variable array specifiers
     QCString bitfields;       // struct member bitfields
+    QCString read;            // property read accessor
+    QCString write;           // property write accessor
     QCString exception;       // exceptions that can be thrown
     QCString init;            // initializer
     int initLines;            // number of lines in the initializer
diff --git a/src/pre.l b/src/pre.l
index a33ffe2..f052878 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -99,6 +99,7 @@ static bool               g_macroExpansion; // from the configuration
 static bool               g_expandOnlyPredef; // from the configuration
 static int                g_commentCount;
 static bool               g_insideComment;
+static bool               g_isImported;
 
 
 static void setFileName(const char *name)
@@ -1065,12 +1066,12 @@ static void readIncludeFile(const QCString &inc)
       if (oldFileDef) 
       {
 	// add include dependency to the file in which the #include was found
-	oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude);
+	oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude,g_isImported);
 	// add included by dependency
         if (g_yyFileDef)
         {
 	  //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
-  	  g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
+  	  g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude,g_isImported);
         }
       }
       FileState *fs=new FileState;
@@ -1100,12 +1101,12 @@ static void readIncludeFile(const QCString &inc)
 	FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
 	//printf("findFileDef(%s)=%p\n",incFileName.data(),fd);
 	// add include dependency to the file in which the #include was found
-	oldFileDef->addIncludeDependency(fd,incFileName,localInclude);
+	oldFileDef->addIncludeDependency(fd,incFileName,localInclude,g_isImported);
 	// add included by dependency
         if (fd)
         {
           //printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
-  	  fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
+  	  fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude,g_isImported);
         }
       }
       if (Debug::isFlagSet(Debug::Preprocessor))
@@ -1386,11 +1387,13 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 <ReadString>.				{
   					  g_defArgsStr+=*yytext;
   					}
-<Command>"include"{B}+/{ID}		{
+<Command>("include"|"import"){B}+/{ID}	{
+  					  g_isImported = yytext[1]=='m';
   					  if (g_macroExpansion) 
 					    BEGIN(IncludeID);
   					}
-<Command>"include"{B}*[<"]		{ 
+<Command>("include"|"import"){B}*[<"]	{ 
+  					  g_isImported = yytext[1]=='m';
 					  char c[2];
 					  c[0]=yytext[yyleng-1];c[1]='\0';
 					  g_incName=c;
diff --git a/src/scanner.l b/src/scanner.l
index 16bcd73..a81a4b0 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -837,7 +837,8 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 %x      ObjCProtocolList
 %x	QtPropType
 %x	QtPropName
-%x	QtPropRW
+%x	QtPropRead
+%x	QtPropWrite
 
 %%
 
@@ -1181,7 +1182,11 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  current->virt = Virtual;
 					  lineCount();
 					}
-<FindMembers>{B}*"abstract"{BN}+    	{ current->type += " abstract ";
+<FindMembers>{B}*"abstract"{BN}+    	{ 
+                                          if (!insidePHP) 
+					  {
+					    current->type += " abstract ";
+					  }
 					  current->virt = Pure;
 					  lineCount();
 					}
@@ -1253,7 +1258,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					}
 <FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ 	{ // M$/Corba IDL interface
 					  lineCount();
-                                          if (insideIDL || insideJava || insideCS || insideD)
+                                          if (insideIDL || insideJava || insideCS || insideD || insidePHP)
 					  {
   					    isTypedef=FALSE;
 					    current->section = Entry::INTERFACE_SEC;
@@ -1621,15 +1626,20 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					}
 <QtPropName>{ID}			{
   					  current->name=yytext;
-  					  BEGIN(QtPropRW);
+  					  BEGIN(QtPropRead);
   					}
-<QtPropRW>"READ"			{
+<QtPropRead>"READ"			{
   					  current->memSpec |= Entry::Readable;
   					}
-<QtPropRW>"WRITE"			{
+<QtPropRead>{ID}			{
+  					  current->read = yytext;
+  					  BEGIN(QtPropWrite);
+  					}
+<QtPropWrite>"WRITE"			{
   					  current->memSpec |= Entry::Writable;
   					}
-<QtPropRW>")"				{
+<QtPropWrite>{ID}			{
+  					  current->write = yytext;
   					  unput(';');
 					  BEGIN(FindMembers);
   					}
@@ -1666,7 +1676,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					    {
 					      addType( current ) ;
 					    }
-					    bool javaLike = insideJava || insideCS || insideD;
+					    bool javaLike = insideJava || insideCS || insideD || insidePHP;
 					    if (javaLike && strcmp(yytext,"public")==0)
 					    {
 					      current->protection = Public;
@@ -2230,27 +2240,17 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
                                           {
                                             current->type = current->type.mid(3);
                                           }
-					  current->type=current->type.simplifyWhiteSpace();
-					  current->args=removeRedundantWhiteSpace(current->args);
-					                // was: current->args.simplifyWhiteSpace();
-					  current->name=current->name.stripWhiteSpace();
-					  //if (!current->name.isEmpty() && current->type.left(8)=="typedef ")
-					  //{
-					  //  // add typedef to dictionary
-					  //  QCString dest = extractName(current->type.right(current->type.length()-8));
-					  //  if (Doxygen::typedefDict[current->name]==0 && !dest.isEmpty())
-					  //  {		
-					  //    //printf("1>>>>>>>>>> adding %s->%s\n",current->name.data(),dest.data());
-					  //    QCString scope;
-					  //    if (current_root->section & Entry::SCOPE_MASK) scope=current_root->name;
-                                          //    Doxygen::typedefDict.insert(current->name, new TypedefInfo(dest,scope));
-					  //  }
-					  //}
-					  current->section = Entry::VARIABLE_SEC ;
-					  current->fileName = yyFileName;
-					  current->startLine = yyLineNr;
-					  //printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId);
-					  current_root->addSubEntry( current ) ;
+					  if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
+					  {
+					    current->type=current->type.simplifyWhiteSpace();
+					    current->args=removeRedundantWhiteSpace(current->args);
+					    current->name=current->name.stripWhiteSpace();
+					    current->section = Entry::VARIABLE_SEC ;
+					    current->fileName = yyFileName;
+					    current->startLine = yyLineNr;
+					    //printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId);
+					    current_root->addSubEntry( current ) ;
+					  }
 					  if ( *yytext == ',')
 					  {
 					    current = new Entry(*current);
@@ -3558,15 +3558,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					    roundCount=0;
 					    BEGIN(SkipUnionSwitch);
 					  }
-					  else if (insideJava && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
-					  {
-  					    current->type.resize(0);
-					    baseProt=Public;
-                                            baseVirt=Normal;
-					    baseName.resize(0);
-					    BEGIN( BasesProt ) ;
-					  }
-					  else if (insidePHP && (strcmp(yytext,"extends")==0))
+					  else if ((insideJava || insidePHP) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
 					  {
   					    current->type.resize(0);
 					    baseProt=Public;
@@ -3684,10 +3676,10 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					    BEGIN( ReadBody ) ;
 					  }
 					}
-<BasesProt>"virtual"                    { baseVirt = Virtual; }
-<BasesProt>"public"                     { baseProt = Public; }
-<BasesProt>"protected"                  { baseProt = Protected; }
-<BasesProt>"private"                    { baseProt = Private; }
+<BasesProt>"virtual"{BN}+               { lineCount(); baseVirt = Virtual; }
+<BasesProt>"public"{BN}+                { lineCount(); baseProt = Public; }
+<BasesProt>"protected"{BN}+             { lineCount(); baseProt = Protected; }
+<BasesProt>"private"{BN}+               { lineCount(); baseProt = Private; }
 <BasesProt>{BN}				{ lineCount(); }
 <BasesProt>.				{ unput(*yytext); BEGIN(Bases); }
 <Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID}	{ 
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index d8df9f8..5716cc9 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -99,6 +99,7 @@ class TagIncludeInfo
     QString name;
     QString text;
     bool isLocal;
+    bool isImported;
 };
 
 /*! Container for file specific info that can be read from a tagfile */
@@ -470,6 +471,7 @@ class TagFileParser : public QXmlDefaultHandler
         m_curIncludes->id = attrib.value("id");
         m_curIncludes->name = attrib.value("name");
         m_curIncludes->isLocal = attrib.value("local")=="yes" ? TRUE : FALSE;
+        m_curIncludes->isImported = attrib.value("imported")=="yes" ? TRUE : FALSE;
         m_curFile->includes.append(m_curIncludes);
       }
       else
@@ -1215,7 +1217,7 @@ void TagFileParser::addIncludes()
                 //        ifd->getOutputFileBase().data(),ii->id.data());
                 if (ifd->getOutputFileBase()==QCString(ii->id))
                 {
-                  fd->addIncludeDependency(ifd,ii->text,ii->isLocal);
+                  fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported);
                 }
               }
             }
diff --git a/src/translator_cn.h b/src/translator_cn.h
index 7b2756a..41a4ebc 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -24,7 +24,7 @@
 */
 #define CN_SPC
 
-class TranslatorChinese : public TranslatorAdapter_1_3_3
+class TranslatorChinese : public Translator
 {
   public:
 		/*! Used for identification of the language. The identification
@@ -1467,9 +1467,22 @@ class TranslatorChinese : public TranslatorAdapter_1_3_3
      */
     virtual QCString trSearchMatches()
     {
-      return "Matches:";
+      /* return "Matches:"; */
       return "���ϵĽ��:";
     }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      /* return filename + " Source File"; */
+      return filename + CN_SPC"Դ�ļ�";
+    }
+    
 };
 
 #endif
diff --git a/src/translator_de.h b/src/translator_de.h
index 7af7cc8..6394f98 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -84,13 +84,16 @@
 //    - Updated a few strings which changed in CVS revision 1.22
 //      ("compound" vs. "class")
 //    
+//   2004/08/01 Jens Seidel (jensseidel@users.sourceforge.net)
+//    - Updated for "new since 1.3.8" version
+//    
 //   Todo:
 //    - see FIXME
 
 #ifndef TRANSLATOR_DE_H
 #define TRANSLATOR_DE_H
 
-class TranslatorGerman : public TranslatorAdapter_1_3_8
+class TranslatorGerman : public Translator
 {
   public:
 
@@ -156,7 +159,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_8
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore() 
-    { return "Mehr..."; }
+    { return "Mehr ..."; }
 
     /*! put in the class documentation */
     virtual QCString trListOfAllMembers()
@@ -1604,6 +1607,18 @@ class TranslatorGerman : public TranslatorAdapter_1_3_8
     {
       return "Treffer:";
     }
+
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      return filename + " Quellcode";
+    }
+
 };
 
 #endif
diff --git a/src/translator_dk.h b/src/translator_dk.h
index 38deea3..ea350f1 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -72,7 +72,7 @@
 #ifndef TRANSLATOR_DK_H
 #define TRANSLATOR_DK_H
 
-class TranslatorDanish : public TranslatorAdapter_1_3_8
+class TranslatorDanish : public Translator
 {
   public:
 
@@ -1445,6 +1445,19 @@ class TranslatorDanish : public TranslatorAdapter_1_3_8
       return "Fundne ord:"; //translation?
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.8
+//////////////////////////////////////////////////////////////////////////
+
+    /*! This is used in HTML as the title of page with source code for
+     *  file filename
+     */
+    virtual QCString trSourceFile(QCString& filename)
+    {
+      return "Kildefilen " + filename;
+    }
+
+
 /*---------- For internal use: ----------------------------------------*/
   protected:
 	/*! For easy flexible-noun implementation.
diff --git a/src/translator_se.h b/src/translator_se.h
index 2b07dd9..0d3866f 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -69,7 +69,7 @@ Problem!
 #ifndef TRANSLATOR_SE_H
 #define TRANSLATOR_SE_H
 
-class TranslatorSwedish : public TranslatorAdapter_1_3_3
+class TranslatorSwedish : public TranslatorAdapter_1_3_8
 {
   public:
 
@@ -1350,7 +1350,56 @@ class TranslatorSwedish : public TranslatorAdapter_1_3_3
       return "H�r �r anropnings diagrammet f�r den h�r funktionen:";
     }
 
+//////////////////////////////////////////////////////////////////////////
+// new since 1.3.3
+//////////////////////////////////////////////////////////////////////////
 
+    /*! When the search engine is enabled this text is put in the header 
+     *  of each page before the field where one can enter the text to search 
+     *  for. 
+     */
+    virtual QCString trSearchForIndex()
+    {
+      return "S�k efter";
+    }
+    /*! This string is used as the title for the page listing the search
+     *  results.
+     */
+    virtual QCString trSearchResultsTitle()
+    {
+      return "S�kresultat";
+    }
+    /*! This string is put just before listing the search results. The
+     *  text can be different depending on the number of documents found.
+     *  Inside the text you can put the special marker $num to insert
+     *  the number representing the actual number of search results.
+     *  The @a numDocuments parameter can be either 0, 1 or 2, where the 
+     *  value 2 represents 2 or more matches. HTML markup is allowed inside
+     *  the returned string.
+     */
+    virtual QCString trSearchResults(int numDocuments)
+    {
+      if (numDocuments==0)
+      {
+        return "Tyv�rr finns det inga dokument som matchar din s�kning.";
+      }
+      else if (numDocuments==1)
+      {
+        return "Hittade <b>1</b> dokument som matchar din s�kning.";
+      }
+      else 
+      {
+        return "Hittade <b>$num</b> dokument som matchar din s�kning. "
+               "Visar de b�sta tr�ffarna f�rst.";
+      }
+    }
+    /*! This string is put before the list of matched words, for each search 
+     *  result. What follows is the list of words that matched the query.
+     */
+    virtual QCString trSearchMatches()
+    {
+      return "Tr�ffar:";
+    }
 
 };
 
diff --git a/src/util.cpp b/src/util.cpp
index 193dded..f2ef4c3 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1010,7 +1010,6 @@ ClassDef *getResolvedClassRec(Definition *scope,
   QCString name=n;
   QCString explicitScopePart;
 
-  //int qualifierIndex = name.findRev("::"); // todo: deal with cases like A<B::C>
   int qualifierIndex = computeQualifiedIndex(name);
   //printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
   if (qualifierIndex!=-1) // qualified name
@@ -1032,7 +1031,6 @@ ClassDef *getResolvedClassRec(Definition *scope,
   //printf("Looking for symbol %s result=%p\n",name.data(),dl);
   if (dl==0) 
   {
-    // name is not a known symbol
     return 0;
   }
 
@@ -1181,7 +1179,7 @@ ClassDef *getResolvedClass(Definition *scope,
   }
   //printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
   //                                  n,result?result->name().data():"<none>");
-  // 
+   
   return result;
 }
 
@@ -4120,14 +4118,22 @@ QCString substituteTemplateArgumentsInString(
         ++formAli,actArg=actualArgs->next()
         )
     {
-      //printf("n=%s formArg->type=%s formArg->name=%s\n",
-      //    n.data(),formArg->type.data(),formArg->name.data());
       if (formArg->type=="class" || formArg->type=="typename")
       {
+        //printf("n=%s formArg->type=%s formArg->name=%si formArg->defval=%s\n",
+        //  n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data());
         if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument
         {
           // replace formal argument with the actual argument of the instance
-          result += actArg->type+" "; 
+          if (actArg->name.isEmpty())
+          {
+            result += actArg->type+" "; 
+          }
+          else // for case where the actual arg is something like "unsigned int"
+               // the "int" part is in actArg->name.
+          {
+            result += actArg->type+" "+actArg->name+" "; 
+          }
           found=TRUE;
         }
         else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() &&
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
index ef9a490..7b51deb 100644
--- a/src/xmlgen.cpp
+++ b/src/xmlgen.cpp
@@ -619,6 +619,15 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
   }
 
   t << "        <name>" << convertToXML(md->name()) << "</name>" << endl;
+  
+  if (md->memberType() == MemberDef::Property)
+  {
+    if (md->isReadable())
+      t << "        <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
+    if (md->isWritable())
+      t << "        <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
+  }
+  
   MemberDef *rmd = md->reimplements();
   if (rmd)
   {
diff --git a/tmake/lib/m68k-atari-mint-g++/app.t b/tmake/lib/m68k-atari-mint-g++/app.t
new file mode 100755
index 0000000..867725e
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/app.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/lib.t b/tmake/lib/m68k-atari-mint-g++/lib.t
new file mode 100755
index 0000000..2523b2f
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/lib.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/subdirs.t b/tmake/lib/m68k-atari-mint-g++/subdirs.t
new file mode 100755
index 0000000..5e888af
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/subdirs.t
@@ -0,0 +1,2 @@
+#! Use the common Unix template
+#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/tmake.conf b/tmake/lib/m68k-atari-mint-g++/tmake.conf
new file mode 100755
index 0000000..9f69008
--- /dev/null
+++ b/tmake/lib/m68k-atari-mint-g++/tmake.conf
@@ -0,0 +1,59 @@
+#
+# 
+#
+# tmake configuration for linux-g++
+#
+
+TEMPLATE		= app
+CONFIG			= qt warn_on release
+
+TMAKE_CC		= gcc
+TMAKE_CFLAGS		= -pipe
+TMAKE_CFLAGS_WARN_ON	= -Wall -W -fno-exceptions
+TMAKE_CFLAGS_WARN_OFF	=
+TMAKE_CFLAGS_RELEASE	= -O2
+TMAKE_CFLAGS_DEBUG	= -g
+TMAKE_CFLAGS_SHLIB	= -fPIC
+TMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
+
+TMAKE_CXX		= g++
+TMAKE_CXXFLAGS		= $$TMAKE_CFLAGS
+TMAKE_CXXFLAGS_WARN_ON	= $$TMAKE_CFLAGS_WARN_ON
+TMAKE_CXXFLAGS_WARN_OFF	= $$TMAKE_CFLAGS_WARN_OFF
+TMAKE_CXXFLAGS_RELEASE	= $$TMAKE_CFLAGS_RELEASE
+TMAKE_CXXFLAGS_DEBUG	= $$TMAKE_CFLAGS_DEBUG
+TMAKE_CXXFLAGS_SHLIB	= $$TMAKE_CFLAGS_SHLIB
+TMAKE_CXXFLAGS_YACC	= $$TMAKE_CFLAGS_YACC
+
+TMAKE_INCDIR		=
+TMAKE_LIBDIR		=
+TMAKE_INCDIR_X11	= /usr/X11R6/include
+TMAKE_LIBDIR_X11	= /usr/X11R6/lib
+TMAKE_INCDIR_QT		= $(QTDIR)/include
+TMAKE_LIBDIR_QT		= $(QTDIR)/lib
+TMAKE_INCDIR_OPENGL	= /usr/X11R6/include
+TMAKE_LIBDIR_OPENGL	= /usr/X11R6/lib
+
+TMAKE_LINK		= g++
+TMAKE_LINK_SHLIB	= g++
+TMAKE_LFLAGS		=
+TMAKE_LFLAGS_RELEASE	=
+TMAKE_LFLAGS_DEBUG	= -g
+TMAKE_LFLAGS_SHLIB	= -shared
+TMAKE_LFLAGS_SONAME	= -Wl,-soname,
+
+TMAKE_LIBS		=
+TMAKE_LIBS_X11		= -lXext -lX11 -lm
+TMAKE_LIBS_X11SM	= -lICE -lSM
+TMAKE_LIBS_QT		= -lqt
+TMAKE_LIBS_QT_MT	= -lqt-mt
+TMAKE_LIBS_QT_OPENGL	= -lqgl
+TMAKE_LIBS_OPENGL	= -lMesaGL -lMesaGLU -lXmu
+
+TMAKE_MOC		= moc
+
+TMAKE_AR		= ar cqs
+TMAKE_RANLIB		=
+
+TMAKE_TAR		= tar -cf
+TMAKE_GZIP		= gzip -9f
diff --git a/wintools/qtools.dsp b/wintools/qtools.dsp
index 5cc8dd4..315f33d 100644
--- a/wintools/qtools.dsp
+++ b/wintools/qtools.dsp
@@ -144,6 +144,10 @@ SOURCE=..\qtools\qglobal.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=..\qtools\qgcache.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=..\qtools\qgvector.cpp
 # End Source File
 # Begin Source File
-- 
cgit v0.12

