浏览代码

* Added ability to create class chart

git-svn-id: trunk@23193 -
michael 12 年之前
父节点
当前提交
2c26d53f9b

+ 3 - 0
.gitattributes

@@ -14018,6 +14018,7 @@ utils/fpdoc/fpde/xpms.pp svneol=native#text/plain
 utils/fpdoc/fpdoc.css -text
 utils/fpdoc/fpdoc.css -text
 utils/fpdoc/fpdoc.lpi svneol=native#text/plain
 utils/fpdoc/fpdoc.lpi svneol=native#text/plain
 utils/fpdoc/fpdoc.pp svneol=native#text/plain
 utils/fpdoc/fpdoc.pp svneol=native#text/plain
+utils/fpdoc/fpdocclasstree.pp svneol=native#text/plain
 utils/fpdoc/fpdocproj.pas svneol=native#text/plain
 utils/fpdoc/fpdocproj.pas svneol=native#text/plain
 utils/fpdoc/fpdocxmlopts.pas svneol=native#text/plain
 utils/fpdoc/fpdocxmlopts.pas svneol=native#text/plain
 utils/fpdoc/fpmake.pp svneol=native#text/plain
 utils/fpdoc/fpmake.pp svneol=native#text/plain
@@ -14032,9 +14033,11 @@ utils/fpdoc/intl/makeskel.de.po svneol=native#text/plain
 utils/fpdoc/makeskel.lpi svneol=native#text/plain
 utils/fpdoc/makeskel.lpi svneol=native#text/plain
 utils/fpdoc/makeskel.pp svneol=native#text/plain
 utils/fpdoc/makeskel.pp svneol=native#text/plain
 utils/fpdoc/mgrfpdocproj.pp svneol=native#text/plain
 utils/fpdoc/mgrfpdocproj.pp svneol=native#text/plain
+utils/fpdoc/minusimage.inc svneol=native#text/plain
 utils/fpdoc/mkfpdoc.pp svneol=native#text/plain
 utils/fpdoc/mkfpdoc.pp svneol=native#text/plain
 utils/fpdoc/mkfpdocproj.lpi svneol=native#text/plain
 utils/fpdoc/mkfpdocproj.lpi svneol=native#text/plain
 utils/fpdoc/mkfpdocproj.pp svneol=native#text/plain
 utils/fpdoc/mkfpdocproj.pp svneol=native#text/plain
+utils/fpdoc/plusimage.inc svneol=native#text/plain
 utils/fpdoc/sample-project.xml svneol=native#text/plain
 utils/fpdoc/sample-project.xml svneol=native#text/plain
 utils/fpdoc/sh_pas.pp svneol=native#text/plain
 utils/fpdoc/sh_pas.pp svneol=native#text/plain
 utils/fpdoc/testunit.pp svneol=native#text/plain
 utils/fpdoc/testunit.pp svneol=native#text/plain

+ 96 - 2
utils/fpdoc/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/09/27]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/12/01]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
@@ -3500,6 +3500,96 @@ endif
 fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 fpc_makefiles: fpc_makefile fpc_makefile_dirs
 fpc_makefiles: fpc_makefile fpc_makefile_dirs
+ifdef TARGET_DIRS_TARGET_DIRS
+TARGET_DIRS_all:
+	$(MAKE) -C TARGET_DIRS all
+TARGET_DIRS_debug:
+	$(MAKE) -C TARGET_DIRS debug
+TARGET_DIRS_smart:
+	$(MAKE) -C TARGET_DIRS smart
+TARGET_DIRS_release:
+	$(MAKE) -C TARGET_DIRS release
+TARGET_DIRS_units:
+	$(MAKE) -C TARGET_DIRS units
+TARGET_DIRS_examples:
+	$(MAKE) -C TARGET_DIRS examples
+TARGET_DIRS_shared:
+	$(MAKE) -C TARGET_DIRS shared
+TARGET_DIRS_install:
+	$(MAKE) -C TARGET_DIRS install
+TARGET_DIRS_sourceinstall:
+	$(MAKE) -C TARGET_DIRS sourceinstall
+TARGET_DIRS_exampleinstall:
+	$(MAKE) -C TARGET_DIRS exampleinstall
+TARGET_DIRS_distinstall:
+	$(MAKE) -C TARGET_DIRS distinstall
+TARGET_DIRS_zipinstall:
+	$(MAKE) -C TARGET_DIRS zipinstall
+TARGET_DIRS_zipsourceinstall:
+	$(MAKE) -C TARGET_DIRS zipsourceinstall
+TARGET_DIRS_zipexampleinstall:
+	$(MAKE) -C TARGET_DIRS zipexampleinstall
+TARGET_DIRS_zipdistinstall:
+	$(MAKE) -C TARGET_DIRS zipdistinstall
+TARGET_DIRS_clean:
+	$(MAKE) -C TARGET_DIRS clean
+TARGET_DIRS_distclean:
+	$(MAKE) -C TARGET_DIRS distclean
+TARGET_DIRS_cleanall:
+	$(MAKE) -C TARGET_DIRS cleanall
+TARGET_DIRS_info:
+	$(MAKE) -C TARGET_DIRS info
+TARGET_DIRS_makefiles:
+	$(MAKE) -C TARGET_DIRS makefiles
+TARGET_DIRS:
+	$(MAKE) -C TARGET_DIRS all
+.PHONY: TARGET_DIRS_all TARGET_DIRS_debug TARGET_DIRS_smart TARGET_DIRS_release TARGET_DIRS_units TARGET_DIRS_examples TARGET_DIRS_shared TARGET_DIRS_install TARGET_DIRS_sourceinstall TARGET_DIRS_exampleinstall TARGET_DIRS_distinstall TARGET_DIRS_zipinstall TARGET_DIRS_zipsourceinstall TARGET_DIRS_zipexampleinstall TARGET_DIRS_zipdistinstall TARGET_DIRS_clean TARGET_DIRS_distclean TARGET_DIRS_cleanall TARGET_DIRS_info TARGET_DIRS_makefiles TARGET_DIRS
+endif
+ifdef TARGET_EXAMPLEDIRS_TARGET_EXAMPLEDIRS
+TARGET_EXAMPLEDIRS_all:
+	$(MAKE) -C TARGET_EXAMPLEDIRS all
+TARGET_EXAMPLEDIRS_debug:
+	$(MAKE) -C TARGET_EXAMPLEDIRS debug
+TARGET_EXAMPLEDIRS_smart:
+	$(MAKE) -C TARGET_EXAMPLEDIRS smart
+TARGET_EXAMPLEDIRS_release:
+	$(MAKE) -C TARGET_EXAMPLEDIRS release
+TARGET_EXAMPLEDIRS_units:
+	$(MAKE) -C TARGET_EXAMPLEDIRS units
+TARGET_EXAMPLEDIRS_examples:
+	$(MAKE) -C TARGET_EXAMPLEDIRS examples
+TARGET_EXAMPLEDIRS_shared:
+	$(MAKE) -C TARGET_EXAMPLEDIRS shared
+TARGET_EXAMPLEDIRS_install:
+	$(MAKE) -C TARGET_EXAMPLEDIRS install
+TARGET_EXAMPLEDIRS_sourceinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS sourceinstall
+TARGET_EXAMPLEDIRS_exampleinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS exampleinstall
+TARGET_EXAMPLEDIRS_distinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS distinstall
+TARGET_EXAMPLEDIRS_zipinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipinstall
+TARGET_EXAMPLEDIRS_zipsourceinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipsourceinstall
+TARGET_EXAMPLEDIRS_zipexampleinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipexampleinstall
+TARGET_EXAMPLEDIRS_zipdistinstall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS zipdistinstall
+TARGET_EXAMPLEDIRS_clean:
+	$(MAKE) -C TARGET_EXAMPLEDIRS clean
+TARGET_EXAMPLEDIRS_distclean:
+	$(MAKE) -C TARGET_EXAMPLEDIRS distclean
+TARGET_EXAMPLEDIRS_cleanall:
+	$(MAKE) -C TARGET_EXAMPLEDIRS cleanall
+TARGET_EXAMPLEDIRS_info:
+	$(MAKE) -C TARGET_EXAMPLEDIRS info
+TARGET_EXAMPLEDIRS_makefiles:
+	$(MAKE) -C TARGET_EXAMPLEDIRS makefiles
+TARGET_EXAMPLEDIRS:
+	$(MAKE) -C TARGET_EXAMPLEDIRS all
+.PHONY: TARGET_EXAMPLEDIRS_all TARGET_EXAMPLEDIRS_debug TARGET_EXAMPLEDIRS_smart TARGET_EXAMPLEDIRS_release TARGET_EXAMPLEDIRS_units TARGET_EXAMPLEDIRS_examples TARGET_EXAMPLEDIRS_shared TARGET_EXAMPLEDIRS_install TARGET_EXAMPLEDIRS_sourceinstall TARGET_EXAMPLEDIRS_exampleinstall TARGET_EXAMPLEDIRS_distinstall TARGET_EXAMPLEDIRS_zipinstall TARGET_EXAMPLEDIRS_zipsourceinstall TARGET_EXAMPLEDIRS_zipexampleinstall TARGET_EXAMPLEDIRS_zipdistinstall TARGET_EXAMPLEDIRS_clean TARGET_EXAMPLEDIRS_distclean TARGET_EXAMPLEDIRS_cleanall TARGET_EXAMPLEDIRS_info TARGET_EXAMPLEDIRS_makefiles TARGET_EXAMPLEDIRS
+endif
 all: fpc_all
 all: fpc_all
 debug: fpc_debug
 debug: fpc_debug
 smart: fpc_smart
 smart: fpc_smart
