--- /dev/null
+# 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
--- /dev/null
+<!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
--- /dev/null
+
+#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);
+}
+
--- /dev/null
+
+#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
--- /dev/null
+######################################################################
+# 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
--- /dev/null
+
+#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);
+}
+
--- /dev/null
+
+#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
--- /dev/null
+
+#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();
+}
--- /dev/null
+
+#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
+}
+
--- /dev/null
+
+#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
--- /dev/null
+
+#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
+ };
+}
+
--- /dev/null
+
+#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
--- /dev/null
+<?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>
--- /dev/null
+
+#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;
+}
+
--- /dev/null
+
+#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
--- /dev/null
+
+#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;
+}
+
--- /dev/null
+
+#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