]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Add Martin Steigemann's Qt based parameter GUI.
authorbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 20 Dec 2010 17:00:59 +0000 (17:00 +0000)
committerbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Mon, 20 Dec 2010 17:00:59 +0000 (17:00 +0000)
git-svn-id: https://svn.dealii.org/trunk@23029 0785d39b-7218-0410-832d-ea1e28bc413d

30 files changed:
deal.II/contrib/parameter_gui/Doxyfile [new file with mode: 0644]
deal.II/contrib/parameter_gui/application.qrc [new file with mode: 0644]
deal.II/contrib/parameter_gui/browse_lineedit.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/browse_lineedit.h [new file with mode: 0644]
deal.II/contrib/parameter_gui/dealii_parameter_gui.pro [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/document.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/exit.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/fileclose.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/fileopen.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/filesave.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/filesaveas.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/folder.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/folder_open.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/icons/idea.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/images/logo_dealii.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/images/logo_dealii_64.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/images/logo_dealii_gui.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/images/logo_dealii_gui_128.png [new file with mode: 0644]
deal.II/contrib/parameter_gui/info_message.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/info_message.h [new file with mode: 0644]
deal.II/contrib/parameter_gui/main.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/mainwindow.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/mainwindow.h [new file with mode: 0644]
deal.II/contrib/parameter_gui/parameter_delegate.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/parameter_delegate.h [new file with mode: 0644]
deal.II/contrib/parameter_gui/parameters.xml [new file with mode: 0644]
deal.II/contrib/parameter_gui/xml_parameter_reader.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/xml_parameter_reader.h [new file with mode: 0644]
deal.II/contrib/parameter_gui/xml_parameter_writer.cpp [new file with mode: 0644]
deal.II/contrib/parameter_gui/xml_parameter_writer.h [new file with mode: 0644]

diff --git a/deal.II/contrib/parameter_gui/Doxyfile b/deal.II/contrib/parameter_gui/Doxyfile
new file mode 100644 (file)
index 0000000..1238113
--- /dev/null
@@ -0,0 +1,1510 @@
+# Doxyfile 1.5.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = parameterGUI
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 1.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = /home/masteige/projects/dealii_parameter_gui/doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, 
+# Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses. 
+# With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this tag. 
+# The format is ext=language, where ext is a file extension, and language is one of 
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, 
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat 
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), 
+# use: inc=Fortran f=C
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = YES
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = YES
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page. 
+# This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
+# doxygen. The layout file controls the global structure of the generated output files 
+# in an output format independent way. The create the layout file that represents 
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
+# of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = /home/masteige/projects/dealii_parameter_gui
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.cpp *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = /home/masteige/projects/mcrack2d/icons
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = YES
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = /home/masteige/projects/dealii_parameter_gui/images
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output. 
+# If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis. 
+# Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match. 
+# The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code. 
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
+# are set, an additional index file will be generated that can be used as input for 
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = 
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. 
+# For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to FRAME, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature. Other possible values 
+# for this tag are: HIERARCHIES, which will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list; 
+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which 
+# disables this behavior completely. For backwards compatibility with previous 
+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE 
+# respectively.
+
+GENERATE_TREEVIEW      = NONE
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = amssymb, amsmath
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader. 
+# This is useful 
+# if you want to understand what is going on. 
+# On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#  
+# TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#  
+# TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Options related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/deal.II/contrib/parameter_gui/application.qrc b/deal.II/contrib/parameter_gui/application.qrc
new file mode 100644 (file)
index 0000000..f5424d6
--- /dev/null
@@ -0,0 +1,16 @@
+<!DOCTYPE RCC><RCC version="1.0">
+ <qresource>
+     <file>icons/document.png</file>
+     <file>icons/exit.png</file>
+     <file>icons/fileclose.png</file>
+     <file>icons/fileopen.png</file>
+     <file>icons/filesaveas.png</file>
+     <file>icons/filesave.png</file>
+     <file>icons/folder_open.png</file>
+     <file>icons/folder.png</file>
+     <file>icons/idea.png</file>
+     <file>images/logo_dealii_64.png</file>
+     <file>images/logo_dealii_gui.png</file>
+     <file>images/logo_dealii_gui_128.png</file>
+ </qresource>
+ </RCC>
\ No newline at end of file
diff --git a/deal.II/contrib/parameter_gui/browse_lineedit.cpp b/deal.II/contrib/parameter_gui/browse_lineedit.cpp
new file mode 100644 (file)
index 0000000..f6aaa3c
--- /dev/null
@@ -0,0 +1,105 @@
+
+#include <QtGui>
+
+#include "browse_lineedit.h"
+
+
+BrowseLineEdit::BrowseLineEdit(const BrowseType  type, QWidget *parent)
+              : QFrame(parent, 0),
+                browse_type(type)
+{
+  line_editor = new QLineEdit;
+  connect(line_editor, SIGNAL(editingFinished()), this, SLOT(editing_finished()));
+
+  browse_button = new QPushButton("&Browse...");
+  connect(browse_button, SIGNAL(clicked()), this, SLOT(browse()));
+
+  setFocusPolicy (Qt::StrongFocus);
+
+  QHBoxLayout *layout = new QHBoxLayout;
+
+  layout->addWidget(line_editor);
+  layout->addWidget(browse_button);
+  setLayout(layout);
+
+  setAutoFillBackground(true);
+  setBackgroundRole(QPalette::Highlight);
+}
+
+
+
+
+QSize BrowseLineEdit::sizeHint() const
+{
+  QSize  size_line_editor   = line_editor->sizeHint(),
+         size_browse_button = browse_button->sizeHint();
+
+  int w = size_line_editor.rwidth() + size_browse_button.rwidth(),
+      h = qMax(size_line_editor.rheight(), size_browse_button.rheight());
+
+  return QSize (w, h);
+}
+
+
+
+QSize BrowseLineEdit::minimumSizeHint() const
+{
+  QSize  size_line_editor   = line_editor->minimumSizeHint(),
+         size_browse_button = browse_button->minimumSizeHint();
+
+  int w = size_line_editor.rwidth() + size_browse_button.rwidth(),
+      h = qMax(size_line_editor.rheight(), size_browse_button.rheight());
+
+  return QSize (w, h);
+}
+
+
+
+QString BrowseLineEdit::text() const
+{
+  return line_editor->text();
+}
+
+
+
+void BrowseLineEdit::setText(const QString &str)
+{
+  line_editor->setText(str);
+}
+
+
+
+void BrowseLineEdit::editing_finished()
+{
+  emit editingFinished();
+}
+
+
+
+void BrowseLineEdit::browse()
+{
+  QString  name = "";
+
+  switch (browse_type)
+    {
+      case file:
+        {
+          name = QFileDialog::getOpenFileName(this, tr("Open File"),
+                                              QDir::currentPath(),
+                                              tr("All Files (*.*)"));
+          break;
+        };
+
+      case directory:
+        {
+          name = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
+                                                   QDir::homePath(),
+                                                   QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+          break;
+        };
+    };
+
+  if (!name.isEmpty() && !name.isNull())
+    line_editor->setText(name);
+}
+
diff --git a/deal.II/contrib/parameter_gui/browse_lineedit.h b/deal.II/contrib/parameter_gui/browse_lineedit.h
new file mode 100644 (file)
index 0000000..2156931
--- /dev/null
@@ -0,0 +1,92 @@
+
+#ifndef BROWSELINEEDIT_H
+#define BROWSELINEEDIT_H
+
+#include <QFrame>
+#include <QLineEdit>
+#include <QFileDialog>
+#include <QPushButton>
+
+/**
+ * The BrowseLineEdit class provides a special line editor for the parameterGUI.
+ * While editing file- or directory names it is much more easier to have a file-dialog
+ * and just click on existing files or directories. This editor provides a simple QLineEditor
+ * and a browse-button which opens a file- or a directory dialog. Clicking on existing files or directories
+ * copies the path to the line editor. Depending on the <tt>BrowseType</tt> given in the constructor
+ * the browse button opens a <tt>file</tt> or a <tt>directory</tt> dialog.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class BrowseLineEdit : public QFrame
+{
+  Q_OBJECT
+
+  public:
+                                    /**
+                                     * The browse button opens a <tt>file</tt> or
+                                     * a <tt>directory</tt> dialog. This can be specified
+                                     * in the constructor by setting this flag <tt>BrowseType</tt>.
+                                     */
+    enum BrowseType {file = 0, directory = 1};
+                                    /**
+                                     * Constructor. The type of the browse dialog can be specified
+                                     * by the flag <tt>BrowseType</tt>, the default is <tt>file</tt>.
+                                     */
+    BrowseLineEdit (const BrowseType  type = file,
+                    QWidget          *parent = 0);
+
+                                    /**
+                                     * Reimplemented from the QWidget class.
+                                     * Returns the size of the editor.
+                                     */
+    QSize  sizeHint() const;
+                                    /**
+                                     * Reimplemented from the QWidget class.
+                                     */
+    QSize  minimumSizeHint() const;
+                                    /**
+                                     * Returns the text of the line editor.
+                                     */
+    QString  text() const;
+                                    /**
+                                     * This pattern stores the type of the browse dialog.
+                                     */
+    BrowseType  browse_type;
+
+  public slots:
+                                    /**
+                                     * A <tt>slot</tt> for setting the text of the line editor.
+                                     */
+    void setText(const QString &str);
+
+  signals:
+
+                                    /**
+                                     * This <tt>signal</tt> will be emitted, if editing is finished.
+                                     */
+    void editingFinished();
+
+  private slots:
+                                    /**
+                                     * This <tt>slot</tt> should be always called, if editing is finished.
+                                     */
+    void editing_finished();
+                                    /**
+                                     * This function opens a file- or a directory dialog as specified in the
+                                     * constructor.
+                                     */
+    void browse();
+
+  private:
+                                    /**
+                                     * The line editor.
+                                     */
+    QLineEdit * line_editor;
+                                    /**
+                                     * The browse button.
+                                     */
+    QPushButton * browse_button;
+};
+
+#endif
diff --git a/deal.II/contrib/parameter_gui/dealii_parameter_gui.pro b/deal.II/contrib/parameter_gui/dealii_parameter_gui.pro
new file mode 100644 (file)
index 0000000..a99da2f
--- /dev/null
@@ -0,0 +1,24 @@
+######################################################################
+# Automatically generated by qmake (2.01a) So. Dez 12 15:30:12 2010
+######################################################################
+
+TEMPLATE = app
+TARGET = 
+DEPENDPATH += .
+INCLUDEPATH += .
+
+# Input
+HEADERS += browse_lineedit.h \
+           info_message.h \
+           mainwindow.h \
+           parameter_delegate.h \
+           xml_parameter_reader.h \
+           xml_parameter_writer.h
+SOURCES += browse_lineedit.cpp \
+           info_message.cpp \
+           main.cpp \
+           mainwindow.cpp \
+           parameter_delegate.cpp \
+           xml_parameter_reader.cpp \
+           xml_parameter_writer.cpp
+RESOURCES += application.qrc
diff --git a/deal.II/contrib/parameter_gui/icons/document.png b/deal.II/contrib/parameter_gui/icons/document.png
new file mode 100644 (file)
index 0000000..8901c3a
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/document.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/exit.png b/deal.II/contrib/parameter_gui/icons/exit.png
new file mode 100644 (file)
index 0000000..b266020
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/exit.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/fileclose.png b/deal.II/contrib/parameter_gui/icons/fileclose.png
new file mode 100644 (file)
index 0000000..7cb9859
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/fileclose.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/fileopen.png b/deal.II/contrib/parameter_gui/icons/fileopen.png
new file mode 100644 (file)
index 0000000..a79982e
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/fileopen.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/filesave.png b/deal.II/contrib/parameter_gui/icons/filesave.png
new file mode 100644 (file)
index 0000000..3bc2a37
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/filesave.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/filesaveas.png b/deal.II/contrib/parameter_gui/icons/filesaveas.png
new file mode 100644 (file)
index 0000000..c8d4816
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/filesaveas.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/folder.png b/deal.II/contrib/parameter_gui/icons/folder.png
new file mode 100644 (file)
index 0000000..df2426e
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/folder.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/folder_open.png b/deal.II/contrib/parameter_gui/icons/folder_open.png
new file mode 100644 (file)
index 0000000..f00c1e8
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/folder_open.png differ
diff --git a/deal.II/contrib/parameter_gui/icons/idea.png b/deal.II/contrib/parameter_gui/icons/idea.png
new file mode 100644 (file)
index 0000000..78c073f
Binary files /dev/null and b/deal.II/contrib/parameter_gui/icons/idea.png differ
diff --git a/deal.II/contrib/parameter_gui/images/logo_dealii.png b/deal.II/contrib/parameter_gui/images/logo_dealii.png
new file mode 100644 (file)
index 0000000..3b7c7d6
Binary files /dev/null and b/deal.II/contrib/parameter_gui/images/logo_dealii.png differ
diff --git a/deal.II/contrib/parameter_gui/images/logo_dealii_64.png b/deal.II/contrib/parameter_gui/images/logo_dealii_64.png
new file mode 100644 (file)
index 0000000..0ecf03f
Binary files /dev/null and b/deal.II/contrib/parameter_gui/images/logo_dealii_64.png differ
diff --git a/deal.II/contrib/parameter_gui/images/logo_dealii_gui.png b/deal.II/contrib/parameter_gui/images/logo_dealii_gui.png
new file mode 100644 (file)
index 0000000..546b453
Binary files /dev/null and b/deal.II/contrib/parameter_gui/images/logo_dealii_gui.png differ
diff --git a/deal.II/contrib/parameter_gui/images/logo_dealii_gui_128.png b/deal.II/contrib/parameter_gui/images/logo_dealii_gui_128.png
new file mode 100644 (file)
index 0000000..98e3cf7
Binary files /dev/null and b/deal.II/contrib/parameter_gui/images/logo_dealii_gui_128.png differ
diff --git a/deal.II/contrib/parameter_gui/info_message.cpp b/deal.II/contrib/parameter_gui/info_message.cpp
new file mode 100644 (file)
index 0000000..e0af897
--- /dev/null
@@ -0,0 +1,83 @@
+
+#include <QtGui>
+
+#include "info_message.h"
+
+
+InfoMessage::InfoMessage(QWidget *parent)
+           : QDialog(parent, 0)
+{
+  show_again = true;                                                   // this variable stores, if the
+                                                                       // the info message should be shown again
+  QGridLayout * grid = new QGridLayout(this);
+
+  icon = new QLabel(this);                                             // set an icon
+#ifndef QT_NO_MESSAGEBOX
+  icon->setPixmap(QMessageBox::standardIcon(QMessageBox::Information));
+  icon->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
+#endif
+  grid->addWidget(icon, 0, 0, Qt::AlignTop);                           // add the icon in the upper left corner
+
+  message = new QTextEdit(this);                                       // set the new message
+  message->setReadOnly(true);
+  grid->addWidget(message, 0, 1);                                      // and add the message on the right
+
+  again = new QCheckBox(this);                                         // add a check box
+  again->setChecked(true);
+  again->setText(QErrorMessage::tr("&Show this message again"));
+  grid->addWidget(again, 1, 1, Qt::AlignTop);
+
+  ok = new QPushButton(this);                                          // and finally a OK button
+  ok->setText(QErrorMessage::tr("&OK"));
+#ifdef QT_SOFTKEYS_ENABLED
+  ok_action = new QAction(ok);                                         // define the action for the button
+  ok_action->setSoftKeyRole(QAction::PositiveSoftKey);
+  ok_action->setText(ok->text());
+  connect(ok_action, SIGNAL(triggered()), this, SLOT(accept()));
+  addAction(ok_action);
+#endif
+  connect(ok, SIGNAL(clicked()), this, SLOT(accept()));
+  ok->setFocus();                                                      // aand set the focus on the button
+  grid->addWidget(ok, 2, 0, 1, 2, Qt::AlignCenter);
+
+  grid->setColumnStretch(1, 42);
+  grid->setRowStretch(0, 42);
+                                                                       // load settings from an ini-file
+  QString  settings_file = QDir::currentPath() + "/settings.ini";
+
+  settings = new QSettings (settings_file, QSettings::IniFormat);
+
+  settings->beginGroup("infoMessage");                                 // we store settings of this class in the
+  show_again = settings->value("showInformation", true).toBool();      //group infoMessage
+  settings->endGroup();
+}
+
+
+
+void InfoMessage::setInfoMessage(const QString &message)
+{
+  this->message->setText(message);                                     // set the message
+}
+
+
+
+void InfoMessage::showMessage()
+{
+  if (show_again)                                                      // and show the message
+    show();
+}
+
+
+
+void InfoMessage::done(int r)
+{
+  if(!again->isChecked())                                              // if the box is not checked,
+    {                                                                  // store this to settings
+      settings->beginGroup("infoMessage");
+      settings->setValue("showInformation", false);
+      settings->endGroup();
+    };
+
+  QDialog::done(r);
+}
+
diff --git a/deal.II/contrib/parameter_gui/info_message.h b/deal.II/contrib/parameter_gui/info_message.h
new file mode 100644 (file)
index 0000000..03bf905
--- /dev/null
@@ -0,0 +1,84 @@
+
+#ifndef INFOMESSAGE_H
+#define INFOMESSAGE_H
+
+#include <QDialog>
+#include <QSettings>
+#include <QCheckBox>
+#include <QTextEdit>
+#include <QLabel>
+
+
+/**
+ * The InfoMessage class implements a special info message for the parameterGUI.
+ * Besides showing a info message itself, the dialog shows a checkbox "Show this message again".
+ * If the user unchecks this box, this is stored in the "settings.ini" file and will be reloaded
+ * the next time the user opens the parameterGUI. The intention of such a info message is the following.
+ * The user should have some information on how using the GUI "at hand"
+ * such as "how to edit parameter values?" for example. But after reading this message, the user knows it
+ * and the message should not appear permanently.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class InfoMessage : public QDialog
+{
+  Q_OBJECT
+
+  public:
+                                    /**
+                                     * Constructor
+                                     */
+    InfoMessage (QWidget *parent = 0);
+                                    /**
+                                     * With this function the <tt>message</tt> which will be shown in the
+                                     * dialog can be set.
+                                     */
+    void setInfoMessage(const QString &message);
+
+  public slots:
+                                    /**
+                                     * Show the dialog with the <tt>message</tt>.
+                                     */
+    void showMessage();
+
+  protected:
+                                    /**
+                                     * Reimplemented from QDialog.
+                                     */
+    void done(int r);
+
+  private:
+                                    /**
+                                     * This variable stores, if the <tt>message</tt> should be shown again the next time.
+                                     */
+    bool show_again;
+                                    /**
+                                     * The <tt>Ok</tt> button.
+                                     */
+    QPushButton * ok;
+                                    /**
+                                     * The checkbox<tt>Show this message again</tt>.
+                                     */
+    QCheckBox * again;
+                                    /**
+                                     * The <tt>message</tt> editor.
+                                     */
+    QTextEdit * message;
+                                    /**
+                                     * An <tt>icon</tt> for the dialog.
+                                     */
+    QLabel * icon;
+#ifdef QT_SOFTKEYS_ENABLED
+                                    /**
+                                     * A action for pressing the <tt>Ok</tt> button.
+                                     */
+    QAction *ok_action;
+#endif
+                                    /**
+                                     * An object for storing <tt>settings</tt> in a file.
+                                     */
+    QSettings * settings;
+};
+
+#endif
diff --git a/deal.II/contrib/parameter_gui/main.cpp b/deal.II/contrib/parameter_gui/main.cpp
new file mode 100644 (file)
index 0000000..7616c63
--- /dev/null
@@ -0,0 +1,40 @@
+
+#include <QApplication>
+#include <QSplashScreen>
+#include <QTimer>
+
+#include "mainwindow.h"
+
+
+/**
+ * Main function for the parameterGUI.
+ * The parameterGUI is a graphical user interface for editing parameter files based on the XML format,
+ * created by the ParameterHandler::print_parameters() function with ParameterHandler::XML as second argument.
+ *
+ *   @image html logo_dealii_gui.png
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+int main(int argc, char *argv[])
+{
+  Q_INIT_RESOURCE(application);                                        // init resources such as icons or graphics
+
+  QApplication app(argc, argv);
+
+  QSplashScreen * splash = new QSplashScreen;                  // setup a splash screen
+  splash->setPixmap(QPixmap("./images/logo_dealii_gui.png"));
+  splash->show();
+
+  QTimer::singleShot(3000, splash, SLOT(close()));             // and close it after 3000 ms
+
+  app.setApplicationName("parameterGUI for deal.II");          // setup the application name
+
+  MainWindow * main_win = new MainWindow (argv[1]);            // give command line arguments to main_win
+                                                               // if a parameter file is specified at the
+                                                               // command line, give it to the MainWindow.
+
+  QTimer::singleShot(1500, main_win, SLOT(show()));            // show the main window with a short delay
+                                                               // so we can see the splash screen
+  return app.exec();
+}
diff --git a/deal.II/contrib/parameter_gui/mainwindow.cpp b/deal.II/contrib/parameter_gui/mainwindow.cpp
new file mode 100644 (file)
index 0000000..789a937
--- /dev/null
@@ -0,0 +1,360 @@
+
+#include <QtGui>
+
+#include "mainwindow.h"
+
+
+MainWindow::MainWindow(const QString  &filename)
+{
+  QString  settings_file = QDir::currentPath() + "/settings.ini";      // a file for user settings
+
+  gui_settings = new QSettings (settings_file, QSettings::IniFormat);  // load settings
+                                                                       // Up to now, we do not read any settings,
+                                                                       // but this can be used in the future for customizing the GUI.
+
+  tree_widget = new QTreeWidget;                                       // tree for showing XML tags
+
+                                                                       // Setup the tree and the window first:
+  tree_widget->header()->setResizeMode(QHeaderView::ResizeToContents); // behavior of the header sections:
+                                                                       // "Interactive: User can resize sections"
+                                                                       // "Fixed: User cannot resize sections"
+                                                                       // "Stretch: Qt will automatically resize sections to fill available space"
+                                                                       // "ResizeToContents: Qt will automatically resize sections to optimal size"
+  tree_widget->setHeaderLabels(QStringList() << tr("(Sub)Sections/Parameters")
+                                             << tr("Value"));
+  tree_widget->setMouseTracking(true);                                 // enables mouse events e.g. showing ToolTips
+                                                                       // and documentation in the StatusLine
+  tree_widget->setEditTriggers(QAbstractItemView::DoubleClicked|
+                               QAbstractItemView::SelectedClicked|
+                               QAbstractItemView::EditKeyPressed);
+//                                QAbstractItemView::AnyKeyPressed);
+                                                                       // set which actions will initiate item editing: Editing starts when:
+                                                                       // DoubleClicked: an item is double clicked
+                                                                       // SelectedClicked: clicking on an already selected item
+                                                                       // EditKeyPressed: the platform edit key has been pressed over an item
+                                                                       // AnyKeyPressed: any key is pressed over an item
+
+  tree_widget->setItemDelegate(new ParameterDelegate(1));              // set the delegate for editing items
+  setCentralWidget(tree_widget);
+                                                                       // connect: if the tree changes, the window will know
+  connect(tree_widget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(tree_was_modified()));
+
+  create_actions();                                                    // create window actions as "Open",...
+  create_menus();                                                      // and menus
+  statusBar()->showMessage(tr("Ready, start editing by double-clicking or hitting F2!"));
+  setWindowTitle(tr("[*]parameterGUI"));                               // set window title
+
+  resize(800, 600);                                                    // set window height and width
+
+  if (filename.size() > 3)                                             // if there is a file_name, try to load the file.
+    load_file(filename);                                               // a vliad file has the xml extension, so we require size() > 3
+}
+
+
+
+void MainWindow::open()
+{
+  if (maybe_save())                                            // check, if the content was modified
+    {
+      QString  file_name =                                     // open a file dialog
+                 QFileDialog::getOpenFileName(this, tr("Open XML Parameter File"),
+                                              QDir::currentPath(),
+                                              tr("XML Files (*.xml)"));
+      if (!file_name.isEmpty())                                        // if a file was selected,
+        load_file(file_name);                                  // load the content
+    };
+}
+
+
+
+bool MainWindow::save()
+{
+  if (current_file.isEmpty())                                  // if there is no file
+    return save_as();                                          // to save changes, open a dialog
+  else
+    return save_file(current_file);                            // otherwise save
+}
+
+
+
+bool MainWindow::save_as()
+{
+  QString  file_name =                                         // open a file dialog
+             QFileDialog::getSaveFileName(this, tr("Save XML Parameter File"),
+                                          QDir::currentPath(),
+                                          tr("XML Files (*.xml)"));
+
+  if (file_name.isEmpty())                                     // if no file was selected
+    return false;                                              // return false
+  else
+    return save_file(file_name);                               // otherwise save content to file
+}
+
+
+
+void MainWindow::about()
+{
+#ifdef Q_WS_MAC
+    static QPointer<QMessageBox> old_msg_box;
+
+    if (old_msg_box) {
+        old_msg_box->show();
+        old_msg_box->raise();
+        old_msg_box->activateWindow();
+        return;
+    }
+#endif
+
+  QString title = "About parameterGUI";
+
+  QString trAboutparameterGUIcaption;
+  trAboutparameterGUIcaption = QMessageBox::tr(
+        "<h3>parameterGUI: A GraphicalUserInterface for parameter handling in deal.II</h3>"
+        "<p>This program uses Qt version %1.</p>"
+        ).arg(QLatin1String(QT_VERSION_STR));
+
+  QString trAboutparameterGUItext;
+  trAboutparameterGUItext = QMessageBox::tr(
+        "<p>The parameterGUI is a graphical user interface for editing XML parameter files "
+        "created by the ParameterHandler class of deal.II. Please see "
+        "<a href=\"http://www.dealii.org/6.3.1/doxygen/deal.II/classParameterHandler.html\">dealii.org/doc</a> for more information. "
+        "The parameterGUI parses XML files into a tree structure and provides "
+        " special editors for different types of parameters.</p>"
+
+        "<p><b>Editing parameter values:</b><br>"
+        "Parameters can be edited by (double-)clicking on the value or "
+        "by pressing the platform edit key (F2 on Linux) over an parameter item.</p>"
+
+        "<p><b>Editors for parameter values:</b>"
+        " <ul>"
+        "  <li>Integer- and Double-type parameters: SpinBox</li>"
+        "  <li>Booleans: ComboBox</li>"
+        "  <li>Selection: ComboBox</li>"
+        "  <li>File- and DirectoryName parameters: BrowseLineEditor</li>"
+        "  <li>Anything|MultipleSelection|List: LineEditor</li>"
+        " </ul>"
+        "</p>"
+
+        "<p>Please see <a href=\"http://www.dealii.org\">dealii.org</a> for more information</p>"
+        "<p><b>Authors:</b><br> "
+        "Martin Steigemann,  <a href=\"mailto:martin.steigemann@mathematik.uni-kassel.de\">martin.steigemann@mathematik.uni-kassel.de</a><br>"
+        "Wolfgang Bangerth,  <a href=\"mailto:bangerth@math.tamu.edu\">bangerth@math.tamu.edu</a></p>"
+        );
+
+  QMessageBox *msg_box = new QMessageBox;
+  msg_box->setAttribute(Qt::WA_DeleteOnClose);
+  msg_box->setWindowTitle(title);
+  msg_box->setText(trAboutparameterGUIcaption);
+  msg_box->setInformativeText(trAboutparameterGUItext);
+
+  QPixmap pm(QLatin1String("./images/logo_dealii_gui_128.png"));
+
+  if (!pm.isNull())
+    msg_box->setIconPixmap(pm);
+
+#ifdef Q_WS_MAC
+    old_msg_box = msg_box;
+    msg_box->show();
+#else
+    msg_box->exec();
+#endif
+}
+
+
+
+void MainWindow::tree_was_modified()
+{
+  setWindowModified(true);             // store, that the window was modified
+                                       // this is a function from the QMainWindow class
+                                       // and we use the windowModified mechanism to show a "*"
+                                       // in the window title, if content was modified
+}
+
+
+
+void MainWindow::show_message ()
+{
+  QString title = "parameterGUI";
+
+  info_message = new InfoMessage(this);
+
+  info_message->setWindowTitle(title);
+  info_message->setInfoMessage(tr("Start Editing by double-clicking on the parameter value or"
+                                  " by hitting the platform edit key. For example, on Linux this is the F2-key!"));
+  info_message->showMessage();
+}
+
+
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+  if (maybe_save())                    // reimplement the closeEvent from the QMainWindow class
+    event->accept();                   // check, if we have to save modified content,
+  else                                 // if content was saved, accept the event,
+    event->ignore();                   // otherwise ignore it
+}
+
+
+
+void MainWindow::create_actions()
+{
+  open_act = new QAction(tr("&Open..."), this);                        // create actions
+  open_act->setIcon(QIcon("./icons/fileopen.png"));            // and set icons
+  open_act->setShortcut(Qt::CTRL + Qt::Key_O);                 // set a short cut
+  open_act->setStatusTip(tr("Open a XML file"));               // set a status tip
+  connect(open_act, SIGNAL(triggered()), this, SLOT(open()));  // and connect
+
+  save_act = new QAction(tr("&Save ..."), this);
+  save_act->setIcon(QIcon("./icons/filesave.png"));
+  save_act->setShortcut(Qt::CTRL + Qt::Key_S);
+  save_act->setStatusTip(tr("Save the current XML file"));
+  connect(save_act, SIGNAL(triggered()), this, SLOT(save()));
+
+  save_as_act = new QAction(tr("&Save As..."), this);
+  save_as_act->setIcon(QIcon("./icons/filesaveas.png"));
+  save_as_act->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Q);
+  save_as_act->setStatusTip(tr("Save the current XML file as"));
+  connect(save_as_act, SIGNAL(triggered()), this, SLOT(save_as()));
+
+  exit_act = new QAction(tr("E&xit"), this);
+  exit_act->setIcon(QIcon("./icons/exit.png"));
+  exit_act->setShortcut(Qt::CTRL + Qt::Key_Q);
+  exit_act->setStatusTip(tr("Exit the parameterGUI application"));
+  connect(exit_act, SIGNAL(triggered()), this, SLOT(close()));
+
+  about_act = new QAction(tr("&About"), this);
+  about_act->setIcon(QIcon("./icons/idea.png"));
+  about_act->setStatusTip(tr("Show the parameterGUI About box"));
+  connect(about_act, SIGNAL(triggered()), this, SLOT(about()));
+
+  about_qt_act = new QAction(tr("About &Qt"), this);
+  about_qt_act->setStatusTip(tr("Show the Qt library's About box"));
+  connect(about_qt_act, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+}
+
+
+
+void MainWindow::create_menus()
+{
+    file_menu = menuBar()->addMenu(tr("&File"));               // create a file menu
+    file_menu->addAction(open_act);                            // and add actions
+    file_menu->addAction(save_act);
+    file_menu->addAction(save_as_act);
+    file_menu->addAction(exit_act);
+
+    menuBar()->addSeparator();
+
+    help_menu = menuBar()->addMenu(tr("&Help"));               // create a help menu
+    help_menu->addAction(about_act);
+    help_menu->addAction(about_qt_act);
+}
+
+
+
+bool MainWindow::maybe_save()
+{
+  if (isWindowModified())                                      // if content was modified
+    {
+      QMessageBox::StandardButton ret;                         // ask, if content should be saved
+      ret = QMessageBox::warning(this, tr("parameterGUI"),
+                                 tr("The content has been modified.\n"
+                                    "Do you want to save your changes?"),
+              QMessageBox::Save | QMessageBox::Discard |QMessageBox::Cancel);
+
+      if (ret == QMessageBox::Save)
+        return save();
+      else if (ret == QMessageBox::Cancel)
+        return false;
+    };
+
+  return true;
+}
+
+
+
+bool MainWindow::save_file(const QString &filename)
+{
+  QFile  file(filename);
+
+  if (!file.open(QFile::WriteOnly | QFile::Text))              // open a file dialog
+    {
+      QMessageBox::warning(this, tr("parameterGUI"),
+                                 tr("Cannot write file %1:\n%2.")
+                                 .arg(filename)
+                                 .arg(file.errorString()));
+      return false;
+    };
+
+  XMLParameterWriter  xml_writer(tree_widget);                 // create a xml_writer
+
+  if (!xml_writer.write_xml_file(&file))                       // and read the xml file
+    return false;
+
+  statusBar()->showMessage(tr("File saved"), 2000);            // if we succeed, show a message
+  set_current_file(filename);                                  // and reset the window
+
+  return true;
+}
+
+
+
+void MainWindow::load_file(const QString &filename)
+{
+  QFile  file(filename);
+
+  if (!file.open(QFile::ReadOnly | QFile::Text))               // open the file
+    {
+      QMessageBox::warning(this, tr("parameterGUI"),
+                                 tr("Cannot read file %1:\n%2.")
+                                 .arg(filename)
+                                 .arg(file.errorString()));
+      return;
+    };
+
+  tree_widget->clear();                                                // clear the tree
+
+  XMLParameterReader  xml_reader(tree_widget);                 // and read the xml file
+
+  if (!xml_reader.read_xml_file(&file))
+    {
+      QMessageBox::warning(this, tr("parameterGUI"),
+                                 tr("Parse error in file %1:\n\n%2")
+                                 .arg(filename)
+                                 .arg(xml_reader.error_string()));
+    }
+  else
+    {
+      statusBar()->showMessage(tr("File loaded - Start editing by double-clicking or hitting F2"), 25000);
+      set_current_file(filename);                              // show a message and set current file
+
+      show_message ();                                         // show some informations how values can be edited
+    };
+}
+
+
+
+void MainWindow::set_current_file(const QString  &filename)
+{
+                                               // We use the windowModified mechanism from the
+                                               // QMainWindow class to indicate in the window title,
+                                               // if the content was modified.
+                                               // If there is "[*]" in the window title, a * will
+                                               // added automatically at this position, if the
+                                               // window was modified.
+                                               // We set the window title to
+                                               // file_name[*] - XMLParameterHandler
+
+  current_file = filename;                                     // set the (global) current file to file_name
+
+  std::string win_title = (filename.toStdString());            // and create the window title,
+
+  if (current_file.isEmpty())                                  // if file_name is empty
+    win_title = "[*]parameterGUI";                             // set the title to our application name,
+  else
+    win_title += "[*] - parameterGUI";                         // if there is a file_name, add the
+                                                               // the file_name and a minus to the title
+
+  setWindowTitle(tr(win_title.c_str()));                       // set the window title
+  setWindowModified(false);                                    // and reset window modified
+}
+
diff --git a/deal.II/contrib/parameter_gui/mainwindow.h b/deal.II/contrib/parameter_gui/mainwindow.h
new file mode 100644 (file)
index 0000000..03dfde0
--- /dev/null
@@ -0,0 +1,157 @@
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QTreeWidget>
+#include <QDialog>
+#include <QSettings>
+
+#include "info_message.h"
+#include "parameter_delegate.h"
+#include "xml_parameter_reader.h"
+#include "xml_parameter_writer.h"
+
+/**
+ * The MainWindow class of the the parameterGUI.
+ * The parameterGUI is a graphical user interface for editing parameter files based on the XML format,
+ * created by the ParameterHandler::print_parameters() function with ParameterHandler::XML as second argument.
+ * Please see @ref Representation of Parameters in the documentation of the @ref ParameterHandler class for more details.
+ * The MainWindow class provides the basic functionality of the GUI as save- and load-file-actions and documentation.
+ * The parameterGUI provides special editors for the different types of parameters defined in the ParameterHandler class.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class MainWindow : public QMainWindow
+{
+  Q_OBJECT
+
+  public:
+                                    /**
+                                     * Constructor.
+                                     * If a <tt>filename</tt> is given,
+                                     * the MainWindow tries to open
+                                     * and parse the file.
+                                     */
+    MainWindow(const QString  &filename = "");
+
+  protected:
+                                    /**
+                                     * Reimplemented from QMainWindow.
+                                     * We ask, if changes should be saved.
+                                     */
+    void closeEvent(QCloseEvent *event);
+
+  private slots:
+
+                                    /**
+                                     * Open a parameter file.
+                                     */
+    void open();
+                                    /**
+                                     * Save the parameter file.
+                                     */
+    bool save();
+                                    /**
+                                     * Open a file dialog to save the parameter file.
+                                     */
+    bool save_as();
+                                    /**
+                                     * Show some information on the parameterGUI
+                                     */
+    void about();
+
+                                    /**
+                                     * A <tt>slot</tt> that should be always called,
+                                     * if parameter values were changed.
+                                     */
+    void tree_was_modified();
+
+  private:
+                                    /**
+                                     * Show an information dialog, how
+                                     * parameters can be edited.
+                                     */
+    void show_message ();
+                                    /**
+                                     * This function creates all actions.
+                                     */
+    void create_actions();
+                                    /**
+                                     * This function creates all menus.
+                                     */
+    void create_menus();
+                                    /**
+                                     * This function checks, if parameters were changed
+                                     * and show a dialog, if changes should be saved.
+                                     * This function should be always called,
+                                     * before open a new parameter file or before closing the GUI
+                                     */
+    bool maybe_save ();
+                                    /**
+                                     * Save parameters to <tt>filename</tt> in XML format.
+                                     */
+    bool save_file (const QString &filename);
+                                    /**
+                                     * Load parameters from <tt>filename</tt> in XML format.
+                                     */
+    void load_file (const QString &filename);
+                                    /**
+                                     * This functions writes the current <tt>filename</tt> to the window title.
+                                     */
+    void set_current_file (const QString  &filename);
+                                    /**
+                                     * This is the tree structure in which we store all parameters.
+                                     */
+    QTreeWidget * tree_widget;
+                                    /**
+                                     * This menu provides all file actions as <tt>open</tt>, <tt>save</tt>, <tt>save as</tt>
+                                     * and <tt>exit</tt>
+                                     */
+    QMenu * file_menu;
+                                    /**
+                                     * This menu provides some informations <tt>about</tt> the parameterGUI
+                                     * and <tt>about Qt</tt>
+                                     */
+    QMenu * help_menu;
+                                    /**
+                                     * QAction <tt>open</tt> a file.
+                                     */
+    QAction * open_act;
+                                    /**
+                                     * QAction <tt>save</tt> a file.
+                                     */
+    QAction * save_act;
+                                    /**
+                                     * QAction <tt>save as</tt> a file.
+                                     */
+    QAction * save_as_act;
+                                    /**
+                                     * QAction <tt>exit</tt> the GUI.
+                                     */
+    QAction * exit_act;
+                                    /**
+                                     * QAction <tt>about</tt> the parameterGUI.
+                                     */
+    QAction * about_act;
+                                    /**
+                                     * QAction <tt>about</tt> Qt.
+                                     */
+    QAction * about_qt_act;
+                                    /**
+                                     * This value stores the current <tt>filename</tt> we work on.
+                                     */
+    QString  current_file;
+                                    /**
+                                     * This dialog shows a short information message after loading a file.
+                                     */
+    InfoMessage * info_message;
+                                    /**
+                                     * An object for storing user settings.
+                                     */
+    QSettings * gui_settings;
+};
+
+
+#endif
diff --git a/deal.II/contrib/parameter_gui/parameter_delegate.cpp b/deal.II/contrib/parameter_gui/parameter_delegate.cpp
new file mode 100644 (file)
index 0000000..6530425
--- /dev/null
@@ -0,0 +1,287 @@
+
+#include <QtGui>
+
+#include "parameter_delegate.h"
+
+
+ParameterDelegate::ParameterDelegate(const int value_column, QObject *parent)
+                 : QItemDelegate(parent)
+{
+  this->value_column = value_column;
+
+  double_steps    = 0.1;               // any click in the editor will increase or decrease the value about double_steps
+  double_decimals = 14;                        // number of decimals shown in the editor
+
+  int_steps = 1;                       // step value for increasing or decrasing integers
+}
+
+
+
+QSize ParameterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+  if (index.column() == value_column)
+    {
+      return QSize(400,30);            // we increase the height of all lines to show editors
+
+/*
+      QString pattern_description = index.data(Qt::StatusTipRole).toString();  // load pattern description
+                                                                               // stored in the StatusLine
+      QRegExp  rx_string("\\b(FileName|DirectoryName)\\b");
+
+      if (rx_string.indexIn (pattern_description) != -1)
+        {
+          return QSize(400,35);                                        // we increase the height for FileName and
+        }                                                      // DirectoryName to show a "browse" button
+      else
+        return QItemDelegate::sizeHint(option, index);
+*/
+
+    }
+  else
+    return QItemDelegate::sizeHint(option, index);
+}
+
+
+
+void ParameterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+  if (index.column() == value_column)
+    {
+      QString pattern_description = index.data(Qt::StatusTipRole).toString();          // load pattern description
+                                                                                       // stored in the StatusLine
+      QRegExp  rx_string("\\b(FileName|DirectoryName)\\b");                            // if the type is Filename
+                                                                                       // or DirectoryName
+      if (rx_string.indexIn (pattern_description) != -1)
+        {
+          QString value = index.model()->data(index, Qt::DisplayRole).toString();      // take the value
+
+          QStyleOptionViewItem my_option = option;                                     // load options
+          my_option.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
+
+          drawDisplay(painter, my_option, my_option.rect, value);                      // print the text in the display
+          drawFocus(painter, my_option, my_option.rect);                               // if the line has the
+                                                                                       // focus, print a rectangle
+        }
+      else
+        QItemDelegate::paint(painter, option, index);                                  // for all other types use
+                                                                                       // the standard delegate
+    }
+  else
+    QItemDelegate::paint(painter, option, index);
+}
+
+
+
+QWidget *ParameterDelegate::createEditor(QWidget *parent,
+                                         const QStyleOptionViewItem &option,
+                                         const QModelIndex &index) const
+{
+  if (index.column() == value_column)
+    {
+      QString pattern_description = index.data(Qt::StatusTipRole).toString();  // load pattern description
+                                                                               // stored in the StatusLine
+      QRegExp  rx_string("\\b(Anything|MultipleSelection|List)\\b"),
+               rx_filename("\\b(FileName)\\b"),        
+               rx_dirname("\\b(DirectoryName)\\b"),    
+               rx_integer("\\b(Integer)\\b"),
+               rx_double("\\b(Double|Float|Floating)\\b"),
+               rx_selection("\\b(Selection)\\b");
+
+      if (rx_string.indexIn (pattern_description) != -1)               // if the type "Anything"
+        {
+          QLineEdit * line_editor = new QLineEdit(parent);             // choose a LineEditor
+
+          connect(line_editor, SIGNAL(editingFinished()),              // connect editors signal 
+                  this, SLOT(commit_and_close_editor()));              // to the closer function
+
+          return line_editor;
+        }
+      else if (rx_filename.indexIn (pattern_description) != -1)                // if the type "FileName"
+        {
+          BrowseLineEdit * filename_editor                             // choose a BrowseLineEditor
+                             = new BrowseLineEdit(BrowseLineEdit::file, parent);
+
+          connect(filename_editor, SIGNAL(editingFinished()),
+                  this, SLOT(commit_and_close_editor()));
+
+          return filename_editor;
+        }
+      else if (rx_dirname.indexIn (pattern_description) != -1)         // if the type "DirectoryName"
+        {
+          BrowseLineEdit * dirname_editor                              // choose a BrowseLineEditor
+                             = new BrowseLineEdit(BrowseLineEdit::directory, parent);
+
+          connect(dirname_editor, SIGNAL(editingFinished()),
+                  this, SLOT(commit_and_close_editor()));
+
+          return dirname_editor;
+        }
+      else if (rx_integer.indexIn (pattern_description) != -1)         // if the tpye is "Integer"
+        {
+          QSpinBox * spin_box = new QSpinBox(parent);                  // choose a spin box
+
+          const int min_int_value = std::numeric_limits<int>::min();
+          const int max_int_value = std::numeric_limits<int>::max();
+
+          spin_box->setMaximum(max_int_value);                         // set max and min from the limits.h class
+          spin_box->setMinimum(min_int_value);
+          spin_box->setSingleStep(int_steps);                          // and every klick is a SingleStep
+
+          connect(spin_box, SIGNAL(editingFinished()),                 // connect editors signal to the closer function
+                  this, SLOT(commit_and_close_editor()));
+
+          return spin_box;
+        }
+      else if (rx_double.indexIn (pattern_description) != -1)          // the same with "Double"
+        {
+          QDoubleSpinBox * double_spin_box = new QDoubleSpinBox(parent);       // choose a spin box
+
+          const double min_double_value = -std::numeric_limits<double>::max();
+          const double max_double_value =  std::numeric_limits<double>::max();
+
+          double_spin_box->setMaximum(max_double_value);               // set max and min from the limits.h class
+          double_spin_box->setMinimum(min_double_value);
+          double_spin_box->setDecimals(double_decimals);               // show "double_decimals" decimals
+          double_spin_box->setSingleStep(double_steps);                        // and every klick is a SingleStep
+
+          connect(double_spin_box, SIGNAL(editingFinished()),          // connect editors signal to the closer function
+                  this, SLOT(commit_and_close_editor()));
+
+          return double_spin_box;
+        }
+      else if (rx_selection.indexIn (pattern_description) != -1)       // and selections
+        {
+          QComboBox * combo_box = new QComboBox(parent);               // we assume, that pattern_desctiption is of the form
+                                                                       // "Type: [Selection item1|item2| ....|item ]    "
+          std::vector<std::string> choices;                            // list with the different items
+          std::string  tmp(pattern_description.toStdString());
+
+          if (tmp.find("[") != std::string::npos)                      // delete all char before [
+            tmp.erase (0, tmp.find("[")+1);
+
+          if (tmp.find("]") != std::string::npos)                      // delete all char after ]
+            tmp.erase (tmp.find("]"),tmp.length());
+
+          if (tmp.find(" ") != std::string::npos)                      // delete all char before " "
+            tmp.erase (0, tmp.find(" ")+1);
+
+          while (tmp.find('|') != std::string::npos)                   // extract items
+            {
+              choices.push_back(std::string(tmp, 0, tmp.find('|')));
+              tmp.erase (0, tmp.find('|')+1);
+            };
+
+          if (tmp.find(" ") != std::string::npos)                      // delete " "
+            tmp.erase (tmp.find(" "));
+
+          choices.push_back(tmp);                                      // add last item
+
+          for (unsigned int i=0; i<choices.size(); ++i)                        // add items to the combo box
+            combo_box->addItem (tr(choices[i].c_str()), tr(choices[i].c_str()));
+
+          combo_box->setEditable(false);
+
+          connect(combo_box, SIGNAL(currentIndexChanged(int)),         // connect editors signal to the closer function
+                  this, SLOT(commit_and_close_editor()));
+
+          return combo_box;
+        }
+      else
+        {
+          return QItemDelegate::createEditor(parent, option, index);
+        };
+    };
+
+  return 0;                    // if it is not the column "parameter values", do nothing
+}
+
+
+
+void ParameterDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+  if (index.column() == value_column)
+    {
+      QString pattern_description = index.data(Qt::StatusTipRole).toString();          // load pattern description
+                                                                                       // stored in the StatusLine
+      QRegExp  rx_filename("\\b(FileName)\\b"),
+               rx_dirname("\\b(DirectoryName)\\b"),
+               rx_selection("\\b(Selection)\\b");
+
+      if (rx_filename.indexIn (pattern_description) != -1)                             // if the type is "FileName"
+        {
+          QString  file_name = index.data(Qt::DisplayRole).toString();
+
+          BrowseLineEdit *filename_editor = qobject_cast<BrowseLineEdit *>(editor);    // set the text of the editor
+          filename_editor->setText(file_name);
+        }
+      else if (rx_dirname.indexIn (pattern_description) != -1)                         // if the type is "DirectoryName"
+        {
+          QString  dir_name = index.data(Qt::DisplayRole).toString();
+
+          BrowseLineEdit *dirname_editor = qobject_cast<BrowseLineEdit *>(editor);     // set the text of the editor
+          dirname_editor->setText(dir_name);
+        }
+      else if (rx_selection.indexIn (pattern_description) != -1)                       // if we have a combo box,
+        {
+          QRegExp  rx(index.data(Qt::DisplayRole).toString());
+
+          QComboBox * combo_box = qobject_cast<QComboBox *>(editor);
+
+          for (unsigned int i=0; i<combo_box->count(); ++i)            // we look, which index
+            if (rx.exactMatch(combo_box->itemText(i)))                 // the data has and set
+              combo_box->setCurrentIndex(i);                           // it to the combo_box
+        }
+      else
+        QItemDelegate::setEditorData(editor, index);                   // if it is not FileName,
+                                                                       // DirectoryName or Selection
+                                                                       // use the standard delegate
+    };
+}
+
+
+
+void ParameterDelegate::commit_and_close_editor()
+{
+  QWidget * editor = qobject_cast<QWidget *>(sender());
+  emit commitData(editor);
+  emit closeEditor(editor);
+}
+
+
+
+void ParameterDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
+                                     const QModelIndex &index) const
+{
+  if (index.column() == value_column)
+    {
+      QString pattern_description = index.data(Qt::StatusTipRole).toString();          // load pattern description
+                                                                                       // stored in the StatusLine
+
+      QRegExp  rx_filename("\\b(FileName)\\b"),
+               rx_dirname("\\b(DirectoryName)\\b"),
+               rx_selection("\\b(Selection)\\b");
+
+      if (rx_filename.indexIn (pattern_description) != -1)                             // if the type is "FileName"
+        {
+          BrowseLineEdit * filename_editor = qobject_cast<BrowseLineEdit *>(editor);   // set the text from the editor
+          QString value = filename_editor->text();
+          model->setData(index, value);
+        }
+      else if (rx_dirname.indexIn (pattern_description) != -1)                         // if the type is "DirectoryName"
+        {
+          BrowseLineEdit * dirname_editor = qobject_cast<BrowseLineEdit *>(editor);    // set the text from the editor
+          QString value = dirname_editor->text();
+          model->setData(index, value);
+        }
+      else if (rx_selection.indexIn (pattern_description) != -1)                       // if the type is "Selection"
+        {
+          QComboBox * combo_box = qobject_cast<QComboBox *>(editor);                   // set the text from the editor
+          QString value = combo_box->currentText();
+          model->setData(index, value);
+        }
+      else
+        QItemDelegate::setModelData(editor, model, index);                             // if it is not FileName or DirectoryName,
+                                                                                       // use the standard delegate
+    };
+}
+
diff --git a/deal.II/contrib/parameter_gui/parameter_delegate.h b/deal.II/contrib/parameter_gui/parameter_delegate.h
new file mode 100644 (file)
index 0000000..654dca4
--- /dev/null
@@ -0,0 +1,96 @@
+
+#ifndef PARAMETERDELEGATE_H
+#define PARAMETERDELEGATE_H
+
+#include <QItemDelegate>
+#include <QModelIndex>
+#include <QObject>
+#include <QLineEdit>
+#include <QComboBox>
+#include <QFileDialog>
+
+#include <limits>
+#include <algorithm>
+
+#include "browse_lineedit.h"
+
+
+/**
+ * The ParameterDelegate class implements special delegates for the QTreeWidget class used in the parameterGUI.
+ * The QTreeWidget class provides some different standard delegates for editing parameters shown in the
+ * tree structure. The ParameterDelegate class provides special editors for the different types of parameters defined in
+ * the ParameterHandler class. For all parameter types based on strings as "Anything", "MultipleSelection" and
+ * "List" a simple line editor will be shown up. In the case of integer and double type parameters the editor is a spin box and for
+ * "Selection" type parameters a combo box will be shown up. For parameters of type "FileName" and "DirectoryName"
+ * the delegate shows a @ref BrowseLineEdit editor. The column of the tree structure with the parameter values has to be set
+ * in the constructor.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class ParameterDelegate : public QItemDelegate
+{
+  Q_OBJECT
+
+  public:
+                                    /**
+                                     * Constructor, the <tt>value_column</tt> specifies the column
+                                     * of the parameter tree this delegate will be used on.
+                                     */
+    ParameterDelegate (const int value_column, QObject *parent = 0);
+                                    /**
+                                     * This function creates the appropriate editor for the parameter
+                                     * based on the <tt>index</tt>.
+                                     */
+    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option,
+                           const QModelIndex &index) const;
+                                    /**
+                                     * Reimplemented from QItemDelegate.
+                                     */
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
+                                    /**
+                                     * Reimplemented from QItemDelegate.
+                                     */
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+                                    /**
+                                     * Reimplemented from QItemDelegate.
+                                     */
+    void setEditorData(QWidget *editor, const QModelIndex &index) const;
+                                    /**
+                                     * Reimplemented from QItemDelegate.
+                                     */
+    void setModelData(QWidget *editor, QAbstractItemModel *model,
+                      const QModelIndex &index) const;
+
+  private slots:
+                                    /**
+                                     * Reimplemented from QItemDelegate.
+                                     */
+    void commit_and_close_editor();
+
+  private:
+                                    /**
+                                     * The column this delegate will be used on.
+                                     */
+    int value_column;
+                                    /**
+                                     * For parameters of type <tt>double</tt> a spin box
+                                     * will be shown as editor. Any click on the spin box
+                                     * will change the value about <tt>double_steps</tt>.
+                                     */
+    double  double_steps;
+                                    /**
+                                     * For parameters of type <tt>integer</tt> a spin box
+                                     * will be shown as editor. Any click on the spin box
+                                     * will change the value about <tt>int_steps</tt>.
+                                     */
+    unsigned int  int_steps;
+                                    /**
+                                     * For parameters of type <tt>double</tt> a spin box
+                                     * will be shown as editor. The spin box will show
+                                     * parameters with a precision of <tt>double_decimals</tt>.
+                                     */
+    unsigned int  double_decimals;
+};
+
+#endif
diff --git a/deal.II/contrib/parameter_gui/parameters.xml b/deal.II/contrib/parameter_gui/parameters.xml
new file mode 100644 (file)
index 0000000..fa4ff1c
--- /dev/null
@@ -0,0 +1,502 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ParameterHandler>
+    <BasicControl>
+        <Equation>
+            <value>Elasticity</value>
+            <default_value>Elasticity</default_value>
+            <documentation>Basic equation to solve</documentation>
+            <pattern>0</pattern>
+            <pattern_description>[Anything]</pattern_description>
+        </Equation>
+        <Domain>
+            <value>CtsSpecimen</value>
+            <default_value>Specimen</default_value>
+            <documentation>Domain</documentation>
+            <pattern>1</pattern>
+            <pattern_description>[Selection CtSpecimen|CtsSpecimen|SENBeam ]</pattern_description>
+        </Domain>
+        <AsymptoticOrder>
+            <value>2</value>
+            <default_value>2</default_value>
+            <documentation>Use this number of terms in asymptotic decompositions</documentation>
+            <pattern>2</pattern>
+            <pattern_description>[Selection 2|3|5 ]</pattern_description>
+        </AsymptoticOrder>
+        <OutputGrids>
+            <value>false</value>
+            <default_value>false</default_value>
+            <documentation>Output grids in eps format</documentation>
+            <pattern>3</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </OutputGrids>
+    </BasicControl>
+    <MaterialProperties>
+        <Material>
+            <value>AluminiumAlloy7075T651</value>
+            <default_value>AluminiumAlloy7075T651</default_value>
+            <documentation>Description of the material: MaterialName|ReadMaterial</documentation>
+            <pattern>4</pattern>
+            <pattern_description>[Selection AluminiumAlloy7075T651|PlexiGlas|SuperAlloyPWA14801493|SihParisIrwinMaterialOne|SihParisIrwinMaterialTwo|CorticalBone|Beton|TestMaterial|ReadMaterial ]</pattern_description>
+        </Material>
+        <MaterialType>
+            <value>Homogeneous</value>
+            <default_value>Homogeneous</default_value>
+            <documentation>Type of material: Homogeneous|Composite|FGM</documentation>
+            <pattern>5</pattern>
+            <pattern_description>[Selection Homogeneous|Composite|FGM ]</pattern_description>
+        </MaterialType>
+        <MaterialAngle>
+            <value>0</value>
+            <default_value>0.</default_value>
+            <documentation>Material angle with respect to the basic coordinate system</documentation>
+            <pattern>6</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </MaterialAngle>
+        <PlaneState>
+            <value>plane_strain</value>
+            <default_value>plain_strain</default_value>
+            <documentation>Plane state: plane_strain|plane_stress</documentation>
+            <pattern>7</pattern>
+            <pattern_description>[Selection plane_strain|plain_stress ]</pattern_description>
+        </PlaneState>
+        <ScaleElasticModuli>
+            <value>false</value>
+            <default_value>false</default_value>
+            <documentation>Scale elastic moduli to a11 = 1 and a22 = 1</documentation>
+            <pattern>8</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </ScaleElasticModuli>
+        <ReadMaterial>
+            <Description>
+                <value>TestMaterialProperties</value>
+                <default_value>ReadedMaterialProperties</default_value>
+                <documentation>Description of ReadMaterial</documentation>
+                <pattern>9</pattern>
+                <pattern_description>[Anything]</pattern_description>
+            </Description>
+            <a11>
+                <value>108752.2388</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>10</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a11>
+            <a21>
+                <value>56023.8806</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>11</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a21>
+            <a22>
+                <value>108752.2388</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>12</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a22>
+            <a31>
+                <value>0</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>13</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a31>
+            <a32>
+                <value>0</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>14</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a32>
+            <a33>
+                <value>26364.1791</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>15</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </a33>
+        </ReadMaterial>
+        <InhomogeneousMaterialProperties>
+            <MaterialTwo>
+                <value>AluminiumAlloy7075T651</value>
+                <default_value>AluminiumAlloy7075T651</default_value>
+                <documentation>Description of the material: MaterialName|ReadMaterial</documentation>
+                <pattern>16</pattern>
+                <pattern_description>[Selection AluminiumAlloy7075T651|PlexiGlas|SuperAlloyPWA14801493|SihParisIrwinMaterialOne|SihParisIrwinMaterialTwo|CorticalBone|Beton|TestMaterial|ReadMaterial ]</pattern_description>
+            </MaterialTwo>
+            <b11>
+                <value>108752.2388</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>17</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b11>
+            <b21>
+                <value>56023.8806</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>18</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b21>
+            <b22>
+                <value>108752.2388</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>19</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b22>
+            <b31>
+                <value>0</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>20</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b31>
+            <b32>
+                <value>0</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>21</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b32>
+            <b33>
+                <value>26364.1791</value>
+                <default_value>1.</default_value>
+                <documentation>Elastic constant</documentation>
+                <pattern>22</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </b33>
+            <beta>
+                <value>0</value>
+                <default_value>0.</default_value>
+                <documentation>Material angle with respect to the basic coordinate system</documentation>
+                <pattern>23</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </beta>
+            <delta>
+                <value>0.5</value>
+                <default_value>0.</default_value>
+                <documentation>Perturbation parameter</documentation>
+                <pattern>24</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </delta>
+        </InhomogeneousMaterialProperties>
+    </MaterialProperties>
+    <Forces>
+        <F>
+            <value>10000</value>
+            <default_value>4500</default_value>
+            <documentation>Applied force value in Newton</documentation>
+            <pattern>25</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </F>
+        <angle>
+            <value>0</value>
+            <default_value>0</default_value>
+            <documentation>If the specimen allows different forces, this parameter can be used to control them</documentation>
+            <pattern>26</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </angle>
+    </Forces>
+    <FractureCriteria>
+        <Criterion>
+            <value>da/dN-curve</value>
+            <default_value>da/dN-curve</default_value>
+            <documentation></documentation>
+            <pattern>27</pattern>
+            <pattern_description>[Selection da/dN-curve|Paris-law|Forman-Mettu-equation ]</pattern_description>
+        </Criterion>
+        <da_2fdN_2dcurve>
+            <K1Th>
+                <value>104.25</value>
+                <default_value>100</default_value>
+                <documentation></documentation>
+                <pattern>28</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </K1Th>
+            <K1C>
+                <value>972</value>
+                <default_value>1000</default_value>
+                <documentation></documentation>
+                <pattern>29</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </K1C>
+            <R>
+                <value>0.1</value>
+                <default_value>0.1</default_value>
+                <documentation></documentation>
+                <pattern>30</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </R>
+            <alpha>
+                <value>3</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>31</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </alpha>
+        </da_2fdN_2dcurve>
+        <Paris_2dlaw>
+            <C>
+                <value>2.12e-11</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>32</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </C>
+            <m>
+                <value>2.1</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>33</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </m>
+        </Paris_2dlaw>
+        <Forman_2dMettu_2dequation>
+            <C>
+                <value>2.12e-11</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>34</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </C>
+            <n>
+                <value>2.885</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>35</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </n>
+            <p>
+                <value>0.5</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>36</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </p>
+            <q>
+                <value>1</value>
+                <default_value>1</default_value>
+                <documentation></documentation>
+                <pattern>37</pattern>
+                <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+            </q>
+        </Forman_2dMettu_2dequation>
+    </FractureCriteria>
+    <MeshRefinement>
+        <MeshSize>
+            <value>2</value>
+            <default_value>1.</default_value>
+            <documentation></documentation>
+            <pattern>38</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </MeshSize>
+        <RefinementCycles>
+            <value>1</value>
+            <default_value>2</default_value>
+            <documentation></documentation>
+            <pattern>39</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </RefinementCycles>
+        <KinkLength>
+            <value>0.5</value>
+            <default_value>1</default_value>
+            <documentation></documentation>
+            <pattern>40</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </KinkLength>
+        <SupportDiameter>
+            <value>0.25</value>
+            <default_value>0.25</default_value>
+            <documentation></documentation>
+            <pattern>41</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </SupportDiameter>
+    </MeshRefinement>
+    <MatrixM>
+        <RadiusR>
+            <value>250</value>
+            <default_value>100</default_value>
+            <documentation></documentation>
+            <pattern>42</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </RadiusR>
+        <KinkAngleMax>
+            <value>110</value>
+            <default_value>110.</default_value>
+            <documentation></documentation>
+            <pattern>43</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </KinkAngleMax>
+        <KinkAngleMin>
+            <value>-110</value>
+            <default_value>-110.</default_value>
+            <documentation></documentation>
+            <pattern>44</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </KinkAngleMin>
+        <MaterialAngleMax>
+            <value>180</value>
+            <default_value>180.</default_value>
+            <documentation></documentation>
+            <pattern>45</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </MaterialAngleMax>
+        <MaterialAngleMin>
+            <value>-180</value>
+            <default_value>-180.</default_value>
+            <documentation></documentation>
+            <pattern>46</pattern>
+            <pattern_description>[Double -1.79769e+308...1.79769e+308 (inclusive)]</pattern_description>
+        </MaterialAngleMin>
+        <StepsKinkAngle>
+            <value>22</value>
+            <default_value>22</default_value>
+            <documentation></documentation>
+            <pattern>47</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </StepsKinkAngle>
+        <StepsMaterialAngle>
+            <value>36</value>
+            <default_value>36</default_value>
+            <documentation></documentation>
+            <pattern>48</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </StepsMaterialAngle>
+        <ComputeMatrixM>
+            <value>false</value>
+            <default_value>false</default_value>
+            <documentation></documentation>
+            <pattern>49</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </ComputeMatrixM>
+        <OutputMatrixM>
+            <value>false</value>
+            <default_value>false</default_value>
+            <documentation></documentation>
+            <pattern>50</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </OutputMatrixM>
+        <FEDegree>
+            <value>1</value>
+            <default_value>1</default_value>
+            <documentation></documentation>
+            <pattern>51</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </FEDegree>
+        <MaxRefCycles>
+            <value>25</value>
+            <default_value>10</default_value>
+            <documentation></documentation>
+            <pattern>52</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </MaxRefCycles>
+        <MultiGrid>
+            <value>true</value>
+            <default_value>true</default_value>
+            <documentation></documentation>
+            <pattern>53</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </MultiGrid>
+        <OutputGrids>
+            <value>false</value>
+            <default_value>false</default_value>
+            <documentation></documentation>
+            <pattern>54</pattern>
+            <pattern_description>[Selection true|false ]</pattern_description>
+        </OutputGrids>
+    </MatrixM>
+    <RungeKuttaMethod>
+        <k>
+            <value>250000</value>
+            <default_value>10000</default_value>
+            <documentation></documentation>
+            <pattern>55</pattern>
+            <pattern_description>[Integer range -2147483648...2147483647 (inclusive)]</pattern_description>
+        </k>
+    </RungeKuttaMethod>
+    <Input>
+        <Files>
+            <Mesh_5fdata_5ffile>
+                <value>/home/masteige/projects/mcrack2d/projects/test/meshes/mesh.ucd</value>
+                <default_value>/home/masteige/mcrack2d/projects/mesh.ucd</default_value>
+                <documentation></documentation>
+                <pattern>56</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </Mesh_5fdata_5ffile>
+            <Crack_5fpath_5fdata_5ffile>
+                <value>/home/masteige/projects/mcrack2d/projects/test/crack_path.data</value>
+                <default_value>/home/masteige/mcrack2d/projects/crack_path.data</default_value>
+                <documentation></documentation>
+                <pattern>57</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </Crack_5fpath_5fdata_5ffile>
+            <Matrix_5fM_5fdata_5ffile>
+                <value>/home/masteige/projects/mcrack2d/projects/test/matrix_M.data</value>
+                <default_value>/home/masteige/mcrack2d/projects/Matrix_M.data</default_value>
+                <documentation></documentation>
+                <pattern>58</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </Matrix_5fM_5fdata_5ffile>
+            <da_5fdN_5fcurve_5fdata_5ffile>
+                <value>/home/masteige/projects/mcrack2d/projects/test/da_dN_curve.data</value>
+                <default_value>/home/masteige/mcrack2d/projects/da_dN_curve.data</default_value>
+                <documentation></documentation>
+                <pattern>59</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </da_5fdN_5fcurve_5fdata_5ffile>
+            <Results_5ffile>
+                <value>/home/masteige/projects/mcrack2d/projects/test/results.data</value>
+                <default_value>/home/masteige/mcrack2d/projects/results.data</default_value>
+                <documentation></documentation>
+                <pattern>60</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </Results_5ffile>
+            <Python_5finput_5ffile>
+                <value>/home/masteige/projects/mcrack2d/scripts/extract_mesh.py</value>
+                <default_value>/home/masteige/mcrack2d/scripts/extract_mesh.py</default_value>
+                <documentation></documentation>
+                <pattern>61</pattern>
+                <pattern_description>[FileName (Type: input)]</pattern_description>
+            </Python_5finput_5ffile>
+        </Files>
+        <Directories>
+            <Material_5fdir>
+                <value>/home/masteige/projects/mcrack2d/material/</value>
+                <default_value>/home/masteige/mcrack2d/materials</default_value>
+                <documentation></documentation>
+                <pattern>62</pattern>
+                <pattern_description>[DirectoryName]</pattern_description>
+            </Material_5fdir>
+            <Project_5fdir>
+                <value>/home/masteige/projects/mcrack2d/projects/test/</value>
+                <default_value>/home/masteige/mcrack2d/projects</default_value>
+                <documentation></documentation>
+                <pattern>63</pattern>
+                <pattern_description>[DirectoryName]</pattern_description>
+            </Project_5fdir>
+            <Graphics_5fdir>
+                <value>/home/masteige/projects/mcrack2d/projects/test/graphics/</value>
+                <default_value>/home/masteige/mcrack2d/projects/graphics</default_value>
+                <documentation></documentation>
+                <pattern>64</pattern>
+                <pattern_description>[DirectoryName]</pattern_description>
+            </Graphics_5fdir>
+            <Meshes_5fdir>
+                <value>/home/masteige/projects/mcrack2d/projects/test/meshes/</value>
+                <default_value>/home/masteige/mcrack2d/projects/meshes</default_value>
+                <documentation></documentation>
+                <pattern>65</pattern>
+                <pattern_description>[DirectoryName]</pattern_description>
+            </Meshes_5fdir>
+            <Results_5fdir>
+                <value>/home/masteige/projects/mcrack2d/projects/test/results/</value>
+                <default_value>/home/masteige/mcrack2d/projects/results</default_value>
+                <documentation></documentation>
+                <pattern>66</pattern>
+                <pattern_description>[DirectoryName]</pattern_description>
+            </Results_5fdir>
+        </Directories>
+    </Input>
+</ParameterHandler>
diff --git a/deal.II/contrib/parameter_gui/xml_parameter_reader.cpp b/deal.II/contrib/parameter_gui/xml_parameter_reader.cpp
new file mode 100644 (file)
index 0000000..7973c7b
--- /dev/null
@@ -0,0 +1,347 @@
+
+#include <QtGui>
+
+#include "xml_parameter_reader.h"
+
+
+XMLParameterReader::XMLParameterReader(QTreeWidget *tree_widget)
+                  : tree_widget(tree_widget)
+{
+  QStyle * style = tree_widget->style();
+
+  subsection_icon.addPixmap(style->standardPixmap(QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off);
+  subsection_icon.addPixmap(style->standardPixmap(QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On);
+
+  parameter_icon.addPixmap(style->standardPixmap(QStyle::SP_FileIcon));
+}
+
+
+
+bool XMLParameterReader::read_xml_file(QIODevice *device)
+{
+  xml.setDevice(device);
+
+               // We look for a StartElement "ParameterHandler"
+               // and start parsing after this.
+               //  <ParameterHandler>
+               //   <subsection>
+               //    ...
+               //   </subsection>
+               //  </ParameterHandler>
+
+  while (xml.readNext() != QXmlStreamReader::Invalid)
+    {
+      if (xml.isStartElement())
+        if (xml.name() == "ParameterHandler")
+          {
+            parse_parameters();
+
+            return !xml.error();;
+          };
+    };
+
+  xml.raiseError(QObject::tr("The file is not an ParameterHandler XML file."));
+
+  return !xml.error();
+}
+
+
+
+QString XMLParameterReader::error_string() const
+{
+  return QObject::tr("%1\nLine %2, column %3")
+         .arg(xml.errorString())
+         .arg(xml.lineNumber())
+         .arg(xml.columnNumber());
+}
+
+
+
+void XMLParameterReader::parse_parameters()
+{
+  Q_ASSERT(xml.isStartElement() && xml.name() == "ParameterHandler");
+
+  while (xml.readNext() != QXmlStreamReader::Invalid)  // go to the next <start_element>
+    {                                                  // if it is the closing element of ParameterHandler,
+      if (xml.isEndElement() && xml.name() == "ParameterHandler")
+        break;                                         // break the loop
+
+      if (xml.isStartElement())                                // if it is a start element
+        read_subsection_element(0);                    // it must be a subsection or a parameter
+    };
+}
+
+
+
+void XMLParameterReader::read_subsection_element(QTreeWidgetItem *parent)
+{
+               // The structure of the parameter file is assumed to be of the form
+               //
+               //  <subsection>
+               //    <subsection>
+               //      ...
+               //        <parameter>
+               //          <value> ... </value>
+               //          ...
+               //          <pattern_description> ... </pattern_description>
+               //        </parameter>
+               //        <parameter>
+               //        ...
+               //        </parameter>
+               //        ...
+               //    </subsection>
+               //    <subsection>
+               //      ...
+               //    </subsection>
+               //    ...
+               //  </subsection>
+               //
+               // Any subsection has a user-specified name also any parameter, but we do not know
+               // the userspecified names and we can not assume anything. So, when parsing the file,
+               // we do not know, if the actual <start_element> is a <subsection> or a <parameter>
+               // in a subsection. To decide, if the element is a subsection- or a parameter-name,
+               // we assume, that if the next <start_element> is <value>, we have a <parameter>
+               // and a parameter has the entries <value>, <default_value>, <documentation>,
+               // <pattern> and <pattern_description>
+
+  Q_ASSERT(xml.isStartElement());                      // the actual element is <subsection>
+
+  QTreeWidgetItem * subsection = create_child_item(parent);            // create a new subsection in the tree
+
+  subsection->setIcon(0, subsection_icon);                             // set the icon,
+  subsection->setText(0, demangle(xml.name().toString()));             // the name
+
+  tree_widget->setItemExpanded(subsection, 0);                         // and the folder is not expanded
+
+  while (xml.readNext() != QXmlStreamReader::Invalid)  // read the next element
+    {
+      if (xml.isEndElement())                          // if the next element is </subsection>, break the loop
+        break;
+
+      if (xml.isStartElement())                                // if it is a start element
+        {
+          if (xml.name() == "value")                   // it can be <value>, then we have found a parameter,
+            {
+              subsection->setFlags(subsection->flags() | Qt::ItemIsEditable);  // values can be edited,
+              read_parameter_element (subsection);
+            }
+          else                                         // or it can be a new <subsection>
+            {
+              subsection->setFlags(subsection->flags() | Qt::NoItemFlags);     // subsections can not be edited,
+              read_subsection_element (subsection);
+            };
+        };
+    };
+}
+
+
+
+void XMLParameterReader::read_parameter_element(QTreeWidgetItem *parent)
+{
+  Q_ASSERT(xml.isStartElement() && xml.name() == "value");     // the actual element is <value>,
+                                                               // then we have found a parameter-item
+  QString value = xml.readElementText();                       // read the element text
+  parent->setText(1, value);                                   // and store as text to the item
+  parent->setIcon(0, parameter_icon);                          // change the icon of parent
+
+  while (xml.readNext() != QXmlStreamReader::Invalid)                          // go to the next <start_element>
+    {
+      if (xml.isStartElement())
+      {
+      if (xml.isStartElement() && xml.name() == "default_value")               // if it is <default_value>
+        {
+          QString default_value = xml.readElementText();                       // store it
+          parent->setText(2, default_value);
+        }
+      else if (xml.isStartElement() && xml.name() == "documentation")          // if it is <documentation>
+        {
+          QString documentation = xml.readElementText();                       // store it
+          parent->setText(3, documentation);
+
+          if (!documentation.isEmpty())                                                // if there is a documentation,
+            {
+              parent->setToolTip(0, "Documentation: " + documentation);                // set Documentation as ToolTip for both columns
+              parent->setToolTip(1, "Documentation: " + documentation);
+              parent->setStatusTip(0, "Documentation: " + documentation);      // and as StatusTip for the first column also
+            };
+        }
+      else if (xml.isStartElement() && xml.name() == "pattern")                        // if it is <pattern>
+        {
+          QString pattern = xml.readElementText();                             // store it as text
+          parent->setText(4, pattern);                                         // we only need this value
+                                                                               // for writing back to XML later
+        }
+      else if (xml.isStartElement() &&  xml.name() == "pattern_description")   // if it is <pattern_description>
+        {
+          QString pattern_description = xml.readElementText();                 // store it as text
+          parent->setText(5, pattern_description);
+                                                                               // show the type and default
+                                                                               // in the StatusLine
+          parent->setStatusTip(1, "Type: " + pattern_description + "   Default: " + parent->text(2));
+
+                                               // in order to store values as correct data types,
+                                               // we check the following types in the pattern_description:
+
+          QRegExp  rx_string("\\b(Anything|FileName|DirectoryName|Selection|List|MultipleSelection)\\b"),      
+                   rx_integer("\\b(Integer)\\b"),
+                   rx_double("\\b(Float|Floating|Double)\\b"),
+                   rx_bool("\\b(Selection true|false)\\b");
+
+          if (rx_string.indexIn (pattern_description) != -1)                   // the type "Anything" or "Filename"
+            {
+              QString value = parent->text(1);                                 // store as a QString
+
+              parent->setData(1, Qt::EditRole, value);                         // and set the data in the item
+              parent->setData(1, Qt::DisplayRole, value);
+            }
+          else if (rx_integer.indexIn (pattern_description) != -1)             // if the tpye is "Integer"
+            {
+              QString text = parent->text(1);
+
+              bool ok = true;
+
+              int value = text.toInt(&ok);                                     // we convert the string to int
+
+              if (ok)                                                          // and store
+                {
+                  parent->setData(1, Qt::EditRole, value);
+                  parent->setData(1, Qt::DisplayRole, value);
+                }
+              else                                                             // otherwise raise an error
+                xml.raiseError(QObject::tr("Cannot convert integer type to integer!"));
+            }
+          else if (rx_double.indexIn (pattern_description) != -1)              // the same with "Float"
+            {
+              QString text = parent->text(1);
+
+              bool ok  = true;
+
+              double value = text.toDouble(&ok);
+
+              if (ok)
+                {
+                  parent->setData(1, Qt::EditRole, value);
+                  parent->setData(1, Qt::DisplayRole, value);
+                }
+              else
+                xml.raiseError(QObject::tr("Cannot convert double type to double!"));
+            };
+
+          if (rx_bool.indexIn (pattern_description) != -1)                     // and booleans
+            {
+              QRegExp  test(parent->text(1));
+
+              bool value = true;
+
+              if (test.exactMatch("true"))
+                value = true;
+              else if (test.exactMatch("false"))
+                value = false;
+              else
+                xml.raiseError(QObject::tr("Cannot convert boolen type to boolean!"));
+
+              parent->setText(1, "");                                          // this is needed because we use
+              parent->setData(1, Qt::EditRole, value);                         // for booleans the standard
+              parent->setData(1, Qt::DisplayRole, value);                      // delegate
+            };
+
+          break;                                               // and break the loop
+        }
+      else
+        {                                                      // if there is any other element, raise an error
+          xml.raiseError(QObject::tr("Incomplete or unknown Parameter!"));
+          break;                                               // and break the loop
+        };                                                     // here we assume the special structure
+      };                                                       // of the parameter-file!
+    };
+}
+
+
+
+QTreeWidgetItem *XMLParameterReader::create_child_item(QTreeWidgetItem *item)
+{
+  QTreeWidgetItem * child_item;                                                // create a new child-item
+
+  if (item)
+    child_item = new QTreeWidgetItem(item);                            // if item is not empty,
+  else                                                                 // append the new item as a child
+    child_item = new QTreeWidgetItem(tree_widget);                     // otherwise create a new item
+                                                                       // in the tree
+
+  child_item->setData(0, Qt::DisplayRole, xml.name().toString());      // set xml.tag_name as data
+  child_item->setText(0, xml.name().toString());                       // set xml.tag_name as data
+
+  return child_item;
+}
+
+
+
+QString XMLParameterReader::demangle (const QString &s)
+{
+  std::string  s_temp (s.toStdString());               // this function is copied from the ParameterHandler class
+
+  std::string u;
+  u.reserve (s_temp.size());
+
+  for (unsigned int i=0; i<s_temp.size(); ++i)
+    if (s_temp[i] != '_')
+      u.push_back (s_temp[i]);
+    else
+      {
+       Q_ASSERT (i+2 < s_temp.size());
+
+       unsigned char c = 0;
+       switch (s_temp[i+1])
+         {
+           case '0':  c = 0 * 16;  break;
+           case '1':  c = 1 * 16;  break;
+           case '2':  c = 2 * 16;  break;
+           case '3':  c = 3 * 16;  break;
+           case '4':  c = 4 * 16;  break;
+           case '5':  c = 5 * 16;  break;
+           case '6':  c = 6 * 16;  break;
+           case '7':  c = 7 * 16;  break;
+           case '8':  c = 8 * 16;  break;
+           case '9':  c = 9 * 16;  break;
+           case 'a':  c = 10 * 16;  break;
+           case 'b':  c = 11 * 16;  break;
+           case 'c':  c = 12 * 16;  break;
+           case 'd':  c = 13 * 16;  break;
+           case 'e':  c = 14 * 16;  break;
+           case 'f':  c = 15 * 16;  break;
+           default:
+                 Q_ASSERT (false);
+         }
+       switch (s_temp[i+2])
+         {
+           case '0':  c += 0;  break;
+           case '1':  c += 1;  break;
+           case '2':  c += 2;  break;
+           case '3':  c += 3;  break;
+           case '4':  c += 4;  break;
+           case '5':  c += 5;  break;
+           case '6':  c += 6;  break;
+           case '7':  c += 7;  break;
+           case '8':  c += 8;  break;
+           case '9':  c += 9;  break;
+           case 'a':  c += 10;  break;
+           case 'b':  c += 11;  break;
+           case 'c':  c += 12;  break;
+           case 'd':  c += 13;  break;
+           case 'e':  c += 14;  break;
+           case 'f':  c += 15;  break;
+           default:
+                 Q_ASSERT (false);
+         }
+
+       u.push_back (static_cast<char>(c));
+
+                                        // skip the two characters
+       i += 2;
+      }
+
+  QString  v (u.c_str());
+
+  return v;
+}
+
diff --git a/deal.II/contrib/parameter_gui/xml_parameter_reader.h b/deal.II/contrib/parameter_gui/xml_parameter_reader.h
new file mode 100644 (file)
index 0000000..2fe44c6
--- /dev/null
@@ -0,0 +1,96 @@
+
+#ifndef XMLPARAMETERREADER_H
+#define XMLPARAMETERREADER_H
+
+#include <QIcon>
+#include <QXmlStreamReader>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+
+
+/**
+ * The XMLParameterReader class provides an interface to parse parameters from XML files to a QTreeWidget.
+ * This class makes extensive use of the QXmlStreamReader class, which implements the basic functionalities
+ * for parsing XML files.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class XMLParameterReader
+{
+  public:
+                                    /**
+                                     * Constructor.
+                                     */
+    XMLParameterReader (QTreeWidget *tree_widget);
+                                    /**
+                                     * This function reads the parameters from <tt>device</tt> into the <tt>tree_widget</tt>.
+                                     * We use the QXmlStreaReader class for this.
+                                     * There must be a start element
+                                     * <code><ParameterHandler></code>
+                                     * and an end element <code></ParameterHandler></code>
+                                     * otherwise an exception is thrown.
+                                     */
+    bool read_xml_file (QIODevice *device);
+                                    /**
+                                     * This function returns an error message.
+                                     */
+    QString error_string () const;
+
+  private:
+                                    /**
+                                     * This function implements a loop over the XML file
+                                     * and parses XML elements. It calls @ref read_subsection_element
+                                     * till the <code></ParameterHandler></code> element is found
+                                     * or the end of the file is reached. In this case, an exception is thrown.
+                                     */
+    void parse_parameters ();
+                                    /**
+                                     * This functions parses a <tt>subsection</tt>.
+                                     * If the next element is <code><value></code>,
+                                     * this functions calls @ref read_parameter_element
+                                     * otherwise the function itself recursively.
+                                     */
+    void read_subsection_element (QTreeWidgetItem *parent);
+                                    /**
+                                     * This functions parses a <tt>parameter</tt>.
+                                     * A <tt>parameter</tt> description consists of five elements:
+                                     * @code
+                                     *   <value>value</value>
+                                     *   <default_value>default_value</default_value>
+                                     *   <documentation>documentation</documentation>
+                                     *   <pattern>pattern</pattern>
+                                     *   <pattern_description>[pattern_description]</pattern_description>
+                                     * @endcode
+                                     * If a <tt>parameter</tt> description is incomplete, an exception
+                                     * is thrown.
+                                     */
+    void read_parameter_element (QTreeWidgetItem *parent);
+                                    /**
+                                     * Reimplemented from the ParameterHandler class.
+                                     * Unmangle a string into its original form.
+                                     */
+    QString  demangle (const QString &s);
+                                    /**
+                                     * This helper function creates a new item in the tree.
+                                     */
+    QTreeWidgetItem * create_child_item(QTreeWidgetItem *item);
+                                    /**
+                                     * The QXmlStreamReader object for reading XML elements.
+                                     */
+    QXmlStreamReader  xml;
+                                    /**
+                                     * A pointer to the tree structure.
+                                     */
+    QTreeWidget * tree_widget;
+                                    /**
+                                     * An icon for subsections in the tree structure.
+                                     */
+    QIcon  subsection_icon;
+                                    /**
+                                     * An icon for parameters in the tree structure.
+                                     */
+    QIcon  parameter_icon;
+};
+
+#endif
diff --git a/deal.II/contrib/parameter_gui/xml_parameter_writer.cpp b/deal.II/contrib/parameter_gui/xml_parameter_writer.cpp
new file mode 100644 (file)
index 0000000..95a1f5a
--- /dev/null
@@ -0,0 +1,83 @@
+
+#include <QtGui>
+
+#include "xml_parameter_writer.h"
+
+
+XMLParameterWriter::XMLParameterWriter(QTreeWidget *tree_widget)
+                  : tree_widget(tree_widget)
+{
+  xml.setAutoFormatting(true);                                 // enable auto-formatting
+}
+
+
+
+bool XMLParameterWriter::write_xml_file(QIODevice *device)
+{
+  xml.setDevice(device);                                       // setup the output device
+  xml.writeStartDocument();                                    // write the head <?xml ... ?>
+  xml.writeStartElement("ParameterHandler");                   // write the root element <ParameterHandler>
+                                                               // loop over the elements
+  for (int i = 0; i < tree_widget->topLevelItemCount(); ++i)
+    write_item(tree_widget->topLevelItem(i));                  // and write the items
+
+  xml.writeEndDocument();                                      // close the first element
+
+  return true;
+}
+
+
+
+void XMLParameterWriter::write_item(QTreeWidgetItem *item)
+{
+  QString tag_name = mangle(item->text(0));                    // store the element name
+
+  xml.writeStartElement(tag_name);                             // and write <tag_name> to the file
+
+  if (!item->text(1).isEmpty())                                        // if the "value"-entry of this item is not empty
+    {                                                          // we have a parameter
+      xml.writeTextElement("value", item->data(1,Qt::EditRole).toString());
+      xml.writeTextElement("default_value", item->text(2));    // and we write its values
+      xml.writeTextElement("documentation", item->text(3));
+      xml.writeTextElement("pattern", item->text(4));
+      xml.writeTextElement("pattern_description", item->text(5));
+    };
+
+  for (int i = 0; i < item->childCount(); ++i)                 // go over the childrens recursively
+    write_item(item->child(i));
+
+  xml.writeEndElement();                                       // write closing </tag_name>
+}
+
+
+
+QString XMLParameterWriter::mangle (const QString &s)
+{
+  std::string  s_temp (s.toStdString());                       // this function is copied from
+                                                               // the ParameterHandler class
+  std::string u;                                               // and adapted to mangle QString
+  u.reserve (s_temp.size());
+
+  static const std::string allowed_characters
+    ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
+
+                                  // for all parts of the string, see
+                                  // if it is an allowed character or
+                                  // not
+  for (unsigned int i=0; i<s_temp.size(); ++i)
+    if (allowed_characters.find (s_temp[i]) != std::string::npos)
+      u.push_back (s_temp[i]);
+    else
+      {
+       u.push_back ('_');
+       static const char hex[16]
+         = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
+       u.push_back (hex[static_cast<unsigned char>(s_temp[i])/16]);
+       u.push_back (hex[static_cast<unsigned char>(s_temp[i])%16]);
+      }
+
+  QString  v (u.c_str());
+
+  return v;
+}
+
diff --git a/deal.II/contrib/parameter_gui/xml_parameter_writer.h b/deal.II/contrib/parameter_gui/xml_parameter_writer.h
new file mode 100644 (file)
index 0000000..f11b8e9
--- /dev/null
@@ -0,0 +1,71 @@
+
+#ifndef XMLPARAMETERWRITER_H
+#define XMLPARAMETERWRITER_H
+
+#include <QXmlStreamWriter>
+#include <QTreeWidget>
+#include <QTreeWidgetItem>
+
+
+/**
+ * The XMLParameterWriter class provides an interface to write parameters stored in a QTreeWidget to a file in XML format.
+ * This class makes extensive use of the QXmlStreamWriter class, which implements the basic functionalities for writing
+ * XML files.
+ *
+ * @ingroup gui
+ * @author Martin Steigemann, Wolfgang Bangerth, December 2010
+ */
+class XMLParameterWriter
+{
+  public:
+                                    /**
+                                     * Constructor.
+                                     */
+    XMLParameterWriter (QTreeWidget *tree_widget);
+                                    /**
+                                     * This function writes the parameters stored in the <tt>tree_widget</tt>
+                                     * to <tt>device</tt> in XML format. We use the QXmlStreaWriter class
+                                     * for this. The root element is
+                                     * <code><ParameterHandler></code>
+                                     */
+    bool write_xml_file (QIODevice *device);
+
+  private:
+                                    /**
+                                     * This function writes an <tt>item</tt> of <tt>tree_widget</tt>
+                                     * to a file in XML format. For this the QXmlStreamWriter class is used.
+                                     * If the <tt>item</tt> is a parameter, the elements that describes this parameter
+                                     * are written:
+                                     * @code
+                                     *   <value>value</value>
+                                     *   <default_value>default_value</default_value>
+                                     *   <documentation>documentation</documentation>
+                                     *   <pattern>pattern</pattern>
+                                     *   <pattern_description>[pattern_description]</pattern_description>
+                                     * @endcode
+                                     * If the <tt>item</tt> is a subsection, a start element <code>this_subsection</code> is written
+                                     * and <tt>write_item</tt> is called recursively to write the next <tt>item</tt>.
+                                     */
+    void write_item (QTreeWidgetItem *item);
+                                    /**
+                                     * Reimplemented from the ParameterHandler class.
+                                     * Mangle a string so that it
+                                     * doesn't contain any special
+                                     * characters or spaces.
+                                     */
+    QString  mangle (const QString &s);
+                                    /**
+                                     * An QXmlStreamWriter object
+                                     * which implements the functionalities
+                                     * we need for writing parameters to XML files.
+                                     */
+    QXmlStreamWriter  xml;
+                                    /**
+                                     * A pointer to the QTreeWidget structure
+                                     * which stores the parameters.
+                                     */
+    QTreeWidget * tree_widget;
+};
+
+
+#endif

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.