@@ -3526,9 +3616,13 @@ include fpcmake.loc
 endif
 endif
 .NOTPARALLEL:
 .NOTPARALLEL:
 fpdoc$(EXEEXT): fpdoc.pp dglobals.pp dwriter.pp dw_xml.pp sh_pas.pp dw_html.pp\
 fpdoc$(EXEEXT): fpdoc.pp dglobals.pp dwriter.pp dw_xml.pp sh_pas.pp dw_html.pp\
-  dw_latex.pp dwlinear.pp dw_txt.pp dw_linrtf.pp
+  dw_latex.pp dwlinear.pp dw_txt.pp dw_linrtf.pp css.inc plusimage.inc minusimage.inc
 makeskel$(EXEEXT): makeskel.pp dglobals.pp
 makeskel$(EXEEXT): makeskel.pp dglobals.pp
 css.inc: fpdoc.css ../bin2obj$(EXEEXT)
 css.inc: fpdoc.css ../bin2obj$(EXEEXT)
 	../bin2obj$(EXEEXT) -o css.inc -c DefaultCSS fpdoc.css
 	../bin2obj$(EXEEXT) -o css.inc -c DefaultCSS fpdoc.css
+plusimage.inc: images/plus.png ../bin2obj$(EXEEXT)
+	../bin2obj$(EXEEXT) -o plusimage.inc -c PlusImageData images/plus.png
+minusimage.inc: images/minus.png ../bin2obj$(EXEEXT)
+	../bin2obj$(EXEEXT) -o minusimage.inc -c MinusImageData images/minus.png
 ../bin2obj$(EXEEXT):
 ../bin2obj$(EXEEXT):
 	$(MAKE) -C .. bin2obj$(EXEEXT)
 	$(MAKE) -C .. bin2obj$(EXEEXT)

+ 7 - 1
utils/fpdoc/Makefile.fpc

@@ -34,12 +34,18 @@ files=dwriter.rst fpdoc.rst dglobals.rst makeskel.rst fpdocopts.rst
 [rules]
 [rules]
 .NOTPARALLEL:
 .NOTPARALLEL:
 fpdoc$(EXEEXT): fpdoc.pp dglobals.pp dwriter.pp dw_xml.pp sh_pas.pp dw_html.pp\
 fpdoc$(EXEEXT): fpdoc.pp dglobals.pp dwriter.pp dw_xml.pp sh_pas.pp dw_html.pp\
-  dw_latex.pp dwlinear.pp dw_txt.pp dw_linrtf.pp
+  dw_latex.pp dwlinear.pp dw_txt.pp dw_linrtf.pp css.inc plusimage.inc minusimage.inc
 
 
 makeskel$(EXEEXT): makeskel.pp dglobals.pp
 makeskel$(EXEEXT): makeskel.pp dglobals.pp
 
 
 css.inc: fpdoc.css ../bin2obj$(EXEEXT)
 css.inc: fpdoc.css ../bin2obj$(EXEEXT)
 	../bin2obj$(EXEEXT) -o css.inc -c DefaultCSS fpdoc.css
 	../bin2obj$(EXEEXT) -o css.inc -c DefaultCSS fpdoc.css
 
 
+plusimage.inc: images/plus.png ../bin2obj$(EXEEXT)
+	../bin2obj$(EXEEXT) -o plusimage.inc -c PlusImageData images/plus.png
+
+minusimage.inc: images/minus.png ../bin2obj$(EXEEXT)
+	../bin2obj$(EXEEXT) -o minusimage.inc -c MinusImageData images/minus.png
+
 ../bin2obj$(EXEEXT):
 ../bin2obj$(EXEEXT):
 	$(MAKE) -C .. bin2obj$(EXEEXT)
 	$(MAKE) -C .. bin2obj$(EXEEXT)

+ 81 - 82
utils/fpdoc/css.inc

@@ -1,9 +1,9 @@
 
 
 Const
 Const
-  DefaultCSS : Array[0..2254] of byte = (
+  DefaultCSS : Array[0..2242] of byte = (
       47, 42, 10, 32, 32, 36, 73,100, 58, 32,102,112,100,111, 99, 46, 99,
       47, 42, 10, 32, 32, 36, 73,100, 58, 32,102,112,100,111, 99, 46, 99,
-     115,115, 44,118, 32, 49, 46, 49, 32, 50, 48, 48, 51, 47, 48, 51, 47,
-      49, 55, 32, 50, 51, 58, 48, 51, 58, 50, 48, 32,109,105, 99,104, 97,
+     115,116, 44,118, 32, 49, 46, 49, 32, 50, 48, 48, 53, 47, 48, 49, 47,
+      48, 50, 32, 49, 54, 58, 50, 50, 58, 49, 54, 32,109,105, 99,104, 97,
      101,108, 32, 69,120,112, 32, 36, 10, 10, 32, 32, 68,101,102, 97,117,
      101,108, 32, 69,120,112, 32, 36, 10, 10, 32, 32, 68,101,102, 97,117,
      108,116, 32,115,116,121,108,101, 32,115,104,101,101,116, 32,102,111,
      108,116, 32,115,116,121,108,101, 32,115,104,101,101,116, 32,102,111,
      114, 32, 70, 80, 68,111, 99, 32,114,101,102,101,114,101,110, 99,101,
      114, 32, 70, 80, 68,111, 99, 32,114,101,102,101,114,101,110, 99,101,
@@ -53,84 +53,83 @@ Const
       32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,
       32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,
      110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,115,121,109, 32,123,
      110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,115,121,109, 32,123,
       10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,114,101,100,
       10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,114,101,100,
-      10,125, 10, 10, 47, 42, 32,107,101,121,119,111,114,100,115, 32,105,
-     110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,
-     115, 32, 42, 47, 10,115,112, 97,110, 46,107,119, 32,123, 10, 32, 32,
-     102,111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100,
-      10,125, 10, 10, 47, 42, 32, 99,111,109,109,101,110,116,115, 32,105,
-     110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,
-     115, 32, 42, 47, 10,115,112, 97,110, 46, 99,109,116, 32,123, 10, 32,
-      32, 99,111,108,111,114, 58, 32,100, 97,114,107, 99,121, 97,110, 59,
-      10, 32, 32,102,111,110,116, 45,115,116,121,108,101, 58, 32,105,116,
-      97,108,105, 99, 10,125, 10, 10, 47, 42, 32,100,105,114,101, 99,116,
-     105,118,101,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114,
-      97,103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,100,
-     105,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,
-     107,121,101,108,108,111,119, 59, 10, 32, 32,102,111,110,116, 45,115,
-     116,121,108,101, 58, 32,105,116, 97,108,105, 99, 10,125, 10, 10, 47,
-      42, 32,110,117,109, 98,101,114,115, 32,105,110, 32,115,111,117,114,
+      10,125, 10, 47, 42, 32, 78,111, 32,119,111,114,100,119,114, 97,112,
+      32,105,110, 32, 99,111,100,101, 32,102,114, 97,103,109,101,110,116,
+     115, 32, 42, 47, 10,115,112, 97,110, 46, 99,111,100,101, 32,123, 10,
+      32, 32, 32,119,104,105,116,101, 45,115,112, 97, 99,101, 58, 32,110,
+     111,119,114, 97,112, 10,125, 10, 10, 47, 42, 32,107,101,121,119,111,
+     114,100,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
+     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,107,119,
+      32,123, 10, 32, 32,102,111,110,116, 45,119,101,105,103,104,116, 58,
+      32, 98,111,108,100, 10,125, 10, 10, 47, 42, 32, 99,111,109,109,101,
+     110,116,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
+     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46, 99,109,
+     116, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,
+      99,121, 97,110, 59, 10, 32, 32,102,111,110,116, 45,115,116,121,108,
+     101, 58, 32,105,116, 97,108,105, 99, 10,125, 10, 10, 47, 42, 32,100,
+     105,114,101, 99,116,105,118,101,115, 32,105,110, 32,115,111,117,114,
       99,101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,
       99,101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,
-     112, 97,110, 46,110,117,109, 32,123, 10, 32, 32, 99,111,108,111,114,
-      58, 32,100, 97,114,107,109, 97,103,101,110,116, 97, 10,125, 10, 10,
-      47, 42, 32, 99,104, 97,114, 97, 99,116,101,114,115, 32, 40, 35, 46,
-      46, 46, 41, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
-     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46, 99,104,
-     114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,
-      99,121, 97,110, 10,125, 10, 10, 47, 42, 32,115,116,114,105,110,103,
-     115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,
-     101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,115,116,114, 32,
-     123, 10, 32, 32, 99,111,108,111,114, 58, 32, 98,108,117,101, 10,125,
-      10, 10, 47, 42, 32, 97,115,115,101,109, 98,108,101,114, 32,112, 97,
-     115,115, 97,103,101,115, 32,105,110, 32,115,111,117,114, 99,101, 32,
-     102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110,
-      46, 97,115,109, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,103,
-     114,101,101,110, 10,125, 10, 10, 10,116,100, 46,112,114,101, 32,123,
-      10, 32, 32,119,104,105,116,101, 45,115,112, 97, 99,101, 58, 32,112,
-     114,101, 10,125, 10, 10,112, 46, 99,109,116, 32,123, 10, 32, 32, 99,
-     111,108,111,114, 58, 32,103,114, 97,121, 10,125, 10, 10,115,112, 97,
-     110, 46,119, 97,114,110,105,110,103, 32,123, 10, 32, 32, 99,111,108,
-     111,114, 58, 32,114,101,100, 59, 10, 32, 32,102,111,110,116, 45,119,
-     101,105,103,104,116, 58, 32, 98,111,108,100, 10,125, 10, 10, 47, 42,
-      32, 33, 33, 33, 58, 32, 72,111,119, 32,115,104,111,117,108,100, 32,
-     119,101, 32,100,101,102,105,110,101, 32,116,104,105,115, 46, 46, 46,
-      63, 32, 42, 47, 10,115,112, 97,110, 46,102,105,108,101, 32,123, 10,
-      32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,103,114,101,101,
-     110, 10,125, 10, 10,116, 97, 98,108,101, 46,114,101,109, 97,114,107,
-      32,123, 10, 32, 32, 98, 97, 99,107,103,114,111,117,110,100, 45, 99,
-     111,108,111,114, 58, 32, 35,102,102,102,102, 99, 48, 59, 10,125, 10,
-      10,116, 97, 98,108,101, 46, 98, 97,114, 32,123, 10, 32, 32, 98, 97,
-      99,107,103,114,111,117,110,100, 45, 99,111,108,111,114, 58, 32, 35,
-      97, 48, 99, 48,102,102, 59, 10,125, 10, 10,115,112, 97,110, 46, 98,
-      97,114,116,105,116,108,101, 32,123, 10, 32, 32,102,111,110,116, 45,
-     119,101,105,103,104,116, 58, 32, 98,111,108,100, 59, 10, 32, 32,102,
+     112, 97,110, 46,100,105,114, 32,123, 10, 32, 32, 99,111,108,111,114,
+      58, 32,100, 97,114,107,121,101,108,108,111,119, 59, 10, 32, 32,102,
      111,110,116, 45,115,116,121,108,101, 58, 32,105,116, 97,108,105, 99,
      111,110,116, 45,115,116,121,108,101, 58, 32,105,116, 97,108,105, 99,
-      59, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107, 98,108,
-     117,101, 10,125, 10, 10,115,112, 97,110, 46,102,111,111,116,101,114,
-      32,123, 10, 32, 32,102,111,110,116, 45,115,116,121,108,101, 58, 32,
-     105,116, 97,108,105, 99, 59, 10, 32, 32, 99,111,108,111,114, 58, 32,
-     100, 97,114,107, 98,108,117,101, 10,125, 10, 10, 47, 42, 32,100,101,
-     102,105,110,105,116,105,111,110, 32,108,105,115,116, 32, 42, 47, 10,
-     100,108, 32,123, 10, 32, 98,111,114,100,101,114, 58, 32, 51,112,120,
-      32,100,111,117, 98,108,101, 32, 35, 99, 99, 99, 59, 10, 32,112, 97,
-     100,100,105,110,103, 58, 32, 48, 46, 53,101,109, 59, 10,125, 10, 10,
-      47, 42, 32,100,101,102,105,110,105,116,105,111,110, 32,108,105,115,
-     116, 58, 32,116,101,114,109, 32, 42, 47, 10,100,116, 32,123, 10, 32,
-     102,108,111, 97,116, 58, 32,108,101,102,116, 59, 10, 32, 99,108,101,
-      97,114, 58, 32,108,101,102,116, 59, 10, 32,119,105,100,116,104, 58,
-      32, 97,117,116,111, 59, 32, 47, 42, 32,110,111,114,109, 97,108,108,
-     121, 32, 98,114,111,119,115,101,114,115, 32,100,101,102, 97,117,108,
-     116, 32,119,105,100,116,104, 32,111,102, 32,108, 97,114,103,101,115,
-     116, 32,105,116,101,109, 32, 42, 47, 10, 32,112, 97,100,100,105,110,
-     103, 45,114,105,103,104,116, 58, 32, 50, 48,112,120, 59, 10, 32,102,
-     111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100, 59,
-      10, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,103,114,101,101,
-     110, 59, 10,125, 10, 10, 47, 42, 32,100,101,102,105,110,105,116,105,
-     111,110, 32,108,105,115,116, 58, 32,100,101,115, 99,114,105,112,116,
-     105,111,110, 32, 42, 47, 10,100,100, 32,123, 10, 32,109, 97,114,103,
-     105,110, 58, 32, 48, 32, 48, 32, 48, 32, 49, 49, 48,112,120, 59, 10,
-      32,112, 97,100,100,105,110,103, 58, 32, 48, 32, 48, 32, 48, 46, 53,
-     101,109, 32, 48, 59, 10,125, 10, 10, 47, 42, 32,102,111,114, 32, 98,
-     114,111,119,115,101,114,115, 32,105,110, 32,115,116, 97,110,100, 97,
-     114,100,115, 32, 99,111,109,112,108,105, 97,110, 99,101, 32,109,111,
-     100,101, 32, 42, 47, 10,116,100, 32,112, 32,123, 10, 32, 32,109, 97,
-     114,103,105,110, 58, 32, 48, 59, 10,125, 10);
+      10,125, 10, 10, 47, 42, 32,110,117,109, 98,101,114,115, 32,105,110,
+      32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,115,
+      32, 42, 47, 10,115,112, 97,110, 46,110,117,109, 32,123, 10, 32, 32,
+      99,111,108,111,114, 58, 32,100, 97,114,107,109, 97,103,101,110,116,
+      97, 10,125, 10, 10, 47, 42, 32, 99,104, 97,114, 97, 99,116,101,114,
+     115, 32, 40, 35, 46, 46, 46, 41, 32,105,110, 32,115,111,117,114, 99,
+     101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,112,
+      97,110, 46, 99,104,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58,
+      32,100, 97,114,107, 99,121, 97,110, 10,125, 10, 10, 47, 42, 32,115,
+     116,114,105,110,103,115, 32,105,110, 32,115,111,117,114, 99,101, 32,
+     102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110,
+      46,115,116,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32, 98,
+     108,117,101, 10,125, 10, 10, 47, 42, 32, 97,115,115,101,109, 98,108,
+     101,114, 32,112, 97,115,115, 97,103,101,115, 32,105,110, 32,115,111,
+     117,114, 99,101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47,
+      10,115,112, 97,110, 46, 97,115,109, 32,123, 10, 32, 32, 99,111,108,
+     111,114, 58, 32,103,114,101,101,110, 10,125, 10, 10, 10,116,100, 46,
+     112,114,101, 32,123, 10, 32, 32,119,104,105,116,101, 45,115,112, 97,
+      99,101, 58, 32,112,114,101, 10,125, 10, 10,112, 46, 99,109,116, 32,
+     123, 10, 32, 32, 99,111,108,111,114, 58, 32,103,114, 97,121, 10,125,
+      10, 10,115,112, 97,110, 46,119, 97,114,110,105,110,103, 32,123, 10,
+      32, 32, 99,111,108,111,114, 58, 32,114,101,100, 59, 10, 32, 32,102,
+     111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100, 10,
+     125, 10, 10, 47, 42, 32, 33, 33, 33, 58, 32, 72,111,119, 32,115,104,
+     111,117,108,100, 32,119,101, 32,100,101,102,105,110,101, 32,116,104,
+     105,115, 46, 46, 46, 63, 32, 42, 47, 10,115,112, 97,110, 46,102,105,
+     108,101, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,
+     107,103,114,101,101,110, 10,125, 10, 10,116, 97, 98,108,101, 46,114,
+     101,109, 97,114,107, 32,123, 10, 32, 32, 98, 97, 99,107,103,114,111,
+     117,110,100, 45, 99,111,108,111,114, 58, 32, 35,102,102,102,102, 99,
+      48, 59, 10,125, 10, 10,116, 97, 98,108,101, 46, 98, 97,114, 32,123,
+      10, 32, 32, 98, 97, 99,107,103,114,111,117,110,100, 45, 99,111,108,
+     111,114, 58, 32, 35, 97, 48, 99, 48,102,102, 59, 10,125, 10, 10,116,
+     100, 32,112, 32,123, 10, 32,109, 97,114,103,105,110, 58, 32, 48, 59,
+      10,125, 10, 10,115,112, 97,110, 46, 98, 97,114,116,105,116,108,101,
+      32,123, 10, 32, 32,102,111,110,116, 45,119,101,105,103,104,116, 58,
+      32, 98,111,108,100, 59, 10, 32, 32,102,111,110,116, 45,115,116,121,
+     108,101, 58, 32,105,116, 97,108,105, 99, 59, 10, 32, 32, 99,111,108,
+     111,114, 58, 32,100, 97,114,107, 98,108,117,101, 10,125, 10, 10,115,
+     112, 97,110, 46,116,111,103,103,108,101,116,114,101,101, 99,108,111,
+     115,101, 32,123, 10, 32, 32, 32, 32, 98, 97, 99,107,103,114,111,117,
+     110,100, 58, 32,117,114,108, 40,109,105,110,117,115, 46,112,110,103,
+      41, 32, 99,101,110,116,101,114, 32,108,101,102,116, 32,110,111, 45,
+     114,101,112,101, 97,116, 59, 10, 32, 32, 32, 32,112, 97,100,100,105,
+     110,103, 45,108,101,102,116, 58, 32, 50, 48,112,120, 59, 32, 10,125,
+      10, 10,115,112, 97,110, 46,116,111,103,103,108,101,116,114,101,101,
+     111,112,101,110, 32,123, 10, 32, 32, 32, 32, 98, 97, 99,107,103,114,
+     111,117,110,100, 58, 32,117,114,108, 40,112,108,117,115, 46,112,110,
+     103, 41, 32, 99,101,110,116,101,114, 32,108,101,102,116, 32,110,111,
+      45,114,101,112,101, 97,116, 59, 10, 32, 32, 32, 32,112, 97,100,100,
+     105,110,103, 45,108,101,102,116, 58, 32, 50, 48,112,120, 59, 32, 10,
+     125, 10, 10,117,108, 46, 99,108, 97,115,115,116,114,101,101,108,105,
+     115,116, 32,108,105, 32,123, 32,112, 97,100,100,105,110,103, 45,108,
+     101,102,116, 58, 32, 48,112,120, 59, 32,125, 10, 10,117,108, 46, 99,
+     108, 97,115,115,116,114,101,101,108,105,115,116, 32,123, 32,108,105,
+     115,116, 45,115,116,121,108,101, 45,116,121,112,101, 58,110,111,110,
+     101, 59, 32,125, 10, 10,108,105, 46, 99,108, 97,115,115,116,114,101,
+     101, 32,117,108, 32,123, 32,100,105,115,112,108, 97,121, 58, 32, 98,
+     108,111, 99,107, 59, 32,125, 10, 10,108,105, 46, 99,108, 97,115,115,
+     116,114,101,101, 99,108,111,115,101,100, 32,117,108, 32,123, 32,100,
+     105,115,112,108, 97,121, 58, 32,110,111,110,101, 59, 32,125, 10);

+ 1 - 0
utils/fpdoc/dglobals.pp

@@ -48,6 +48,7 @@ resourcestring
   SDocProceduresAndFunctions = 'Procedures and functions';
   SDocProceduresAndFunctions = 'Procedures and functions';
   SDocVariables              = 'Variables';
   SDocVariables              = 'Variables';
   SDocIdentifierIndex        = 'Index';
   SDocIdentifierIndex        = 'Index';
+  SDocPackageClassHierarchy  = 'Class hierarchy';
   SDocModuleIndex            = 'Index of all identifiers in unit ''%s''';
   SDocModuleIndex            = 'Index of all identifiers in unit ''%s''';
   SDocPackageIndex           = 'Index of all identifiers in package ''%s''';
   SDocPackageIndex           = 'Index of all identifiers in package ''%s''';
   SDocUnitOverview           = 'Overview of unit ''%s''';
   SDocUnitOverview           = 'Overview of unit ''%s''';

+ 257 - 28
utils/fpdoc/dw_html.pp

@@ -32,6 +32,7 @@ const
   // Maybe needed later for topic overview ??
   // Maybe needed later for topic overview ??
   TopicsSubIndex = 7;
   TopicsSubIndex = 7;
   IndexSubIndex = 8;
   IndexSubIndex = 8;
+  ClassHierarchySubIndex = 9;
 
 
   // Subpage indices for classes
   // Subpage indices for classes
   PropertiesByInheritanceSubindex = 1;
   PropertiesByInheritanceSubindex = 1;
@@ -88,7 +89,10 @@ type
     FOnTest: TNotifyEvent;
     FOnTest: TNotifyEvent;
     FPackage: TPasPackage;
     FPackage: TPasPackage;
     FCharSet : String;
     FCharSet : String;
+    procedure AddElementsFromList(L: TStrings; List: TFPList; UsePathName : Boolean = False);
     procedure AppendTypeDecl(AType: TPasType; TableEl, CodeEl: TDomElement);
     procedure AppendTypeDecl(AType: TPasType; TableEl, CodeEl: TDomElement);
+    procedure CreateMinusImage;
+    procedure CreatePlusImage;
     function GetPageCount: Integer;
     function GetPageCount: Integer;
     procedure SetOnTest(const AValue: TNotifyEvent);
     procedure SetOnTest(const AValue: TNotifyEvent);
   protected
   protected
@@ -99,6 +103,7 @@ type
     PageInfos: TObjectList;     // list of TPageInfo objects
     PageInfos: TObjectList;     // list of TPageInfo objects
 
 
     Doc: THTMLDocument;
     Doc: THTMLDocument;
+    HeadElement,
     BodyElement, TitleElement: TDOMElement;
     BodyElement, TitleElement: TDOMElement;
 
 
     Module: TPasModule;
     Module: TPasModule;
@@ -233,6 +238,8 @@ type
     procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
     procedure CreatePageBody(AElement: TPasElement; ASubpageIndex: Integer); virtual;
     procedure CreatePackagePageBody;
     procedure CreatePackagePageBody;
     procedure CreatePackageIndex;
     procedure CreatePackageIndex;
+    procedure CreatePackageClassHierarchy;
+    procedure CreateClassHierarchyPage(AList: TStringList; AddUnit : Boolean);
     procedure AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
     procedure AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
     Procedure CreateTopicPageBody(AElement : TTopicElement);
     Procedure CreateTopicPageBody(AElement : TTopicElement);
     procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
     procedure CreateModulePageBody(AModule: TPasModule; ASubpageIndex: Integer);
@@ -286,9 +293,12 @@ type
 
 
 implementation
 implementation
 
 
-uses SysUtils, XHTML, XMLRead, XMLWrite, HTMWrite, sh_pas,chmsitemap;
+uses SysUtils, XHTML, XMLRead, XMLWrite, HTMWrite, sh_pas, fpdocclasstree,
+  chmsitemap;
 
 
 {$i css.inc}
 {$i css.inc}
+{$i plusimage.inc}
+{$i minusimage.inc}
 
 
 Function FixHTMLpath(S : String) : STring;
 Function FixHTMLpath(S : String) : STring;
 
 
@@ -525,6 +535,13 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
     end;
     end;
   end;
   end;
 
 
+  Function HaveClasses(AModule: TPasModule) : Boolean;
+
+  begin
+    with AModule do
+      Result:=InterfaceSection.Classes.Count>0;
+  end;
+
   procedure ScanModule(AModule: TPasModule; LinkList : TObjectList);
   procedure ScanModule(AModule: TPasModule; LinkList : TObjectList);
   var
   var
     i, j, k: Integer;
     i, j, k: Integer;
@@ -621,6 +638,7 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
 var
 var
   i: Integer;
   i: Integer;
   L : TObjectList;
   L : TObjectList;
+  H : Boolean;
 
 
 begin
 begin
   inherited ;
   inherited ;
@@ -642,6 +660,15 @@ begin
     begin
     begin
     AddPage(Package, 0);
     AddPage(Package, 0);
     AddPage(Package,IndexSubIndex);
     AddPage(Package,IndexSubIndex);
+    I:=0;
+    H:=False;
+    While (I<Package.Modules.Count) and Not H do
+      begin
+      H:=HaveClasses(TPasModule(Package.Modules[i]));
+      Inc(I);
+      end;
+    if H then
+      AddPage(Package,ClassHierarchySubIndex);
     AddTopicPages(Package);
     AddTopicPages(Package);
     end;
     end;
   L:=TObjectList.Create;
   L:=TObjectList.Create;
@@ -683,6 +710,7 @@ begin
   Doc.AppendChild(HTMLEl);
   Doc.AppendChild(HTMLEl);
 
 
   HeadEl := Doc.CreateHeadElement;
   HeadEl := Doc.CreateHeadElement;
+  HeadElement:=HeadEl;
   HTMLEl.AppendChild(HeadEl);
   HTMLEl.AppendChild(HeadEl);
   El := Doc.CreateElement('meta');
   El := Doc.CreateElement('meta');
   HeadEl.AppendChild(El);
   HeadEl.AppendChild(El);
@@ -762,6 +790,41 @@ begin
       end;
       end;
     end;
     end;
   CreateCSSFile;
   CreateCSSFile;
+  CreatePlusImage;
+  CreateMinusImage;
+end;
+
+procedure THTMLWriter.CreatePlusImage;
+Var
+  TempStream: TMemoryStream;
+
+begin
+  TempStream := TMemoryStream.Create;
+  try
+    DoLog('Creating plus image',[]);
+    TempStream.WriteBuffer(PlusImageData,SizeOf(PlusImageData));
+    TempStream.Position := 0;
+    TempStream.SaveToFile(Engine.output+'plus.png');
+  finally
+    TempStream.Free;
+  end;
+end;
+
+procedure THTMLWriter.CreateMinusImage;
+
+Var
+  TempStream: TMemoryStream;
+
+begin
+  TempStream := TMemoryStream.Create;
+  try
+    DoLog('Creating minus image',[]);
+    TempStream.WriteBuffer(MinusImageData,SizeOf(MinusImageData));
+    TempStream.Position := 0;
+    TempStream.SaveToFile(Engine.output+'minus.png');
+  finally
+    TempStream.Free;
+  end;
 end;
 end;
 
 
 procedure THTMLWriter.CreateCSSFile;
 procedure THTMLWriter.CreateCSSFile;
@@ -2003,6 +2066,20 @@ var
       AppendText(ParaEl, ']');
       AppendText(ParaEl, ']');
   end;
   end;
 
 
+  procedure AddPackageLink(ALinkSubpageIndex: Integer; const AName: String);
+  begin
+    if FUseMenuBrackets then
+      AppendText(ParaEl, '[');
+    if ALinkSubpageIndex = ASubpageIndex then
+      AppendText(ParaEl, AName)
+    else
+      AppendText(
+        CreateLink(ParaEl, ResolveLinkWithinPackage(Package, ALinkSubpageIndex)),
+        AName);
+    if FUseMenuBrackets then
+      AppendText(ParaEl, ']');
+  end;
+
 begin
 begin
   TableEl := CreateEl(BodyElement, 'table');
   TableEl := CreateEl(BodyElement, 'table');
   TableEl['cellpadding'] := '4';
   TableEl['cellpadding'] := '4';
@@ -2032,17 +2109,8 @@ begin
     end
     end
   else
   else
     begin
     begin
-    // Manually add link for package page
-    if FUseMenuBrackets then
-      AppendText(ParaEl, '[');
-    if (IndexSubIndex = ASubpageIndex) then
-      AppendText(ParaEl, SDocIdentifierIndex)
-    else
-      AppendText(
-        CreateLink(ParaEl, ResolveLinkWithinPackage(Package, IndexSubIndex)),
-        SDocIdentifierIndex);
-    if FUseMenuBrackets then
-      AppendText(ParaEl, ']');
+    AddPackageLink(IndexSubIndex, SDocIdentifierIndex);
+    AddPackageLink(ClassHierarchySubIndex, SDocPackageClassHierarchy);
     end;
     end;
 
 
   if Length(SearchPage) > 0 then
   if Length(SearchPage) > 0 then
@@ -2269,6 +2337,162 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure THTMLWriter.CreateClassHierarchyPage(AList : TStringList; AddUnit : Boolean);
+  Procedure PushClassElement;
+
+  Var
+    H : THTMLElement;
+  begin
+    H:=CreateEl(CurOutputNode, 'li');
+    H['class']:='classtree';
+    PushOutputNode(H);
+    H:=CreateEl(CurOutputNode, 'span');
+    H['class']:='toggletreeclose';
+    H['onclick']:='expandorcollapse(this)';
+    PushOutputNode(h);
+    AppendNbSp(h,1);
+    PopOutputNode;
+  end;
+
+  Procedure PushClassList;
+
+  Var
+    H : THTMLElement;
+  begin
+    H:=CreateEl(CurOutputNode, 'ul');
+    H['class']:='classtreelist';
+    PushOutputNode(h);
+  end;
+
+  Procedure AppendClass(E : TDomElement);
+
+  Var
+    N : TDomNode;
+    P,PM : TPasElement;
+    NN : String;
+    EN : String;
+    LL : TstringList;
+    I,J : Integer;
+
+  begin
+    EN:=Package.Name+'.'+E['unit']+'.'+E.NodeName;
+    J:=AList.IndexOf(EN);
+    If J<>-1 then
+      P:=AList.Objects[J] as TPasElement
+    else
+      P:=Engine.FindElement(EN);
+    PushClassElement;
+    try
+      if (P<>Nil) then
+        begin
+        AppendHyperLink(CurOutputNode,P);
+        PM:=P.Getmodule;
+        if (PM<>Nil) then
+          begin
+          AppendText(CurOutputNode,' (');
+          AppendHyperLink(CurOutputNode,PM);
+          AppendText(CurOutputNode,')');
+          end
+        end
+      else
+        AppendText(CurOutputNode,P.Name);
+      LL:=TStringList.Create;
+      try
+        N:=E.FirstChild;
+        While (N<>Nil) do
+          begin
+          if (N.NodeType=ELEMENT_NODE) then
+            LL.AddObject(N.NodeName,N);
+          N:=N.NextSibling;
+          end;
+        if (LL.Count>0) then
+          begin
+          LL.Sorted:=true;
+          PushClassList;
+          try
+            For I:=0 to LL.Count-1 do
+              AppendClass(LL.Objects[i] as TDomElement);
+          finally
+            PopOutputNode;
+          end;
+          end;
+      finally
+        LL.Free;
+      end;
+    Finally
+      PopOutputNode;
+    end;
+  end;
+
+Var
+  B : TClassTreeBuilder;
+  E : TDomElement;
+  F : TFileStream;
+
+begin
+  PushOutputNode(BodyElement);
+  try
+    B:=TClassTreeBuilder.Create(Package,okClass);
+    try
+      B.BuildTree(AList);
+      // Classes
+      WriteXMLFile(B.ClassTree,'tree.xml');
+      // Dummy TObject
+      E:=B.ClassTree.DocumentElement;
+      PushClassList;
+      try
+        AppendClass(E);
+      finally
+        PopOutputNode;
+      end;
+    finally
+      B.Free;
+    end;
+  finally
+    PopOutputNode;
+  end;
+end;
+
+procedure THTMLWriter.CreatePackageClassHierarchy;
+
+Const
+  SFunc = 'function expandorcollapse (o) {'+sLineBreak+
+          '  o.className = (o.className=="toggletreeclose") ? "toggletreeopen" : "toggletreeclose";'+sLineBreak+
+          '  o.parentNode.className = (o.className=="toggletreeclose") ? "classtree" : "classtreeclosed";'+sLineBreak+
+          '  return false;'+sLineBreak+
+          '}';
+
+Var
+  L : TStringList;
+  I : Integer;
+  M : TPasModule;
+  E : TPasElement;
+  S : String;
+  SE : THTMLElement;
+
+begin
+  SE := Doc.CreateElement('script');
+  AppendText(SE,SFunc);
+  HeadElement.AppendChild(SE);
+  L:=TStringList.Create;
+  try
+    L.Capacity:=PageInfos.Count; // Too much, but that doesn't hurt.
+    For I:=0 to Package.Modules.Count-1 do
+      begin
+      M:=TPasModule(Package.Modules[i]);
+      Self.AddElementsFromList(L,M.InterfaceSection.Classes,True)
+      end;
+    AppendMenuBar(ClassHierarchySubIndex);
+    S:=Package.Name;
+    If Length(S)>0 then
+      Delete(S,1,1);
+    AppendTitle(Format(SDocPackageClassHierarchy, [S]));
+    CreateClassHierarchyPage(L,True);
+  Finally
+    L.Free;
+  end;
+end;
+
 procedure THTMLWriter.CreatePageBody(AElement: TPasElement;
 procedure THTMLWriter.CreatePageBody(AElement: TPasElement;
   ASubpageIndex: Integer);
   ASubpageIndex: Integer);
 var
 var
@@ -2289,6 +2513,8 @@ begin
       CreatePackagePageBody
       CreatePackagePageBody
     else if ASubPageIndex=IndexSubIndex then
     else if ASubPageIndex=IndexSubIndex then
       CreatePackageIndex  
       CreatePackageIndex  
+    else if ASubPageIndex=ClassHierarchySubIndex then
+      CreatePackageClassHierarchy
     end
     end
   else
   else
     begin
     begin
@@ -2409,24 +2635,27 @@ begin
   end;  
   end;  
 end;
 end;
 
 
-procedure THTMLWriter.AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
+Procedure THTMLWriter.AddElementsFromList(L : TStrings; List : TFPList; UsePathName : Boolean = False);
 
 
-  Procedure AddElementsFromList(L : TStrings; List : TFPList);
-  
-  Var
-    I : Integer;
-    El : TPasElement;
-    
-  begin
-    For I:=0 to List.Count-1 do
-      begin
-      El:=TPasElement(List[I]);
+Var
+  I : Integer;
+  El : TPasElement;
+
+begin
+  For I:=0 to List.Count-1 do
+    begin
+    El:=TPasElement(List[I]);
+    if UsePathName then
+      L.AddObject(El.PathName,El)
+    else
       L.AddObject(El.Name,El);
       L.AddObject(El.Name,El);
-      If el is TPasEnumType then
-        AddElementsFromList(L,TPasEnumType(el).Values);
-      end;
-  end;
-  
+    If el is TPasEnumType then
+      AddElementsFromList(L,TPasEnumType(el).Values);
+    end;
+end;
+
+procedure THTMLWriter.AddModuleIdentifiers(AModule : TPasModule; L : TStrings);
+
 begin
 begin
   AddElementsFromList(L,AModule.InterfaceSection.Consts);
   AddElementsFromList(L,AModule.InterfaceSection.Consts);
   AddElementsFromList(L,AModule.InterfaceSection.Types);
   AddElementsFromList(L,AModule.InterfaceSection.Types);

+ 18 - 6
utils/fpdoc/fpclasschart.lpi

@@ -1,22 +1,24 @@
 <?xml version="1.0"?>
 <?xml version="1.0"?>
 <CONFIG>
 <CONFIG>
   <ProjectOptions>
   <ProjectOptions>
-    <PathDelim Value="/"/>
-    <Version Value="6"/>
+    <Version Value="9"/>
     <General>
     <General>
       <Flags>
       <Flags>
         <SaveOnlyProjectUnits Value="True"/>
         <SaveOnlyProjectUnits Value="True"/>
         <MainUnitHasUsesSectionForAllUnits Value="False"/>
         <MainUnitHasUsesSectionForAllUnits Value="False"/>
         <MainUnitHasCreateFormStatements Value="False"/>
         <MainUnitHasCreateFormStatements Value="False"/>
         <MainUnitHasTitleStatement Value="False"/>
         <MainUnitHasTitleStatement Value="False"/>
+        <LRSInOutputDirectory Value="False"/>
       </Flags>
       </Flags>
       <SessionStorage Value="InProjectDir"/>
       <SessionStorage Value="InProjectDir"/>
       <MainUnit Value="0"/>
       <MainUnit Value="0"/>
-      <TargetFileExt Value=""/>
     </General>
     </General>
     <VersionInfo>
     <VersionInfo>
-      <ProjectVersion Value=""/>
+      <StringTable ProductVersion=""/>
     </VersionInfo>
     </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="default" Default="True"/>
+    </BuildModes>
     <PublishOptions>
     <PublishOptions>
       <Version Value="2"/>
       <Version Value="2"/>
       <IgnoreBinaries Value="False"/>
       <IgnoreBinaries Value="False"/>
@@ -29,7 +31,7 @@
         <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
         <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
       </local>
       </local>
     </RunParams>
     </RunParams>
-    <Units Count="2">
+    <Units Count="3">
       <Unit0>
       <Unit0>
         <Filename Value="fpclasschart.pp"/>
         <Filename Value="fpclasschart.pp"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -40,10 +42,20 @@
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="dGlobals"/>
         <UnitName Value="dGlobals"/>
       </Unit1>
       </Unit1>
+      <Unit2>
+        <Filename Value="fpdocclasstree.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpdocclasstree"/>
+      </Unit2>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>
-    <Version Value="8"/>
+    <Version Value="11"/>
+    <Parsing>
+      <SyntaxOptions>
+        <UseAnsiStrings Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
     <Other>
     <Other>
       <CompilerPath Value="$(CompPath)"/>
       <CompilerPath Value="$(CompPath)"/>
     </Other>
     </Other>

+ 10 - 103
utils/fpdoc/fpclasschart.pp

@@ -19,7 +19,7 @@ program fpclasschart;
 
 
 uses
 uses
   SysUtils, Classes, Typinfo, Gettext, dom, xmlread,
   SysUtils, Classes, Typinfo, Gettext, dom, xmlread,
-  dGlobals, PasTree, PParser,PScanner, xmlwrite;
+  dGlobals, PasTree, PParser,PScanner, xmlwrite, fpdocclasstree;
 
 
 resourcestring
 resourcestring
   STitle = 'fpClassTree - Create class tree from pascal sources';
   STitle = 'fpClassTree - Create class tree from pascal sources';
@@ -37,20 +37,14 @@ type
 
 
   { TClassTreeEngine }
   { TClassTreeEngine }
 
 
+
   TClassTreeEngine = class(TFPDocEngine)
   TClassTreeEngine = class(TFPDocEngine)
   Private
   Private
-    FClassTree : TXMLDocument;
-    FTreeStart : TDomElement;
+    FTree : TClassTreeBuilder;
     FObjects : TStringList;
     FObjects : TStringList;
-    FObjectKind : TPasObjKind;
-    FParentObject : TPasClassType;
-    function LookForElement(PE: TDomElement; AElement: TPasElement): TDomNode;
-    function NodeMatch(N: TDomNode; AElement: TPasElement): Boolean;
-    Function AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
   public
   public
     Constructor Create(AClassTree : TXMLDocument; AObjectKind : TPasObjKind);
     Constructor Create(AClassTree : TXMLDocument; AObjectKind : TPasObjKind);
     Destructor Destroy; override;
     Destructor Destroy; override;
-    Function BuildTree : Integer;
     function CreateElement(AClass: TPTreeElement; const AName: String;
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; AVisibility :TPasMemberVisibility;
       AParent: TPasElement; AVisibility :TPasMemberVisibility;
       const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement; override;
       const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement; override;
@@ -95,6 +89,11 @@ type
     Property MaxObjectsPerColumn : Integer Read FMaxObjectsPerColumn Write FMaxObjectsPerColumn;
     Property MaxObjectsPerColumn : Integer Read FMaxObjectsPerColumn Write FMaxObjectsPerColumn;
   end;
   end;
 
 
+{ TClassTreeBuilder }
+
+
+
+
 { TChartFormatter }
 { TChartFormatter }
 
 
 constructor TClassChartFormatter.Create(AXML: TXMLDocument);
 constructor TClassChartFormatter.Create(AXML: TXMLDocument);
@@ -450,21 +449,11 @@ end;
 
 
 Constructor TClassTreeEngine.Create(AClassTree : TXMLDocument; AObjectKind : TPasObjKind);
 Constructor TClassTreeEngine.Create(AClassTree : TXMLDocument; AObjectKind : TPasObjKind);
 
 
-Var
-  N : TDomNode;
 
 
 begin
 begin
-  FClassTree:=AClassTree;
-  FTreeStart:=FClassTree.DocumentElement;
   FPackage:=TPasPackage.Create('dummy',Nil);
   FPackage:=TPasPackage.Create('dummy',Nil);
-  FObjectKind:=AObjectKind;
+  FTree:=TClassTreeBuilder.Create(FPackage,AObjectKind);
   FObjects:=TStringList.Create;
   FObjects:=TStringList.Create;
-  Case FObjectkind of
-    okObject    : FParentObject:=TPasClassType.Create('TObject',FPackage);
-    okClass     : FParentObject:=TPasClassType.Create('TObject',FPackage);
-    okInterface : FParentObject:=TPasClassType.Create('IInterface',FPackage);
-  end;
-  FParentObject.ObjKind:=FObjectKind;
   Inherited Create;
   Inherited Create;
 end;
 end;
 
 
@@ -474,89 +463,7 @@ begin
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
-Function TClassTreeEngine.BuildTree : Integer;
-
-Var
-  I : Integer;
-  PC : TPasClassType;
-
-begin
-  Result:=0;
-  FObjects.Sorted:=True;
-  For I:=0 to FObjects.Count-1 do
-    begin
-    PC:=TPasClassType(FObjects.Objects[i]);
-    If (PC.ObjKind=FObjectKind) and Not PC.IsForward then
-      AddToClassTree(PC as TPasElement,Result)
-    end;
-end;
-
-Function TClassTreeEngine.NodeMatch(N : TDomNode; AElement : TPasElement) : Boolean;
-
-begin
-  Result:=(N.NodeType=ELEMENT_NODE) and (CompareText(N.NodeName,AElement.Name)=0)
-end;
-
-Function TClassTreeEngine.LookForElement(PE : TDomElement; AElement : TPasElement) : TDomNode;
-
-Var
-  N : TDomNode;
-
-begin
-  Result:=PE.FirstChild;
-  While (Result<>Nil) and Not NodeMatch(Result,AElement) do
-    Result:=Result.NextSibling;
-  If (Result=Nil) then
-    begin
-    N:=PE.FirstChild;
-    While (Result=Nil) and (N<>Nil) do
-      begin
-      if (N.NodeType=ELEMENT_NODE) then
-        begin
-        Result:=LookForElement(N as TDomElement,AElement);
-        end;
-      N:=N.NextSibling;
-      end;
-    end
-end;
-
-Function TClassTreeEngine.AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
 
 
-Var
-  PC : TPasClassType;
-  PE : TDomElement;
-  M : TPasModule;
-  N : TDomNode;
-
-begin
-  PE:=Nil;
-  If (AElement is TPasClassType) then
-    begin
-    PC:=AElement as TPasClassType;
-    If not Assigned(PC.AncestorType) and (CompareText(PC.Name,FParentObject.Name)<>0) then
-      PC.AncestorType:=FParentObject;
-    If Assigned(PC.AncestorType) then
-      PE:=AddToClassTree(PC.AncestorType,ACount);
-    end;
-  If (PE=Nil) then
-    PE:=FTreeStart;
-  N:=LookForElement(PE,AElement);
-  If (N<>Nil) then
-    Result:=N as TDomElement
-  else
-    begin
-    Inc(ACount);
-    Result:=FClassTree.CreateElement(AElement.Name);
-    If Not (AElement is TPasUnresolvedTypeRef) then
-      begin
-      M:=AElement.GetModule;
-      if Assigned(M) then
-        Result['unit']:=M.Name;
-      end;
-    PE.AppendChild(Result);
-    end;
-end;    
-    
 { ---------------------------------------------------------------------
 { ---------------------------------------------------------------------
   Main program. Document all units.    
   Main program. Document all units.    
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
@@ -636,7 +543,7 @@ begin
       Engine := TClassTreeEngine.Create(XML,AObjectKind);
       Engine := TClassTreeEngine.Create(XML,AObjectKind);
       Try
       Try
         ParseSource(Engine,InputFiles[I],OSTarget,CPUTarget);
         ParseSource(Engine,InputFiles[I],OSTarget,CPUTarget);
-        ACount:=ACount+Engine.BuildTree;
+        ACount:=ACount+Engine.Ftree.BuildTree(Engine.FObjects);
       Finally
       Finally
         Engine.Free;
         Engine.Free;
       end;
       end;

+ 20 - 26
utils/fpdoc/fpdoc.css

@@ -1,5 +1,5 @@
 /*
 /*
-  $Id: fpdoc.css,v 1.1 2003/03/17 23:03:20 michael Exp $
+  $Id: fpdoc.cst,v 1.1 2005/01/02 16:22:16 michael Exp $
 
 
   Default style sheet for FPDoc reference documentation
   Default style sheet for FPDoc reference documentation
   by Sebastian Guenther, [email protected]
   by Sebastian Guenther, [email protected]
@@ -62,6 +62,10 @@ span.code {
 span.sym {
 span.sym {
   color: darkred
   color: darkred
 }
 }
+/* No wordwrap in code fragments */
+span.code {
+   white-space: nowrap
+}
 
 
 /* keywords in source fragments */
 /* keywords in source fragments */
 span.kw {
 span.kw {
@@ -127,40 +131,30 @@ table.bar {
   background-color: #a0c0ff;
   background-color: #a0c0ff;
 }
 }
 
 
+td p {
+ margin: 0;
+}
+
 span.bartitle {
 span.bartitle {
   font-weight: bold;
   font-weight: bold;
   font-style: italic;
   font-style: italic;
   color: darkblue
   color: darkblue
 }
 }
 
 
-span.footer {
-  font-style: italic;
-  color: darkblue
+span.toggletreeclose {
+    background: url(minus.png) center left no-repeat;
+    padding-left: 20px; 
 }
 }
 
 
-/* definition list */
-dl {
- border: 3px double #ccc;
- padding: 0.5em;
+span.toggletreeopen {
+    background: url(plus.png) center left no-repeat;
+    padding-left: 20px; 
 }
 }
 
 
-/* definition list: term */
-dt {
- float: left;
- clear: left;
- width: auto; /* normally browsers default width of largest item */
- padding-right: 20px;
- font-weight: bold;
- color: darkgreen;
-}
+ul.classtreelist li { padding-left: 0px; }
 
 
-/* definition list: description */
-dd {
- margin: 0 0 0 110px;
- padding: 0 0 0.5em 0;
-}
+ul.classtreelist { list-style-type:none; }
 
 
-/* for browsers in standards compliance mode */
-td p {
-  margin: 0;
-}
+li.classtree ul { display: block; }
+
+li.classtreeclosed ul { display: none; }

+ 7 - 2
utils/fpdoc/fpdoc.lpi

@@ -31,7 +31,7 @@
     <RunParams>
     <RunParams>
       <local>
       <local>
         <FormatVersion Value="1"/>
         <FormatVersion Value="1"/>
-        <CommandLineParams Value="--project=fpdoc.xml"/>
+        <CommandLineParams Value="--package=me --output=me --input=ct.pp --format=html"/>
         <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
         <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
       </local>
       </local>
     </RunParams>
     </RunParams>
@@ -40,7 +40,7 @@
         <PackageName Value="FCL"/>
         <PackageName Value="FCL"/>
       </Item1>
       </Item1>
     </RequiredPackages>
     </RequiredPackages>
-    <Units Count="15">
+    <Units Count="16">
       <Unit0>
       <Unit0>
         <Filename Value="fpdoc.pp"/>
         <Filename Value="fpdoc.pp"/>
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
@@ -116,6 +116,11 @@
         <IsPartOfProject Value="True"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="mkfpdoc"/>
         <UnitName Value="mkfpdoc"/>
       </Unit14>
       </Unit14>
+      <Unit15>
+        <Filename Value="fpdocclasstree.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fpdocclasstree"/>
+      </Unit15>
     </Units>
     </Units>
   </ProjectOptions>
   </ProjectOptions>
   <CompilerOptions>
   <CompilerOptions>

+ 1 - 0
utils/fpdoc/fpdoc.pp

@@ -23,6 +23,7 @@ uses
 {$endif}
 {$endif}
   SysUtils, Classes, Gettext, custapp,
   SysUtils, Classes, Gettext, custapp,
   dGlobals,  // Global definitions, constants.
   dGlobals,  // Global definitions, constants.
+  fpdocclasstree, // Class tree builder
   dwriter,   // TFPDocWriter definition.
   dwriter,   // TFPDocWriter definition.
   dwlinear,  // Linear (abstract) writer
   dwlinear,  // Linear (abstract) writer
   dw_LaTeX,  // TLaTex writer
   dw_LaTeX,  // TLaTex writer

+ 160 - 0
utils/fpdoc/fpdocclasstree.pp

@@ -0,0 +1,160 @@
+unit fpdocclasstree;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, DOM, pastree;
+
+Type
+  TClassTreeBuilder = Class
+  Private
+    FClassTree : TXMLDocument;
+    FTreeStart : TDomElement;
+    FObjectKind : TPasObjKind;
+    FPackage: TPasPackage;
+    FParentObject : TPasClassType;
+  Protected
+    function LookForElement(PE: TDomElement; AElement: TPasElement): TDomNode;
+    function NodeMatch(N: TDomNode; AElement: TPasElement): Boolean;
+    Function AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
+  Public
+    Constructor Create(APackage : TPasPackage; AObjectKind : TPasObjKind = okClass);
+    Destructor Destroy; override;
+    Function BuildTree(AObjects : TStringList) : Integer;
+    Property ClassTree : TXMLDocument Read FClassTree;
+  end;
+
+implementation
+
+constructor TClassTreeBuilder.Create(APackage : TPasPackage;
+  AObjectKind: TPasObjKind);
+Var
+  N : TDomNode;
+begin
+  FCLassTree:=TXMLDocument.Create;
+  FPackage:=APAckage;
+  FObjectKind:=AObjectKind;
+  Case FObjectkind of
+    okObject    : FParentObject:=TPasClassType.Create('System.TObject',FPackage);
+    okClass     : FParentObject:=TPasClassType.Create('System.TObject',FPackage);
+    okInterface : FParentObject:=TPasClassType.Create('System.IInterface',FPackage);
+  end;
+  FParentObject.ObjKind:=FObjectKind;
+  FTreeStart:=FClassTree.CreateElement('TObject');
+  FTreeStart['unit']:='System';
+  ClassTree.AppendChild(FTreeStart);
+end;
+
+destructor TClassTreeBuilder.Destroy;
+begin
+  FreeAndNil(FClassTree);
+  Inherited;
+end;
+Function TClassTreeBuilder.BuildTree(AObjects : TStringList) : Integer;
+
+Var
+  I : Integer;
+  PC : TPasClassType;
+
+begin
+  Result:=0;
+  AObjects.Sorted:=True;
+  For I:=0 to AObjects.Count-1 do
+    begin
+    PC:=TPasClassType(AObjects.Objects[i]);
+    If (PC.ObjKind=FObjectKind) and Not PC.IsForward then
+      begin
+      AddToClassTree(PC as TPasElement,Result)
+      end;
+    end;
+end;
+
+Function TClassTreeBuilder.NodeMatch(N : TDomNode; AElement : TPasElement) : Boolean;
+
+Var
+  S : String;
+
+begin
+  Result:=(N.NodeType=ELEMENT_NODE);
+  if Result then
+    begin
+    S:=N.NodeName;
+    S:=FPackage.Name+'.'+TDomElement(N)['unit']+'.'+S;
+    Result:= (CompareText(S,AElement.PathName)=0)
+    end;
+end;
+
+Function TClassTreeBuilder.LookForElement(PE : TDomElement; AElement : TPasElement) : TDomNode;
+
+Var
+  N : TDomNode;
+
+begin
+  Result:=PE;
+  While (Result<>Nil) and Not NodeMatch(Result,AElement) do
+    Result:=Result.NextSibling;
+  If (Result=Nil) then
+    begin
+    N:=PE.FirstChild;
+    While (Result=Nil) and (N<>Nil) do
+      begin
+      if (N.NodeType=ELEMENT_NODE) then
+        begin
+        Result:=LookForElement(N as TDomElement,AElement);
+        end;
+      N:=N.NextSibling;
+      end;
+    end
+end;
+
+Function TClassTreeBuilder.AddToClassTree(AElement : TPasElement; Var ACount : Integer) : TDomElement;
+
+Var
+  PC : TPasClassType;
+  PE : TDomElement;
+  M : TPasModule;
+  N : TDomNode;
+
+begin
+  Result:=Nil;
+  If (AElement=Nil) then
+    Result:=FTreeStart
+  else If (AElement is TPasClassType) then
+    begin
+    Writeln('Doing ',AElement.Name);
+    if (AElement=FParentObject) then
+      Result:=FTreeStart
+    else
+      begin
+      PC:=AElement as TPasClassType;
+      PE:=AddToClassTree(PC.AncestorType,ACount);
+      N:=LookForElement(PE,AElement);
+      If (N<>Nil) then
+        Result:=N as TDomElement
+      else
+        begin
+        Inc(ACount);
+        Result:=FClassTree.CreateElement(AElement.Name);
+        If Not (AElement is TPasUnresolvedTypeRef) then
+          begin
+          M:=AElement.GetModule;
+          if Assigned(M) then
+            Result['unit']:=M.Name;
+          end;
+        if (PE=FTreeStart) then
+          begin
+          Writeln('Adding to tree start :',AELement.Name);
+          Writeln('Have ancestor : ',PC.AncestorType<>Nil);
+          if (PC.AncestorType<>Nil) then
+            Writeln(PC.AncestorType.ClassName, ' : '+PC.AncestorType.Name);
+          end;
+        PE.AppendChild(Result);
+        end;
+     end;
+    end
+end;
+
+end.
+

+ 20 - 0
utils/fpdoc/minusimage.inc

@@ -0,0 +1,20 @@
+
+Const
+  MinusImageData : Array[0..273] of byte = (
+     137, 80, 78, 71, 13, 10, 26, 10,  0,  0,  0, 13, 73, 72, 68, 82,  0,
+       0,  0, 19,  0,  0,  0, 19,  8,  4,  0,  0,  0,216, 89,254, 71,  0,
+       0,  0,  2, 98, 75, 71, 68,  0,238,237, 63,236, 77,  0,  0,  0,  9,
+     112, 72, 89,115,  0,  0,  0, 72,  0,  0,  0, 72,  0, 70,201,107, 62,
+       0,  0,  0,  9,118,112, 65,103,  0,  0,  0, 19,  0,  0,  0, 19,  0,
+     241,127,140,174,  0,  0,  0, 63, 73, 68, 65, 84, 40,207, 99,124,199,
+      64, 12, 96, 34, 74,213,192, 40, 99, 65, 48, 39,253, 71,151,204, 99,
+     196,162,140,129,161, 30, 69, 81, 35, 61,220,198,192,192,192,  0,119,
+      12,195,127,124,202,254,227, 48,141,134,110,107,196,169,140,113,232,
+     167, 16,  0,229, 60,  7,139,203,229, 71,  3,  0,  0,  0, 37,116, 69,
+      88,116,100, 97,116,101, 58, 99,114,101, 97,116,101,  0, 50, 48, 49,
+      50, 45, 49, 50, 45, 50, 48, 84, 49, 53, 58, 48, 52, 58, 52, 48, 43,
+      48, 49, 58, 48, 48, 36,251,160,191,  0,  0,  0, 37,116, 69, 88,116,
+     100, 97,116,101, 58,109,111,100,105,102,121,  0, 50, 48, 49, 50, 45,
+      49, 50, 45, 50, 48, 84, 49, 53, 58, 48, 52, 58, 52, 48, 43, 48, 49,
+      58, 48, 48, 85,166, 24,  3,  0,  0,  0,  0, 73, 69, 78, 68,174, 66,
+      96,130);

+ 21 - 0
utils/fpdoc/plusimage.inc

@@ -0,0 +1,21 @@
+
+Const
+  PlusImageData : Array[0..288] of byte = (
+     137, 80, 78, 71, 13, 10, 26, 10,  0,  0,  0, 13, 73, 72, 68, 82,  0,
+       0,  0, 19,  0,  0,  0, 19,  8,  4,  0,  0,  0,216, 89,254, 71,  0,
+       0,  0,  2, 98, 75, 71, 68,  0,238,237, 63,236, 77,  0,  0,  0,  9,
+     112, 72, 89,115,  0,  0,  0, 72,  0,  0,  0, 72,  0, 70,201,107, 62,
+       0,  0,  0,  9,118,112, 65,103,  0,  0,  0, 19,  0,  0,  0, 19,  0,
+     241,127,140,174,  0,  0,  0, 78, 73, 68, 65, 84, 40,207, 99,124,199,
+      64, 12, 96, 34, 74,213,192, 40, 99, 65, 48, 39,253, 71,151,204, 99,
+     196,162,140,129,161, 30, 69, 81, 35,126, 75, 25, 49,133,200,112, 27,
+     194, 36, 70,  6,  6,134,255,248,148,253,103, 96, 96, 96,100,192,240,
+      11,  5,225,246, 31,139, 50, 20, 75, 27, 25,112,  1,198,161,159, 66,
+       0, 47,159,  9,140, 36, 84,124, 38,  0,  0,  0, 37,116, 69, 88,116,
+     100, 97,116,101, 58, 99,114,101, 97,116,101,  0, 50, 48, 49, 50, 45,
+      49, 50, 45, 50, 48, 84, 49, 53, 58, 48, 52, 58, 50, 50, 43, 48, 49,
+      58, 48, 48,117, 11,184, 17,  0,  0,  0, 37,116, 69, 88,116,100, 97,
+     116,101, 58,109,111,100,105,102,121,  0, 50, 48, 49, 50, 45, 49, 50,
+      45, 50, 48, 84, 49, 53, 58, 48, 52, 58, 50, 50, 43, 48, 49, 58, 48,
+      48,  4, 86,  0,173,  0,  0,  0,  0, 73, 69, 78, 68,174, 66, 96,130
+     );