qxrunner/0000700000000000000000000000000010522450211011414 5ustar rootrootqxrunner/doc/0000700000000000000000000000000010522445252012172 5ustar rootrootqxrunner/docgen/0000700000000000000000000000000010521421041012651 5ustar rootrootqxrunner/docgen/copy_design.bat0000700000000000000000000000050710502562364015666 0ustar rootroot@echo off REM REM copy_design.bat REM call :COPY_ARTEFACTS qxrunner call :COPY_ARTEFACTS qxcppunit REM call :COPY_ARTEFACTS qxrunner_all goto EOF REM REM Subroutines REM :COPY_ARTEFACTS cd ..\doc\%1\html copy ..\..\..\docgen\tab*.gif . copy ..\..\..\docgen\tabs.css . cd ..\..\..\docgen :EOF qxrunner/docgen/docgen.ppr0000700000000000000000000000143110522443152014645 0ustar rootroot[Config] Relative path=1 Compilator.SaveAll=0 Compilator.Capture=0 Compilator.HideOutput=0 DefaultCPIndex=0 LogtoEnd=1 DontOpen=0 FileFormat=0 [Project tree] docgen +Ordner +doxyfile ext_tools.doxyfile qxrunner_all.doxyfile qx_browse.doxyfile qx_pckg.doxyfile qxcppunit.doxyfile qxrunner.doxyfile +html footer.html style.css tabs.css +latex header.tex style.sty index.sty +pics tab_r.gif tab_l.gif +make make_doc.bat make_html.bat make_pdf.bat make_help.bat make_clean.bat copy_design.bat +external doxygen.css doxygen_tabs.css ..\..\..\..\MikTex\localtexmf\miktex\config\miktex.ini ..\delta3d\doc\doxyfile.cfg [Open project files] [Selected Project Files] Main= qxrunner/docgen/doxygen.css0000700000000000000000000001756710501102754015070 0ustar rootrootBODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { font-family: Geneva, Arial, Helvetica, sans-serif; } BODY,TD { font-size: 90%; } H1 { text-align: center; font-size: 160%; } H2 { font-size: 120%; } H3 { font-size: 100%; } CAPTION { font-weight: bold } DIV.qindex { width: 100%; background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } DIV.nav { width: 100%; background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; line-height: 140%; } DIV.navtab { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } TD.navtab { font-size: 70%; } A.qindex { text-decoration: none; font-weight: bold; color: #1A419D; } A.qindex:visited { text-decoration: none; font-weight: bold; color: #1A419D } A.qindex:hover { text-decoration: none; background-color: #ddddff; } A.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } A.qindexHL:hover { text-decoration: none; background-color: #6666cc; color: #ffffff; } A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } A.el { text-decoration: none; font-weight: bold } A.elRef { font-weight: bold } A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} A.codeRef:link { font-weight: normal; color: #0000FF} A.codeRef:visited { font-weight: normal; color: #0000FF} A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } .fragment { font-family: monospace, fixed; font-size: 95%; } PRE.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; } DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD.indexkey { background-color: #e8eef2; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TD.indexvalue { background-color: #e8eef2; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TR.memlist { background-color: #f0f0f0; } P.formulaDsp { text-align: center; } IMG.formulaDsp { } IMG.formulaInl { vertical-align: middle; } SPAN.keyword { color: #008000 } SPAN.keywordtype { color: #604020 } SPAN.keywordflow { color: #e08000 } SPAN.comment { color: #800000 } SPAN.preprocessor { color: #806020 } SPAN.stringliteral { color: #002080 } SPAN.charliteral { color: #008080 } .mdescLeft { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplParams { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; color: #606060; background-color: #FAFAFA; font-size: 80%; } .search { color: #003399; font-weight: bold; } FORM.search { margin-bottom: 0px; margin-top: 0px; } INPUT.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } TD.tiny { font-size: 75%; } a { color: #1A41A8; } a:visited { color: #2A3798; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #84b0c7; } TH.dirtab { background: #e8eef2; font-weight: bold; } HR { height: 1px; border: none; border-top: 1px solid black; } /* Style for detailed member documentation */ .memtemplate { font-size: 80%; color: #606060; font-weight: normal; } .memnav { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .memitem { padding: 4px; background-color: #eef3f5; border-width: 1px; border-style: solid; border-color: #dedeee; -moz-border-radius: 8px 8px 8px 8px; } .memname { white-space: nowrap; font-weight: bold; } .memdoc{ padding-left: 10px; } .memproto { background-color: #d5e1e8; width: 100%; border-width: 1px; border-style: solid; border-color: #84b0c7; font-weight: bold; -moz-border-radius: 8px 8px 8px 8px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; font-style: italic; } /* End Styling for detailed member documentation */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin:0.5em; } .directory { font-size: 9pt; font-weight: bold; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } qxrunner/docgen/doxygen_tabs.css0000700000000000000000000000333610501127126016066 0ustar rootroot/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ DIV.tabs { float : left; width : 100%; background : url("tab_b.gif") repeat-x bottom; margin-bottom : 4px; } DIV.tabs UL { margin : 0px; padding-left : 10px; list-style : none; } DIV.tabs LI, DIV.tabs FORM { display : inline; margin : 0px; padding : 0px; } DIV.tabs FORM { float : right; } DIV.tabs A { float : left; background : url("tab_r.gif") no-repeat right top; border-bottom : 1px solid #84B0C7; font-size : x-small; font-weight : bold; text-decoration : none; } DIV.tabs A:hover { background-position: 100% -150px; } DIV.tabs A:link, DIV.tabs A:visited, DIV.tabs A:active, DIV.tabs A:hover { color: #1A419D; } DIV.tabs SPAN { float : left; display : block; background : url("tab_l.gif") no-repeat left top; padding : 5px 9px; white-space : nowrap; } DIV.tabs INPUT { float : right; display : inline; font-size : 1em; } DIV.tabs TD { font-size : x-small; font-weight : bold; text-decoration : none; } /* Commented Backslash Hack hides rule from IE5-Mac \*/ DIV.tabs SPAN {float : none;} /* End IE5-Mac hack */ DIV.tabs A:hover SPAN { background-position: 0% -150px; } DIV.tabs LI#current A { background-position: 100% -150px; border-width : 0px; } DIV.tabs LI#current SPAN { background-position: 0% -150px; padding-bottom : 6px; } DIV.nav { background : none; border : none; border-bottom : 1px solid #84B0C7; } qxrunner/docgen/ext_tools.doxyfile0000700000000000000000000000014010501130216016433 0ustar rootroot # ext_tools.doxyfile HHC_LOCATION = "C:\Programme\HTML Help Workshop\hhc.exe" qxrunner/docgen/footer.html0000700000000000000000000000064310501131724015047 0ustar rootroot
Generated at $datetime for QxRunner by Doxygen $doxygenversion and HTML Help.
qxrunner/docgen/header.tex0000700000000000000000000000167710440600034014642 0ustar rootroot\batchmode \documentclass[a4paper]{book} \usepackage{a4wide} \usepackage{makeidx} \usepackage{fancyhdr} \usepackage{graphicx} \usepackage{multicol} \usepackage{float} \usepackage{textcomp} \usepackage{alltt} %\usepackage{doxygen} \usepackage{style} \makeindex \setcounter{tocdepth}{1} \renewcommand{\footrulewidth}{0.4pt} \begin{document} \begin{titlepage} \vspace*{3cm} \begin{center} \begin{figure}[ht!] \begin{center} \includegraphics[width=8cm]{banner.jpg} \end{center}} \end{figure} \vspace*{0.5cm} {\normalfont $projectnumber }\\ \vspace*{2cm} {\normalfont\fontsize{26}{28}\bfseries $projectname }\\ \vspace*{1cm} {\normalfont\fontsize{18}{20}\bfseries Reference Manual }\\ \vspace*{4.5cm} {\small Generated by Doxygen $doxygenversion }\\ \vspace*{0.2cm} {\small $datetime }\\ \end{center} \end{titlepage} \clearemptydoublepage \pagenumbering{roman} \tableofcontents \clearemptydoublepage \pagenumbering{arabic} qxrunner/docgen/index.sty0000700000000000000000000000043310350326044014533 0ustar rootroot preamble "\\begin{document} \\begin{theindex} {\\small\n" postamble "\n\n} \\end{theindex} \\end{document}\n" group_skip "\n\n \\vspace*{0.2cm} \n" heading_prefix "{\\large\\bfseries - \n" heading_suffix " - }\\vspace*{0.2cm} \n" headings_flag 1 qxrunner/docgen/make_clean.bat0000700000000000000000000000044210502562370015435 0ustar rootroot@echo off REM REM make_clean.bat REM call :MAKE_CLEAN qxrunner call :MAKE_CLEAN qxcppunit REM call :MAKE_CLEAN qxrunner_all goto EOF REM REM Subroutines REM :MAKE_CLEAN cd ..\doc\%1\html del *.hhc del *.hhk del *.hhp del *.chm cd ..\..\..\docgen :EOF qxrunner/docgen/make_doc.bat0000700000000000000000000000017510501565420015121 0ustar rootroot@echo off REM REM make_doc.bat REM call make_html.bat call make_help.bat REM call make_pdf.bat call make_clean.bat qxrunner/docgen/make_help.bat0000700000000000000000000000061610502562372015310 0ustar rootroot@echo off REM REM make_help.bat REM call copy_design.bat call :MAKE_AND_COPY_HTMLHELP qxrunner call :MAKE_AND_COPY_HTMLHELP qxcppunit REM call :MAKE_AND_COPY_HTMLHELP qxrunner_all goto EOF REM REM Subroutines REM :MAKE_AND_COPY_HTMLHELP cd ..\doc\%1\html "C:\Programme\HTML Help Workshop\hhc.exe" index.hhp copy index.chm ..\%1.chm cd ..\..\..\docgen :EOF qxrunner/docgen/make_html.bat0000700000000000000000000000032310502562372015317 0ustar rootroot@REM @REM make_html.bat @REM call :MAKE_HTML qxrunner call :MAKE_HTML qxcppunit REM call :MAKE_HTML qxrunner_all goto EOF REM REM Subroutines REM :MAKE_HTML doxygen %1.doxyfile :EOF qxrunner/docgen/make_pdf.bat0000700000000000000000000000107510502562372015131 0ustar rootroot@echo off REM REM make_pdf.bat REM call :MAKE_AND_COPY_PDF qxrunner call :MAKE_AND_COPY_PDF qxcppunit REM call :MAKE_AND_COPY_PDF qxrunner_all goto EOF REM REM Subroutines REM :MAKE_AND_COPY_PDF cd doc\latex\%1 copy ..\..\..\style.sty . copy ..\..\..\index.sty . copy ..\..\..\TBD!!!!!!.jpg .\banner.jpg pdflatex refman.tex makeindex -c -s index.sty refman.idx REM Multiple pdflatex for proper TOC creation pdflatex refman.tex pdflatex refman.tex pdflatex refman.tex copy refman.pdf ..\..\pdf\%1.pdf cd ..\..\.. :EOF qxrunner/docgen/qxcppunit.doxyfile0000700000000000000000000000100010502557620016457 0ustar rootroot # qxcppunit.doxyfile @INCLUDE = qx_pckg.doxyfile PROJECT_NAME = "QxCppUnit" PROJECT_NUMBER = "QxRunner for CppUnit" OUTPUT_DIRECTORY = ../doc/qxcppunit INPUT = ../include/qxcppunit \ ../src/qxcppunit EXAMPLE_PATH = ../examples/qxcppunitdemo IMAGE_PATH = ../src/qxcppunit/resources #PROJECT_NAME = "QxCppUnit (Browse)" #@INCLUDE = qx_browse.doxyfile qxrunner/docgen/qxrunner.doxyfile0000700000000000000000000000076210522443147016324 0ustar rootroot # qxrunner.doxyfile @INCLUDE = qx_pckg.doxyfile PROJECT_NAME = "QxRunner" PROJECT_NUMBER = "Version 0.9.2" OUTPUT_DIRECTORY = ../doc/qxrunner INPUT = ../include/qxrunner \ ../src/qxrunner EXAMPLE_PATH = ../examples/qxrunnerdemo IMAGE_PATH = ../src/qxrunner/resources #PROJECT_NAME = "QxRunner (Browse)" #@INCLUDE = qx_browse.doxyfile qxrunner/docgen/qxrunner_all.doxyfile0000700000000000000000000000120710510264036017142 0ustar rootroot # qxrunner_all.doxyfile @INCLUDE = qx_pckg.doxyfile PROJECT_NAME = "QxRunner (All)" PROJECT_NUMBER = "Version 0.9.1" OUTPUT_DIRECTORY = ../doc/qxrunner_all INPUT = ../include/qxrunner \ ../src/qxrunner \ ../include/qxcppunit \ ../src/qxcppunit EXAMPLE_PATH = ../examples/qxrunnerdemo \ ../examples/qxcppunitdemo IMAGE_PATH = ../src/qxrunner/resources \ ../src/qxcppunit/resources \ qxrunner/docgen/qx_browse.doxyfile0000700000000000000000000000022610502015274016440 0ustar rootroot # qx_browse.doxyfile EXTRACT_PRIVATE = YES SOURCE_BROWSER = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO qxrunner/docgen/qx_pckg.doxyfile0000700000000000000000000014664110501574112016077 0ustar rootroot# Doxyfile 1.4.6-NO # 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 (" ") #--------------------------------------------------------------------------- # Defines locations of external tools #--------------------------------------------------------------------------- @INCLUDE = ext_tools.doxyfile #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = # 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 = # 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 = # 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: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = YES # 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 = NO # 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 = YES # 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 the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_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 DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = 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 = 4 # 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 # 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 = 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 = NO # 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 #--------------------------------------------------------------------------- # 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 = NO # 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 = 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 = NO # 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 = YES # 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_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 = # 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 = NO # 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 , where is the value of # the FILE_VERSION_FILTER tag, and 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 = #--------------------------------------------------------------------------- # 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 = # 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 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 = NO # 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 = # 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 = NO # 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 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 = # 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 , where # is the value of the INPUT_FILTER tag, and 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 (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = 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 = # 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 = # 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 = footer.html # 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 = style.css # 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 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 compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = YES # 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 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 = YES # 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 # If the GENERATE_TREEVIEW tag is set to YES, 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. GENERATE_TREEVIEW = YES # 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 #--------------------------------------------------------------------------- # 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 = # 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 = # 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 = # 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 = # 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 = NO # 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 = NO # 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 # 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 # 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 tags 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 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 MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # 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 a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # 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 #--------------------------------------------------------------------------- # Configuration::additions 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 qxrunner/docgen/style.css0000700000000000000000000002124610501602064014537 0ustar rootroot BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { font-family: Arial, Helvetica, Geneva, sans-serif; } BODY,TD { font-style: normal; font-size: 10pt; } H1,H2,H3,H4,H5,H6 { font-weight: bold; color: #006600; background-color: #DADADA; padding: 1px; } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD { vertical-align: top; } TD.paramname { white-space: nowrap; } H1 { text-align: center; font-size: 12pt; } H2 { font-size: 11pt; } H3 { font-size: 10pt; } H4 { font-size: 10pt; } /* See also further down for A adjustments */ CAPTION { font-weight: bold } DIV.qindex { width: 100%; background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; line-height: 100%; } DIV.nav { width: 100%; background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; padding: 2px; line-height: 100%; } DIV.navtab { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } TD.navtab { font-size: 70%; } A.qindex { /* text-decoration: none; font-weight: bold; color: #1A419D; */ } A.qindex:visited { /* text-decoration: none; font-weight: bold; color: #1A419D */ } A.qindex:hover { /* text-decoration: none; background-color: #ddddff; */ } A.qindexHL { text-decoration: none; font-weight: bold; background-color: #6666cc; color: #ffffff; border: 1px double #9295C2; } A.qindexHL:hover { /* text-decoration: none; background-color: #6666cc; color: #ffffff; */ } A.qindexHL:visited { /* text-decoration: none; background-color: #6666cc; color: #ffffff */ } /*A.el { text-decoration: none; font-weight: bold }*/ A.el { text-decoration: none; font-weight: normal } A.elRef { font-weight: bold } A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} A.codeRef:link { font-weight: normal; color: #0000FF} A.codeRef:visited { font-weight: normal; color: #0000FF} A:hover { text-decoration: none; background-color: #f2f2ff } DL.el { margin-left: -1cm } .fragment { font-family: monospace, fixed; font-size: 95%; } PRE.fragment { border: 1px solid #CCCCCC; background-color: #f5f5f5; margin-top: 4px; margin-bottom: 4px; margin-left: 2px; margin-right: 8px; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; } /* DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } */ DIV.ah { background-color: #6666cc; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold; } DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } BODY { background: white; color: black; margin-right: 20px; margin-left: 20px; } TD.indexkey { background-color: #e8eef2; font-weight: bold; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TD.indexvalue { background-color: #e8eef2; font-style: italic; padding-right : 10px; padding-top : 2px; padding-left : 10px; padding-bottom : 2px; margin-left : 0px; margin-right : 0px; margin-top : 2px; margin-bottom : 2px; border: 1px solid #CCCCCC; } TR.memlist { background-color: #f0f0f0; } P.formulaDsp { text-align: center; } IMG.formulaDsp { } IMG.formulaInl { vertical-align: middle; } SPAN.keyword { color: #008000 } SPAN.keywordtype { color: #604020 } SPAN.keywordflow { color: #e08000 } SPAN.comment { color: #800000 } SPAN.preprocessor { color: #806020 } SPAN.stringliteral { color: #002080 } SPAN.charliteral { color: #008080 } .mdescLeft { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .mdescRight { padding: 0px 8px 4px 8px; font-size: 80%; font-style: italic; background-color: #FAFAFA; border-top: 1px none #E0E0E0; border-right: 1px none #E0E0E0; border-bottom: 1px none #E0E0E0; border-left: 1px none #E0E0E0; margin: 0px; } .memItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemLeft { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplItemRight { padding: 1px 8px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; background-color: #FAFAFA; font-size: 80%; } .memTemplParams { padding: 1px 0px 0px 8px; margin: 4px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #E0E0E0; border-right-color: #E0E0E0; border-bottom-color: #E0E0E0; border-left-color: #E0E0E0; border-top-style: solid; border-right-style: none; border-bottom-style: none; border-left-style: none; color: #606060; background-color: #FAFAFA; font-size: 80%; } .search { color: #003399; font-weight: bold; } FORM.search { margin-bottom: 0px; margin-top: 0px; } INPUT.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } TD.tiny { font-size: 75%; } A { color: #0000FF; font-weight: normal; text-decoration: none; } A:active { color: #CC0000; } A:hover { text-decoration: none; background-color: #FFCC00; } A.anchor { color: #006600; font-weight: bold; } A.anchor:hover { color: #006600; background-color: #DADADA; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #84b0c7; } TH.dirtab { background: #e8eef2; font-weight: bold; } HR { height: 1px; border: none; border-top: 1px solid black; color: #006600; } /* Style for detailed member documentation */ .memtemplate { font-size: 80%; color: #606060; font-weight: normal; } .memnav { background-color: #e8eef2; border: 1px solid #84b0c7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .memitem { padding: 4px; background-color: #eef3f5; border-width: 1px; border-style: solid; border-color: #dedeee; -moz-border-radius: 8px 8px 8px 8px; } .memname { white-space: nowrap; font-weight: bold; } .memdoc{ padding-left: 10px; } .memproto { background-color: #d5e1e8; width: 100%; border-width: 1px; border-style: solid; border-color: #84b0c7; font-weight: bold; -moz-border-radius: 8px 8px 8px 8px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; font-style: italic; } /* End Styling for detailed member documentation */ /* for the tree view */ .ftvtree { font-family: sans-serif; margin:0.5em; } .directory { font-size: 9pt; font-weight: bold; } .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } .directory > h3 { margin-top: 0; } .directory p { margin: 0px; white-space: nowrap; } .directory div { display: none; margin: 0px; } .directory img { vertical-align: -30%; } qxrunner/docgen/style.sty0000700000000000000000000001343610440575574014611 0ustar rootroot\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{doxygen} \RequirePackage{calc} \RequirePackage{array} \pagestyle{fancyplain} \newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} \renewcommand{\chaptermark}[1]{\markboth{#1}{}} \renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} \lhead[\fancyplain{}{\bfseries\thepage}] {\fancyplain{}{\bfseries\rightmark}} \rhead[\fancyplain{}{\bfseries\leftmark}] {\fancyplain{}{\bfseries\thepage}} \rfoot[\fancyplain{}{\bfseries\scriptsize Generated for Delta3D by Doxygen, Graphviz and MikTex }]{} \lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated for Delta3D by Doxygen, Graphviz and MikTex }} \cfoot{} \newenvironment{CompactList} {\begin{list}{}{ \setlength{\leftmargin}{0.5cm} \setlength{\itemsep}{0pt} \setlength{\parsep}{0pt} \setlength{\topsep}{0pt} \renewcommand{\makelabel}{}}} {\end{list}} \newenvironment{CompactItemize} { \begin{itemize} \setlength{\itemsep}{-3pt} \setlength{\parsep}{0pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} } {\end{itemize}} \newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} \newlength{\tmplength} \newenvironment{TabularC}[1] { \setlength{\tmplength} {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} \par\begin{tabular*}{\linewidth} {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} } {\end{tabular*}\par} \newcommand{\entrylabel}[1]{ {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%% \newenvironment{Desc} {\begin{list}{} { \settowidth{\labelwidth}{40pt} \setlength{\leftmargin}{\labelwidth} \setlength{\parsep}{-8pt} \setlength{\itemsep}{-4pt} \renewcommand{\makelabel}{\entrylabel} } } {\end{list}} %\newenvironment{Desc} %{\begin{list}{} % { % \settowidth{\labelwidth}{40pt} % \setlength{\leftmargin}{\labelwidth} % \setlength{\parsep}{0pt} % \setlength{\itemsep}{-4pt} % \renewcommand{\makelabel}{\entrylabel} % } %} %{\end{list}} \newenvironment{Indent} {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} \item[]\ignorespaces} {\unskip\end{list}} \setlength{\parindent}{0cm} \setlength{\parskip}{0.2cm} \addtocounter{secnumdepth}{1} \sloppy \usepackage[T1]{fontenc} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Font style for the document. \renewcommand{\rmdefault}{phv} % Taken from book.cls and adapted to smaller font sizes. % Captions for source code documentation sections. \renewcommand\section{\@startsection {section}{1}{\z@}% {-3.5ex \@plus -1ex \@minus -.2ex}% % {2.3ex \@plus.2ex}% {2.0ex \@plus.2ex}% {\normalfont\fontsize{13}{15}\bfseries}} \renewcommand\subsection{\@startsection{subsection}{2}{\z@}% % {-3.25ex\@plus -1ex \@minus -.2ex}% % {1.5ex \@plus .2ex}% {-1.5ex\@plus -1ex \@minus -.2ex}% {0.5ex \@plus .2ex}% {\normalfont\fontsize{11}{13}\bfseries}} \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% % {-3.25ex\@plus -1ex \@minus -.2ex}% % {1.5ex \@plus .2ex}% {-0.5ex\@plus -1ex \@minus -.2ex}% {0.1ex \@plus .2ex}% {\normalfont\normalsize\bfseries}} %\newcommand\section{\@startsection {section}{1}{\z@}% % {-3.5ex \@plus -1ex \@minus -.2ex}% % {2.3ex \@plus.2ex}% % {\normalfont\Large\bfseries}} %\newcommand\subsection{\@startsection{subsection}{2}{\z@}% % {-3.25ex\@plus -1ex \@minus -.2ex}% % {1.5ex \@plus .2ex}% % {\normalfont\large\bfseries}} %\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% % {-3.25ex\@plus -1ex \@minus -.2ex}% % {1.5ex \@plus .2ex}% % {\normalfont\normalsize\bfseries}} % Chapter titles for source code documentation chapters. \def\@makechapterhead#1{% % \vspace*{10\p@}% \hfill {\parindent \z@ \raggedright \normalfont \ifnum \c@secnumdepth >\m@ne \if@mainmatter \fontsize{18}{20}\bfseries \@chapapp\space \thechapter \par\nobreak \vskip 30\p@ \fi \fi \interlinepenalty\@M \fontsize{20}{22} \bfseries #1\par\nobreak \vskip 20\p@ \hrulefill \vskip 40\p@ }} %\def\@makechapterhead#1{% % \vspace*{50\p@}% % {\parindent \z@ \raggedright \normalfont % \ifnum \c@secnumdepth >\m@ne % \if@mainmatter % \huge\bfseries \@chapapp\space \thechapter % \par\nobreak % \vskip 20\p@ % \fi % \fi % \interlinepenalty\@M % \Huge \bfseries #1\par\nobreak % \vskip 40\p@ % }} % Chapter titles for other chapters such as index. \def\@makeschapterhead#1{% % \vspace*{50\p@}% {\parindent \z@ \raggedright \normalfont \interlinepenalty\@M \fontsize{20}{22} \bfseries #1\par\nobreak \hrulefill \vskip 20\p@ }} %\def\@makeschapterhead#1{% % \vspace*{50\p@}% % {\parindent \z@ \raggedright % \normalfont % \interlinepenalty\@M % \Huge \bfseries #1\par\nobreak % \vskip 40\p@ % }} % Paper dimension \setlength{\topmargin}{-10mm} \setlength{\textheight}{250mm} \setlength\evensidemargin{-5mm} \setlength\oddsidemargin{-5mm} \setlength{\textwidth}{175mm} \setlength{\headwidth}{175mm} \setlength{\footwidth}{175mm} qxrunner/docgen/tabs.css0000700000000000000000000000404710501113646014333 0ustar rootroot/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ DIV.tabs { float : left; width : 100%; /* background : url("tab_b.gif") repeat-x bottom; */ /* margin-bottom : 4px;*/ padding-top : 1px; padding-bottom : 1px; border-bottom : 1px solid #84B0C7; background-color : #FFFFFF; } DIV.tabs UL { margin : 0px; padding-left : 10px; list-style : none; } DIV.tabs LI, DIV.tabs FORM { display : inline; margin : 0px; padding : 0px; } DIV.tabs FORM { float : right; } DIV.tabs A { float : left; background : url("tab_r.gif") no-repeat right top; border-bottom : 1px solid #84B0C7; font-size : 9pt; font-weight : bold; text-decoration : none; } DIV.tabs A:link, DIV.tabs A:visited, DIV.tabs A:hover { color: #0000FF; } DIV.tabs A:hover { background-position: 100% -150px; background-color: #FFCC00; } DIV.tabs A:active { color: #CC0000; } DIV.tabs SPAN { float : left; display : block; background : url("tab_l.gif") no-repeat left top; padding : 3px 7px; /*5px 9px;*/ white-space : nowrap; } DIV.tabs INPUT { float : right; display : inline; font-size : 1em; } DIV.tabs TD { font-size : 9pt; font-weight : bold; text-decoration : none; } /* Commented Backslash Hack hides rule from IE5-Mac \*/ DIV.tabs SPAN {float : none;} /* End IE5-Mac hack */ DIV.tabs A:hover SPAN { background-position: 0% -150px; } DIV.tabs LI#current A { background-position: 100% -150px; border-width : 0px; border-bottom : 1px solid #84B0C7; background-color : #FFCC00; /* color : #943565; */ color: #006600; } DIV.tabs LI#current SPAN { background-position: 0% -150px; padding-bottom : 3px; /*6px;*/ } DIV.nav { background : none; border : none; border-bottom : 1px solid #84B0C7; } qxrunner/docgen/tab_l.gif0000700000000000000000000000235410347654116014451 0ustar rootrootGIF89a ,‡ö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ:œÿÿþâz4ÿÿ¼&tˆ¼&L;FIGÕ,÷ö÷ôñüúø¼Qà@ßÕÆˆÞéˆw÷ôòxîxŒy€‘î’pÿÿÿ’m舿Âãï ï ˜¦$À\”ÿÿÿ¿ÃÎy\xˆ,Ⱦ pư ÉEx’ E’ N}$zü’Aý ‘y¤zt‘î’ p˜äÀ’>o’>b}´}ŒHHý¼&x¼&8{$JHýüýüHEH{PÀ{ýüH’ E’ NIüyà}Œ} ‘î}´}0’@.Ð{’ p˜äÀ’@ï’@»ýü€‘ååHœzðzø‚Ôî\P H‚ÔÅœ:œ:n‚ÔÖo–‚Ô‚Ôî\P Ïб¡agÎÁTS…ù¡ !ùÿ, ,ÿYT°!$RÈ@Á,(Lq`Š, `†ŒˆÌÐ@£Rb2e€$6žL9¦L”5arDù²&‰=øÉsÄ Hˆ|y AƒJi"uJ‚fS§ ª2ÅB«Q®Uk^]ÐÕ*X³ Èz[VìÙ­iËÂU‹–®Û¸kß~Å[·í^ºsåþÌ6ìà¼|#¶{¸ïbÂgïn¬ØqP½…-W– 91åÆœ‹¶ZóçÌ¥+«}³k¾©[{F-{ræÍµ;ÛŽœ{4îÛ½I_M¸ñ׌ÏFîWùîå°‡í\wsæ¾YWÏ^»éîП‹É¿ÞúhêÞ§Ÿ.}ûåòÜy³…H0„:(Â?âþ¡@èQü‘„`$,È ƒ .!‚Xa€˜!>(!„ ~("…!’8¢…%¢x"†)²¸¢†-Âø"‡1Ò8£‡&樢Ž.ò(£6‰ãŽDöXäG™äF6‰¤“JBÉä“TFYå”Vf‰å–vY#—_zy£˜B’¹¤™R¢y¥šZ² æ˜aÆ çœeÊY'gÚ™'žiêÙ'Ÿkú( Z;qxrunner/docgen/tab_r.gif0000700000000000000000000000531110347654160014452 0ustar rootrootGIF89a,‡ö÷ùñô÷öøúüýþúûüùúûøùúêïóïóöÆÕßÒÞæØâéÞçíÝæìåìñèîòô÷ùóöø³ÈÕÁÒÝËÙâÏÜäÖá薴ŹɯÂÍ»ÎÙÃÔÞÂÓÝÈ×àÌÚâÕáèÙäê×âèåìðëðó„°ÇÑÞåÜæëãëïëñôîóõ÷úûûüüÿÿÿþþþ:”ÿÿþâz4ÿÿÌ]TˆÌ],;FIGÕ,÷ö÷ôñüúø»ÿ¨óïóßÕÆˆÞéˆw÷ôòÈîxŒy€‘î’pÿÿÿ’mFøˆxï G¦$Àx¿ÃÎy\xˆ,Dؾ pư ÉE° ’ E’ N}$zü’Aý ‘y¤zt‘î’ p˜äÀ’>o’>b}´}ŒHHýÌ]XÈ{$JHýüýüHEH{PDÐ{ýüH’ E’ NIüyà}Œ} ‘î}´}0’@.Dà{’ p˜äÀ’@ï’@»ýü€‘ååH”zðzø‚Ôî\P H‚ÔÅ”:”:n‚ÔÖo–‚Ô‚Ôî\P Ïб¡agÎÁTS…ù¡ !ùÿ,,ÿIH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜQ‚,BŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêŒ Á‚† v J´¨Ñ£H“*]JT„)*xd¡¢ªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û° ¤xp¢Ã… qóêÝË·¯ß¿€ L¸°áÈ+^̸±ãÇ#†šB$ØÌ¹³çÏ C‹Mº´éÓ¨S«^ͺµë×°cËžMûtй'.ÿ¼Í»·ïßÀƒ N¼¸ñãÈ“+_μ¹óçУKŸN=ùË—¨Î½»÷ïàËÿO¾|÷ëÙl7Ͼ½û÷ðãËŸßûÝË ,°Ï¿¿ÿÿ(à€hà&¨à‚ 6èàƒF(á„&(Bn X _…vèᇠ†(âˆ$–Èá…—i¨ß ,¶èâ‹0Æ(ãŒ4Öhã8æ¨ãŽ<öèã@)äD™#~”P Ù5éä“PF)å”TViå•Xf©å–\véå—`†)æ˜dr™Ÿ’K–©æšl¶éæ›pÆ)çœjæ—d ,©âž|öé矀*è „j衈&ªè¢Œ6êè£F*©¢Jz`) “fªé¦œvêé§ †*ª¦hZꦣ¦ªêª¬¶êê«°òÿY©©¨Æjë­¸æªë®žÎz)¯À+ì°ÄÆêë©Å&«ì²Ì6;è±µ:+í´ÔVë*´Öf«í¶Ü:Šm·à†+.¸ßŽkî¹è[nºì¶ën«ë¾+ï¼ôJo½øæ«o ÷îëï¿õö ðÀŸ+pÁ'œíÁ 7ì°² ?,ñĺFLñųjqÆwÜ鯇,²·xÒ:òÉ(Û[ò¯)·ì2¢ ¿,sÊ1ÏlsÈ5߬3Æ9ïìóÃ=ÿ,4ÂAmô¿E­4¾I/íô»M?-5ºQOmu¸U_­µ¶Yoíõ´]-ö²amö°eŸ­ö®i¯í¶­m¿-7¼+#;÷Ý`×-Þ|'ÿw߀oúwà„G:xáˆ3zx⌺xã úxä”÷9yå˜ßiªÝ™wÎéåžCzèŒN:⦟NxêªÎzë|¿ûݲÏ.wí¶»{îjïλپÿ.vðÂ{M|ñZ¼ÕÊ//uóÎ; }ôJOO½ÑÖ_/töÚûÌ}÷:¾Íâ/sù滌~ú4ëÍ~ëë¿?rüòãì~ý¡Ó?ÇúïÏóýþÃ\ÿ8±h< è¨ÀÒ1°¨{ W'Á º®‚Œ3H» rðvü îB(ÂÞ‘°„À;! ‡§Â¯….L cȼÒðy6¼¡ôr¨Ãêñ°‡Øû!ÿ·'Ä!z¯ˆF “H¾%2ñ|N|¢ú¢(ÅömnoU¬á³øÂ-rQ†^ü¢M&Æ1²¬Œ8 #w¨Æ5ú°n "ãHÄ9Òñˆv¼£ó¨Ç&ò±Pü# §(ÈAZ‘Œ†Ü™I6*2’hŽ|$Á)IbQ²’º$&¥ÉM²-’žÔ´8BÊRšò”¨L¥*WÉÊVšÒ# IfIËZÚò–¸Ì¥.wÉË^úò—À ¦0‡IÌbó˜ÈL¦2—ÉÌ`ú(²l¦4§IÍjZóšØÌ¦6·YM©h€Ü §8ÇIÎršóœèÜ¥]*ÎvºóðŒ§<Ãy‚ÌÌóžøÌ§>÷ÿÏŸðóŸ ¨@L<€M¨BÊÐxŠ¡ ¨D'JÑeŠà¡ͨF7ÊÑY^¢ ©HGÊÏ’ô¤(Mé9/ŠQ•ºô¥0•&KAÓšÚô¦¼œ)NwÊÓž¦> ªPI Ô¡õ¨-*R—ÊÔ*µ©Pê=Ÿ*ÕªZõœT½ªV·šÍ¬rõ«`]¦WÃJÖ²s¬fM«Zo‰Öµº5­m}«\Á×¹Úõªu½«^¡š×½úõ¨}ý«`}ØÁö¦…=¬b_šØÅ:ö¤}¬d;ÙÉZ¶¢•½¬fšÙÍz– ý¬hÿÚÑšŸ¥=­já™ÚÕº­}­lÇÛÙÿÚV›µ½­n«™ÛÝú–™½ý­pÜáW˜Å=®r{™Üå:—Í}®tgÝé>·ºÖ].v³{Üírw¸ÞýîoÃ+ÞÝ’·¼·=/zg«Þõ¾¶½î]-|ã{ÚùÒw´ö½ïgó«ßÍò·¿—ý/€'+à?¶À^,‚|Ø3x°~ð_#,á½R¸Âw½0†çªá ¿µÃ^+ˆC WÇwÄ&&+ŠSLW£wÅ.Þ*ŒcŒWwÆ6–*ŽsÌW[wÇ>^*ƒ X"_×ÈÎ2’ƒªä%÷´ÉNÞ)”£ŒX*ƒ×ÊÂ2–aªå-»´Ë^N)˜Ã Y2§×̶3šCªæ5s´¦ÍnÖ(œãŒY:Ë×Ϊ3ž#ªç=3´Ï~V(  ZBï×О4¢ªèEó³ÑŽÖ'¤#ZJØÒ’4¦ã©éM¿³Óžn'¨C [R7ØÔ†5ªÉ©êU‹³Õ®æ&¬c[Z[ØÖz5®­©ë]S³×¾–&°ƒ \bØØn6²‘©ìe³ÙÎ&&´£\j—uÚÖþ%¶³Í\n·ØÛ\Ý6¸s)îq³5 ;qxrunner/examples/0000700000000000000000000000000010521421041013230 5ustar rootrootqxrunner/examples/qxcppunitdemo/0000700000000000000000000000000010522450243016137 5ustar rootrootqxrunner/examples/qxcppunitdemo/main.cpp0000700000000000000000000000051210502351224017565 0ustar rootroot#include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QxCppUnit::TestRunner runner; runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()); runner.run(); return 0; } qxrunner/examples/qxcppunitdemo/qxcppunitdemo.ico0000700000000000000000000001731610477341514021557 0ustar rootroot  ¨6 ˆ Þ hf( @ €±E' ±E'±E'±E'±E'²E'³E'³E'´E(´E(´E(´E(´E(´E(´E(´E(³E'³E'²E'±E'±E'±E'±E'±E'±E' ±E'¢±E'ú±E'ÿ±E'ÿ³E'ÿ¶F(ÿ¸G)ÿºH)ÿºH)ÿºH)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿºH)ÿºH)ÿ¹H)ÿ¸G)ÿµF(ÿ³E'ÿ±E'ÿ±E'ÿ±E'ö±E'ޱE'±E'®±E'ÿ±E'ÿ´F(ÿºH)ÿ¿J*ÿÃL+ÿÆM,ÿÈM,ÿÉN,ÿÉN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÉN-ÿÉN,ÿÈM,ÿÆM,ÿÃK+ÿ¾J*ÿ¹H)ÿ³F(ÿ±E'ÿ±E'ÿ±E'ޱE' ±E'þ±E'ÿ¶F(ÿ¾J*ÿÆL,ÿÌO-ÿÐP.ÿÓR/ÿÕR/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÕR/ÿÓQ/ÿÐP.ÿËN-ÿÅL+ÿ½I*ÿµF(ÿ±E'ÿ±E'ö±E'±E'>±E'ÿ´F(ÿ¾J*ÿÈM,ÿÐP.ÿÖS/ÿÛT0ÿÞV1ÿàW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿàV2ÿÞV1ÿÚT0ÿÕR/ÿÏP.ÿÇM,ÿ½I*ÿ³F(ÿ±E'ÿ±E'±E'?±E'ÿ»H)ÿÆM,ÿÐP.ÿØS0ÿßV1ÿäX2ÿçY3ÿéZ4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿéZ4ÿçY3ÿãX2ÿÞV1ÿ×S0ÿÏP.ÿÅL+ÿ¹H)ÿ±E'ÿ±E'±E'?´F(ÿÀJ+ÿÌO-ÿÖS/ÿßV1ÿæY3ÿë[4ÿï\5ÿñ]5ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿñ]5ÿî\5ÿê[4ÿåX3ÿÞV1ÿÕR/ÿËN-ÿ¾J*ÿ³E'ÿ±E'±E'?·G(ÿÅL+ÿÑQ.ÿÛU0ÿäX3ÿë[4ÿñ]5ÿô_6ÿ÷_7ÿñ]5ÿáW2ÿèZ3ÿ÷_7ÿø`7ÿø`7ÿø`7ÿø`7ÿ÷`7ÿ÷`7ÿö_7ÿô^6ÿð]5ÿê[4ÿãX2ÿÚT0ÿÐP.ÿÃK+ÿµF(ÿ±E'²E'?¹H)ÿÈM,ÿÔR/ÿßV1ÿèZ3ÿï]5ÿõ_6ÿù`7ÿûa8ÿåX3ÿ5ºçÿkš­ÿÔ`Bÿñ]6ÿûa8ÿûa8ÿûa8ÿûa8ÿûa8ÿûa8ÿø`7ÿô^6ÿî\5ÿçY3ÿÞV1ÿÓQ/ÿÆM,ÿ¸G)ÿ²E'³E'?»I)ÿÊN-ÿ×S/ÿáW2ÿê[4ÿñ^5ÿ÷`7ÿûa8ÿýb8ÿæY4ÿÃýÿÁþÿ¼ðÿ’†‡ÿä[6ÿù`7ÿþb9ÿþb9ÿþb9ÿýb8ÿûa8ÿö_7ÿñ]5ÿéZ4ÿàV2ÿÕR/ÿÈM,ÿ¹H)ÿ´E'´E(?¼I*ÿËO-ÿ×S0ÿâW2ÿë[4ÿò^6ÿø`7ÿüa8ÿþb9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿ=±Øÿ·scÿë[4ÿýb8ÿÿc9ÿþb9ÿûa8ÿ÷`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÉN,ÿºH)ÿ´F(´F(?¼I*ÿËO-ÿØS0ÿâX2ÿë[4ÿó^6ÿø`7ÿüa8ÿþc9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿÁþÿ Áýÿb ·ÿÑdHÿò^6ÿþb8ÿûa8ÿ÷`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÉN-ÿºH)ÿµF(´F(?¼I*ÿËO-ÿØS0ÿâX2ÿë[4ÿó^6ÿø`7ÿüa8ÿþc9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿÁþÿÁþÿÁþÿ¾ôÿˆŒ’ÿá\9ÿõ_7ÿø`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÊN-ÿ»H)ÿµF(´F(?½J*ÿÌQ0ÿØV3ÿãZ5ÿë]7ÿó`9ÿøb:ÿüc;ÿþe;ÿç[6ÿÃýÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ6µàÿ­ynÿãZ5ÿð_8ÿê]7ÿâY5ÿ×U2ÿÊP/ÿ»I*ÿµF(´F(?½K,ÿÎW7ÿÙ[9ÿä_<ÿìc>ÿóe?ÿøg@ÿüiAÿþjBÿèa=ÿÆýÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÄþÿ_©ÃÿÛa@ÿëb=ÿâ_;ÿØ[9ÿÌV6ÿ»I*ÿµF(´F(?¾M.ÿÐ^?ÿÛbBÿåfDÿíiFÿôlGÿùnIÿüoJÿþpJÿéhEÿ%ÈýÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿ`¯ËÿÜhHÿìiFÿäfDÿÚbBÿÎ]?ÿ»J,ÿµF(´F(?¾O1ÿÒfIÿÝjKÿænNÿîqOÿôsQÿùuRÿüwSÿþxSÿêoOÿ1Ëýÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(ÉþÿJÀçÿ²…ÿænNÿñrPÿíqOÿånMÿÜjKÿÑfIÿ¼K-ÿµF(´F(?¿Q4ÿÕoTÿßsVÿèwXÿïzZÿõ|[ÿù~\ÿü]ÿþ€^ÿëxZÿ>Îýÿ5Ìþÿ5Ìþÿ5Ìþÿ5Ìþÿ5Ìþÿ5ÌþÿBÊøÿ™¤«ÿå{_ÿö|\ÿù}\ÿô|[ÿîyZÿçvXÿÞsVÿÓoTÿ¼L.ÿµF(´F(?ÀT7ÿØz`ÿá}bÿé€dÿðƒfÿö…gÿú‡hÿüˆiÿþ‰iÿí‚eÿKÑýÿCÐþÿCÐþÿCÐþÿCÐþÿDÐýÿƒ¹ÍÿÙ‹wÿô…gÿþˆiÿüˆhÿù‡hÿõ…gÿïƒeÿè€dÿà}bÿÖy`ÿ¼N0ÿµF(´E(?ÁW:ÿÛ„mÿãˆoÿëŠqÿñrÿösÿútÿý‘uÿþ’uÿîŒrÿZÕýÿSÔþÿSÔþÿSÔþÿtÊçÿÊ —ÿðrÿý’uÿÿ’uÿþ’uÿü‘uÿútÿösÿðrÿêŠpÿâ‡oÿÚ„mÿ½O1ÿ´F(³E'?ÁY=ÿÞzÿå’|ÿì•}ÿò—ÿö™€ÿúš€ÿü›ÿþœ‚ÿï–~ÿhÙýÿbØþÿoÕöÿ¶µ·ÿí—ÿú›ÿþœ‚ÿþœ‚ÿþœ‚ÿþœÿü›ÿúš€ÿö™ÿñ—~ÿë•}ÿä’|ÿÜzÿ¼P3ÿ´E'²E'?Á\@ÿàš‡ÿç‰ÿ퟊ÿò¡Œÿö£Œÿù¤ÿû¥Žÿý¥Žÿð ‹ÿ‰Ùóÿ§ÈÔÿ妕ÿö£ÿý¥Žÿý¦Žÿý¦Žÿý¦Žÿý¦Žÿü¥Žÿû¥Žÿù¤ÿö£Œÿñ¡‹ÿ쟊ÿæ‰ÿßš‡ÿ»Q4ÿ³E'±E'?¿^Cÿ⥕ÿ訖ÿíª˜ÿò«™ÿõ­™ÿø®šÿú¯šÿû¯›ÿø®šÿð«˜ÿó¬™ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿú¯šÿø®šÿõ­™ÿñ«™ÿí©—ÿç§–ÿᥕÿºR5ÿ²E'±E'?¾`Fÿä°£ÿ鲤ÿí´¥ÿñ¶¦ÿô·¦ÿö¸§ÿø¸§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿø¸§ÿö¸§ÿô·¦ÿñµ¦ÿí´¥ÿ貤ÿã°¢ÿ¸R6ÿ±E'±E'?½bIÿæ»°ÿê½±ÿî¾²ÿñÀ²ÿóÀ³ÿõÁ³ÿö´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿö´ÿõÁ³ÿóÀ³ÿð¿²ÿí¾²ÿê½±ÿå»°ÿ·S8ÿ±E'±E'?½bIÿèÆ½ÿëǾÿîȾÿñÉ¿ÿóÊ¿ÿôËÀÿõËÀÿöËÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöËÀÿõËÀÿôË¿ÿòÊ¿ÿðÉ¿ÿîȾÿëǾÿèÆ½ÿ¶R6ÿ±E'±E''´L/ÿéÊÂÿíÒÊÿïÒËÿñÓËÿòÔËÿôÔÌÿôÔÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿôÔÌÿóÔÌÿòÔËÿñÓËÿïÒËÿíÑÊÿ俵ÿ±E'ú±E' ±E'ÁÈ|gÿíÔÍÿñÜÖÿòÝ×ÿóÝ×ÿôÝ×ÿôÝ×ÿõÝ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÝ×ÿôÝ×ÿôÝ×ÿóÝ×ÿòÜ×ÿñÜÖÿëÏÈÿÂnWÿ±E'¢±E'±E'Á´M0ÿÀhPÿÁlTÿÃlUÿÅmUÿÇnVÿÈnVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÈnVÿÇnVÿÅmUÿÃlUÿÁlTÿ¿gNÿ³J,þ±E'®±E' ±E''±E'?±E'?±E'?±E'?³E'?´F'?´F(?µF(?µF(?µF(?µF(?µF(?µF(?µF(?µF(?´F(?´F'?³E'?±E'?±E'?±E'?±E'>±E' ÿÿÿÿðÀÀ€€€€€€€€€€€€€€€€€€€€€€€€ÀÀðÿÿÿÿ(0 ` °D&,±E'‰±E'—±E'—³E'—µF(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—µF(—²E'—±E'—±E'—°D&„°D&"°D&2°D&õ±E'þµF(þ¼I*þÂK+þÅL,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÅL+þÁK+þ»I)þµF(þ±E'þ°D&í°D&"±E'œ±E'þ¹H)ÿÄL+ÿÌO-þÓQ/ÿÖS/ÿØS0þØS0ÿØS0ÿØS0ÿØS0þØS0ÿØS0þØS0ÿÖS/ÿÒQ.þÌO-ÿÃK+ÿ¸G)þ±E'ÿ±E'„±E'¯¶G(þÄL+ÿÐP.ÿÙT0þàV2ÿäX2ÿæY3þæY3ÿæY3ÿæY3ÿæY3þæY3ÿæY3þæY3ÿäX2ÿßV1þÙT0ÿÏP.ÿÃK+þµF(ÿ±E'—±E'¯½I*þÍO-þÚT0þãX2þê[4þï\5þð]5þð]5þð]5þð]5þð]5þð]5þð]5þð]5þî\5þêZ4þãX2þÙT0þÌO-þ»I)þ±E'—³E'¯ÃK+þÓR/ÿáW2ÿë[4þò^6ÿö_7ÿð]5þÉkSÿë[5ÿø`7ÿø`7þø`7ÿø`7þø`7ÿö_7ÿñ]5þêZ4ÿßV1ÿÒQ.þÁK+ÿ³E'—¶F(¯ÇM,þ×S0ÿåX3ÿï]5þ÷_7ÿûa8ÿë[5þÂüÿM¦ÆÿÇkTÿõ_7þýb8ÿýb8þýb8ÿûa8ÿö_7þî\5ÿäX2ÿÖS/þÅL+ÿµF(—·G(¯ÈM,þÙT0þçY3þñ]5þø`7þýb8þí[5þÂýþÀýþ¿ùþt“¢þâa?þûa8þþb8þýb8þø`7þð]5þæY3þØS0þÇM,þ¶G(—·G)¯ÉN,þÙT0ÿçY3ÿñ]5þù`7ÿýb8ÿí[5þÂýÿÁþÿÁþÿÀýþ#¸êÿœ}þî]7ÿüb8ÿø`7þð]5ÿæY3ÿØS0þÇM,ÿ·G(—·G)¯ÉN-þÚU1ÿçZ4ÿñ^6þùa8ÿýc9ÿí\6þÂýÿÁþÿÁþÿÁýþÁþÿÁýþD¬Ðÿ¿o\ÿï]6þð^6ÿæZ4ÿØT1þÇN-ÿ·G(—·G)¯ËT4þÛ[8ÿè`<ÿòd>þùg?ÿýhAÿíb=þÅýÿÃþÿÃþÿÃýþÃþÿÃýþÃþÿÃûÿnœ®þãa>ÿç`;ÿÚZ8þÉS3ÿ·G(—·G)¯Î]?þÝdDþéiFþómIþùoJþýqKþîkHþ%ÈýþÆýþÆýþÆýþÆýþÆýþÆýþ"Æüþp¤¸þäjIþèiFþÜdCþË[=þ·G(—·G)¯ÑhLþßoQÿëtTÿówVþúzWÿý{XÿðvUþ5Ìýÿ/Êþÿ/Êþÿ.Êýþ/Êþÿ/Êýþ]ºÚÿňyÿñvUþówVÿêsTÿÞoQþÎeHÿ·G(—·G)¯Ôt[þâ|`þì€cþôƒeþú…fþý‡gþñ‚dþFÐýþAÏýþAÏýþAÏýþTÊñþ®¡ þñƒfþü†gþú…fþôƒdþì€cþá{`þÒpVþ·G(—·G(¯Ø‚kþåŠqÿîŽsÿõuþú’vÿý”wÿòuþZÕýÿUÔþÿZÔûÿ›·Ãþé”}ÿü“wþþ”wÿý“wÿú’vþõuÿîsÿä‰qþÕ|dÿ¶G(—¶F(¯Ü{þ瘃ÿÿöž†þúŸ‡ÿý ˆÿó†þpÚýÿËàÿÛ§›ÿùŸ‡þþ¡ˆÿý¡ˆþý¡ˆÿý ‡ÿúŸ‡þõ†ÿÿ昂þ؈sÿµF(—³E'¯ÞŒþ馔þï©–þõ«—þø¬˜þû­˜þ÷¬˜þá´©þô«—þû®™þü®™þü®™þü®™þû®™þû­˜þø¬˜þô«—þï©–þ覔þÚ•‚þ³E'—±E'¯à«þ굦ÿï·§ÿó¸¨þö¹©ÿøº©ÿùºªþù»ªÿù»ªÿù»ªÿùºªþù»ªÿùºªþùºªÿøº©ÿö¹©þó¸¨ÿï¶§ÿé´¦þÜ¡‘ÿ±E'—±E'¯ã¸­þë·ÿïĸÿòŹþõƹÿöǺÿ÷Ǻþ÷Ǻÿ÷Ǻÿ÷Ǻÿ÷Ǻþ÷Ǻÿ÷Ǻþ÷ǺÿöǺÿôƹþòŹÿïĸÿë·þÞ­Ÿÿ±E'—°D&¡Þ²¥þíÐÈþðÑÉþòÒÉþôÒÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþôÒÊþòÒÉþðÑÉþíÐÈþÙ¥–þ°E'‰±E'>¾dKúã¼±ÿíÓÌÿïÔÍþðÕÍÿñÕÍÿñÕÍþñÕÍÿñÕÍÿñÕÍÿñÕÍþñÕÍÿñÕÍþñÕÍÿñÕÍÿðÕÍþïÔÍÿíÓÌÿá·«þº\Bõ±E',±E'>±E'¡±E'®±E'¯´F'¯¶F(¯·G(¯¸G)¯¸G)¯¸G)¯¸G)¯¸G)¯¸G)¯·G(¯¶F(¯³E'¯±E'¯±E'¯°E'œ±E'2ÿÿÿÀ€€€€€€€€€€€€€€€€€€€€Àÿÿÿ(  @X" X"Y"Y"Z"Z"Z"Z"Y"Y"X"X" ±E'—±E'ý·G(ÿ¾I*ÿÁK+ÿÂK+ÿÂK+ÿÂK+ÿÂK+ÿÁK+ÿ½I*ÿ·G(ÿ±E'ü±E'ˆc&²E'þ¿J*ÿÎO-ÿ×S0ÿÛU0ÿÜU1ÿÜU1ÿÜU1ÿÜU1ÿÛU0ÿ×S/ÿÍO-ÿ½I*ÿ±E'üc& c&¸G)ÿÎP.ÿßV1ÿéZ4ÿí\5ÿî\5ÿî\5ÿî\5ÿî\5ÿí\5ÿéZ4ÿÞV1ÿÍO-ÿ·G(ÿc&d&¿J*ÿØS0ÿêZ4ÿõ_6ÿò]6ÿš~ÿí_9ÿù`7ÿù`7ÿù`7ÿô^6ÿéZ4ÿ×S/ÿ½I*ÿd&e'ÃK+ÿÜU1ÿî\5ÿù`7ÿò^6ÿ Âýÿ0±Üÿ´xjÿù`7ÿþb8ÿù`7ÿí\5ÿÛU0ÿÁK+ÿe'e'ÄL+ÿÝU1ÿï\5ÿúa8ÿò^6ÿ ÂýÿÁþÿÁýÿU¡¼ÿÖjNÿø`7ÿî\5ÿÜU1ÿÂK+ÿe'e'ÅO/ÿÞZ7ÿïa;ÿúe>ÿóc<ÿÃýÿÂþÿÂþÿÂþÿ¿öÿ™ÿè`;ÿÝZ7ÿÃN.ÿe'e'ÈX:ÿáhHÿñnKÿúrNÿôpLÿ'Èýÿ"Çþÿ"Çþÿ"Çþÿ*Åøÿ…œ§ÿémKÿàhGÿÅV8ÿe'e'ËdHÿäz]ÿò`ÿûƒbÿõaÿ@Ïýÿ<Îþÿ<Îýÿu·ÎÿÜ‹vÿù‚bÿñ`ÿãy]ÿÉaDÿe'e'ÏqWÿèŽvÿô“yÿû–{ÿö”zÿ^ÖýÿsÌêÿɧ ÿú–zÿþ—{ÿû–zÿó“yÿçŽvÿÌlSÿe'd&Ð~hÿê£ÿô§’ÿú©”ÿø©”ÿž¾ÿôª–ÿüª”ÿüª”ÿüª”ÿù©”ÿó§’ÿê£ÿÍxaÿd'c&Ñ‹xÿ츫ÿò»¬ÿö½­ÿø½®ÿø¾®ÿø¾®ÿø¾®ÿø¾®ÿø½®ÿö½­ÿò»¬ÿ븫ÿ΄pÿc&c&Ð~ÿíÍÄÿòÏÅÿôÐÆÿõÐÆÿöÐÆÿöÐÆÿöÐÆÿöÐÆÿõÐÆÿôÏÆÿñÎÅÿíÍÄÿ͇týc& ¶R7§Ô™‰ÿÚ¤–ÿÝ¥–ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿÝ¥–ÿÚ¤–ÿÓ—†þµO3—n+n+o+p+q+q+q+q+p+o+n+n+À€€Àqxrunner/examples/qxcppunitdemo/qxcppunitdemo.pro0000700000000000000000000000305410510224264021565 0ustar rootroot#---------------------------------------------------------------------- # File: qxcppunitdemo.pro # Purpose: qmake config file for the QxCppUnit library demo program. #---------------------------------------------------------------------- TEMPLATE = app include(../../qxconfig.pro) TARGET = qxcppunitdemo #---------------------------------------------------------------------- # OS Independent #---------------------------------------------------------------------- QX_LIBDIR = ../../lib # Location of Qx libraries INCLUDEPATH += . ../../include $$(CPPUNIT)/include #---------------------------------------------------------------------- # Libraries for linker. #---------------------------------------------------------------------- LIBS += $$qxCppUnitLibForLinker() LIBS += $$qxRunnerLibForLinker() LIBS += $$cppUnitLibForLinker() #---------------------------------------------------------------------- # MS Windows #---------------------------------------------------------------------- win32 { RES_FILE = qxcppunitdemo.res debug: QMAKE_CXXFLAGS_DEBUG += $$compilerOptions() } win32:use_dll { DEFINES += QXCPPUNIT_DLL DEFINES += QXRUNNER_DLL DEFINES += CPPUNIT_DLL } #---------------------------------------------------------------------- # Linux/Unix #---------------------------------------------------------------------- unix: { # NOP } #---------------------------------------------------------------------- SOURCES = \ testexamples1.cpp \ testexamples2.cpp \ testexamples3.cpp \ main.cpp qxrunner/examples/qxcppunitdemo/qxcppunitdemo.rc0000700000000000000000000000006410472330154021372 0ustar rootrootIDI_ICON1 ICON DISCARDABLE "qxcppunitdemo.ico" qxrunner/examples/qxcppunitdemo/qxcppunitdemo.res0000700000000000000000000001757010522440172021567 0ustar rootroot ÿÿÿÿ¨ ÿÿÿÿ0 ( @ €±E' ±E'±E'±E'±E'²E'³E'³E'´E(´E(´E(´E(´E(´E(´E(´E(³E'³E'²E'±E'±E'±E'±E'±E'±E' ±E'¢±E'ú±E'ÿ±E'ÿ³E'ÿ¶F(ÿ¸G)ÿºH)ÿºH)ÿºH)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿ»H)ÿºH)ÿºH)ÿ¹H)ÿ¸G)ÿµF(ÿ³E'ÿ±E'ÿ±E'ÿ±E'ö±E'ޱE'±E'®±E'ÿ±E'ÿ´F(ÿºH)ÿ¿J*ÿÃL+ÿÆM,ÿÈM,ÿÉN,ÿÉN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÊN-ÿÉN-ÿÉN,ÿÈM,ÿÆM,ÿÃK+ÿ¾J*ÿ¹H)ÿ³F(ÿ±E'ÿ±E'ÿ±E'ޱE' ±E'þ±E'ÿ¶F(ÿ¾J*ÿÆL,ÿÌO-ÿÐP.ÿÓR/ÿÕR/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÖS/ÿÕR/ÿÓQ/ÿÐP.ÿËN-ÿÅL+ÿ½I*ÿµF(ÿ±E'ÿ±E'ö±E'±E'>±E'ÿ´F(ÿ¾J*ÿÈM,ÿÐP.ÿÖS/ÿÛT0ÿÞV1ÿàW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿáW2ÿàV2ÿÞV1ÿÚT0ÿÕR/ÿÏP.ÿÇM,ÿ½I*ÿ³F(ÿ±E'ÿ±E'±E'?±E'ÿ»H)ÿÆM,ÿÐP.ÿØS0ÿßV1ÿäX2ÿçY3ÿéZ4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿê[4ÿéZ4ÿçY3ÿãX2ÿÞV1ÿ×S0ÿÏP.ÿÅL+ÿ¹H)ÿ±E'ÿ±E'±E'?´F(ÿÀJ+ÿÌO-ÿÖS/ÿßV1ÿæY3ÿë[4ÿï\5ÿñ]5ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿò^6ÿñ]5ÿî\5ÿê[4ÿåX3ÿÞV1ÿÕR/ÿËN-ÿ¾J*ÿ³E'ÿ±E'±E'?·G(ÿÅL+ÿÑQ.ÿÛU0ÿäX3ÿë[4ÿñ]5ÿô_6ÿ÷_7ÿñ]5ÿáW2ÿèZ3ÿ÷_7ÿø`7ÿø`7ÿø`7ÿø`7ÿ÷`7ÿ÷`7ÿö_7ÿô^6ÿð]5ÿê[4ÿãX2ÿÚT0ÿÐP.ÿÃK+ÿµF(ÿ±E'²E'?¹H)ÿÈM,ÿÔR/ÿßV1ÿèZ3ÿï]5ÿõ_6ÿù`7ÿûa8ÿåX3ÿ5ºçÿkš­ÿÔ`Bÿñ]6ÿûa8ÿûa8ÿûa8ÿûa8ÿûa8ÿûa8ÿø`7ÿô^6ÿî\5ÿçY3ÿÞV1ÿÓQ/ÿÆM,ÿ¸G)ÿ²E'³E'?»I)ÿÊN-ÿ×S/ÿáW2ÿê[4ÿñ^5ÿ÷`7ÿûa8ÿýb8ÿæY4ÿÃýÿÁþÿ¼ðÿ’†‡ÿä[6ÿù`7ÿþb9ÿþb9ÿþb9ÿýb8ÿûa8ÿö_7ÿñ]5ÿéZ4ÿàV2ÿÕR/ÿÈM,ÿ¹H)ÿ´E'´E(?¼I*ÿËO-ÿ×S0ÿâW2ÿë[4ÿò^6ÿø`7ÿüa8ÿþb9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿ=±Øÿ·scÿë[4ÿýb8ÿÿc9ÿþb9ÿûa8ÿ÷`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÉN,ÿºH)ÿ´F(´F(?¼I*ÿËO-ÿØS0ÿâX2ÿë[4ÿó^6ÿø`7ÿüa8ÿþc9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿÁþÿ Áýÿb ·ÿÑdHÿò^6ÿþb8ÿûa8ÿ÷`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÉN-ÿºH)ÿµF(´F(?¼I*ÿËO-ÿØS0ÿâX2ÿë[4ÿó^6ÿø`7ÿüa8ÿþc9ÿçY4ÿÃýÿÁþÿÁþÿÁþÿÁþÿÁþÿÁþÿ¾ôÿˆŒ’ÿá\9ÿõ_7ÿø`7ÿò^6ÿê[4ÿáW2ÿÖS/ÿÊN-ÿ»H)ÿµF(´F(?½J*ÿÌQ0ÿØV3ÿãZ5ÿë]7ÿó`9ÿøb:ÿüc;ÿþe;ÿç[6ÿÃýÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ Áþÿ6µàÿ­ynÿãZ5ÿð_8ÿê]7ÿâY5ÿ×U2ÿÊP/ÿ»I*ÿµF(´F(?½K,ÿÎW7ÿÙ[9ÿä_<ÿìc>ÿóe?ÿøg@ÿüiAÿþjBÿèa=ÿÆýÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÃþÿÄþÿ_©ÃÿÛa@ÿëb=ÿâ_;ÿØ[9ÿÌV6ÿ»I*ÿµF(´F(?¾M.ÿÐ^?ÿÛbBÿåfDÿíiFÿôlGÿùnIÿüoJÿþpJÿéhEÿ%ÈýÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿÆþÿ`¯ËÿÜhHÿìiFÿäfDÿÚbBÿÎ]?ÿ»J,ÿµF(´F(?¾O1ÿÒfIÿÝjKÿænNÿîqOÿôsQÿùuRÿüwSÿþxSÿêoOÿ1Ëýÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(Éþÿ(ÉþÿJÀçÿ²…ÿænNÿñrPÿíqOÿånMÿÜjKÿÑfIÿ¼K-ÿµF(´F(?¿Q4ÿÕoTÿßsVÿèwXÿïzZÿõ|[ÿù~\ÿü]ÿþ€^ÿëxZÿ>Îýÿ5Ìþÿ5Ìþÿ5Ìþÿ5Ìþÿ5Ìþÿ5ÌþÿBÊøÿ™¤«ÿå{_ÿö|\ÿù}\ÿô|[ÿîyZÿçvXÿÞsVÿÓoTÿ¼L.ÿµF(´F(?ÀT7ÿØz`ÿá}bÿé€dÿðƒfÿö…gÿú‡hÿüˆiÿþ‰iÿí‚eÿKÑýÿCÐþÿCÐþÿCÐþÿCÐþÿDÐýÿƒ¹ÍÿÙ‹wÿô…gÿþˆiÿüˆhÿù‡hÿõ…gÿïƒeÿè€dÿà}bÿÖy`ÿ¼N0ÿµF(´E(?ÁW:ÿÛ„mÿãˆoÿëŠqÿñrÿösÿútÿý‘uÿþ’uÿîŒrÿZÕýÿSÔþÿSÔþÿSÔþÿtÊçÿÊ —ÿðrÿý’uÿÿ’uÿþ’uÿü‘uÿútÿösÿðrÿêŠpÿâ‡oÿÚ„mÿ½O1ÿ´F(³E'?ÁY=ÿÞzÿå’|ÿì•}ÿò—ÿö™€ÿúš€ÿü›ÿþœ‚ÿï–~ÿhÙýÿbØþÿoÕöÿ¶µ·ÿí—ÿú›ÿþœ‚ÿþœ‚ÿþœ‚ÿþœÿü›ÿúš€ÿö™ÿñ—~ÿë•}ÿä’|ÿÜzÿ¼P3ÿ´E'²E'?Á\@ÿàš‡ÿç‰ÿ퟊ÿò¡Œÿö£Œÿù¤ÿû¥Žÿý¥Žÿð ‹ÿ‰Ùóÿ§ÈÔÿ妕ÿö£ÿý¥Žÿý¦Žÿý¦Žÿý¦Žÿý¦Žÿü¥Žÿû¥Žÿù¤ÿö£Œÿñ¡‹ÿ쟊ÿæ‰ÿßš‡ÿ»Q4ÿ³E'±E'?¿^Cÿ⥕ÿ訖ÿíª˜ÿò«™ÿõ­™ÿø®šÿú¯šÿû¯›ÿø®šÿð«˜ÿó¬™ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿû¯›ÿú¯šÿø®šÿõ­™ÿñ«™ÿí©—ÿç§–ÿᥕÿºR5ÿ²E'±E'?¾`Fÿä°£ÿ鲤ÿí´¥ÿñ¶¦ÿô·¦ÿö¸§ÿø¸§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿù¹§ÿø¸§ÿö¸§ÿô·¦ÿñµ¦ÿí´¥ÿ貤ÿã°¢ÿ¸R6ÿ±E'±E'?½bIÿæ»°ÿê½±ÿî¾²ÿñÀ²ÿóÀ³ÿõÁ³ÿö´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿ÷´ÿö´ÿõÁ³ÿóÀ³ÿð¿²ÿí¾²ÿê½±ÿå»°ÿ·S8ÿ±E'±E'?½bIÿèÆ½ÿëǾÿîȾÿñÉ¿ÿóÊ¿ÿôËÀÿõËÀÿöËÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöÌÀÿöËÀÿõËÀÿôË¿ÿòÊ¿ÿðÉ¿ÿîȾÿëǾÿèÆ½ÿ¶R6ÿ±E'±E''´L/ÿéÊÂÿíÒÊÿïÒËÿñÓËÿòÔËÿôÔÌÿôÔÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿõÕÌÿôÔÌÿóÔÌÿòÔËÿñÓËÿïÒËÿíÑÊÿ俵ÿ±E'ú±E' ±E'ÁÈ|gÿíÔÍÿñÜÖÿòÝ×ÿóÝ×ÿôÝ×ÿôÝ×ÿõÝ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÞ×ÿõÝ×ÿôÝ×ÿôÝ×ÿóÝ×ÿòÜ×ÿñÜÖÿëÏÈÿÂnWÿ±E'¢±E'±E'Á´M0ÿÀhPÿÁlTÿÃlUÿÅmUÿÇnVÿÈnVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÉoVÿÈnVÿÇnVÿÅmUÿÃlUÿÁlTÿ¿gNÿ³J,þ±E'®±E' ±E''±E'?±E'?±E'?±E'?³E'?´F'?´F(?µF(?µF(?µF(?µF(?µF(?µF(?µF(?µF(?´F(?´F'?³E'?±E'?±E'?±E'?±E'>±E' ÿÿÿÿðÀÀ€€€€€€€€€€€€€€€€€€€€€€€€ÀÀðÿÿÿÿˆ ÿÿÿÿ0 (0 ` °D&,±E'‰±E'—±E'—³E'—µF(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—¶F(—µF(—²E'—±E'—±E'—°D&„°D&"°D&2°D&õ±E'þµF(þ¼I*þÂK+þÅL,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÇM,þÅL+þÁK+þ»I)þµF(þ±E'þ°D&í°D&"±E'œ±E'þ¹H)ÿÄL+ÿÌO-þÓQ/ÿÖS/ÿØS0þØS0ÿØS0ÿØS0ÿØS0þØS0ÿØS0þØS0ÿÖS/ÿÒQ.þÌO-ÿÃK+ÿ¸G)þ±E'ÿ±E'„±E'¯¶G(þÄL+ÿÐP.ÿÙT0þàV2ÿäX2ÿæY3þæY3ÿæY3ÿæY3ÿæY3þæY3ÿæY3þæY3ÿäX2ÿßV1þÙT0ÿÏP.ÿÃK+þµF(ÿ±E'—±E'¯½I*þÍO-þÚT0þãX2þê[4þï\5þð]5þð]5þð]5þð]5þð]5þð]5þð]5þð]5þî\5þêZ4þãX2þÙT0þÌO-þ»I)þ±E'—³E'¯ÃK+þÓR/ÿáW2ÿë[4þò^6ÿö_7ÿð]5þÉkSÿë[5ÿø`7ÿø`7þø`7ÿø`7þø`7ÿö_7ÿñ]5þêZ4ÿßV1ÿÒQ.þÁK+ÿ³E'—¶F(¯ÇM,þ×S0ÿåX3ÿï]5þ÷_7ÿûa8ÿë[5þÂüÿM¦ÆÿÇkTÿõ_7þýb8ÿýb8þýb8ÿûa8ÿö_7þî\5ÿäX2ÿÖS/þÅL+ÿµF(—·G(¯ÈM,þÙT0þçY3þñ]5þø`7þýb8þí[5þÂýþÀýþ¿ùþt“¢þâa?þûa8þþb8þýb8þø`7þð]5þæY3þØS0þÇM,þ¶G(—·G)¯ÉN,þÙT0ÿçY3ÿñ]5þù`7ÿýb8ÿí[5þÂýÿÁþÿÁþÿÀýþ#¸êÿœ}þî]7ÿüb8ÿø`7þð]5ÿæY3ÿØS0þÇM,ÿ·G(—·G)¯ÉN-þÚU1ÿçZ4ÿñ^6þùa8ÿýc9ÿí\6þÂýÿÁþÿÁþÿÁýþÁþÿÁýþD¬Ðÿ¿o\ÿï]6þð^6ÿæZ4ÿØT1þÇN-ÿ·G(—·G)¯ËT4þÛ[8ÿè`<ÿòd>þùg?ÿýhAÿíb=þÅýÿÃþÿÃþÿÃýþÃþÿÃýþÃþÿÃûÿnœ®þãa>ÿç`;ÿÚZ8þÉS3ÿ·G(—·G)¯Î]?þÝdDþéiFþómIþùoJþýqKþîkHþ%ÈýþÆýþÆýþÆýþÆýþÆýþÆýþ"Æüþp¤¸þäjIþèiFþÜdCþË[=þ·G(—·G)¯ÑhLþßoQÿëtTÿówVþúzWÿý{XÿðvUþ5Ìýÿ/Êþÿ/Êþÿ.Êýþ/Êþÿ/Êýþ]ºÚÿňyÿñvUþówVÿêsTÿÞoQþÎeHÿ·G(—·G)¯Ôt[þâ|`þì€cþôƒeþú…fþý‡gþñ‚dþFÐýþAÏýþAÏýþAÏýþTÊñþ®¡ þñƒfþü†gþú…fþôƒdþì€cþá{`þÒpVþ·G(—·G(¯Ø‚kþåŠqÿîŽsÿõuþú’vÿý”wÿòuþZÕýÿUÔþÿZÔûÿ›·Ãþé”}ÿü“wþþ”wÿý“wÿú’vþõuÿîsÿä‰qþÕ|dÿ¶G(—¶F(¯Ü{þ瘃ÿÿöž†þúŸ‡ÿý ˆÿó†þpÚýÿËàÿÛ§›ÿùŸ‡þþ¡ˆÿý¡ˆþý¡ˆÿý ‡ÿúŸ‡þõ†ÿÿ昂þ؈sÿµF(—³E'¯ÞŒþ馔þï©–þõ«—þø¬˜þû­˜þ÷¬˜þá´©þô«—þû®™þü®™þü®™þü®™þû®™þû­˜þø¬˜þô«—þï©–þ覔þÚ•‚þ³E'—±E'¯à«þ굦ÿï·§ÿó¸¨þö¹©ÿøº©ÿùºªþù»ªÿù»ªÿù»ªÿùºªþù»ªÿùºªþùºªÿøº©ÿö¹©þó¸¨ÿï¶§ÿé´¦þÜ¡‘ÿ±E'—±E'¯ã¸­þë·ÿïĸÿòŹþõƹÿöǺÿ÷Ǻþ÷Ǻÿ÷Ǻÿ÷Ǻÿ÷Ǻþ÷Ǻÿ÷Ǻþ÷ǺÿöǺÿôƹþòŹÿïĸÿë·þÞ­Ÿÿ±E'—°D&¡Þ²¥þíÐÈþðÑÉþòÒÉþôÒÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþõÓÊþôÒÊþòÒÉþðÑÉþíÐÈþÙ¥–þ°E'‰±E'>¾dKúã¼±ÿíÓÌÿïÔÍþðÕÍÿñÕÍÿñÕÍþñÕÍÿñÕÍÿñÕÍÿñÕÍþñÕÍÿñÕÍþñÕÍÿñÕÍÿðÕÍþïÔÍÿíÓÌÿá·«þº\Bõ±E',±E'>±E'¡±E'®±E'¯´F'¯¶F(¯·G(¯¸G)¯¸G)¯¸G)¯¸G)¯¸G)¯¸G)¯·G(¯¶F(¯³E'¯±E'¯±E'¯°E'œ±E'2ÿÿÿÀ€€€€€€€€€€€€€€€€€€€€Àÿÿÿh ÿÿÿÿ0 (  @X" X"Y"Y"Z"Z"Z"Z"Y"Y"X"X" ±E'—±E'ý·G(ÿ¾I*ÿÁK+ÿÂK+ÿÂK+ÿÂK+ÿÂK+ÿÁK+ÿ½I*ÿ·G(ÿ±E'ü±E'ˆc&²E'þ¿J*ÿÎO-ÿ×S0ÿÛU0ÿÜU1ÿÜU1ÿÜU1ÿÜU1ÿÛU0ÿ×S/ÿÍO-ÿ½I*ÿ±E'üc& c&¸G)ÿÎP.ÿßV1ÿéZ4ÿí\5ÿî\5ÿî\5ÿî\5ÿî\5ÿí\5ÿéZ4ÿÞV1ÿÍO-ÿ·G(ÿc&d&¿J*ÿØS0ÿêZ4ÿõ_6ÿò]6ÿš~ÿí_9ÿù`7ÿù`7ÿù`7ÿô^6ÿéZ4ÿ×S/ÿ½I*ÿd&e'ÃK+ÿÜU1ÿî\5ÿù`7ÿò^6ÿ Âýÿ0±Üÿ´xjÿù`7ÿþb8ÿù`7ÿí\5ÿÛU0ÿÁK+ÿe'e'ÄL+ÿÝU1ÿï\5ÿúa8ÿò^6ÿ ÂýÿÁþÿÁýÿU¡¼ÿÖjNÿø`7ÿî\5ÿÜU1ÿÂK+ÿe'e'ÅO/ÿÞZ7ÿïa;ÿúe>ÿóc<ÿÃýÿÂþÿÂþÿÂþÿ¿öÿ™ÿè`;ÿÝZ7ÿÃN.ÿe'e'ÈX:ÿáhHÿñnKÿúrNÿôpLÿ'Èýÿ"Çþÿ"Çþÿ"Çþÿ*Åøÿ…œ§ÿémKÿàhGÿÅV8ÿe'e'ËdHÿäz]ÿò`ÿûƒbÿõaÿ@Ïýÿ<Îþÿ<Îýÿu·ÎÿÜ‹vÿù‚bÿñ`ÿãy]ÿÉaDÿe'e'ÏqWÿèŽvÿô“yÿû–{ÿö”zÿ^ÖýÿsÌêÿɧ ÿú–zÿþ—{ÿû–zÿó“yÿçŽvÿÌlSÿe'd&Ð~hÿê£ÿô§’ÿú©”ÿø©”ÿž¾ÿôª–ÿüª”ÿüª”ÿüª”ÿù©”ÿó§’ÿê£ÿÍxaÿd'c&Ñ‹xÿ츫ÿò»¬ÿö½­ÿø½®ÿø¾®ÿø¾®ÿø¾®ÿø¾®ÿø½®ÿö½­ÿò»¬ÿ븫ÿ΄pÿc&c&Ð~ÿíÍÄÿòÏÅÿôÐÆÿõÐÆÿöÐÆÿöÐÆÿöÐÆÿöÐÆÿõÐÆÿôÏÆÿñÎÅÿíÍÄÿ͇týc& ¶R7§Ô™‰ÿÚ¤–ÿÝ¥–ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿߦ—ÿÝ¥–ÿÚ¤–ÿÓ—†þµO3—n+n+o+p+q+q+q+q+p+o+n+n+À€€À00ÿÿIDI_ICON10   ¨ ˆ  hqxrunner/examples/qxcppunitdemo/qxcppunitdemo.sln0000700000000000000000000000244410502776614021577 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxcppunitdemo", "qxcppunitdemo.vcproj", "{B97D5D1F-00EE-4EEA-8263-CF79555C0446}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 Debug|Win32 = Debug|Win32 Release_DLL|Win32 = Release_DLL|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug|Win32.ActiveCfg = Debug|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug|Win32.Build.0 = Debug|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release|Win32.ActiveCfg = Release|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal qxrunner/examples/qxcppunitdemo/qxcppunitdemo.vcproj0000700000000000000000000002462310505265130022276 0ustar rootroot qxrunner/examples/qxcppunitdemo/testexamples1.cpp0000700000000000000000000000164710502351050021447 0ustar rootroot// This class implements a set of CppUnit example test cases which // succeed or fail. It isn't intended to show how to write CppUnit tests. #include #include class TestExamples1; CPPUNIT_TEST_SUITE_REGISTRATION(TestExamples1); class TestExamples1 : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(TestExamples1); CPPUNIT_TEST(testAssertEqualSucceed); CPPUNIT_TEST(testAssertEqualFail); CPPUNIT_TEST(testAssertDoublesEqualSucceed); CPPUNIT_TEST(testAssertDoublesEqualFail); CPPUNIT_TEST_SUITE_END(); void testAssertEqualSucceed() { CPPUNIT_ASSERT_EQUAL(1, 1); } void testAssertEqualFail() { CPPUNIT_ASSERT_EQUAL(1, 0); } void testAssertDoublesEqualSucceed() { CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, 1.1, 0.5); } void testAssertDoublesEqualFail() { CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, 1.1, 0.05); } }; qxrunner/examples/qxcppunitdemo/testexamples2.cpp0000700000000000000000000000162110502351102021436 0ustar rootroot// This class implements a set of CppUnit example test cases which // succeed or fail. It isn't intended to show how to write CppUnit tests. #include #include class TestExamples2; CPPUNIT_TEST_SUITE_REGISTRATION(TestExamples2); class TestExamples2 : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(TestExamples2); CPPUNIT_TEST(testFail); CPPUNIT_TEST(testAssertAssertionPass); CPPUNIT_TEST(testAssertAssertionFail); CPPUNIT_TEST(testUnhandledError); CPPUNIT_TEST_SUITE_END(); void testFail() { CPPUNIT_FAIL("Intentionally failed"); } void testAssertAssertionPass() { CPPUNIT_ASSERT_ASSERTION_PASS(CPPUNIT_ASSERT(1 == 1)); } void testAssertAssertionFail() { CPPUNIT_ASSERT_ASSERTION_FAIL(CPPUNIT_ASSERT(1 == 2)); } void testUnhandledError() { throw "Unhandled error"; } }; qxrunner/examples/qxcppunitdemo/testexamples3.cpp0000700000000000000000000000164710505245162021462 0ustar rootroot// This class implements a set of CppUnit example test cases which // succeed or fail. It isn't intended to show how to write CppUnit tests. #include #include class TestExamples3; CPPUNIT_TEST_SUITE_REGISTRATION(TestExamples3); class TestExamples3 : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(TestExamples3); CPPUNIT_TEST(testAssertSucceed); CPPUNIT_TEST(testAssertFail); CPPUNIT_TEST(testAssertNoThrowSucceed); CPPUNIT_TEST(testAssertNoThrowFail); CPPUNIT_TEST_SUITE_END(); void testAssertSucceed() { CPPUNIT_ASSERT(1 == 1); } void testAssertFail() { CPPUNIT_ASSERT(1 == 0); } void testAssertNoThrowSucceed() { std::vector v; v.push_back(999); CPPUNIT_ASSERT_NO_THROW(v.at(0)); } void testAssertNoThrowFail() { std::vector v; CPPUNIT_ASSERT_NO_THROW(v.at(0)); } }; qxrunner/examples/qxrunnerdemo/0000700000000000000000000000000010522450243015766 5ustar rootrootqxrunner/examples/qxrunnerdemo/demoitem.cpp0000700000000000000000000000302110505504646020304 0ustar rootroot#include "demoitem.h" #include #include DemoItem::DemoItem(const QList& data, RunnerItem* parent) : RunnerItem(data, parent) { } DemoItem::~DemoItem() { // Remove destructor if it doesn't class specific cleanup. } int DemoItem::run() { if (child(0)) { return QxRunner::NoResult; // Have nothing to do as a parent } //Mimick some processing. //for (int i = 0; i < 30000; i++) //{ // QCoreApplication::processEvents(); //} QString msg; QString line; // Randomly generated result. switch (rand() % 6) { case 0: msg = "Run completed successfully."; line.setNum(__LINE__); setResult(QxRunner::RunSuccess); break; case 1: msg = "Run completed with an information."; line.setNum(__LINE__); setResult(QxRunner::RunInfo); break; case 2: msg = "Run completed with a warning."; line.setNum(__LINE__); setResult(QxRunner::RunWarning); break; case 3: msg = "Run completed with an error."; line.setNum(__LINE__); setResult(QxRunner::RunError); break; case 4: msg = "Run completed with a fatal error."; line.setNum(__LINE__); setResult(QxRunner::RunFatal); break; case 5: // This gets caught by the caller as a fallback, but actually // all exceptions should get handled in the run() method. throw 0; break; } // Fill item with resulting data. setData(2, msg); setData(3, __FILE__); setData(4, line); return result(); } qxrunner/examples/qxrunnerdemo/demoitem.h0000700000000000000000000000045110502351200017734 0ustar rootroot#ifndef DEMOITEM_H #define DEMOITEM_H #include using namespace QxRunner; class DemoItem : public RunnerItem { public: // Operations DemoItem(const QList& data, RunnerItem* parent = 0); ~DemoItem(); int run(); }; #endif // DEMOITEM_H qxrunner/examples/qxrunnerdemo/demomodel.cpp0000700000000000000000000000346310502351254020450 0ustar rootroot#include "demomodel.h" #include "demoitem.h" DemoModel::DemoModel(const QStringList& data, QObject* parent) : RunnerModel(parent) { // Data for column headers is stored in the root item. QList rootData; rootData << tr("Item Name") << tr("Result") << tr("Message") << tr("File Name") << tr("Line Number"); setRootItem(new DemoItem(rootData)); // Fill the model items. setupModelData(data, rootItem()); } DemoModel::~DemoModel() { // Remove destructor if it doesn't class specific cleanup. } QString DemoModel::name() const { return tr("Demo"); } void DemoModel::setupModelData(const QStringList& itemList, RunnerItem* parent) { QList parents; DemoItem* item; QString token; QList columnData; QList::const_iterator it = itemList.constBegin(); for (; it != itemList.constEnd(); ++it) { token = *it; // First column has the item name, remaining columns are empty. it++; columnData.clear(); columnData << *it; // Note: Appending empty columns is not needed since the runner // item constructor takes care of it. // -> columnData << "" << "" << "" << ""; if (token == "L0") { item = new DemoItem(columnData, parent); parent->appendChild(item); parents.clear(); parents << item; } else if (token == "CH") { parents.last()->appendChild(new DemoItem(columnData, parents.last())); } else if (token == "L1") { item = parents.first(); parents.clear(); parents << item; item = new DemoItem(columnData, parents.last()); parents.last()->appendChild(item); parents << item; } else { item = new DemoItem(columnData, parents.last()); parents.last()->appendChild(item); parents << item; } } } qxrunner/examples/qxrunnerdemo/demomodel.h0000700000000000000000000000070010502351200020073 0ustar rootroot#ifndef DEMOMODEL_H #define DEMOMODEL_H #include #include using namespace QxRunner; class DemoModel : public RunnerModel { Q_OBJECT public: // Operations DemoModel(const QStringList& data, QObject* parent = 0); ~DemoModel(); QString name() const; private: // Operations void setupModelData(const QStringList& itemList, RunnerItem* parent); }; #endif // DEMOMODEL_H qxrunner/examples/qxrunnerdemo/main.cpp0000700000000000000000000000410610502351254017422 0ustar rootroot#include "demomodel.h" #include #include QStringList demoItems(); // Helper function int main(int argc, char *argv[]) { QApplication app(argc, argv); DemoModel model(demoItems()); // Setup the data QxRunner::Runner runner(&model); runner.run(); return 0; } // Creates a list of items for the model. QStringList demoItems() { QStringList itemList; itemList << "L0" << "Group 1"; itemList << "CH" << "Demo item 1a"; itemList << "CH" << "Demo item 1b"; itemList << "CH" << "Demo item 1c"; itemList << "CH" << "Demo item 1d"; itemList << "L0" << "Group 2"; itemList << "CH" << "Demo item 2a"; itemList << "CH" << "Demo item 2b"; itemList << "CH" << "Demo item 2c"; itemList << "CH" << "Demo item 2d"; itemList << "L0" << "Group 3"; itemList << "CH" << "Demo item 3a"; itemList << "CH" << "Demo item 3b"; itemList << "CH" << "Demo item 3c"; itemList << "CH" << "Demo item 3d"; itemList << "L1" << "Group 3.1"; itemList << "CH" << "Demo item 3.1a"; itemList << "CH" << "Demo item 3.1b"; itemList << "CH" << "Demo item 3.1c"; itemList << "CH" << "Demo item 3.1d"; itemList << "L2" << "Group 3.1.1"; itemList << "CH" << "Demo item 3.1.1a"; itemList << "CH" << "Demo item 3.1.1b"; itemList << "CH" << "Demo item 3.1.1c"; itemList << "CH" << "Demo item 3.1.1d"; itemList << "L2" << "Group 3.2"; itemList << "CH" << "Demo item 3.2a"; itemList << "CH" << "Demo item 3.2b"; itemList << "CH" << "Demo item 3.2c"; itemList << "CH" << "Demo item 3.2d"; itemList << "L3" << "Group 3.2.1"; itemList << "CH" << "Demo item 3.2.1a"; itemList << "CH" << "Demo item 3.2.1b"; itemList << "CH" << "Demo item 3.2.1c"; itemList << "CH" << "Demo item 3.2.1d"; itemList << "L0" << "Demo item 4"; itemList << "L0" << "Group 5"; itemList << "CH" << "Demo item 5a"; itemList << "CH" << "Demo item 5b"; itemList << "CH" << "Demo item 5c"; itemList << "CH" << "Demo item 5d"; itemList << "L0" << "Demo item 6"; itemList << "L0" << "Demo item 7"; return itemList; } qxrunner/examples/qxrunnerdemo/qxrunnerdemo.ico0000700000000000000000000001731610465676320021240 0ustar rootroot ¨6 ˆ Þ hf( @ €   )A P Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q P >&  ''E¬¹/eüû0fÿÿ0fÿÿ1hÿÿ1iÿÿ2kÿÿ2kÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2kÿÿ2jÿÿ1iÿÿ1gÿÿ0fÿÿ0fÿÿ/cùù%=š¨  %^)MÁ³0fÿÿ0fÿÿ1hÿÿ2lÿÿ3nÿÿ5pÿÿ6qÿÿ7rÿÿ7rÿÿ7rÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7rÿÿ7rÿÿ7rÿÿ6qÿÿ5pÿÿ3nÿÿ2kÿÿ1hÿÿ0fÿÿ0fÿÿ&C¨•*j,[ä!0fþþ0fÿÿ1jÿÿ3nÿÿ6qÿÿ8sÿÿ:uÿÿ:wÿÿ:xÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ:xÿÿ:wÿÿ9uÿÿ8sÿÿ5pÿÿ3mÿÿ1iÿÿ0fÿÿ/eþö,Zâ /eþ>0fÿÿ1iÿÿ3nÿÿ7rÿÿ:uÿÿ:xÿÿ;{ÿÿ<}ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ<|ÿÿ;zÿÿ:xÿÿ9uÿÿ6qÿÿ3mÿÿ1hÿÿ0fÿÿ/eþ0fÿ?0fÿÿ2lÿÿ6qÿÿ:vÿÿ;yÿÿ<}ÿÿ?€ÿÿ@ÿÿA‚ÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿA‚ÿÿ@ÿÿ>€ÿÿ<|ÿÿ;yÿÿ9uÿÿ5pÿÿ2kÿÿ0fÿÿ0fÿ0fÿ?1hÿÿ4oÿÿ8tÿÿ;yÿÿ<}ÿÿ@ÿÿAƒÿÿA…ÿÿA†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿA†ÿÿA„ÿÿA‚ÿÿ?€ÿÿ<|ÿÿ:xÿÿ8sÿÿ3nÿÿ1gÿÿ0fÿ0fÿ?1jÿÿ5pÿÿ:vÿÿ;{ÿÿ?€ÿÿAƒÿÿA†ÿÿB‡ÿÿCˆÿÿB„ûÿ=|ðÿ?€õÿCˆþÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿB‡ÿÿA…ÿÿA‚ÿÿ>€ÿÿ;zÿÿ9uÿÿ5pÿÿ1iÿÿ0fÿ0gÿ?2kÿÿ7rÿÿ:wÿÿ=}ÿÿ@ÿÿA…ÿÿB‡ÿÿCˆÿÿD‰ÿÿ?~ðÿ‹5ÿ+†pÿAâÿB„ùÿEŠÿÿEŠÿÿEŠÿÿEŠÿÿEŠÿÿD‰ÿÿCˆÿÿB‡ÿÿA„ÿÿ@ÿÿ<|ÿÿ:wÿÿ6qÿÿ2jÿÿ0gÿ1hÿ?2mÿÿ7sÿÿ;yÿÿ>~ÿÿAƒÿÿB†ÿÿCˆÿÿDŠÿÿF‹ÿÿ?~ïÿ „ÿÿ„ÿ5„™ÿAïÿD‰üÿFŒÿÿFŒÿÿEŒÿÿF‹ÿÿD‰ÿÿCˆÿÿA†ÿÿA‚ÿÿ=~ÿÿ:xÿÿ7rÿÿ2kÿÿ1hÿ1iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿEŒÿÿ@~ïÿ „ÿÿÿÿ†>ÿ>‚¿ÿAóÿF‹þÿGŒÿÿEŒÿÿEŠÿÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7rÿÿ2lÿÿ1iÿ2iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿFŒÿÿ@~ïÿ „ÿÿÿÿÿ€ÿ(†eÿA€ÛÿC…÷ÿE‹ÿÿEŠÿÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7rÿÿ2lÿÿ2iÿ2iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿFŒÿÿ@~ïÿ „ÿÿÿÿÿÿÿ ƒÿ3…ÿBìÿC‡ûÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7sÿÿ2lÿÿ2iÿ2iÿ?3nÿÿ;uÿÿ>{ÿÿA€ÿÿC„ÿÿEˆÿÿFŠÿÿHŒÿÿHÿÿB€ïÿ †ÿÿÿÿÿÿÿÿÿ‡6ÿ?…·ÿ@òÿD†þÿC„ÿÿ@ÿÿ={ÿÿ:uÿÿ2lÿÿ2iÿ2iÿ?5oÿÿAzÿÿDÿÿG…ÿÿJˆÿÿKÿÿLŽÿÿNÿÿN‘ÿÿH„ðÿŠÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ0ŒdÿG‚îÿJˆÿÿF„ÿÿDÿÿAyÿÿ3mÿÿ2iÿ2iÿ?7pÿÿI€ÿÿL…ÿÿOŠÿÿQŽÿÿS‘ÿÿT’ÿÿV”ÿÿV–ÿÿPŠðÿ $ÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿ6‘cÿO‡îÿQÿÿN‰ÿÿL…ÿÿIÿÿ4nÿÿ2iÿ2iÿ?9rÿÿS†ÿÿU‹ÿÿXÿÿZ“ÿÿ[—ÿÿ\˜ÿÿ^šÿÿ_›ÿÿYñÿ+•/ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ4•IÿU”»ÿXŽóÿZ•ýÿZ“ÿÿWÿÿU‹ÿÿR…ÿÿ5nÿÿ2iÿ2iÿ?žAÿ>žAÿ>žAÿ>žAÿ?ŸBÿ[¤†ÿoŸáÿq¢ùÿs§ÿÿr§ÿÿq¥ÿÿp¤ÿÿo¡ÿÿmÿÿkšÿÿh•ÿÿ8pÿÿ2iÿ1iÿ?Bxÿÿužÿÿw¢ÿÿy¦ÿÿ{¨ÿÿ|«ÿÿ}¬ÿÿ~®ÿÿ~¯ÿÿz¦ôÿUªXÿN¦QÿN¦QÿN¦Qÿ_«tÿy©Ïÿ{§öÿ~®þÿ¯ÿÿ~¯ÿÿ~®ÿÿ}¬ÿÿ|«ÿÿ{¨ÿÿx¥ÿÿw¢ÿÿtÿÿ:qÿÿ1iÿ1hÿ?Ezÿÿ¦ÿÿƒªÿÿ…®ÿÿ‡°ÿÿ‡³ÿÿˆ´ÿÿ‰µÿÿжÿÿ†®õÿd²gÿ^®`ÿe±nÿ²»ÿ‡®óÿ‰´ýÿжÿÿжÿÿжÿÿжÿÿ‰µÿÿˆ´ÿÿ‡²ÿÿ‡°ÿÿ„­ÿÿƒªÿÿ€¦ÿÿ;rÿÿ1hÿ0gÿ?H{ÿÿޝÿÿ²ÿÿ‘µÿÿ“¸ÿÿ“ºÿÿ”»ÿÿ•¼ÿÿ•¼ÿÿ’¶öÿ½‰ÿ†º©ÿ“·ìÿ”¹ûÿ–½ÿÿ–½ÿÿ–½ÿÿ–½ÿÿ–½ÿÿ•¼ÿÿ•¼ÿÿ”»ÿÿ“¹ÿÿ“¸ÿÿ‘µÿÿ²ÿÿ®ÿÿ=sÿÿ0gÿ0fÿ?K|ÿÿš¸ÿÿœºÿÿ½ÿÿŸ¿ÿÿ Áÿÿ Âÿÿ Ãÿÿ¡Ãÿÿ Áüÿž½÷ÿŸ¿ùÿ¡Ãþÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ Ãÿÿ Âÿÿ ÁÿÿŸ¿ÿÿ½ÿÿœºÿÿš·ÿÿ>rÿÿ0fÿ0fÿ?N}ÿÿ§Àÿÿ©Ãÿÿ©ÅÿÿªÆÿÿ¬Èÿÿ¬Éÿÿ­Êÿÿ­Êÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Êÿÿ­Êÿÿ¬Éÿÿ¬ÈÿÿªÆÿÿ©Äÿÿ¨Âÿÿ¦Àÿÿ?rÿÿ0fÿ0fÿ?Q~ÿÿ³ÉÿÿµÊÿÿ¶Ìÿÿ¶Îÿÿ·Ïÿÿ¸Ðÿÿ¸Ðÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¸Ðÿÿ¸Ðÿÿ·Ïÿÿ¶Íÿÿ¶Ìÿÿ´Êÿÿ³Èÿÿ@rÿÿ0fÿ0fÿ?P~ÿÿÀÑÿÿÀÒÿÿÁÔÿÿÂÕÿÿÃÖÿÿÃ×ÿÿÃ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÃ×ÿÿÃ×ÿÿÃÖÿÿÃÖÿÿÂÕÿÿÁÓÿÿÀÒÿÿÀÑÿÿ>pÿÿ0fÿ0fÿ'8kÿÿÄÓÿÿÌÚÿÿÍÛÿÿÎÜÿÿÎÝÿÿÎÝÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÝÿÿÎÝÿÿÎÝÿÿÍÜÿÿÍÛÿÿÌÚÿÿ¸Êÿÿ0fÿú0fÿ 0fÿÁm“ÿÿÏÜÿÿØãÿÿØãÿÿØäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿØäÿÿØãÿÿØãÿÿÊØÿÿ^ˆÿÿ0fÿ¢0fÿ0fÿÁ9lÿÿWƒÿÿ[†ÿÿ\‡ÿÿ\‰ÿÿ]Šÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]Šÿÿ\‰ÿÿ\‡ÿÿ\†ÿÿV‚ÿÿ5jÿþ0fÿ®0fÿ 0fÿ'0fÿ?0fÿ?0fÿ?0fÿ?0gÿ?1hÿ?1iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?1iÿ?1hÿ?0gÿ?0fÿ?0fÿ?0fÿ?0fÿ>0fÿ À€€€€€€€€€€€€€€€€€€€€€€€€€€€ÀÀðÿÿÿÿ(0 `    2S$8§%<—²%<—²&=—²&>—²&?—²&?—²&?—²&?—²&?—²&?—²&?—²&?—²&>—²&=—²%<—²%<—²#7‰¤'H)h;/cø÷0fþþ1iþþ3mþþ4oþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ5qþþ4oþþ3lþþ1iþþ0fþþ.aóð&a).bö0fþþ2kÿÿ5pÿÿ8tþþ:wÿÿ;xÿÿ;yþþ;yÿÿ;yÿÿ;yÿÿ;yþþ;yÿÿ;yþþ;yÿÿ;xÿÿ:vþþ8tÿÿ5pÿÿ2kþþ0fÿÿ.bõ…/eþ¯1iþþ5pÿÿ:vÿÿ;zþþ=~ÿÿ?€ÿÿ?þþ?ÿÿ?ÿÿ?ÿÿ?€þþ?ÿÿ?€þþ?ÿÿ?€ÿÿ=}þþ;zÿÿ9uÿÿ5pþþ1iÿÿ/eþ—0fþ¯3mþþ9tþþ;zþþ?€þþAƒþþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA„þþA‚þþ>þþ;zþþ8tþþ3lþþ0fþ—1hÿ¯5pþþ:wÿÿ=~ÿÿAƒþþB†ÿÿCˆÿÿA„úþ?‚Õÿ@öÿCˆþÿCˆþþCˆÿÿCˆþþCˆÿÿCˆÿÿB†þþA‚ÿÿ=}ÿÿ:vþþ4oÿÿ0gÿ—1iÿ¯6qþþ;yÿÿ?€ÿÿA…þþCˆÿÿEŠÿÿ@óþ ƒÿ„Pÿ>‚ÑÿC‡úþE‹ÿÿE‹þþE‹ÿÿDŠÿÿCˆþþA„ÿÿ?€ÿÿ;xþþ5qÿÿ1iÿ—1jþ¯7rþþ;zþþ@þþB†þþCˆþþE‹þþA‚óþƒ þ~þ þ*ƒxþBƒéþFŠýþF‹þþE‹þþCˆþþA…þþ?€þþ;yþþ6qþþ1jþ—2kÿ¯7rþþ;zÿÿ@ÿÿB†þþCˆÿÿF‹ÿÿA‚óþƒ ÿÿÿ~þ‚"ÿ5ƒ¢þC„õÿE‹þÿCˆþþB†ÿÿ?ÿÿ;yþþ6qÿÿ2jÿ—2kÿ¯8sþþ<{ÿÿAÿÿB†þþD‰ÿÿFŒÿÿB‚óþ ƒ ÿÿÿþÿþ…Eÿ>ƒÉÿB„ùþB†ÿÿ@ÿÿþ;>þ;>þEŸSþc ³þo öþq¦þþo¤þþn¢þþlžþþi™þþ^þþ1jþ—1jÿ¯rœþþy¤ÿÿ|©ÿÿ}¬þþ®ÿÿ€°ÿÿ}©÷þVªYÿP§SÿS©Xÿlªžþ~ªîÿ€¯ýþ°ÿÿ€¯ÿÿ®þþ}¬ÿÿ|¨ÿÿy£þþl—ÿÿ1jÿ—1iÿ¯¦þþ‰¯ÿÿŒ³ÿÿ¶þþޏÿÿ¹ÿÿ´÷þlµoÿwµ‘ÿ‹´áÿŽ·üþ¹ÿÿ¹þþ¹ÿÿ¹ÿÿŽ·þþµÿÿŒ³ÿÿ‰®þþy ÿÿ1iÿ—1hþ¯‘±þþš¹þþœ½þþž¿þþžÁþþŸÂþþžÀüþ¿çþ¾úþŸÂþþŸÂþþŸÂþþŸÂþþŸÂþþŸÂþþžÁþþ¿þþœ½þþš¹þþ‡ªþþ1hþ—0fÿ¯¡¼þþ«Äÿÿ¬Çÿÿ®Éþþ®Êÿÿ¯Ëÿÿ¯Ìþþ¯Ìÿÿ¯Ìÿÿ¯Ìÿÿ¯Ìþþ¯Ìÿÿ¯Ìþþ¯Ìÿÿ¯Ëÿÿ®Êþþ­Éÿÿ¬Çÿÿ«Äþþ–³ÿÿ0fÿ—0fÿ¯°Æþþ»Ïÿÿ¼Ñÿÿ½Òþþ½Óÿÿ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôÿÿ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôÿÿ½Óþþ½Òÿÿ¼Ðÿÿ»Ïþþ£¼ÿÿ0fÿ—/eþ¡©¿þþÊÙþþËÚþþÌÛþþÍÜþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÌÜþþÌÛþþËÚþþÊÙþþšµþþ0fþ‰0fÿ>RþúµÈÿÿÎÜÿÿÏÝþþÏÝÿÿÐÞÿÿÐÞþþÐÞÿÿÐÞÿÿÐÞÿÿÐÞþþÐÞÿÿÐÞþþÐÞÿÿÐÝÿÿÏÝþþÏÝÿÿÎÛÿÿ¯ÄþþIyÿõ0fÿ,0fþ>0fÿ¡0fÿ®0fþ¯1hÿ¯1jÿ¯1kþ¯2kÿ¯2kÿ¯2kÿ¯2kþ¯2kÿ¯2kþ¯1jÿ¯1iÿ¯1hþ¯0fÿ¯0fÿ¯0fþœ0fÿ2€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿ(  @ +0000000000 * %@ ¤0fþþ1jÿÿ3mÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ3mÿÿ1jÿÿ0fýý$:’– !6ˆ0fþþ4nÿÿ8tÿÿ;yÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ;yÿÿ8tÿÿ3mÿÿ0fþü6ˆ 92jÿÿ9uÿÿ=}ÿÿ@‚ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿ@‚ÿÿ=|ÿÿ8tÿÿ1jÿÿ994nÿÿ;yÿÿ@‚ÿÿB‡ÿÿB…úÿ1ƒ¢ÿB…öÿD‰ÿÿD‰ÿÿD‰ÿÿB‡ÿÿ@‚ÿÿ;yÿÿ3mÿÿ9:5pÿÿ<|ÿÿA…ÿÿD‰ÿÿB…÷ÿ ÿ/ÿ8„ºÿE‰ûÿF‹ÿÿD‰ÿÿA„ÿÿ<{ÿÿ5oÿÿ;;5pÿÿ<|ÿÿA…ÿÿD‰ÿÿC…÷ÿ ÿÿÿ‚Wÿ?…ÜÿDˆþÿA„ÿÿ<{ÿÿ5oÿÿ;;9sÿÿB€ÿÿGˆÿÿJÿÿH‰÷ÿ …ÿƒ ÿƒ ÿƒ ÿ „ÿ/…‡ÿF…úÿBÿÿ8rÿÿ;;CzÿÿRŠÿÿV’ÿÿY–ÿÿX’øÿ!$ÿ ÿ ÿ ÿ Ž)ÿ>‹ÿUúÿRŠÿÿAxÿÿ;;Pƒÿÿf˜ÿÿjŸÿÿl£ÿÿkŸøÿ;>ÿ7š:ÿ7š:ÿMvÿhŸàÿl¢þÿjŸÿÿf˜ÿÿM€ÿÿ;:_ÿÿ~¨ÿÿ®ÿÿƒ±ÿÿ‚®ùÿY¬\ÿ`¬rÿz­Íÿƒ°üÿ„²ÿÿƒ°ÿÿ­ÿÿ~§ÿÿ[Šÿÿ;9o˜ÿÿ–¸ÿÿ™¼ÿÿš¿ÿÿš¾üÿ½Éÿš¾ùÿ›Àÿÿ›Àÿÿ›Àÿÿš¿ÿÿ™¼ÿÿ–·ÿÿh“ÿÿ:9~¡ÿÿ¯Çÿÿ±Ëÿÿ²Íÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ²Íÿÿ±Ëÿÿ¯Çÿÿv›ÿÿ99ƒ£ÿÿÇ×ÿÿÈÙÿÿÉÚÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÚÿÿÈÙÿÿÇ×ÿÿyœÿý9 ?qÿ§Ž«ÿÿšµÿÿ›·ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›·ÿÿšµÿÿ‹©ÿþ;nÿ—?Ÿ?Ÿ@ŸAŸBŸBŸBŸBŸAŸ@Ÿ?Ÿ?Ÿ€€Àqxrunner/examples/qxrunnerdemo/qxrunnerdemo.pro0000700000000000000000000000265310506762662021265 0ustar rootroot#---------------------------------------------------------------------- # File: qxrunnerdemo.pro # Purpose: qmake config file for the QxRunner library demo program. #---------------------------------------------------------------------- TEMPLATE = app include(../../qxconfig.pro) TARGET = qxrunnerdemo #---------------------------------------------------------------------- # OS Independent #---------------------------------------------------------------------- QX_LIBDIR = ../../lib # Location of Qx libraries INCLUDEPATH += . ../../include #---------------------------------------------------------------------- # Libraries for linker. #---------------------------------------------------------------------- LIBS += $$qxRunnerLibForLinker() #---------------------------------------------------------------------- # MS Windows #---------------------------------------------------------------------- win32 { RES_FILE = qxrunnerdemo.res debug: QMAKE_CXXFLAGS_DEBUG += $$compilerOptions() } win32:use_dll { DEFINES += QXRUNNER_DLL } #---------------------------------------------------------------------- # Linux/Unix #---------------------------------------------------------------------- unix: { # NOP } #---------------------------------------------------------------------- HEADERS = \ demoitem.h \ demomodel.h SOURCES = \ demoitem.cpp \ demomodel.cpp \ main.cpp qxrunner/examples/qxrunnerdemo/qxrunnerdemo.rc0000700000000000000000000000006310466372734021064 0ustar rootrootIDI_ICON1 ICON DISCARDABLE "qxrunnerdemo.ico" qxrunner/examples/qxrunnerdemo/qxrunnerdemo.res0000700000000000000000000001757010522444735021256 0ustar rootroot ÿÿÿÿ¨ ÿÿÿÿ0 ( @ €   )A P Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q P >&  ''E¬¹/eüû0fÿÿ0fÿÿ1hÿÿ1iÿÿ2kÿÿ2kÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2lÿÿ2kÿÿ2jÿÿ1iÿÿ1gÿÿ0fÿÿ0fÿÿ/cùù%=š¨  %^)MÁ³0fÿÿ0fÿÿ1hÿÿ2lÿÿ3nÿÿ5pÿÿ6qÿÿ7rÿÿ7rÿÿ7rÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7sÿÿ7rÿÿ7rÿÿ7rÿÿ6qÿÿ5pÿÿ3nÿÿ2kÿÿ1hÿÿ0fÿÿ0fÿÿ&C¨•*j,[ä!0fþþ0fÿÿ1jÿÿ3nÿÿ6qÿÿ8sÿÿ:uÿÿ:wÿÿ:xÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ;yÿÿ:xÿÿ:wÿÿ9uÿÿ8sÿÿ5pÿÿ3mÿÿ1iÿÿ0fÿÿ/eþö,Zâ /eþ>0fÿÿ1iÿÿ3nÿÿ7rÿÿ:uÿÿ:xÿÿ;{ÿÿ<}ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ=~ÿÿ<|ÿÿ;zÿÿ:xÿÿ9uÿÿ6qÿÿ3mÿÿ1hÿÿ0fÿÿ/eþ0fÿ?0fÿÿ2lÿÿ6qÿÿ:vÿÿ;yÿÿ<}ÿÿ?€ÿÿ@ÿÿA‚ÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿAƒÿÿA‚ÿÿ@ÿÿ>€ÿÿ<|ÿÿ;yÿÿ9uÿÿ5pÿÿ2kÿÿ0fÿÿ0fÿ0fÿ?1hÿÿ4oÿÿ8tÿÿ;yÿÿ<}ÿÿ@ÿÿAƒÿÿA…ÿÿA†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿB†ÿÿA†ÿÿA„ÿÿA‚ÿÿ?€ÿÿ<|ÿÿ:xÿÿ8sÿÿ3nÿÿ1gÿÿ0fÿ0fÿ?1jÿÿ5pÿÿ:vÿÿ;{ÿÿ?€ÿÿAƒÿÿA†ÿÿB‡ÿÿCˆÿÿB„ûÿ=|ðÿ?€õÿCˆþÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿCˆÿÿB‡ÿÿA…ÿÿA‚ÿÿ>€ÿÿ;zÿÿ9uÿÿ5pÿÿ1iÿÿ0fÿ0gÿ?2kÿÿ7rÿÿ:wÿÿ=}ÿÿ@ÿÿA…ÿÿB‡ÿÿCˆÿÿD‰ÿÿ?~ðÿ‹5ÿ+†pÿAâÿB„ùÿEŠÿÿEŠÿÿEŠÿÿEŠÿÿEŠÿÿD‰ÿÿCˆÿÿB‡ÿÿA„ÿÿ@ÿÿ<|ÿÿ:wÿÿ6qÿÿ2jÿÿ0gÿ1hÿ?2mÿÿ7sÿÿ;yÿÿ>~ÿÿAƒÿÿB†ÿÿCˆÿÿDŠÿÿF‹ÿÿ?~ïÿ „ÿÿ„ÿ5„™ÿAïÿD‰üÿFŒÿÿFŒÿÿEŒÿÿF‹ÿÿD‰ÿÿCˆÿÿA†ÿÿA‚ÿÿ=~ÿÿ:xÿÿ7rÿÿ2kÿÿ1hÿ1iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿEŒÿÿ@~ïÿ „ÿÿÿÿ†>ÿ>‚¿ÿAóÿF‹þÿGŒÿÿEŒÿÿEŠÿÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7rÿÿ2lÿÿ1iÿ2iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿFŒÿÿ@~ïÿ „ÿÿÿÿÿ€ÿ(†eÿA€ÛÿC…÷ÿE‹ÿÿEŠÿÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7rÿÿ2lÿÿ2iÿ2iÿ?3mÿÿ8sÿÿ;yÿÿ>ÿÿAƒÿÿB‡ÿÿCˆÿÿEŠÿÿFŒÿÿ@~ïÿ „ÿÿÿÿÿÿÿ ƒÿ3…ÿBìÿC‡ûÿCˆÿÿB†ÿÿAƒÿÿ=~ÿÿ;yÿÿ7sÿÿ2lÿÿ2iÿ2iÿ?3nÿÿ;uÿÿ>{ÿÿA€ÿÿC„ÿÿEˆÿÿFŠÿÿHŒÿÿHÿÿB€ïÿ †ÿÿÿÿÿÿÿÿÿ‡6ÿ?…·ÿ@òÿD†þÿC„ÿÿ@ÿÿ={ÿÿ:uÿÿ2lÿÿ2iÿ2iÿ?5oÿÿAzÿÿDÿÿG…ÿÿJˆÿÿKÿÿLŽÿÿNÿÿN‘ÿÿH„ðÿŠÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ …ÿ0ŒdÿG‚îÿJˆÿÿF„ÿÿDÿÿAyÿÿ3mÿÿ2iÿ2iÿ?7pÿÿI€ÿÿL…ÿÿOŠÿÿQŽÿÿS‘ÿÿT’ÿÿV”ÿÿV–ÿÿPŠðÿ $ÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿŠÿ6‘cÿO‡îÿQÿÿN‰ÿÿL…ÿÿIÿÿ4nÿÿ2iÿ2iÿ?9rÿÿS†ÿÿU‹ÿÿXÿÿZ“ÿÿ[—ÿÿ\˜ÿÿ^šÿÿ_›ÿÿYñÿ+•/ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ"%ÿ4•IÿU”»ÿXŽóÿZ•ýÿZ“ÿÿWÿÿU‹ÿÿR…ÿÿ5nÿÿ2iÿ2iÿ?žAÿ>žAÿ>žAÿ>žAÿ?ŸBÿ[¤†ÿoŸáÿq¢ùÿs§ÿÿr§ÿÿq¥ÿÿp¤ÿÿo¡ÿÿmÿÿkšÿÿh•ÿÿ8pÿÿ2iÿ1iÿ?Bxÿÿužÿÿw¢ÿÿy¦ÿÿ{¨ÿÿ|«ÿÿ}¬ÿÿ~®ÿÿ~¯ÿÿz¦ôÿUªXÿN¦QÿN¦QÿN¦Qÿ_«tÿy©Ïÿ{§öÿ~®þÿ¯ÿÿ~¯ÿÿ~®ÿÿ}¬ÿÿ|«ÿÿ{¨ÿÿx¥ÿÿw¢ÿÿtÿÿ:qÿÿ1iÿ1hÿ?Ezÿÿ¦ÿÿƒªÿÿ…®ÿÿ‡°ÿÿ‡³ÿÿˆ´ÿÿ‰µÿÿжÿÿ†®õÿd²gÿ^®`ÿe±nÿ²»ÿ‡®óÿ‰´ýÿжÿÿжÿÿжÿÿжÿÿ‰µÿÿˆ´ÿÿ‡²ÿÿ‡°ÿÿ„­ÿÿƒªÿÿ€¦ÿÿ;rÿÿ1hÿ0gÿ?H{ÿÿޝÿÿ²ÿÿ‘µÿÿ“¸ÿÿ“ºÿÿ”»ÿÿ•¼ÿÿ•¼ÿÿ’¶öÿ½‰ÿ†º©ÿ“·ìÿ”¹ûÿ–½ÿÿ–½ÿÿ–½ÿÿ–½ÿÿ–½ÿÿ•¼ÿÿ•¼ÿÿ”»ÿÿ“¹ÿÿ“¸ÿÿ‘µÿÿ²ÿÿ®ÿÿ=sÿÿ0gÿ0fÿ?K|ÿÿš¸ÿÿœºÿÿ½ÿÿŸ¿ÿÿ Áÿÿ Âÿÿ Ãÿÿ¡Ãÿÿ Áüÿž½÷ÿŸ¿ùÿ¡Ãþÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ¡Ãÿÿ Ãÿÿ Âÿÿ ÁÿÿŸ¿ÿÿ½ÿÿœºÿÿš·ÿÿ>rÿÿ0fÿ0fÿ?N}ÿÿ§Àÿÿ©Ãÿÿ©ÅÿÿªÆÿÿ¬Èÿÿ¬Éÿÿ­Êÿÿ­Êÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Ëÿÿ­Êÿÿ­Êÿÿ¬Éÿÿ¬ÈÿÿªÆÿÿ©Äÿÿ¨Âÿÿ¦Àÿÿ?rÿÿ0fÿ0fÿ?Q~ÿÿ³ÉÿÿµÊÿÿ¶Ìÿÿ¶Îÿÿ·Ïÿÿ¸Ðÿÿ¸Ðÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¹Ñÿÿ¸Ðÿÿ¸Ðÿÿ·Ïÿÿ¶Íÿÿ¶Ìÿÿ´Êÿÿ³Èÿÿ@rÿÿ0fÿ0fÿ?P~ÿÿÀÑÿÿÀÒÿÿÁÔÿÿÂÕÿÿÃÖÿÿÃ×ÿÿÃ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÄ×ÿÿÃ×ÿÿÃ×ÿÿÃÖÿÿÃÖÿÿÂÕÿÿÁÓÿÿÀÒÿÿÀÑÿÿ>pÿÿ0fÿ0fÿ'8kÿÿÄÓÿÿÌÚÿÿÍÛÿÿÎÜÿÿÎÝÿÿÎÝÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÞÿÿÏÝÿÿÎÝÿÿÎÝÿÿÍÜÿÿÍÛÿÿÌÚÿÿ¸Êÿÿ0fÿú0fÿ 0fÿÁm“ÿÿÏÜÿÿØãÿÿØãÿÿØäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿÙäÿÿØäÿÿØãÿÿØãÿÿÊØÿÿ^ˆÿÿ0fÿ¢0fÿ0fÿÁ9lÿÿWƒÿÿ[†ÿÿ\‡ÿÿ\‰ÿÿ]Šÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]‹ÿÿ]Šÿÿ\‰ÿÿ\‡ÿÿ\†ÿÿV‚ÿÿ5jÿþ0fÿ®0fÿ 0fÿ'0fÿ?0fÿ?0fÿ?0fÿ?0gÿ?1hÿ?1iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?2iÿ?1iÿ?1hÿ?0gÿ?0fÿ?0fÿ?0fÿ?0fÿ>0fÿ À€€€€€€€€€€€€€€€€€€€€€€€€€€€ÀÀðÿÿÿÿˆ ÿÿÿÿ0 (0 `    2S$8§%<—²%<—²&=—²&>—²&?—²&?—²&?—²&?—²&?—²&?—²&?—²&?—²&>—²&=—²%<—²%<—²#7‰¤'H)h;/cø÷0fþþ1iþþ3mþþ4oþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ6qþþ5qþþ4oþþ3lþþ1iþþ0fþþ.aóð&a).bö0fþþ2kÿÿ5pÿÿ8tþþ:wÿÿ;xÿÿ;yþþ;yÿÿ;yÿÿ;yÿÿ;yþþ;yÿÿ;yþþ;yÿÿ;xÿÿ:vþþ8tÿÿ5pÿÿ2kþþ0fÿÿ.bõ…/eþ¯1iþþ5pÿÿ:vÿÿ;zþþ=~ÿÿ?€ÿÿ?þþ?ÿÿ?ÿÿ?ÿÿ?€þþ?ÿÿ?€þþ?ÿÿ?€ÿÿ=}þþ;zÿÿ9uÿÿ5pþþ1iÿÿ/eþ—0fþ¯3mþþ9tþþ;zþþ?€þþAƒþþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA…þþA„þþA‚þþ>þþ;zþþ8tþþ3lþþ0fþ—1hÿ¯5pþþ:wÿÿ=~ÿÿAƒþþB†ÿÿCˆÿÿA„úþ?‚Õÿ@öÿCˆþÿCˆþþCˆÿÿCˆþþCˆÿÿCˆÿÿB†þþA‚ÿÿ=}ÿÿ:vþþ4oÿÿ0gÿ—1iÿ¯6qþþ;yÿÿ?€ÿÿA…þþCˆÿÿEŠÿÿ@óþ ƒÿ„Pÿ>‚ÑÿC‡úþE‹ÿÿE‹þþE‹ÿÿDŠÿÿCˆþþA„ÿÿ?€ÿÿ;xþþ5qÿÿ1iÿ—1jþ¯7rþþ;zþþ@þþB†þþCˆþþE‹þþA‚óþƒ þ~þ þ*ƒxþBƒéþFŠýþF‹þþE‹þþCˆþþA…þþ?€þþ;yþþ6qþþ1jþ—2kÿ¯7rþþ;zÿÿ@ÿÿB†þþCˆÿÿF‹ÿÿA‚óþƒ ÿÿÿ~þ‚"ÿ5ƒ¢þC„õÿE‹þÿCˆþþB†ÿÿ?ÿÿ;yþþ6qÿÿ2jÿ—2kÿ¯8sþþ<{ÿÿAÿÿB†þþD‰ÿÿFŒÿÿB‚óþ ƒ ÿÿÿþÿþ…Eÿ>ƒÉÿB„ùþB†ÿÿ@ÿÿþ;>þ;>þEŸSþc ³þo öþq¦þþo¤þþn¢þþlžþþi™þþ^þþ1jþ—1jÿ¯rœþþy¤ÿÿ|©ÿÿ}¬þþ®ÿÿ€°ÿÿ}©÷þVªYÿP§SÿS©Xÿlªžþ~ªîÿ€¯ýþ°ÿÿ€¯ÿÿ®þþ}¬ÿÿ|¨ÿÿy£þþl—ÿÿ1jÿ—1iÿ¯¦þþ‰¯ÿÿŒ³ÿÿ¶þþޏÿÿ¹ÿÿ´÷þlµoÿwµ‘ÿ‹´áÿŽ·üþ¹ÿÿ¹þþ¹ÿÿ¹ÿÿŽ·þþµÿÿŒ³ÿÿ‰®þþy ÿÿ1iÿ—1hþ¯‘±þþš¹þþœ½þþž¿þþžÁþþŸÂþþžÀüþ¿çþ¾úþŸÂþþŸÂþþŸÂþþŸÂþþŸÂþþŸÂþþžÁþþ¿þþœ½þþš¹þþ‡ªþþ1hþ—0fÿ¯¡¼þþ«Äÿÿ¬Çÿÿ®Éþþ®Êÿÿ¯Ëÿÿ¯Ìþþ¯Ìÿÿ¯Ìÿÿ¯Ìÿÿ¯Ìþþ¯Ìÿÿ¯Ìþþ¯Ìÿÿ¯Ëÿÿ®Êþþ­Éÿÿ¬Çÿÿ«Äþþ–³ÿÿ0fÿ—0fÿ¯°Æþþ»Ïÿÿ¼Ñÿÿ½Òþþ½Óÿÿ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôÿÿ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôþþ¾Ôÿÿ¾Ôÿÿ½Óþþ½Òÿÿ¼Ðÿÿ»Ïþþ£¼ÿÿ0fÿ—/eþ¡©¿þþÊÙþþËÚþþÌÛþþÍÜþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÍÝþþÌÜþþÌÛþþËÚþþÊÙþþšµþþ0fþ‰0fÿ>RþúµÈÿÿÎÜÿÿÏÝþþÏÝÿÿÐÞÿÿÐÞþþÐÞÿÿÐÞÿÿÐÞÿÿÐÞþþÐÞÿÿÐÞþþÐÞÿÿÐÝÿÿÏÝþþÏÝÿÿÎÛÿÿ¯ÄþþIyÿõ0fÿ,0fþ>0fÿ¡0fÿ®0fþ¯1hÿ¯1jÿ¯1kþ¯2kÿ¯2kÿ¯2kÿ¯2kþ¯2kÿ¯2kþ¯1jÿ¯1iÿ¯1hþ¯0fÿ¯0fÿ¯0fþœ0fÿ2€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿh ÿÿÿÿ0 (  @ +0000000000 * %@ ¤0fþþ1jÿÿ3mÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ5oÿÿ3mÿÿ1jÿÿ0fýý$:’– !6ˆ0fþþ4nÿÿ8tÿÿ;yÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ<{ÿÿ;yÿÿ8tÿÿ3mÿÿ0fþü6ˆ 92jÿÿ9uÿÿ=}ÿÿ@‚ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿA„ÿÿ@‚ÿÿ=|ÿÿ8tÿÿ1jÿÿ994nÿÿ;yÿÿ@‚ÿÿB‡ÿÿB…úÿ1ƒ¢ÿB…öÿD‰ÿÿD‰ÿÿD‰ÿÿB‡ÿÿ@‚ÿÿ;yÿÿ3mÿÿ9:5pÿÿ<|ÿÿA…ÿÿD‰ÿÿB…÷ÿ ÿ/ÿ8„ºÿE‰ûÿF‹ÿÿD‰ÿÿA„ÿÿ<{ÿÿ5oÿÿ;;5pÿÿ<|ÿÿA…ÿÿD‰ÿÿC…÷ÿ ÿÿÿ‚Wÿ?…ÜÿDˆþÿA„ÿÿ<{ÿÿ5oÿÿ;;9sÿÿB€ÿÿGˆÿÿJÿÿH‰÷ÿ …ÿƒ ÿƒ ÿƒ ÿ „ÿ/…‡ÿF…úÿBÿÿ8rÿÿ;;CzÿÿRŠÿÿV’ÿÿY–ÿÿX’øÿ!$ÿ ÿ ÿ ÿ Ž)ÿ>‹ÿUúÿRŠÿÿAxÿÿ;;Pƒÿÿf˜ÿÿjŸÿÿl£ÿÿkŸøÿ;>ÿ7š:ÿ7š:ÿMvÿhŸàÿl¢þÿjŸÿÿf˜ÿÿM€ÿÿ;:_ÿÿ~¨ÿÿ®ÿÿƒ±ÿÿ‚®ùÿY¬\ÿ`¬rÿz­Íÿƒ°üÿ„²ÿÿƒ°ÿÿ­ÿÿ~§ÿÿ[Šÿÿ;9o˜ÿÿ–¸ÿÿ™¼ÿÿš¿ÿÿš¾üÿ½Éÿš¾ùÿ›Àÿÿ›Àÿÿ›Àÿÿš¿ÿÿ™¼ÿÿ–·ÿÿh“ÿÿ:9~¡ÿÿ¯Çÿÿ±Ëÿÿ²Íÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ³Îÿÿ²Íÿÿ±Ëÿÿ¯Çÿÿv›ÿÿ99ƒ£ÿÿÇ×ÿÿÈÙÿÿÉÚÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÛÿÿÉÚÿÿÈÙÿÿÇ×ÿÿyœÿý9 ?qÿ§Ž«ÿÿšµÿÿ›·ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›¸ÿÿ›·ÿÿšµÿÿ‹©ÿþ;nÿ—?Ÿ?Ÿ@ŸAŸBŸBŸBŸBŸAŸ@Ÿ?Ÿ?Ÿ€€À00ÿÿIDI_ICON10   ¨ ˆ  hqxrunner/examples/qxrunnerdemo/qxrunnerdemo.sln0000700000000000000000000000244210502277370021246 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxrunnerdemo", "qxrunnerdemo.vcproj", "{DE143BF4-551B-4EC9-8404-E54BD0391292}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 Debug|Win32 = Debug|Win32 Release_DLL|Win32 = Release_DLL|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug|Win32.ActiveCfg = Debug|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug|Win32.Build.0 = Debug|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release|Win32.ActiveCfg = Release|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal qxrunner/examples/qxrunnerdemo/qxrunnerdemo.vcproj0000700000000000000000000004100110504316636021750 0ustar rootroot qxrunner/include/0000700000000000000000000000000010521421041013035 5ustar rootrootqxrunner/include/qxcppunit/0000700000000000000000000000000010521421041015070 5ustar rootrootqxrunner/include/qxcppunit/cppunititem.h0000700000000000000000000000306210502565472017626 0ustar rootroot/*! * \file cppunititem.h * * \brief Declares class CppUnitItem. */ #ifndef CPPUNITITEM_H #define CPPUNITITEM_H #include #include #include using namespace QxRunner; namespace QxCppUnit { /*! * \brief The CppUnitItem class executes a CppUnit test case. * * The CppUnitItem class registers itself as a test listener and runs * a CppUnit test. In case of failure the item columns contain the * failure information, whereby the textual representation for a * warning is set to 'failure' which complies with CppUnit speech. * The class is designed to execute one individual test and not a test * suite. */ class CppUnitItem : public RunnerItem, private CPPUNIT_NS::TestListener { public: // Operations /*! * Constructs a CppUnit item for one individual \a test with the * test name in \a data and the given \a parent. */ CppUnitItem(const QList& data, RunnerItem* parent = 0, CPPUNIT_NS::Test* test = 0); /*! * Destroys this CppUnit item. */ ~CppUnitItem(); /*! * Runs the test and returns the test result code which is of type * QxRunner::RunnerResult. */ int run(); private: // Operations /*! * Called when a failure occurs while running the test. Records * failure information in the item. */ void addFailure(const CPPUNIT_NS::TestFailure& failure); private: // Attributes CPPUNIT_NS::Test* m_test; }; } // namespace #endif // CPPUNITITEM_H qxrunner/include/qxcppunit/cppunitmodel.h0000700000000000000000000000344610505261244017767 0ustar rootroot/*! * \file cppunitmodel.h * * \brief Declares class CppUnitModel. */ #ifndef CPPUNITMODEL_H #define CPPUNITMODEL_H #include #include using namespace QxRunner; namespace QxCppUnit { /*! * \brief The CppUnitModel class maintains CppUnit data and executes * CppUnit unit tests. * * This class stores CppUnit test data using CppUnitItem objects. The * CppUnit tests referenced by the CppUnitItem objects can be executed. * Test results are prepared for representation in views. * * The expected results from this model are: * * * - QxRunner::RunSuccess - CppUnit test case passed * - QxRunner::RunWarning - CppUnit assertion failed * - QxRunner::RunError - CppUnit reported an error */ class CppUnitModel : public RunnerModel { Q_OBJECT public: // Operations /*! * Constructs a CppUnit model with the given \a parent. The root * item is created and the set of expected results is defined. */ CppUnitModel(QObject* parent = 0); /*! * Destroys this CppUnit model. */ ~CppUnitModel(); /*! * Returns the model name "QxCppUnit". */ QString name() const; /*! * Returns the CppUnit version used. */ QString about() const; /*! * Appends the \a test to the list of CppUnit tests in the model. * \a test can be one individual test or a test suite. */ void addTest(CPPUNIT_NS::Test* test) const; private: // Operations /*! * Helper method to append a CppUnitItem object for the \a test * to the given \a parent. If \a test is a suite then recursively * a CppUnitItem object for each test in the suite is appended. */ void addTestItem(CPPUNIT_NS::Test* test, RunnerItem* parent) const; }; } // namespace #endif // CPPUNITMODEL_H qxrunner/include/qxcppunit/qxcppunit_global.h0000700000000000000000000000132010502362230020616 0ustar rootroot/*! * \file qxcppunit_global.h * * \brief Declares global functions, macros, symbols and the like. */ #ifndef QXCPPUNIT_GLOBAL_H #define QXCPPUNIT_GLOBAL_H #include /*! * Macro to export symbols to DLL with VC++: * * - QXCPPUNIT_DLL_BUILD must be defined when building the DLL. * - QXCPPUNIT_DLL must be defined if linking against the DLL. * - If none of the above are defined then you are building or * linking against the static library. */ #if defined(QXCPPUNIT_DLL_BUILD) # define QXCPPUNIT_EXPORT Q_DECL_EXPORT #elif defined (QXCPPUNIT_DLL) # define QXCPPUNIT_EXPORT Q_DECL_IMPORT #else # define QXCPPUNIT_EXPORT #endif #endif // QXCPPUNIT_GLOBAL_H qxrunner/include/qxcppunit/testrunner.h0000700000000000000000000000331710502551560017472 0ustar rootroot/*! * \file testrunner.h * * \brief Declares class TestRunner. */ #ifndef TESTRUNNER_H #define TESTRUNNER_H #include "qxcppunit_global.h" #include #include namespace CPPUNIT_NS { class Test; } namespace QxRunner { class Runner; } namespace QxCppUnit { class CppUnitModel; /*! * \brief The TestRunner class starts a QxCppUnit application. * * This class creates a CppUnitModel and adds a CppUnitItem object for * each given CppUnit test to the model. It sets an application icon * and then shows the test runner main window on screen. This is the * only class of the library that is used by clients to build a GUI * test runner for CppUnit. */ class QXCPPUNIT_EXPORT TestRunner { public: // Operations /*! * Constructs a test runner. Creates the CppUnitModel instance. */ TestRunner(); /*! * Destroys this test runner. */ virtual ~TestRunner(); /*! * Appends the \a test to the list of CppUnit tests. \a test can be * one individual test or a test suite. */ void addTest(CPPUNIT_NS::Test* test) const; /*! * Appends the \a tests to the list of CppUnit tests. An entry in * \a tests can be one individual test or a test suite. */ void addTests(const CppUnitVector& tests) const; /*! * Sets the application icon and shows the main window. */ void run(); private: // Operations // Copy and assignment not supported. TestRunner(const TestRunner&); TestRunner& operator=(const TestRunner&); private: // Attributes QxRunner::Runner* m_runner; CppUnitModel* m_model; }; } // namespace #endif // TESTRUNNER_H qxrunner/include/qxrunner/0000700000000000000000000000000010522427164014734 5ustar rootrootqxrunner/include/qxrunner/aboutdialog.h0000700000000000000000000000174310500775376017416 0ustar rootroot/*! * \file aboutdialog.h * * \brief Declares class AboutDialog. */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include "ui_aboutdialog.h" namespace QxRunner { class RunnerModel; /*! * \brief The AboutDialog class displays a simple message box about * QxRunner. * * * The message box shows the version of QxRunner, information about * the model in use and the version number of Qt being used. */ class AboutDialog : public QDialog { Q_OBJECT public: // Operations /*! * Constructs an about dialog with the given \a parent * and \a model. */ AboutDialog(QWidget* parent, RunnerModel* model); /*! * Destroys this about dialog. */ ~AboutDialog(); private: // Operations // Copy and assignment not supported. AboutDialog(const AboutDialog&); AboutDialog& operator=(const AboutDialog&); private: // Attributes Ui::AboutDialog ui; }; } // namespace #endif // ABOUTDIALOG_H qxrunner/include/qxrunner/appsettings.h0000700000000000000000000000376310522426404017456 0ustar rootroot/*! * \file appsettings.h * * \brief Declares class AppSettings. */ #ifndef APPSETTINGS_H #define APPSETTINGS_H #include "runnerwindowclient.h" namespace Ui { class RunnerWindow; } namespace QxRunner { class RunnerWindow; /*! * \brief The AppSettings class manages persistent platform-independent * application settings. * * This helper class is introduced to avoid bloating the main window * class with rudimentary code. It is a friend of RunnerWindow because * it not only reads or writes the settings file but also applies the * settings to the main window by restoring window geometry and the like * at program start-up. For missing or invalid settings reasonable defaults * are used. * * \sa \ref settings */ class AppSettings : public RunnerWindowClient { public: // Operations /*! * Constructs an application settings object with the * given \a window. */ AppSettings(RunnerWindow* window); /*! * Destroys this application settings. */ virtual ~AppSettings(); /*! * Writes all settings into the INI file. */ void writeSettings(); /*! * Reads and applies settings which have nothing to do with * window geometry or the layout of the view columns. */ void applyBaseSettings() const; /*! * Reads and applies settings which define window geometry. * Restores the main window's toolbars and dock widgets. */ void applyWindowSettings() const; /*! * Shows the columns in the views which have been visible at last * program exit and resizes them. */ void applyColumnSettings() const; private: // Operations /*! * Returns the pointer to the internal structure of the main window. */ Ui::RunnerWindow* windowUi() const; // Copy and assignment not supported. AppSettings(const AppSettings&); AppSettings& operator=(const AppSettings&); private: // Attributes QString m_organization; QString m_application; }; } // namespace #endif // APPSETTINGS_H qxrunner/include/qxrunner/columnsdialog.h0000700000000000000000000000460310502006516017743 0ustar rootroot/*! * \file columnsdialog.h * * \brief Declares class ColumnsDialog. */ #ifndef COLUMNSDIALOG_H #define COLUMNSDIALOG_H #include "ui_columnsdialog.h" #include "runnerwindowclient.h" #include namespace QxRunner { /*! * \brief The ColumnsDialog class allows defining the visible columns * in the views. * * The user can select which columns in the views should be visible. The * the available columns are retrieved from the views in the main window. * If the dialog is accepted the selection is applied to the views and * the columns get reasonable column widths. If the dialog is closed with * \c Cancel the columns remain unchanged. * * The first column in a view is always visible therefore its visibility * can't be changed. For a hidden view the column visibilities also can't * be changed. */ class ColumnsDialog : public QDialog, public RunnerWindowClient { Q_OBJECT public: // Operations /*! * Constructs a columns selection dialog with the given \a parent * for the views contained in the \a window. */ ColumnsDialog(QWidget* parent, RunnerWindow* window); /*! * Destroys this columns selection dialog. */ ~ColumnsDialog(); private slots: /*! * All selections are applied to the views but the dialog remains * open. */ void apply(); /*! * All selections are applied to the views and the dialog gets * closed. */ void accept(); /*! * The dialog gets closed without applying any selections. */ void reject(); private: // Operations /*! * Disables \a item for selection and changes its color to the * color for disabled GUI elelements. */ void setItemDisabled(QTreeWidgetItem* item) const; /*! * Handles key press events for the tree view. A space mimicks * a mouse click. +/- expand/collapse branches. */ bool eventFilter(QObject* obj, QEvent* event); // Copy and assignment not supported. ColumnsDialog(const ColumnsDialog&); ColumnsDialog& operator=(const ColumnsDialog&); private: // Attributes Ui::ColumnsDialog ui; QTreeWidgetItem* m_runnerTopItem; QTreeWidgetItem* m_resultsTopItem; QBitArray m_prevRunnerColumns; QBitArray m_prevResultsColumns; QList m_prevRunnerColumnSizes; QList m_prevResultsColumnSizes; }; } // namespace #endif // COLUMNSDIALOG_H qxrunner/include/qxrunner/proxymodelcommon.h0000700000000000000000000000311610501566342020523 0ustar rootroot/*! * \file proxymodelcommon.h * * \brief Declares class ProxyModelCommon. */ #ifndef PROXYMODELCOMMON_H #define PROXYMODELCOMMON_H #include namespace QxRunner { /*! * \brief The ProxyModelCommon class defines a set of common methods * for sorting filter proxy models. * * This class should be seen as a 'static decorator' for the proxy * model classes. It is not intended to be used directly, but must * be subclassed. * * \sa \ref views */ class ProxyModelCommon { public: // Operations /*! * Constructs a proxy model common. The active flag is set to true. */ ProxyModelCommon(); /*! * Destroys this proxy model common. */ virtual ~ProxyModelCommon(); /*! * Returns the active flag. */ bool isActive() const; /*! * Sets the \a active flag. */ void setActive(bool active); /*! * Returns the array with the flags for columns. */ QBitArray enabledColumns() const; /*! * Sets the enabled flags for columns. True at the corresponding * column position in \a enabledColumns enables, false disables * that column. */ void setEnabledColumns(const QBitArray& enabledColumns); /*! * Returns the enabled flag for \a column. */ bool isColumnEnabled(int column) const; private: // Operations // Copy and assignment not supported. ProxyModelCommon(const ProxyModelCommon&); ProxyModelCommon& operator=(const ProxyModelCommon&); private: // Attributes bool m_active; QBitArray m_enabledColumns; }; } // namespace #endif // PROXYMODELCOMMON_H qxrunner/include/qxrunner/qxrunner_global.h0000700000000000000000000000333510521424522020310 0ustar rootroot/*! * \file qxrunner_global.h * * \brief Declares global functions, macros, symbols and the like. */ #ifndef QXRUNNER_GLOBAL_H #define QXRUNNER_GLOBAL_H #include /*! * Macro to export symbols to DLL with VC++: * * - QXRUNNER_DLL_BUILD must be defined when building the DLL. * - QXRUNNER_DLL must be defined if linking against the DLL. * - If none of the above are defined then you are building or * linking against the static library. */ #if defined(QXRUNNER_DLL_BUILD) # define QXRUNNER_EXPORT Q_DECL_EXPORT #elif defined (QXRUNNER_DLL) # define QXRUNNER_EXPORT Q_DECL_IMPORT #else # define QXRUNNER_EXPORT #endif #define QXRUNNER_VERSION_STR "0.9.2" namespace QxRunner { /*! * Returns the version number of QxRunner at run-time as a string * (for example, "1.0.0"). This may be a different version than the * version the application was compiled against. */ const char* version(); /*! * Result types handled by QxRunner. * * \sa \ref result_types */ enum RunnerResult { NoResult = 0, //!< No result available, item not run yet. RunSuccess = 1, //!< Item completed successfully. RunInfo = 2, //!< Item completed successfully and has an info. RunWarning = 4, //!< Item completed with a warning. RunError = 8, //!< Item completed with an error. RunFatal = 16, //!< Item completed with a fatal error. RunException = 32 //!< Item not completed due to an unhandled error. }; /*! * This constant defines all reasonable results returned by runner * items, provided for convenience. */ const int AllResults = RunSuccess | RunInfo | RunWarning | RunError | RunFatal; } // namespace #endif // QXRUNNER_GLOBAL_H qxrunner/include/qxrunner/resultsmodel.h0000700000000000000000000000562610500776376017653 0ustar rootroot/*! * \file resultsmodel.h * * \brief Declares class ResultsModel. */ #ifndef RESULTSMODEL_H #define RESULTSMODEL_H #include #include namespace QxRunner { class RunnerItem; /*! * \brief The ResultsModel class maintains results data in a * non-hierarchical list. * * This class stores the results of runner items. Actually not the * result values of type QxRunner::RunnerResult but runner item * indexes are kept. * * \sa \ref results_model and \ref runner_item_index */ class ResultsModel : public QAbstractListModel { Q_OBJECT public: // Operations /*! * Constructs a results model with the given \a headerData and * \a parent. */ ResultsModel(const QStringList& headerData, QObject* parent = 0); /*! * Destroys this results model. */ ~ResultsModel(); /*! * Returns the data stored under the given \a role for the item * referred to by \a index. */ QVariant data(const QModelIndex& index, int role) const; /*! * Returns the data for the given \a role and \a section in the * header with the specified \a orientation. */ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; /*! * Returns the number of rows. This corresponds to the number of * available results. \a parent is ignored. */ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*! * Returns the number of columns. \a parent is ignored. */ int columnCount(const QModelIndex& parent = QModelIndex()) const; /*! * Returns the result located at \a row. If no entry is at the * given position QxRunner::NoResult is returned. */ int result(int row) const; /*! * Returns the runner item index related to the results model * \a index. */ QModelIndex mapToRunnerItemIndex(const QModelIndex& index) const; /*! * Returns the results model index related to the runner item * index \a runnerItemIndex. */ QModelIndex mapFromRunnerItemIndex(const QModelIndex& runnerItemIndex) const; public slots: /*! * Adds \a runnerItemIndex at the end of the results list. Increases * the number of rows by one. */ void addResult(const QModelIndex& runnerItemIndex); /*! * Removes all result entries. Forces attached views to update. */ void clear(); private: // Operations /*! * Returns the runner item referred to by \a runnerItemIndex. */ RunnerItem* itemFromIndex(const QModelIndex& runnerItemIndex) const; // Copy and assignment not supported. ResultsModel(const ResultsModel&); ResultsModel& operator=(const ResultsModel&); private: // Attributes QStringList m_headerData; QList m_runnerItemIndexes; typedef QMap RunnerItemMap; RunnerItemMap m_runnerItemMap; }; } // namespace #endif // RESULTSMODEL_H qxrunner/include/qxrunner/resultsproxymodel.h0000700000000000000000000000451610501376752020745 0ustar rootroot/*! * \file resultsproxymodel.h * * \brief Declares class ResultsProxyModel. */ #ifndef RESULTSPROXYMODEL_H #define RESULTSPROXYMODEL_H #include "qxrunner_global.h" #include "proxymodelcommon.h" #include namespace QxRunner { class ResultsModel; /*! * \brief The ResultsProxyModel class provides support for sorting and * filtering data passed between ResultsModel and a view. * * When the model is set to inactive no data is returned at all. When a * column of the model is disabled, no data is returned for that column. * * Row filtering is based on the result for a particular row. Rows with * a QxRunner::RunException result are never filtered out. * * \sa \ref views */ class ResultsProxyModel : public QSortFilterProxyModel, public ProxyModelCommon { Q_OBJECT public: // Operations /*! * Constructs a results proxy model with the given \a parent and * \a filter. */ ResultsProxyModel(QObject* parent, int filter = QxRunner::AllResults); /*! * Destroys this results proxy model. */ ~ResultsProxyModel(); /*! * Returns the data stored under the given \a role for the item * referred to by \a index. */ QVariant data(const QModelIndex& index, int role) const; /*! * Returns the active filter. Is a combination of OR'ed * QxRunner::RunnerResult values. */ int filter() const; /*! * Sets the \a filter for the model. Is a combination of OR'ed * QxRunner::RunnerResult values. Result types defined in the * filter are included in the model. */ void setFilter(int filter); protected: // Operations /*! * Returns true if the value in the item in the row indicated by * \a source_row should be included in the model. \a source_parent * is ignored. */ bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; private: // Operations /*! * Returns the model that contains the data that is available * through the proxy model. */ ResultsModel* model() const; // Copy and assignment not supported. ResultsProxyModel(const ResultsProxyModel&); ResultsProxyModel& operator=(const ResultsProxyModel&); private: // Attributes int m_filter; }; } // namespace #endif // RESULTSPROXYMODEL_H qxrunner/include/qxrunner/resultsviewcontroller.h0000700000000000000000000000364510500776552021624 0ustar rootroot/*! * \file resultsviewcontroller.h * * \brief Declares class ResultsViewController. */ #ifndef RESULTSVIEWCONTROLLER_H #define RESULTSVIEWCONTROLLER_H #include "viewcontrollercommon.h" #include namespace QxRunner { class ResultsModel; class ResultsProxyModel; /*! * \brief The ResultsViewController class provides functionality for * the results view. * * This helper class is introduced to avoid bloating the main window * class with code specific for views representing data from ResultsModel. * * Sorting of data isn't available as long as there is no data to * represent. When the model contains data then clicking on a column * header sorts the data according to that column. * * \sa \ref views */ class ResultsViewController : public QObject, public ViewControllerCommon { Q_OBJECT public: // Operations /*! * Constructs a results view controller with the given \a parent * and \a view. */ ResultsViewController(QObject* parent, QTreeView* view); /*! * Destroys this results view controller. */ ~ResultsViewController(); /*! * Enables sorting if \a enable is true, otherwise disables * sorting. */ void enableSorting(bool enable) const; /*! * Returns the model that contains the data that is available * through the proxy model. */ ResultsModel* resultsModel() const; /*! * Returns the proxy model that the view is presenting. */ ResultsProxyModel* resultsProxyModel() const; private slots: /*! * Enables sortign when the model has data, otherwise disables * sorting. */ void setupSorting() const; private: // Operations // Copy and assignment not supported. ResultsViewController(const ResultsViewController&); ResultsViewController& operator=(const ResultsViewController&); }; } // namespace #endif // RESULTSVIEWCONTROLLER_H qxrunner/include/qxrunner/runner.h0000700000000000000000000000274310501375212016420 0ustar rootroot/*! * \file runner.h * * \brief Declares class Runner. */ #ifndef RUNNER_H #define RUNNER_H #include "qxrunner_global.h" class QIcon; namespace QxRunner { class RunnerModel; /*! * \brief The Runner class starts a QxRunner application. * * This class creates the main window and shows it on screen. When * the main window closes QApplication also quits. * * The runner can be given an application icon, typically displayed in * the top-left corner of windows. This icon overrides the QxRunner * default icon. Not to be confused with the icon of the executable * application file itself as presented on the desktop. To change this * it is necessary to employ a platform-dependent technique as * described in the Qt documentation. */ class QXRUNNER_EXPORT Runner { public: // Operations /*! * Constructs a runner with the given \a model. */ Runner(RunnerModel* model); /*! * Destroys this runner. * * \note * Deleting the model provided at construction time is left to the * owner of the model instance. */ virtual ~Runner(); /*! * Shows the main window. */ void run(); /*! * Sets the application \a icon. */ void setWindowIcon(const QIcon& icon); private: // Operations // Copy and assignment not supported. Runner(const Runner&); Runner& operator=(const Runner&); private: // Attributes RunnerModel* m_model; QIcon* m_icon; }; } // namespace #endif // RUNNER_H qxrunner/include/qxrunner/runneritem.h0000700000000000000000000000655510501772350017310 0ustar rootroot/*! * \file runneritem.h * * \brief Declares class RunnerItem. */ #ifndef RUNNERITEM_H #define RUNNERITEM_H #include "qxrunner_global.h" #include namespace QxRunner { /*! * \brief The RunnerItem class represents an executable item in a tree * view and contains several columns of data. * * This class holds information about its position in the RunnerModel * tree structure, column data and the code that gets executed in a * QxRunner run. * * The class is a basic C++ class. It is not intended to be used directly, * but must be subclassed. It does not inherit from QObject or provide * signals and slots. Subclasses nevertheless can be a QObject, for * example to support localization with \c tr(). * * Subclasses must reimplement the abstract run() method to do useful * application specific work. * * \sa \ref runner_model_item and \ref runner_item_index */ class QXRUNNER_EXPORT RunnerItem { public: // Operations /*! * Constructs a runner item with the given \a parent and the * \a data associated with each column. Ensures that number of * columns equals number of columns in \a parent. Initial result * is set to QxRunner::NoResult. */ RunnerItem(const QList& data, RunnerItem* parent = 0); /*! * Destroys this runner item and all its children. */ virtual ~RunnerItem(); /*! * Returns the item's parent. */ RunnerItem* parent() const; /*! * Returns the child that corresponds to the specified \a row * number in the item's list of child items. */ RunnerItem* child(int row) const; /*! * Adds \a child to the item's list of child items. */ void appendChild(RunnerItem* child); /*! * Returns the number of child items held. */ int childCount() const; /*! * Reports the item's location within its parent's list of items. */ int row() const; /*! * Returns the number of columns of data in the item. */ int columnCount() const; /*! * Returns the data of \a column. */ QVariant data(int column) const; /*! * Sets the data for the \a column to \a value. */ void setData(int column, const QVariant& value); /*! * Returns true if the item is selected for execution, otherwise * false. */ bool isSelected() const; /*! * If \a select is true the item can be executed by QxRunner, * otherwise not. */ void setSelected(bool select); /*! * Returns the result of the last execution. The returned value * is of type QxRunner::RunnerResult. */ int result() const; /*! * Sets the \a result for this item. The given value must be of * type QxRunner::RunnerResult. */ void setResult(int result); /*! * Except for column 0 the data is set to an empty string. The * item's result is set to QxRunner::NoResult. */ void clear(); /*! * The custom code to be executed when an item is run by QxRunner * must be placed in the run method of subclasses. */ virtual int run() = 0; private: // Operations // Copy and assignment not supported. RunnerItem(const RunnerItem&); RunnerItem& operator=(const RunnerItem&); private: // Attributes RunnerItem* m_parentItem; QList m_itemData; QList m_childItems; bool m_selected; int m_result; }; } // namespace #endif // RUNNERITEM_H qxrunner/include/qxrunner/runnermodel.h0000700000000000000000000003032010522132060017424 0ustar rootroot/*! * \file runnermodel.h * * \brief Declares class RunnerModel. */ #ifndef RUNNERMODEL_H #define RUNNERMODEL_H #include "qxrunner_global.h" #include #include #include #include namespace QxRunner { class RunnerItem; class ResultsModel; class RunnerModelThread; /*! * \brief The RunnerModel class maintains the core data and executes * runner items. * * This class stores data using RunnerItem objects that are linked * together in a pointer-based tree structure. * * Selected runner items can be executed. Status about ongoing item * execution is reported with signals. Items execute in a separate * thread which requires thread synchronization. Private classes which * subclass QEvent are used to post data from the thread to this class. * * The model can be set to minimal update mode. In this mode the data() * method returns data for column 0 only and not all signals reporting * item execution status get fired. * * RunnerModel also creates the ResultsModel object which collects * the results of executed runner items. * * \sa \ref runner_model_item and \ref implementation_ascpects */ class QXRUNNER_EXPORT RunnerModel : public QAbstractItemModel { Q_OBJECT friend class RunnerModelThread; public: // Operations /*! * Constructs a runner model with the given \a parent. */ RunnerModel(QObject* parent = 0); /*! * Destroys this runner model. Ongoing runner item execution is * stopped. */ ~RunnerModel(); /*! * Returns the model name. */ virtual QString name() const = 0; /*! * Returns supplementary information. Typically displayed in about * message boxes. */ virtual QString about() const; /*! * Returns the data stored under the given \a role for the item * referred to by \a index. */ QVariant data(const QModelIndex& index, int role) const; /*! * Sets the \a role data for the item at \a index to \a value. * Returns true if successful, otherwise false. */ bool setData (const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); /*! * Returns the item flags for the given \a index. Column 0 is user * checkable, all other columns are read only. */ Qt::ItemFlags flags(const QModelIndex& index) const; /*! * Returns the data for the given \a role and \a section in the * header with the specified \a orientation. */ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; /*! * Returns the index of the item in the model specified by the * given \a row, \a column and \a parent index. */ QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; /*! * Returns the parent of the model item with the given \a index. * The returned index never corresponds to the root item. */ QModelIndex parent(const QModelIndex& index) const; /*! * Returns the number of rows under the given \a parent, or the * number of top-level items if an invalid index is specified. */ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*! * Returns the number of columns for the given \a parent, or for * the root item if an invalid index is specified. */ int columnCount(const QModelIndex& parent = QModelIndex()) const; /*! * Updates all internal counters and emits the signals which report * counter values with the actual counts. */ void countItems(); /*! * Returns the result types expected from runner items. Is a * combination of OR'ed QxRunner::RunnerResult values. */ int expectedResults() const; /*! * Sets the check state for the item at \a index and any children * to \a checked. */ void setItemChecked(const QModelIndex& index, bool checked); /*! * Removes previous results and starts runner item execution. * Forces attached views to update. */ void runItems(); /*! * Tries to stop item execution. Returns true if successful, * otherwise false. Must probably be called several times until * stopping succeeds. */ bool stopItems(); /*! * Fires itemCompleted() for every result contained in the results * model. Forces attached views to update. */ void emitItemResults(); /*! * Returns true if runner items are currently being executed in * the thread, otherwise false. Waits max. \a time millisecons * to determine the return value. */ bool isRunning(unsigned long time = 0) const; /*! * Returns the results model. If no results model exists one is * created. */ ResultsModel* resultsModel(); signals: /*! * This signal is emitted when the runner item referred to by * \a index is started. */ void itemStarted(const QModelIndex& index) const; /*! * This signal is emitted when the runner item referred to by * \a index has completed. */ void itemCompleted(const QModelIndex& index) const; /*! * This signal is emitted when all runner items have completed. */ void allItemsCompleted() const; /*! * This signal is emitted when the number of runner items has * changed. */ void numTotalChanged(int numItems) const; /*! * This signal is emitted when the number of selected runner items * has changed. */ void numSelectedChanged(int numItems) const; /*! * This signal is emitted when the number of started runner items * has changed. */ void numStartedChanged(int numItems) const; /*! * This signal is emitted when the number of completed runner items * has changed. */ void numCompletedChanged(int numItems) const; /*! * This signal is emitted when the number of successfully completed * runner items has changed. */ void numSuccessChanged(int numItems) const; /*! * This signal is emitted when the number of runner items that * returned an info result has changed. */ void numInfosChanged(int numItems) const; /*! * This signal is emitted when the number of runner items that * returned a warning result has changed. */ void numWarningsChanged(int numItems) const; /*! * This signal is emitted when the number of runner items that * returned an error result has changed. */ void numErrorsChanged(int numItems) const; /*! * This signal is emitted when the number of runner items that * returned a fatal error result has changed. */ void numFatalsChanged(int numItems) const; /*! * This signal is emitted when the number of runner items that * produced an unhandled error has changed. */ void numExceptionsChanged(int numItems) const; public slots: /*! * Sets minimal update mode to \a minimalUpdate. */ void setMinimalUpdate(bool minimalUpdate); protected: // Operations /*! * Returns the root item or 0 if no root item exists. */ RunnerItem* rootItem() const; /*! * Sets \a rootItem as the root item. */ void setRootItem(RunnerItem* rootItem); /*! * Sets the result types that must be expected from runner items. * \a expectedResults is a combination of OR'ed * QxRunner::RunnerResult values. */ void setExpectedResults(int expectedResults); /*! * Returns the runner item the \a index refers to. */ RunnerItem* itemFromIndex(const QModelIndex& index) const; private: // Operations /*! * Helper method to return the subset of data when in minimal * update mode. */ QVariant dataForMinimalUpdate(const QModelIndex& index, int role) const; /*! * Helper method to initialize internal data used for item check * state management. */ void initializeSelectionMap(); /*! * Helper method to update internal data used for item check state * management with data from \a index. */ void updateSelectionMap(const QModelIndex& index); /*! * Entry point for thread processing in the model. */ void threadCode(); /*! * Returns true if the thread must stop, otherwise false. */ bool mustStop(); /*! * Sets the stop flag for the thread. */ void setMustStop(bool stop); /*! * Returns true if the thread must wait, otherwise false. If * \a block is true the method waits until false can be returned. */ bool mustWait(bool block = false); /*! * Sets the wait flag for the thread. */ void setMustWait(bool wait); /*! * Helper method to recursively clear all runner items. Starts * with the runner item referred to by \a index. */ void clearItem(const QModelIndex& index); /*! * Helper method to recursively run selected runner items. Starts * with the runner item referred to by \a index. */ void runItem(const QModelIndex& index); /*! * Helper method to recursively fire itemCompleted() for runner * items with a result. Starts with the runner item referred to * by \a index. */ void emitItemResult(const QModelIndex& index); /*! * Sets the textual representation for the execution result in * \a item to \a text. An existing text isn't overwritten. */ void setResultText(RunnerItem* item, const QString& text) const; /*! * Returns true if minimal update mode is on, otherwise false. */ bool isMinimalUpdate() const; /*! * Helper method to recursively set the check state of the parent * item at \a index and its children to \a checked. */ void setParentItemChecked(const QModelIndex& index, bool checked); /*! * Helper method to set the check state of the child item at * \a index to \a checked. */ void setChildItemChecked(const QModelIndex& index, bool checked); /*! * Returns the check state of the item at \a index. Child items * are two-state and parents are tri-state. */ QVariant itemCheckState(const QModelIndex& index) const; /*! * Processes events from the thread and fires signals with data * from the events. Forces attached views to update. */ bool event(QEvent* event); // Copy and assignment not supported. RunnerModel(const RunnerModel&); RunnerModel& operator=(const RunnerModel&); private: // Constants static const int WAIT_TIME_MILLI = 200; private: // Attributes RunnerItem* m_rootItem; RunnerModelThread* m_thread; ResultsModel* m_resultsModel; QMutex m_lock; bool m_stop; bool m_wait; bool m_minimalUpdate; QModelIndex m_startedItemIndex; int m_expectedResults; int m_numSelected; int m_numStarted; int m_numSuccess; int m_numInfos; int m_numWarnings; int m_numErrors; int m_numFatals; int m_numExceptions; typedef QPair SelectionPair; typedef QMap SelectionMap; SelectionMap m_selectionMap; private: // Classes and related constants enum EventType { ItemStateChanged = QEvent::User, ItemGetsStarted, ItemCompleted, AllItemsCompleted }; /*! * Base class for events posted by the thread. The index refers * to the runner item in question. */ class ItemStateChangedEvent : public QEvent { public: // Operations ItemStateChangedEvent(const QModelIndex& index, QEvent::Type type = (QEvent::Type)ItemStateChanged) : QEvent(type), m_index(index) {} QModelIndex index() const { return m_index; } private: // Attributes QModelIndex m_index; }; /*! * Event posted to notify of a started runner item. */ class ItemGetsStartedEvent : public ItemStateChangedEvent { public: // Operations ItemGetsStartedEvent(const QModelIndex& index) : ItemStateChangedEvent(index, (QEvent::Type)ItemGetsStarted) {} }; /*! * Event posted to notify of a completed runner item. */ class ItemCompletedEvent : public ItemStateChangedEvent { public: // Operations ItemCompletedEvent(const QModelIndex& index) : ItemStateChangedEvent(index, (QEvent::Type)ItemCompleted) {} }; /*! * Event posted when all items have completed. The index is invalid. */ class AllItemsCompletedEvent : public ItemStateChangedEvent { public: // Operations AllItemsCompletedEvent(const QModelIndex& index) : ItemStateChangedEvent(index, (QEvent::Type)AllItemsCompleted) {} }; }; } // namespace #endif // RUNNERMODEL_H qxrunner/include/qxrunner/runnermodelthread.h0000700000000000000000000000250610501772350020632 0ustar rootroot/*! * \file runnermodelthread.h * * \brief Declares class RunnerModelThread. */ #ifndef RUNNERMODELTHREAD_H #define RUNNERMODELTHREAD_H #include namespace QxRunner { class RunnerModel; /*! * \brief The RunnerModelThread class enables asynchronous execution * of runner items. * * The RunnerModelThread class enables RunnerModel to asynchronously * execute RunnerItem objects. When the thread is started it calls the * private \c threadCode() method of RunnerModel where the 'real' * threaded code is executed. Therefore RunnerModelThread is a friend * of RunnerModel. */ class RunnerModelThread : public QThread { Q_OBJECT public: // Operations /*! * Constructs a runner model thread with the given \a parent. */ RunnerModelThread(RunnerModel* parent); /*! * Destroys this runner model thread. */ ~RunnerModelThread(); /*! * Causes the current thread to sleep for \a msecs milliseconds. */ void msleep(unsigned long msecs) const; private: // Operations /*! * Reimplemented from QThread. Starts the thread. */ void run(); // Copy and assignment not supported. RunnerModelThread(const RunnerModelThread&); RunnerModelThread& operator=(const RunnerModelThread&); }; } // namespace #endif // RUNNERMODELTHREAD_H qxrunner/include/qxrunner/runnerproxymodel.h0000700000000000000000000000232610500661120020533 0ustar rootroot/*! * \file runnerproxymodel.h * * \brief Declares class RunnerProxyModel. */ #ifndef RUNNERROXYMODEL_H #define RUNNERROXYMODEL_H #include "proxymodelcommon.h" #include namespace QxRunner { /*! * \brief The RunnerProxyModel class provides support for sorting and * filtering data passed between RunnerModel and a view. * * When a column of the model is disabled, no data is returned for * that column. * * \sa \ref views */ class RunnerProxyModel : public QSortFilterProxyModel, public ProxyModelCommon { Q_OBJECT public: // Operations /*! * Constructs a runner proxy model with the given \a parent. */ RunnerProxyModel(QObject* parent); /*! * Destroys this runner proxy model. */ ~RunnerProxyModel(); /*! * Returns the data stored under the given \a role for the item * referred to by \a index. */ QVariant data(const QModelIndex& index, int role) const; private: // Operations // Copy and assignment not supported. RunnerProxyModel(const RunnerProxyModel&); RunnerProxyModel& operator=(const RunnerProxyModel&); }; } // namespace #endif // RUNNERROXYMODEL_H qxrunner/include/qxrunner/runnerviewcontroller.h0000700000000000000000000000510610522427023021414 0ustar rootroot/*! * \file runnerviewcontroller.h * * \brief Declares class RunnerViewController. */ #ifndef RUNNERVIEWCONTROLLER_H #define RUNNERVIEWCONTROLLER_H #include "viewcontrollercommon.h" #include namespace QxRunner { class RunnerModel; class RunnerProxyModel; /*! * \brief The RunnerViewController class provides functionality for * the runner view. * * This helper class is introduced to avoid bloating the main window * class with code specific for views representing data from RunnerModel. * * Most methods of the class facilitate user interaction with the view. * Sorting of data by clicking on a column header isn't supported. * * \sa \ref views and \ref selected_item */ class RunnerViewController : public QObject, public ViewControllerCommon { Q_OBJECT public: // Operations /*! * Constructs a runner view controller with the given \a parent * and \a view. */ RunnerViewController(QObject* parent, QTreeView* view); /*! * Destroys this runner view controller. */ ~RunnerViewController(); /*! * Returns the model that contains the data that is available * through the proxy model. */ RunnerModel* runnerModel() const; /*! * Returns the proxy model that the view is presenting. */ RunnerProxyModel* runnerProxyModel() const; public slots: /*! * Selects all items in the view. */ void selectAll() const; /*! * Unselects all items in the view. */ void unselectAll() const; /*! * Expands all branches in the view. */ void expandAll() const; /*! * Collapses all branches in the view. */ void collapseAll() const; private: // Operations /*! * Helper method to recursively expand all branches. Starts with * the item referred to by \a index. */ void expand(const QModelIndex& index) const; /*! * Helper method to recursively collapse all branches. Starts with * the item referred to by \a index. */ void collapse(const QModelIndex& index) const; /*! * If \a select is true then all items in the view selected, * otherwise unselected. */ void selectAllItems(bool select) const; /*! * Handles key press events for the view. A space mimicks a mouse * click. +/- expand/collapse branches. */ bool eventFilter(QObject* obj, QEvent* event); // Copy and assignment not supported. RunnerViewController(const RunnerViewController&); RunnerViewController& operator=(const RunnerViewController&); }; } // namespace #endif // RUNNERVIEWCONTROLLER_H qxrunner/include/qxrunner/runnerwindow.h0000700000000000000000000002107210522427164017653 0ustar rootroot/*! * \file runnerwindow.h * * \brief Declares class RunnerWindow. */ #ifndef RUNNERWINDOW_H #define RUNNERWINDOW_H #include "ui_runnerwindow.h" #include #include namespace Ui { class StatusWidget; } namespace QxRunner { class AppSettings; class StatusWidget; class RunnerModel; class RunnerProxyModel; class ResultsModel; class ResultsProxyModel; class RunnerViewController; class ResultsViewController; /*! * \brief The RunnerWindow class defines the QxRunner main window. * * The RunnerWindow class presents a RunnerModel and its ResultsModel * in appropriate views to the user and provides commands for their * manipulation. Runner items can be executed. Their results can be * filtered and sorted. * * The current implementation doesn't expect that a previously set * model gets replaced by another one. Nevertheless the code tries * to catch up such a situation by smoothly removing a previous model. * But problems could arise for example when there are still items * executed in the thread of the model to be replaced. * * In minimal update mode only a subset of the item result data is * displayed during item execution. When all items have finished * all result data is shown at once. * * GUI internal synchronization is employed to prevent from user * interactions interfere with the ongoing item execution. * * \sa \ref main_window */ class RunnerWindow : public QMainWindow { Q_OBJECT friend class AppSettings; public: // Operations /*! * Constructs a runner window with the given \a parent and the * specified widget \a flags. */ RunnerWindow(QWidget* parent = 0, Qt::WFlags flags = 0); /*! * Destroys this runner window. * * \note * Deleting the model provided for the main window is left to * the owner of the model instance. */ ~RunnerWindow(); /*! * Shows the main window adapted to the current model and settings. */ void show(); /*! * Sets the \a model for the main window to present. */ void setModel(RunnerModel* model); /*! * Returns the view which presents runner items. */ QTreeView* runnerView() const; /*! * Returns the view which presents result items. */ QTreeView* resultsView() const; /*! * Returns the runner model that contains the data that is * available through the runner proxy model. */ RunnerModel* runnerModel() const; /*! * Returns the proxy model that the runner view is presenting. */ RunnerProxyModel* runnerProxyModel() const; /*! * Returns the results model that contains the data that is * available through the results proxy model. */ ResultsModel* resultsModel() const; /*! * Returns the proxy model that the results view is presenting. */ ResultsProxyModel* resultsProxyModel() const; /*! * Returns true if the results view is visible, otherwise false. */ bool isResultsViewVisible() const; private slots: /*! * Displays the execution progress for \a numItems items. */ void displayProgress(int numItems) const; /*! * Updates the GUI when all items have completed. */ void displayCompleted() const; /*! * Displays the total number \a numItems of items. */ void displayNumTotal(int numItems) const; /*! * Displays the number \a numItems of selected items. */ void displayNumSelected(int numItems) const; /*! * Displays the number \a numItems of completed items. */ void displayNumCompleted(int numItems) const; /*! * Displays the number \a numItems of items that completed * successfully. */ void displayNumSuccess(int numItems) const; /*! * Displays the number \a numItems of items that returned an * info result. */ void displayNumInfos(int numItems) const; /*! * Displays the number \a numItems of items that returned a * warning result. */ void displayNumWarnings(int numItems) const; /*! * Displays the number \a numItems of items that returned an * error result. */ void displayNumErrors(int numItems) const; /*! * Displays the number \a numItems of items that returned a * fatal result. */ void displayNumFatals(int numItems) const; /*! * Displays the number \a numItems of items that produced an * unhandled error. */ void displayNumExceptions(int numItems) const; /*! * Highlights the runner view row where the data of the runner * item referred to by \a runnerItemIndex is displayed. */ void highlightRunningItem(const QModelIndex& runnerItemIndex) const; /*! * Sets the filter in the results model. The filter is determinded * from the enabled filter buttons. */ void setResultsFilter() const; /*! * Highlights the results view row that corresponds to the runner * proxy model selection in \a selected. \a deselected is ignored. */ void syncResultWithRunnerItem(const QItemSelection& selected, const QItemSelection& deselected) const; /*! * Highlights the runner view row that corresponds to the results * proxy model selection in \a selected. \a deselected is ignored. */ void syncRunnerItemWithResult(const QItemSelection& selected, const QItemSelection& deselected) const; /*! * Ensures that the view which has the focus shows a focus rect * in the row referred to by \a index. */ void ensureFocusRect(const QModelIndex& index); /*! * Ensures that the highlighted row in every view is visible. */ void scrollToHighlightedRows() const; /*! * Exectues the items in the model. */ void runItems(); /*! * Stops item execution. If first stopping attempt isn't successfull * the StoppingDialog is shown. */ void stopItems(); /*! * Helper method needed to sync the results display with the results * dock widget visibility. Ensures highlighted rows are visible. */ void showResults(bool show); /*! * Shows the columns selection dialog. */ void showColumnsSelection(); /*! * Shows the settings dialog. */ void showSettings(); /*! * Shows the about dialog. */ void showAbout(); private: // Operations /*! * Disables and modifies widgets and signals before running items. */ void disableControlsBeforeRunning(); /*! * Enables and modifies widgets and signals after item execution * has finished. */ void enableControlsAfterRunning() const; /*! * If \a enable is true the actions for item manipulation are * enabled, otherwise disabled. */ void enableItemActions(bool enable) const; /*! * If \a enable is true the filter buttons are enabled, otherwise * disabled. */ void enableResultsFilter(bool enable) const; /*! * If \a enable is true syncResultWithRunnerItem() is enabled, * otherwise disabled. */ void enableRunnerItemSync(bool enable) const; /*! * If \a enable is true syncRunnerItemWithResult() is enabled, * otherwise disabled. */ void enableResultSync(bool enable) const; /*! * Sets a suitable current index in the results view so the view * has a focus rect and behaves 'normal' when it gets the focus. */ void ensureCurrentResult() const; /*! * Disables or removes menu items adapted to the model. */ void adjustMenus() const; /*! * Sets \a numItems as text in \a labelForText. If \a numItems * is 0 the labels are hidden, otherwise made visible. */ void displayStatusNum(QLabel* labelForText, QLabel* labelForPic, int numItems) const; /*! * Returns true if the GUI and model are in minimal update mode, * otherwise false. */ bool isMinimalUpdate() const; /*! * Returns the status widget. */ Ui::StatusWidget* statusWidget() const; /*! * Returns the runner view controller. */ RunnerViewController* runnerController() const; /*! * Returns the results view controller. */ ResultsViewController* resultsController() const; /*! * Writes settings to the INI file and ends the program. If items are * running the user can choose to terminate 'the hard way'. */ void closeEvent(QCloseEvent* event); // Copy and assignment not supported. RunnerWindow(const RunnerWindow&); RunnerWindow& operator=(const RunnerWindow&); private: // Attributes Ui::RunnerWindow ui; StatusWidget* m_statusWidget; QSemaphore m_sema; QBrush m_highlightBrush; RunnerViewController* m_runnerViewController; ResultsViewController* m_resultsViewController; }; } // namespace #endif // RUNNERWINDOW_H qxrunner/include/qxrunner/runnerwindowclient.h0000700000000000000000000000402510501772222021044 0ustar rootroot/*! * \file runnerwindowclient.h * * \brief Declares class RunnerWindowClient. */ #ifndef RUNNERWINDOWCLIENT_H #define RUNNERWINDOWCLIENT_H #include namespace QxRunner { class RunnerWindow; class RunnerModel; class RunnerProxyModel; class ResultsModel; class ResultsProxyModel; /*! * \brief The RunnerWindowClient class simplifies access to RunnerWindow. * * The RunnerWindowClient class defines a set of methods for accessing * objects and attributes exposed by the main window. Most of the * methods delegate requests to RunnerWindow. This class is intended * to be subclassed or used directly. */ class RunnerWindowClient { public: // Operations /*! * Constructs a runner window client for the given \a window. */ RunnerWindowClient(RunnerWindow* window); /*! * Destroys this runner window client. */ virtual ~RunnerWindowClient(); /*! * Returns the main window. */ RunnerWindow* window() const; /*! * Returns the runner view from the main window. */ QTreeView* runnerView() const; /*! * Returns the results view from the main window. */ QTreeView* resultsView() const; /*! * Returns the runner model from the main window. */ RunnerModel* runnerModel() const; /*! * Returns the runner proxy model from the main window. */ RunnerProxyModel* runnerProxyModel() const; /*! * Returns the results model from the main window. */ ResultsModel* resultsModel() const; /*! * Returns the results proxy model from the main window. */ ResultsProxyModel* resultsProxyModel() const; /*! * Returns true if the results view in the main window is * visible, otherwise false. */ bool isResultsViewVisible() const; private: // Operations // Copy and assignment not supported. RunnerWindowClient(const RunnerWindowClient&); RunnerWindowClient& operator=(const RunnerWindowClient&); private: // Attributes RunnerWindow* m_window; }; } // namespace #endif // RUNNERWINDOWCLIENT_H qxrunner/include/qxrunner/settingsdialog.h0000700000000000000000000000272710501376752020143 0ustar rootroot/*! * \file settingsdialog.h * * \brief Declares class SettingsDialog. */ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include "ui_settingsdialog.h" #include "runnerwindowclient.h" namespace QxRunner { /*! * \brief The SettingsDialog class allows selection of program * settings. * * The settings can be applied immediately and will be stored in the * settings file at program exit. Currently the only choice presented * in the dialog is whether the views have alternating row colors or not. */ class SettingsDialog : public QDialog, public RunnerWindowClient { Q_OBJECT public: // Operations /*! * Constructs a settings dialog with the given \a parent * and \a window. */ SettingsDialog(QWidget* parent, RunnerWindow* window); /*! * Destroys this settings dialog. */ ~SettingsDialog(); private slots: /*! * All settings are applied but the dialog remains open. */ void apply(); /*! * All settings are applied and the dialog gets closed. */ void accept(); /*! * The dialog gets closed without applying any settings. */ void reject(); private: // Operations // Copy and assignment not supported. SettingsDialog(const SettingsDialog&); SettingsDialog& operator=(const SettingsDialog&); private: // Attributes Ui::SettingsDialog ui; bool m_alternatingRowColors; }; } // namespace #endif // SETTINGSDIALOG_H qxrunner/include/qxrunner/statuswidget.h0000700000000000000000000000205610502307766017645 0ustar rootroot/*! * \file statuswidget.h * * \brief Declares class StatusWidget. */ #ifndef STATUSWIDGET_H #define STATUSWIDGET_H #include "ui_statuswidget.h" namespace QxRunner { /*! * \brief The StatusWidget class presents QxRunner status information. * * The information mainly consists of counters such as number of items, * number of errrors, execution progress and the like. Actual values * must be inserted by clients. The status widget is placed in the * statusbar of the main window. * * \sa \ref main_window */ class StatusWidget : public QWidget { Q_OBJECT public: // Operations /*! * Constructs a status widget with the given \a parent. */ StatusWidget(QWidget* parent); /*! * Destroys this status widget. */ ~StatusWidget(); public: // Attributes Ui::StatusWidget ui; private: // Operations // Copy and assignment not supported. StatusWidget(const StatusWidget&); StatusWidget& operator=(const StatusWidget&); }; } // namespace #endif // STATUSWIDGET_H qxrunner/include/qxrunner/stoppingdialog.h0000700000000000000000000000272010502007604020123 0ustar rootroot/*! * \file stoppingdialog.h * * \brief Declares class StoppingDialog. */ #ifndef STOPPINGDIALOG_H #define STOPPINGDIALOG_H #include "ui_stoppingdialog.h" namespace QxRunner { class RunnerModel; /*! * \brief The StoppingDialog class tries to stop item execution. * * The stopping dialog instructs RunnerModel to stop item execution * without the dialog being visible on the screen. If not successful * at first attempt the dialog is shown to the user to give a visual * hint as well as a chance to interrupt the stopping. */ class StoppingDialog : public QDialog { Q_OBJECT public: // Operations /*! * Constructs a stopping dialog with the given \a parent and * \a model. */ StoppingDialog(QWidget* parent, RunnerModel* model); /*! * Destroys this stopping dialog. */ ~StoppingDialog(); /*! * Reimplemented from QDialog. Returns \c QDialog::Accepted when * stopping was successful, otherwise \c QDialog::Rejected. */ int exec(); private slots: /*! * Reimplemented from QDialog. Ensures that the dialog gets * closed properly. */ void reject(); private: // Operations // Copy and assignment not supported. StoppingDialog(const StoppingDialog&); StoppingDialog& operator=(const StoppingDialog&); private: // Attributes Ui::StoppingDialog ui; RunnerModel* m_model; bool m_shouldClose; }; } // namespace #endif // STOPPINGDIALOG_H qxrunner/include/qxrunner/utils.h0000700000000000000000000000333110505465210016243 0ustar rootroot/*! * \file utils.h * * \brief Declares class Utils. */ #ifndef UTILS_H #define UTILS_H #include class QTreeView; class QVariant; class QModelIndex; class QAbstractItemModel; namespace QxRunner { /*! * \brief The Utils class provides a set of static helper functions. * * * The methods of this class provide logic that must otherwise be * coded identically at different locations in the project. It's not * possible to create an instance of the class. */ class Utils { public: // Operations /*! * Returns the width of the columns in the \a view. */ static QList columnSizes(QTreeView* view); /*! * Returns the icon that represents \a result which must be a * QxRunner::RunnerResult value. */ static QVariant resultIcon(int result); /*! * Returns the source model of the proxy \a model. */ static QAbstractItemModel* modelFromProxy(QAbstractItemModel* model); /*! * Returns the source model index corresponding to the given proxy * \a index from the proxy \a model. */ static QModelIndex modelIndexFromProxy(QAbstractItemModel* model, const QModelIndex& index); /*! * Returns the model index in the proxy \a model given the source * \a index from the source model. */ static QModelIndex proxyIndexFromModel(QAbstractItemModel* model, const QModelIndex& index); private: // Operations /*! * Virtual destructor required when there are virtual methods. */ virtual ~Utils() {}; /*! * Prevents from creating an instance of this class. */ virtual void dummy() = 0; }; } // namespace #endif // UTILS_H qxrunner/include/qxrunner/viewcontrollercommon.h0000700000000000000000000000410110501556156021374 0ustar rootroot/*! * \file viewcontrollercommon.h * * \brief Declares class ViewControllerCommon. */ #ifndef VIEWCONTROLLERCOMMON_H #define VIEWCONTROLLERCOMMON_H #include #include #include #include namespace QxRunner { /*! * \brief The ViewControllerCommon class defines a set of common * methods for view controllers. * * This class should be seen as a 'static decorator' for the view * controller classes. It is not intended to be used directly, but * must be subclassed. * * \sa \ref views */ class ViewControllerCommon { public: // Operations /*! * Constructs a view controller common for the given \a view. Sets * view default properties. */ ViewControllerCommon(QTreeView* view); /*! * Destroys this view controller common. */ virtual ~ViewControllerCommon(); /*! * Returns the index of column 0 of the highlighted row. The index * isn't necessarily the current view index. If no row is highlighted * the returned index is invalid. */ QModelIndex highlightedRow() const; /*! * Highlights the row of the \a index independent of the selection * mode and ensures that it is visible. The given index becomes the * new current index. */ void setHighlightedRow(const QModelIndex& index) const; protected: // Operations /*! * Returns the view widget. */ QTreeView* view() const; /*! * Returns the header of the view widget. */ QHeaderView* header() const; /*! * Returns the model that contains the data that is available * through the proxy model. */ QAbstractItemModel* model() const; /*! * Returns the proxy model that the view is presenting. */ QSortFilterProxyModel* proxyModel() const; private: // Operations // Copy and assignment not supported. ViewControllerCommon(const ViewControllerCommon&); ViewControllerCommon& operator=(const ViewControllerCommon&); private: // Attributes QTreeView* m_view; }; } // namespace #endif // VIEWCONTROLLERCOMMON_H qxrunner/lib/0000700000000000000000000000000010522450211012162 5ustar rootrootqxrunner/license.txt0000700000000000000000000000142310502364334013612 0ustar rootrootQxRunner Library QxCppUnit Library Copyright (C) 2006 systest.ch This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA qxrunner/make_clean0000700000000000000000000000072710505524530013436 0ustar rootroot#/usr/bin/csh # make_clean # # Removes files in the lib directory and all temporary files/directories. rm -f lib/* rm -f Makefile* rm -rf doc/qxrunner rm -rf doc/qxcppunit rm *~ foreach theDir (src/qxrunner examples/qxrunnerdemo src/qxcppunit examples/qxcppunitdemo) rm -f $theDir/*~ rm -f $theDir/Makefile* rm -rf $theDir/.debug rm -rf $theDir/.debug_shared rm -rf $theDir/.release rm -rf $theDir/.release_shared rm -rf $theDir/.generatedfiles end # foreach qxrunner/make_clean.bat0000700000000000000000000000136610504525354014207 0ustar rootroot@echo off REM REM make_clean.bat REM REM Removes files in the lib directory and all temporary files/directories. del /F/S/Q lib\*.* del qxrunner_all.ncb del/A:H *.suo del Makefile* rmdir /S/Q .\doc\qxrunner rmdir /S/Q .\doc\qxcppunit REM rmdir /S/Q .\doc\html REM rmdir /S/Q .\doc\latex call :MAKE_CLEAN src\qxrunner call :MAKE_CLEAN examples\qxrunnerdemo call :MAKE_CLEAN src\qxcppunit call :MAKE_CLEAN examples\qxcppunitdemo goto EOF REM REM Subroutines REM :MAKE_CLEAN del .\%1\*.ncb del .\%1\*.pdb del/A:H .\%1\*.suo del .\%1\*.vcproj.*.user del .\%1\Makefile* rmdir /S/Q .\%1\debug rmdir /S/Q .\%1\debug_dll rmdir /S/Q .\%1\release rmdir /S/Q .\%1\release_dll rmdir /S/Q .\%1\generatedfiles :EOF qxrunner/qmake.ppr0000700000000000000000000000074710510255336013260 0ustar rootroot[Config] Relative path=1 Compilator.SaveAll=0 Compilator.Capture=0 Compilator.HideOutput=0 DefaultCPIndex=0 LogtoEnd=1 DontOpen=0 FileFormat=0 [Project tree] qmake +Ordner qxconfig.pro src\qxrunner\qxrunner.pro src\qxcppunit\qxcppunit.pro examples\qxrunnerdemo\qxrunnerdemo.pro examples\qxcppunitdemo\qxcppunitdemo.pro qxrunner_all.pro [Open project files] 0=Neu1.txt [Selected Project Files] Main= Selected=Neu1.txt [Neu1.txt] TopLine=1 Caret=1,1 qxrunner/qxconfig.pro0000700000000000000000000002130510506761226013775 0ustar rootroot#---------------------------------------------------------------------- # File: qxconfig.pro # Purpose: Configuration parameters and functions for Qx projects. # PreCond: TEMPLATE variable must be set. #---------------------------------------------------------------------- LANGUAGE = C++ #---------------------------------------------------------------------- # If QX_CONFIG_MODIFIER is 'true' the following values can be provided # in the CONFIG variable for simplified compiler and linker options # specification. If set to 'false' the standard qmake handling of the # CONFIG variable is applied. # # Value Description # ----- ----------- # debug_static Build target in debug mode. If target is a library # create it as static. If target is an app link it with # debug static libraries (if possible). This is the # default. # debug_dll Build target in debug mode. If target is a library # create it as a DLL/shared image. If target is an app # link it with debug DLL's/shared images. # release_static Build target in release mode. If target is a library # create it as static. If target is an app link it with # release static libraries (if possible). # release_dll Build target in release mode. If target is a library # create it as a DLL/shared image. If target is an app # link it with release DLL's/shared images. #---------------------------------------------------------------------- QX_CONFIG_MODIFIER = true #---------------------------------------------------------------------- # CONFIG set up. Assigns unique options to the CONFIG variable. #---------------------------------------------------------------------- CONFIG -= debug_and_release build_all # Not convincing CONFIG += qt warn_on contains(QX_CONFIG_MODIFIER, true) { config_done = false # Do some cleaning first CONFIG = $$unique(CONFIG) CONFIG -= debug release dll staticlib use_staticlib use_dll debug_dll { CONFIG -= debug_dll CONFIG += debug contains(TEMPLATE, lib) { CONFIG += dll } contains(TEMPLATE, app) { CONFIG += use_dll } config_done = true } release_static { CONFIG -= release_static CONFIG += release contains(TEMPLATE, lib) { CONFIG += staticlib } contains(TEMPLATE, app) { CONFIG += use_staticlib } config_done = true } release_dll { CONFIG -= release_dll CONFIG += release contains(TEMPLATE, lib) { CONFIG += dll } contains(TEMPLATE, app) { CONFIG += use_dll } config_done = true } contains(config_done, false) { # debug_static / default CONFIG -= debug_static CONFIG += debug contains(TEMPLATE, lib) { CONFIG += staticlib } contains(TEMPLATE, app) { CONFIG += use_staticlib } } message(******************************) debug:staticlib: message(Mode: debug staticlib) debug:dll: message(Mode: debug dll) debug:use_staticlib: message(Mode: debug use_staticlib) debug:use_dll: message(Mode: debug use_dll) release:staticlib: message(Mode: release staticlib) release:dll: message(Mode: release dll) release:use_staticlib: message(Mode: release use_staticlib) release:use_dll: message(Mode: release use_dll) message(******************************) } #---------------------------------------------------------------------- # Definition of configuration specific library base filenames. #---------------------------------------------------------------------- QX_RUNNERFILENAME = qxrunner QX_CPPUNITFILENAME = qxcppunit CPPUNITFILENAME = cppunit debug { QX_RUNNERFILENAME = $${QX_RUNNERFILENAME}d QX_CPPUNITFILENAME = $${QX_CPPUNITFILENAME}d } win32:debug { CPPUNITFILENAME = $${CPPUNITFILENAME}d # No debug version of CppUnit library on Linux? } win32:dll { QX_RUNNERFILENAME = $${QX_RUNNERFILENAME}_dll QX_CPPUNITFILENAME = $${QX_CPPUNITFILENAME}_dll CPPUNITFILENAME = $${CPPUNITFILENAME}_dll } win32:use_dll { QX_RUNNERFILENAME = $${QX_RUNNERFILENAME}_dll QX_CPPUNITFILENAME = $${QX_CPPUNITFILENAME}_dll CPPUNITFILENAME = $${CPPUNITFILENAME}_dll } unix:dll { QX_RUNNERFILENAME = $${QX_RUNNERFILENAME}_shared QX_CPPUNITFILENAME = $${QX_CPPUNITFILENAME}_shared } unix:use_dll { QX_RUNNERFILENAME = $${QX_RUNNERFILENAME}_shared QX_CPPUNITFILENAME = $${QX_CPPUNITFILENAME}_shared } #---------------------------------------------------------------------- # Definition of configuration specific intermediate directories. #---------------------------------------------------------------------- win32 { debug { OBJECTS_DIR = debug } release { OBJECTS_DIR = release } dll { OBJECTS_DIR = $${OBJECTS_DIR}_dll } use_dll { OBJECTS_DIR = $${OBJECTS_DIR}_dll } RCC_DIR = generatedfiles } unix { debug { OBJECTS_DIR = .debug } release { OBJECTS_DIR = .release } dll { OBJECTS_DIR = $${OBJECTS_DIR}_shared } use_dll { OBJECTS_DIR = $${OBJECTS_DIR}_shared } RCC_DIR = .generatedfiles } DESTDIR = $$OBJECTS_DIR UI_DIR = $$RCC_DIR MOC_DIR = $${RCC_DIR}/$${OBJECTS_DIR} #====================================================================== # Helper Functions. See the code for referenced variables. #====================================================================== #---------------------------------------------------------------------- # Replace / with \ in given path. #---------------------------------------------------------------------- defineReplace(winPath) { variable = $$1 variable ~= s'/'\' return($$variable) } #---------------------------------------------------------------------- # Prepare command for library copy to lib folder after build. #---------------------------------------------------------------------- defineReplace(winCopyLib) { excludefile = $$winPath($${DESTDIR}/xcopy_exclude.txt) libdir = $$winPath($$QX_LIBDIR) files = $$winPath($${DESTDIR}/$${TARGET}*) copy_cmd = @echo .exp > $$excludefile copy_cmd += | @echo .ilk >> $$excludefile copy_cmd += | xcopy/C/R/Y/EXCLUDE:$$excludefile $$files $$libdir return($$copy_cmd) } #---------------------------------------------------------------------- # Returns compiler options. Right now for MSVC debug mode only. #---------------------------------------------------------------------- defineReplace(compilerOptions) { compiler_options = "" win32:debug { # MSVC creates a program database file (.pdb) in debug mode tmp = $$find(MAKEFILE_GENERATOR, MSVC) !isEmpty(tmp) { pdbfile = $$winPath($${DESTDIR}/$${TARGET}.pdb) compiler_options = /Fd"$$pdbfile" } } return($$compiler_options) } #---------------------------------------------------------------------- # Returns filename of QxRunner library suitable for input to linker. #---------------------------------------------------------------------- defineReplace(qxRunnerLibForLinker) { win32 { libname = $$winPath($${QX_LIBDIR}/$${QX_RUNNERFILENAME}.lib) } unix { libname = -L$$QX_LIBDIR -l$$QX_RUNNERFILENAME } return($$libname) } #---------------------------------------------------------------------- # Returns filename of QxCppUnit library suitable for input to linker. #---------------------------------------------------------------------- defineReplace(qxCppUnitLibForLinker) { win32 { libname = $$winPath($${QX_LIBDIR}/$${QX_CPPUNITFILENAME}.lib) } unix { libname = -L$$QX_LIBDIR -l$$QX_CPPUNITFILENAME } return($$libname) } #---------------------------------------------------------------------- # Returns filename of CppUnit library suitable for input to linker. #---------------------------------------------------------------------- defineReplace(cppUnitLibForLinker) { win32 { libname = $$winPath($$(CPPUNIT)/lib/$${CPPUNITFILENAME}.lib) } unix { libname = -L$$(CPPUNIT)/lib -l$$CPPUNITFILENAME } return($$libname) } qxrunner/qxrunner_all.pro0000700000000000000000000000075510504525414014672 0ustar rootroot#---------------------------------------------------------------------- # File: qxrunner_all.pro # Purpose: qmake config file to create all Qx libraries and demo # programs. Set the CONFIG variable in the particular config # files to build in a specific mode. #---------------------------------------------------------------------- TEMPLATE = subdirs SUBDIRS = src/qxrunner \ src/qxcppunit \ examples/qxrunnerdemo \ examples/qxcppunitdemo qxrunner/qxrunner_all.sln0000700000000000000000000001037510472620524014667 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxrunner", "src\qxrunner\qxrunner.vcproj", "{A143759E-685E-4553-8325-AA3968DF8C65}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxrunnerdemo", "examples\qxrunnerdemo\qxrunnerdemo.vcproj", "{DE143BF4-551B-4EC9-8404-E54BD0391292}" ProjectSection(ProjectDependencies) = postProject {A143759E-685E-4553-8325-AA3968DF8C65} = {A143759E-685E-4553-8325-AA3968DF8C65} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxcppunitdemo", "examples\qxcppunitdemo\qxcppunitdemo.vcproj", "{B97D5D1F-00EE-4EEA-8263-CF79555C0446}" ProjectSection(ProjectDependencies) = postProject {E3359260-0C42-4B09-84FF-2B056F0C173A} = {E3359260-0C42-4B09-84FF-2B056F0C173A} {A143759E-685E-4553-8325-AA3968DF8C65} = {A143759E-685E-4553-8325-AA3968DF8C65} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxcppunit", "src\qxcppunit\qxcppunit.vcproj", "{E3359260-0C42-4B09-84FF-2B056F0C173A}" ProjectSection(ProjectDependencies) = postProject {A143759E-685E-4553-8325-AA3968DF8C65} = {A143759E-685E-4553-8325-AA3968DF8C65} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 Debug|Win32 = Debug|Win32 Release_DLL|Win32 = Release_DLL|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A143759E-685E-4553-8325-AA3968DF8C65}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug|Win32.ActiveCfg = Debug|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug|Win32.Build.0 = Debug|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release|Win32.ActiveCfg = Release|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release|Win32.Build.0 = Release|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug|Win32.ActiveCfg = Debug|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Debug|Win32.Build.0 = Debug|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release|Win32.ActiveCfg = Release|Win32 {DE143BF4-551B-4EC9-8404-E54BD0391292}.Release|Win32.Build.0 = Release|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug|Win32.ActiveCfg = Debug|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Debug|Win32.Build.0 = Debug|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release|Win32.ActiveCfg = Release|Win32 {B97D5D1F-00EE-4EEA-8263-CF79555C0446}.Release|Win32.Build.0 = Release|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug|Win32.ActiveCfg = Debug|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug|Win32.Build.0 = Debug|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release|Win32.ActiveCfg = Release|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal qxrunner/README.txt0000700000000000000000000000425210510260102013113 0ustar rootrootQxRunner Library for Windows ============================ Building with the Visual Studio IDE ----------------------------------- These instructions are valid for the Visual Studio 2005 IDE. 1. Open the solution file qxrunner.sln in the QXRUNNER\src\qxrunner directory. 2. Select the configurations of your choice in the Batch build dialog and press the appropriate button to start the build process. Building from the Command Line ------------------------------ These instructions are valid for building the library from the command line. Be mindful of setting the environment for using the build tools of your choice. 1. Open a command window. 2. Go to the QXRUNNER\src\qxrunner directory. 3. Enter qmake qxrunner.pro 4. Enter nmake QxRunner Library for Linux (Unix) ================================= These instructions are valid for building the library from the command line. 1. Open a terminal window. 2. Go to the QXRUNNER/src/qxrunner directory. 3. Enter qmake qxrunner.pro 4. Enter make QxCppUnit Library for Windows ============================= Building with the Visual Studio IDE ----------------------------------- These instructions are valid for the Visual Studio 2005 IDE. 1. Open the solution file qxcppunit.sln in the QXRUNNER\src\qxcppunit directory. 2. Select the configurations of your choice in the Batch build dialog and press the appropriate button to start the build process. Building from the Command Line ------------------------------ These instructions are valid for building the library from the command line. Be mindful of setting the environment for using the build tools of your choice. 1. Open a command window. 2. Go to the QXRUNNER\src\qxcppunit directory. 3. Enter qmake qxcppunit.pro 4. Enter nmake QxCppUnit Library for Linux (Unix) ================================== These instructions are valid for building the library from the command line. 1. Open a terminal window. 2. Go to the QXRUNNER/src/qxcppunit directory. 3. Enter qmake qxcppunit.pro 4. Enter make qxrunner/src/0000700000000000000000000000000010521421041012201 5ustar rootrootqxrunner/src/qxcppunit/0000700000000000000000000000000010522450243014243 5ustar rootrootqxrunner/src/qxcppunit/cppunititem.cpp0000700000000000000000000000302210502352652017313 0ustar rootroot/*! * \file cppunititem.cpp * * \brief Implements class CppUnitItem. */ #include "cppunititem.h" #include #include #include namespace QxCppUnit { CppUnitItem::CppUnitItem(const QList& data, RunnerItem* parent, CPPUNIT_NS::Test* test) : RunnerItem(data, parent), m_test(test) { } CppUnitItem::~CppUnitItem() { } int CppUnitItem::run() { if (child(0)) { return QxRunner::NoResult; // Have nothing to do as a parent } // Expect the best. setResult(QxRunner::RunSuccess); // Prepare for receiving failure notifications. CPPUNIT_NS::TestResult testResult; testResult.addListener(this); // Run the test m_test->run(&testResult); return result(); } void CppUnitItem::addFailure(const CPPUNIT_NS::TestFailure& failure) { CPPUNIT_NS::Exception* e = failure.thrownException(); QVariant msg = QString(e->what()).trimmed(); QVariant fileName; QVariant lineNumber; CPPUNIT_NS::SourceLine line = failure.sourceLine(); if (line.isValid()) { fileName = QString(line.fileName().c_str()).trimmed(); lineNumber = QString().setNum(line.lineNumber()); } setData(2, msg); setData(3, fileName); setData(4, lineNumber); if (failure.isError()) { setResult(QxRunner::RunError); } else { setResult(QxRunner::RunWarning); setData(1, "Failure"); // Use CppUnit terminology } } } // namespace qxrunner/src/qxcppunit/cppunitmodel.cpp0000700000000000000000000000274010502351454017462 0ustar rootroot/*! * \file cppunitmodel.cpp * * \brief Implements class CppUnitModel. */ #include "cppunitmodel.h" #include "cppunititem.h" namespace QxCppUnit { CppUnitModel::CppUnitModel(QObject* parent) : RunnerModel(parent) { // Data for column headers is stored in the root item. QList rootData; rootData << tr("Test Name") << tr("Result") << tr("Message") << tr("File Name") << tr("Line Number"); setRootItem(new CppUnitItem(rootData)); // Define the set of expected results. setExpectedResults(QxRunner::RunWarning | QxRunner::RunError); } CppUnitModel::~CppUnitModel() { } QString CppUnitModel::name() const { return tr("QxCppUnit"); } QString CppUnitModel::about() const { QString version(CPPUNIT_VERSION); QString aboutModel = tr("for CppUnit") + " " + version; return aboutModel; } void CppUnitModel::addTest(CPPUNIT_NS::Test* test) const { // Recursively add the tests to the model. addTestItem(test, rootItem()); } void CppUnitModel::addTestItem(CPPUNIT_NS::Test* test, RunnerItem* parent) const { QString testName = QString::fromLatin1(test->getName().c_str()); QList columnData; columnData << testName; CppUnitItem* item = new CppUnitItem(columnData, parent, test); parent->appendChild(item); // Could be a suite with several tests. for (int i = 0; i < test->getChildTestCount(); i++) { addTestItem(test->getChildTestAt(i), item); } } } // namespace qxrunner/src/qxcppunit/mainpage.h0000700000000000000000000001063210502626650016207 0ustar rootroot/*! * \file mainpage.h * * \brief Contains documentation. * * This file contains text and doxygen formatting commands for the * \ref main "Main Page" and other parts of the API documentation. */ /*!*/ /*! \page license License \verbatim QxCppUnit Library Copyright (C) 2006 systest.ch This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA \endverbatim */ namespace QxCppUnit { // Enables doxygen to create links to documented items /*!*/ /*! \mainpage \image html qxcppunit_64x64.png \section intro Introduction The QxCppUnit library provides a GUI frontend for CppUnit test execution. It is based on the QxRunner and Qt libraries. It can be used to unit test any kind of C++ software, it's not limited to Qt applications. This library is just a thin wrapper around the QxRunner library. Actually the idea to write a Qt test runner with a user-friendly GUI led to the development of the QxRunner library. The QxCppUnit library mainly consists of the CppUnitItem class, which subclasses QxRunner::RunnerItem, and the CppUnitModel class derived from QxRunner::RunnerModel. The TestRunner class populates a CppUnitModel instance with CppUnitItem objects and uses a QxRunner::Runner instance to show the GUI on the screen. To write a GUI test runner for CppUnit just the TestRunner class is needed as described in the \ref examples page. */ /*!*/ /*! \page implementation_ascpects Implementation Aspects \section symbols Exported Symbols This applies for the Win32 world only. By default symbols of the library are 'hidden' when created as a DLL. Therefore symbols, in particular classes, that must be accessible from the outside of the library are exported with the QXCPPUNIT_EXPORT macro: \code class QXCPPUNIT_EXPORT TestRunner { public: // Operations ... \endcode Only the TestRunner class is exported right now, the other classes are for internal use only. This might be reconsidered in the future and more classes could become exported to be used somewhere outside the library. \section result_types Result Types See the CppUnitModel class for the result types handled by the library. */ /*!*/ /*! \namespace QxCppUnit \brief Namespace for the QxCppUnit library entities. \namespace QxRunner \brief Namespace of the QxRunner Library. \namespace CPPUNIT_NS \brief The CppUnit library exposes its classes in the CPPUNIT_NS namespace. */ /*!*/ /*! \page examples Examples The demo program shipped with the QxCppUnit library can be used as the starting point for writing a GUI test runner for CppUnit. It has some CppUnit test fixtures with simple test cases which succeed or fail and uses a TestRunner instance in the main program to launch the GUI. \section demo_test_example A CppUnit Test Example This is one of the test fixtures of the demo program. Of course this is a very simple test and only used for demonstration purposes. It isn't intended to show how to write CppUnit tests. \includelineno testexamples2.cpp \section demo_main The Demo Main Program The main program is straightforward: \includelineno main.cpp */ } // namespace qxrunner/src/qxcppunit/qxcppunit.pro0000700000000000000000000000341010506761476017040 0ustar rootroot#---------------------------------------------------------------------- # File: qxcppunit.pro # Purpose: qmake config file for the QxCppUnit library. #---------------------------------------------------------------------- TEMPLATE = lib include(../../qxconfig.pro) TARGET = $$QX_CPPUNITFILENAME # From qxconfig #---------------------------------------------------------------------- # OS Independent #---------------------------------------------------------------------- QX_LIBDIR = ../../lib # Location of Qx libraries RESOURCES += resources/qxcppunit.qrc DEPENDPATH += ../../include/qxcppunit INCLUDEPATH += . $$DEPENDPATH ../../include $$(CPPUNIT)/include #---------------------------------------------------------------------- # Libraries for linker. #---------------------------------------------------------------------- dll { LIBS += $$qxRunnerLibForLinker() LIBS += $$cppUnitLibForLinker() } #---------------------------------------------------------------------- # MS Windows #---------------------------------------------------------------------- win32 { QMAKE_POST_LINK = $$winCopyLib() debug: QMAKE_CXXFLAGS_DEBUG += $$compilerOptions() } win32:dll { DEFINES += QXCPPUNIT_DLL_BUILD DEFINES += QXRUNNER_DLL DEFINES += CPPUNIT_DLL } #---------------------------------------------------------------------- # Linux/Unix #---------------------------------------------------------------------- unix { DESTDIR = $$QX_LIBDIR # Override from qxconfig } #---------------------------------------------------------------------- HEADERS = \ cppunititem.h \ cppunitmodel.h \ qxcppunit_global.h \ testrunner.h SOURCES = \ cppunititem.cpp \ cppunitmodel.cpp \ testrunner.cpp qxrunner/src/qxcppunit/qxcppunit.sln0000700000000000000000000000243410472314204017022 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxcppunit", "qxcppunit.vcproj", "{E3359260-0C42-4B09-84FF-2B056F0C173A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 Debug|Win32 = Debug|Win32 Release_DLL|Win32 = Release_DLL|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug|Win32.ActiveCfg = Debug|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Debug|Win32.Build.0 = Debug|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release|Win32.ActiveCfg = Release|Win32 {E3359260-0C42-4B09-84FF-2B056F0C173A}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal qxrunner/src/qxcppunit/qxcppunit.vcproj0000700000000000000000000005677610510251052017545 0ustar rootroot qxrunner/src/qxcppunit/resources/0000700000000000000000000000000010521421041016246 5ustar rootrootqxrunner/src/qxcppunit/resources/qxcppunit.qrc0000700000000000000000000000015010501357150021016 0ustar rootroot qxcppunit_16x16.png qxrunner/src/qxcppunit/resources/qxcppunit_16x16.png0000700000000000000000000000117110501357026021670 0ustar rootroot‰PNG  IHDRóÿa@IDATxœm“?H•aÆçýÞ{¬JÈ ‡$+*¢¢Q‚‹¢É0\ZZZ…Æpp ÷  ‡,pp ¡°$„Rñ–Wï½ß÷¾ç4Üë½÷À³çwÎûò¡Q§.<ëò € ÿ–aÐû_&6¡ÞÍõÁÙ·ƒg‡ŽvæADíÊLÁ"ÅRͦ?®M.ÎÜõ]熻nŸºu­q¹†YØÿí€f³ ŠéÈÚòðsäÓ ¬o’€8‡àÚûQL‹Jˆâ€œ„bÉø¹¥8ïpÎJ_×"_ —Qý‰¨F4;eCDðˆ°]2~m)I\"˜*£—&¹x¬‹Ù•‡|ß¾ŠˆÇ̰1‹ì– <ÀN)°^$9Åy05¨­qÒ­ò¸w¥ÍL}~Jaï •˜v* Ø-Gð‘$o$ÞP5¨­ƒepåø4}7ßónùo–ž²H¹Z€Ê^$ºˆïPOÀ²æó5v²[KFH#{ûÚ„h¤™¡@£ÕÀ2 ˜ÿq—‰…16«=h¨²21Z €µRffÍ©«ÅóŒzÉâF?âr@ÖÈd3‘øz8¦ Yƒ±ùqæVï£r¤>C³†Z½˜á Ãb Ubè qž+{TšI2 ÄPACÕÃðÀ¾jj!Ý3°¸η=&Ó€†*1-bšF €Þþ™×Àˆ¸¼s®qIÛ[0 õÉuó«os÷^4»Nô rÆöçÌÁ祿W§öþÒ¶]˱ŠvŽIEND®B`‚qxrunner/src/qxcppunit/resources/qxcppunit_64x64.png0000700000000000000000000000677110502362504021707 0ustar rootroot‰PNG  IHDR@@ªiqÞ ÀIDATxœí›k¬]ÅuÇ3{Ÿsçúúq} 0ã$j\ FàD‰*„š–ªº)Š"’V¥ùÔPA«*M#5¢VUÚD¡)U%>´•¬ª4”¥¨jŠƒ!±“@Ü€Î%qƒ± 1Å6÷žÇÌꇙÙ3³Ï>¾7š%í³ß³gý×=fö>ðÿ\Ô¨ùÝL®»òÿ²/L–N/pöäÆsCLmÜÉÅ?w7­©-«|ŒJšS(•?÷+qÛ­eÄõÍÒ_<Á+ß»ÅS‡³ãYïf/¹™‹ß~wýü.`70GªáP~­꼕nq*K BºÎd¼ <,¤'^ù¯ûxãØW«ýª§3WrÅ;?—^{ð8Fˆ³ºR Ð^y\ñzŠƒAD°çºÑ*Ž"ˆ~ãºg* ¸ìúO3½qgØý(ð ¥\½mo½j=³ëZî†`e¯x8ÖHFZNçÑ)a1Fxõõ.Ï>Šã¯.…OjÍmÖràÍS‡ùïCŸ ('·¤Êß”ßù– ÜõÁ«Ù¾mW"±p]«±Z|Šq-ÞE¬ŸyþñŽ¿¶4o-+¸NàäôÆ”“[, ˜Xw%ë·Þ N£‡€ËÞ¾c=ü±kÙ0ÛÆXÁZ°Lµ(Œøµ?g­ª®³BÜÇbHú I?À˜°/X+þZá’-S¼k×<û§Û³ë€ðÀ™“,p Hd°KúÕ«üƒÄá¢Hü; ®<òéù /’ÿøƒ13Hâ3Ó-ö¼÷rþþá|ø n«°àŠË:l½hš^ߣ»ßŠ?žõ£ü~ÜpŒN{"ùN=6ì¾n3{YÀÙì¾.¯0pÅ¥3t{Ðѵƒÿ§zÕ­>tÁ8%´+ Žy‚ªiïOg™ÂR–š-›&9vr`szy 05QÐí JYPÚG|!`¤òã)„òö$fÆô‰A0e‚ˆezªL¨¤à£¿F)%>×Ss(McÏI{cO^‘– ñRñµB%‰4`ŒÐ뉷zLñ ©¬”N+¿¬¸€".ðæ ‡ƒò";ƒf¬¢ÛÊK‚޵ ˜\3Åy©8,’­2«Jædlˆ 4w¨ÅÀ@·¨O+Z¬¬·d”÷ Š4(¾œõkn í©ÆP‚ˆ”Ò ŠóV:Û­´U• T Hb€XÁJj ØP §Œ1ÐíY”Jƒ  â•(’1AÎLï "UÍÖmt9ZÁŠ¾ð ™ ¤Ä&Åö ÷. €ÆX\ÔÁˆñ@{¨ê ÔÒƒˆÁt{¼ÿÚ§Ù±á;<{âFž|q'Kݺ˜B—ÓI‡V *¤ã¡*è{7‹‚θ"9bT|”v…ÜàI\H¢XaÐÞº~?Êœæs_bdžoòøÂû8|ô"`‰¢µU´W„ÄkB¡ã‹ `Y©` ¬gTFJâA€?oŒÐí9å«@¨©±!¶— yÀZ0}À.‚uÃÒõn»ê~®½øz¾òÜ{9öƒ*&(Z3(ݘ¼ÒÔJq¿—Ñ_Õ(ï¡ 1 9]×\ PÙXbÔùzˆÔ¶ý50è H¯ Èå“û¹ë‡øÖñ_âߟ{gOw)ÊitkÆËa* $­³¢'µ~  ‚â‡5*­ ëm\!dÒ©â:© †X@²°K`»CÑt¹qþAvÎ}ÇŽÜÎ×_ØŽ]Z¤hÍ¢ËÉÌJ1¬}=¸AyI¬Gk]!¤Pabm€to`Ä3 !‚Q!ÕÝÿˆ~Oœò5¤2ÍKüÚö?熭7ðÐw ÐE›¢½Á»E->T•mÊ„ïÉ­.‚X‹Ø¼T£\ <,g€uJkÉâ@•ð ˆX# úvY‚\6ñwßp€o¾r+ÿüÌ-œz£‹.;íÙ$mæô%/‰òÑ÷­µžž •ŽçLƒT1@ë71@»FTAª°BÜíKÜ8ÿ\ó‹_å_¿'¾Ž¥¥7)ÛëÑe'^˜@VñYoùüDlåM2¡×·h]åI³JPä%rúUì­€ “åö«ÿ„wo»ž½OßÉ·_ ŠÓ”í (ÝÎkKe}±iôÄØ‘‘£Á~?±~ÆFÆ4Ø€í5Á•È%åSüþîƒÚ¾‡¿;x;Ç~â²EÑ^J×¢¿ÄÜoó `båT T‘Ð?X½©& q\ è<dm ]®ß´—Ÿ¿åßxä…ß⟾õ œyã Ek–¢ìÄIúB,¨ë—ææG0ú§´©”v.€gC`BP´_{L΀`±Ö×úA!<Ì"JƒX÷º ë]ÆR#Á„G^¼‹_ÞþEö>ó›<°ÿº}E99GÑZïé¾Òèž+/XÀõ³ú`Rl5$ƒñàäU.]0 „†«Q„ã¾@󬪊 ¥Kt1ͧ¾ô>Å(Ú&:s Ê¨ÌŠ%ZTî“„}Â’AT.eý!‘ò±a•*/Ö…Åí”×NyOúrê" Û1(ÕŠ¯¿Ä¬Bñ¬w¥%Uœ¨$br0T±j4ÄFüÚ1ÁàÜÚ9¸UþU¹J@ÐÕ^ZQ(Uz‹³Æòµík 1`Xã1 &²e¨½‘Ãá`uãP tØ÷C>ÿbRQxËøYI_ŒSB¬°µ•Ï;ĨªG þf%ñÖWÞú.~<ìfŽ]` à\irh}<–4^¬÷ƒƒx\nóÖ·ø±qX¼{d¯ÉÇ®zôãÄÇÅ3€”Ö¸™(;ˆç—/„jb ¢¼ïÛ>Õ‹@¯¸²‚(qQiDi”DÜãÆCÒñ¤6É^RëK`Ãè [ šºqþ5ðJ{ë[ß!%ˆ²„/I«%¾-õ­Œ‹I’ A@‚µˆíå äÖÏШðröX1.âW_?x *[-¢´ÿLûšàBA¨JY y>e§|PÜöÛhý§;uÇ!äßG‹oØm»¹p‹¨Ò§7“X_{êÆ­_$ùeh{e²tz×ôhöÑŸÉÏÄÉÿo^MÇ˃óIEND®B`‚qxrunner/src/qxcppunit/testrunner.cpp0000700000000000000000000000217110505473170017171 0ustar rootroot/*! * \file testrunner.cpp * * \brief Implements class TestRunner. */ #include "testrunner.h" #include "cppunitmodel.h" #include #include #include // Helper function needed to expand Q_INIT_RESOURCE outside the namespace. static void initQxCppUnitResource() { Q_INIT_RESOURCE(qxcppunit); } using namespace QxRunner; namespace QxCppUnit { TestRunner::TestRunner() { m_runner = 0; m_model = new CppUnitModel; } TestRunner::~TestRunner() { // Delete the runner first. delete m_runner; delete m_model; } void TestRunner::addTest(CPPUNIT_NS::Test* test) const { m_model->addTest(test); } void TestRunner::addTests(const CppUnitVector& tests) const { CppUnitVector::const_iterator it = tests.begin(); for (; it != tests.end(); ++it) { addTest(*it); } } void TestRunner::run() { m_runner = new QxRunner::Runner(m_model); // Application icon. initQxCppUnitResource(); m_runner->setWindowIcon(QIcon(":/icons/qxcppunit_16x16.png")); m_runner->run(); } } // namespace qxrunner/src/qxrunner/0000700000000000000000000000000010522450242014071 5ustar rootrootqxrunner/src/qxrunner/aboutdialog.cpp0000700000000000000000000000211010477307146017101 0ustar rootroot/*! * \file aboutdialog.cpp * * \brief Implements class AboutDialog. */ #include "aboutdialog.h" #include "runnermodel.h" #include "qxrunner_global.h" namespace QxRunner { AboutDialog::AboutDialog(QWidget* parent, RunnerModel* model) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint) { ui.setupUi(this); connect(ui.buttonOk, SIGNAL(clicked()), SLOT(accept())); // QxRunner version. ui.labelVersion->setText(version()); // Model info. QString modelInfo; if (model) { modelInfo = model->name().trimmed(); QString modelAbout = model->about().trimmed(); if (!modelAbout.isEmpty()) { if (!modelInfo.isEmpty()) { modelInfo += "\n"; } modelInfo += modelAbout; } } ui.labelModelName->setText(modelInfo); // Qt version. ui.labelQtVersion->setText(qVersion()); resize(QSize(1, 1)); // Works better than adjustSize() } AboutDialog::~AboutDialog() { } } // namespace qxrunner/src/qxrunner/aboutdialog.ui0000700000000000000000000001174610505503152016736 0ustar rootroot AboutDialog 0 0 214 158 About QxRunner 9 6 Qt::Vertical 41 91 :/icons/qxrunner_64x64.png QFrame::NoFrame QFrame::Plain QxRunner 0 6 Qt::Horizontal QSizePolicy::MinimumExpanding 51 25 OK true 0 6 Model: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Version: 5 5 1 0 0 Qt: 5 5 1 0 dummy 5 5 1 0 0 Qt::Vertical 20 40 qxrunner/src/qxrunner/appsettings.cpp0000700000000000000000000002464210502055616017155 0ustar rootroot/*! * \file appsettings.cpp * * \brief Implements class AppSettings. */ #include "appsettings.h" #include "runnerwindow.h" #include "runnermodel.h" #include "runnerproxymodel.h" #include "resultsproxymodel.h" #include "utils.h" #include #include #include namespace QxRunner { AppSettings::AppSettings(RunnerWindow* window) : RunnerWindowClient(window) { m_organization = "qxrunner"; // Since the application name can vary (this is a library) get the // application name from the executable. QFileInfo fileInfo(QCoreApplication::applicationFilePath()); m_application = fileInfo.baseName(); // Look for the model name entry. QSettings settings(QSettings::IniFormat, QSettings::UserScope, m_organization, m_application); settings.beginGroup("model"); QString modelName = settings.value("name", "").toString(); if (!modelName.trimmed().isEmpty()) { m_application = modelName; // Override executable name } // If there is a model then use its name for the 'real' INI file and // write it into the application INI file. An existing model name entry // gets overwritten. if (runnerModel()) { modelName = runnerModel()->name().toLower(); QFileInfo fileInfo(modelName); modelName = fileInfo.baseName(); // Should be a valid filename // Validate settings filename by writing a test entry and checking // the status of the sync operation. QSettings testSettings(QSettings::IniFormat, QSettings::UserScope, m_organization, modelName); testSettings.setValue("test", "test_only"); testSettings.sync(); QSettings::Status stat = testSettings.status(); if (stat == QSettings::NoError) { testSettings.remove("test"); } else { modelName = ""; } } if (!modelName.trimmed().isEmpty()) { // Remove all settings and write 'pointer' to 'real' settings file. settings.clear(); settings.setValue("name", modelName); m_application = modelName; } settings.endGroup(); } AppSettings::~AppSettings() { } void AppSettings::writeSettings() { QSettings settings(QSettings::IniFormat, QSettings::UserScope, m_organization, m_application); //-------------------- settings.beginGroup("mainwindow"); settings.setValue("maximized", window()->isMaximized()); settings.setValue("size", window()->size()); settings.setValue("pos", window()->pos()); settings.setValue("state", window()->saveState()); settings.endGroup(); //-------------------- // Get the relevant column count. int columnCount = 0; if (runnerModel()) { columnCount = runnerModel()->columnCount(); } settings.beginGroup("runnerview"); QList runnerColumnSizes = Utils::columnSizes(runnerView()); // Data conversions needed for storing the settings. if (columnCount > 0) { QByteArray bArray(columnCount, '0'); for (int i = 0; i < columnCount; i++) { if (runnerProxyModel()->isColumnEnabled(i)) { bArray[i] = '1'; } } settings.setValue("columns", bArray); QList vList; for (int i = 0; i < columnCount; i++) { vList.append(runnerColumnSizes[i]); } settings.setValue("column_sizes", vList); } else { settings.remove("columns"); settings.remove("column_sizes"); } settings.endGroup(); //-------------------- settings.beginGroup("resultsview"); settings.setValue("floating", windowUi()->dockResults->isFloating()); settings.setValue("fatals", windowUi()->buttonFatals->isChecked()); settings.setValue("errors", windowUi()->buttonErrors->isChecked()); settings.setValue("warnings", windowUi()->buttonWarnings->isChecked()); settings.setValue("infos", windowUi()->buttonInfos->isChecked()); QList resultsColumnSizes = Utils::columnSizes(resultsView()); if (columnCount > 0) { QByteArray bArray(columnCount, '0'); for (int i = 0; i < columnCount; i++) { if (resultsProxyModel()->isColumnEnabled(i)) { bArray[i] = '1'; } } settings.setValue("columns", bArray); QList vList; for (int i = 0; i < columnCount; i++) { vList.append(resultsColumnSizes[i]); } settings.setValue("column_sizes", vList); } else { settings.remove("columns"); settings.remove("column_sizes"); } settings.endGroup(); //-------------------- settings.beginGroup("options"); settings.setValue("minimal_update", window()->isMinimalUpdate()); settings.setValue("alternating_row_colors", runnerView()->alternatingRowColors()); settings.endGroup(); } void AppSettings::applyBaseSettings() const { QSettings settings(QSettings::IniFormat, QSettings::UserScope, m_organization, m_application); bool checked; settings.beginGroup("resultsview"); checked = settings.value("fatals", true).toBool(); windowUi()->buttonFatals->setChecked(checked); checked = settings.value("errors", true).toBool(); windowUi()->buttonErrors->setChecked(checked); checked = settings.value("warnings", true).toBool(); windowUi()->buttonWarnings->setChecked(checked); checked = settings.value("infos", true).toBool(); windowUi()->buttonInfos->setChecked(checked); settings.endGroup(); settings.beginGroup("options"); checked = settings.value("minimal_update", false).toBool(); windowUi()->actionMinimalUpdate->setChecked(checked); checked = settings.value("alternating_row_colors", true).toBool(); runnerView()->setAlternatingRowColors(checked); resultsView()->setAlternatingRowColors(checked); settings.endGroup(); } void AppSettings::applyWindowSettings() const { QSettings settings(QSettings::IniFormat, QSettings::UserScope, m_organization, m_application); settings.beginGroup("resultsview"); bool floating = settings.value("floating", false).toBool(); settings.endGroup(); settings.beginGroup("mainwindow"); if (settings.value("maximized", false).toBool()) { window()->showMaximized(); } else { QSize defaultSize(window()->size()); window()->resize(settings.value("size", defaultSize).toSize()); QPoint defaultPos(window()->pos()); window()->move(settings.value("pos", defaultPos).toPoint()); } if (settings.contains("state")) { // In case of a floating dock widget updates must be enabled. if (floating) { window()->setUpdatesEnabled(true); } resultsView()->setMaximumSize(QSize(16777215, 16777215)); window()->restoreState(settings.value("state").toByteArray()); } settings.endGroup(); } void AppSettings::applyColumnSettings() const { // Get the relevant column count. int columnCount = runnerModel()->columnCount(); // Set the runner tree view columns to default sizes first. Results tree view // columns have no default size, they must be adjusted otherwise (manually) // since it's not easy to find useful column spans. for (int i = 0; i < columnCount; i++) { runnerView()->resizeColumnToContents(i); } QSettings settings(QSettings::IniFormat, QSettings::UserScope, m_organization, m_application); // When there are column sizes in the settings then these are applied. QByteArray runnerColumns; QByteArray resultsColumns; QStringList runnerColumnSizes; QStringList resultsColumnSizes; // Try to read the settings. settings.beginGroup("runnerview"); if (settings.contains("columns")) { runnerColumns = settings.value("columns").toByteArray(); runnerColumnSizes = settings.value("column_sizes").toStringList(); } settings.endGroup(); settings.beginGroup("resultsview"); if (settings.contains("columns")) { resultsColumns = settings.value("columns").toByteArray(); resultsColumnSizes = settings.value("column_sizes").toStringList(); } settings.endGroup(); if (runnerColumns.size() < 1 && resultsColumns.size() < 1) { // No settings. return; } // Some validation to prevent from crashes. while (runnerColumns.count() < columnCount) { runnerColumns.append('0'); } while (resultsColumns.count() < columnCount) { resultsColumns.append('0'); } while (runnerColumnSizes.count() < columnCount) { runnerColumnSizes.append("25"); } while (resultsColumnSizes.count() < columnCount) { resultsColumnSizes.append("25"); } // Minimal column width. for (int i = 0; i < columnCount; i++) { if (runnerColumnSizes[i].toInt() < 25) { runnerColumnSizes[i] = "25"; } if (resultsColumnSizes[i].toInt() < 25) { resultsColumnSizes[i] = "25"; } } // Enable resizing. resultsView()->header()->setResizeMode(QHeaderView::Interactive); // Disable stretching first to properly resize the columns. bool runnerViewStretched = runnerView()->header()->stretchLastSection(); bool resultsViewStretched = resultsView()->header()->stretchLastSection(); runnerView()->header()->setStretchLastSection(false); resultsView()->header()->setStretchLastSection(false); QBitArray enabledRunnerColumns(columnCount); QBitArray enabledResultsColumns(columnCount); // Establish columns according to the settings. for (int i = 0; i < columnCount; i++) { runnerView()->setColumnHidden(i, runnerColumns[i] != '1'); runnerView()->header()->resizeSection(i, runnerColumnSizes[i].toInt()); enabledRunnerColumns[i] = (runnerColumns[i] == '1'); resultsView()->setColumnHidden(i, resultsColumns[i] != '1'); resultsView()->header()->resizeSection(i, resultsColumnSizes[i].toInt()); enabledResultsColumns[i] = (resultsColumns[i] == '1'); } // First column always visible. if (runnerView()->isColumnHidden(0)) { runnerView()->setColumnHidden(0, false); runnerView()->resizeColumnToContents(0); enabledRunnerColumns[0] = true; } if (resultsView()->isColumnHidden(0)) { resultsView()->setColumnHidden(0, false); resultsView()->resizeColumnToContents(0); enabledResultsColumns[0] = true; } runnerView()->header()->setStretchLastSection(runnerViewStretched); resultsView()->header()->setStretchLastSection(resultsViewStretched); // Update proxy models with the currently enabled, i.e. visible columns. runnerProxyModel()->setEnabledColumns(enabledRunnerColumns); resultsProxyModel()->setEnabledColumns(enabledResultsColumns); } Ui::RunnerWindow* AppSettings::windowUi() const { return &(window()->ui); } } // namespace qxrunner/src/qxrunner/columnsdialog.cpp0000700000000000000000000002013410476413670017454 0ustar rootroot/*! * \file columnsdialog.cpp * * \brief Implements class ColumnsDialog. */ #include "columnsdialog.h" #include "runnerwindow.h" #include "runnermodel.h" #include "runnerproxymodel.h" #include "resultsproxymodel.h" #include "utils.h" #include #include namespace QxRunner { ColumnsDialog::ColumnsDialog(QWidget* parent, RunnerWindow* window) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), RunnerWindowClient(window) { ui.setupUi(this); connect(ui.buttonOk, SIGNAL(clicked()), SLOT(accept())); connect(ui.buttonApply, SIGNAL(clicked()), SLOT(apply())); connect(ui.buttonCancel, SIGNAL(clicked()), SLOT(reject())); // Adjust GUI. ui.treeColumns->clear(); ui.treeColumns->headerItem()->setTextAlignment(0, Qt::AlignLeft); // Get the relevant column count. int columnCount = runnerModel()->columnCount(); if (columnCount < 1) // Should not happen { return; } // Collect attributes of views in case "Cancel" is pressed. m_prevRunnerColumns = runnerProxyModel()->enabledColumns(); m_prevRunnerColumnSizes = Utils::columnSizes(runnerView()); m_prevResultsColumns = resultsProxyModel()->enabledColumns(); m_prevResultsColumnSizes = Utils::columnSizes(resultsView()); // Show the columns in a branch for each view. QTreeWidgetItem* item; QStringList itemText; itemText << "Runner View"; m_runnerTopItem = new QTreeWidgetItem(ui.treeColumns, itemText); itemText.clear(); itemText << "Results View"; m_resultsTopItem = new QTreeWidgetItem(ui.treeColumns, itemText); // Column 0 is always visible in both views, therefore it's entry is // shown disabled. itemText.clear(); itemText << runnerModel()->headerData(0, Qt::Horizontal).toString(); item = new QTreeWidgetItem(m_runnerTopItem, itemText); item->setCheckState(0, Qt::Checked); setItemDisabled(item); item = new QTreeWidgetItem(m_resultsTopItem, itemText); item->setCheckState(0, Qt::Checked); setItemDisabled(item); // Add one row for each other column in the model. for (int i = 1; i < columnCount; i++) { itemText.clear(); itemText << runnerModel()->headerData(i, Qt::Horizontal).toString(); item = new QTreeWidgetItem(m_runnerTopItem, itemText); if (runnerProxyModel()->isColumnEnabled(i)) { item->setCheckState(0, Qt::Checked); } else { item->setCheckState(0, Qt::Unchecked); } item = new QTreeWidgetItem(m_resultsTopItem, itemText); if (resultsProxyModel()->isColumnEnabled(i)) { item->setCheckState(0, Qt::Checked); } else { item->setCheckState(0, Qt::Unchecked); } if (!isResultsViewVisible()) { setItemDisabled(item); } } ui.treeColumns->setItemExpanded(m_runnerTopItem, true); ui.treeColumns->setItemExpanded(m_resultsTopItem, true); // Intercept tree widget events for key press handling. ui.treeColumns->installEventFilter(static_cast(this)); adjustSize(); } ColumnsDialog::~ColumnsDialog() { } void ColumnsDialog::apply() { bool prevState; bool newState; bool runnerViewChanged = false; bool resultsViewChanged = false; QTreeWidgetItem* item; // Get the relevant column count. int columnCount = runnerModel()->columnCount(); // Apply user selection in case of visibility change. for (int i = 0; i < columnCount; i++) { item = m_runnerTopItem->child(i); prevState = runnerProxyModel()->isColumnEnabled(i); newState = (item->checkState(0) == Qt::Checked); if (prevState != newState) { runnerView()->setColumnHidden(i, !newState); runnerViewChanged = true; } item = m_resultsTopItem->child(i); prevState = resultsProxyModel()->isColumnEnabled(i); newState = (item->checkState(0) == Qt::Checked); if (prevState != newState) { resultsView()->setColumnHidden(i, !newState); resultsViewChanged = true; } } // If a view has changed then first stretch the columns over the view // and then resize the first column if there is data in the view. if (runnerViewChanged) { runnerView()->header()->setResizeMode(QHeaderView::Stretch); runnerView()->header()->setResizeMode(QHeaderView::Interactive); if (runnerView()->indexBelow(runnerView()->rootIndex()).isValid()) { runnerView()->resizeColumnToContents(0); } } if (resultsViewChanged) { resultsView()->header()->setResizeMode(QHeaderView::Stretch); resultsView()->header()->setResizeMode(QHeaderView::Interactive); if (resultsView()->indexBelow(resultsView()->rootIndex()).isValid()) { resultsView()->resizeColumnToContents(0); } } // Let the proxy models know about the newly visible (enabled) columns. QBitArray enabledRunnerColumns(columnCount); QBitArray enabledResultsColumns(columnCount); for (int i = 0; i < columnCount; i++) { enabledRunnerColumns[i] = !runnerView()->isColumnHidden(i); enabledResultsColumns[i] = !resultsView()->isColumnHidden(i); } runnerProxyModel()->setEnabledColumns(enabledRunnerColumns); resultsProxyModel()->setEnabledColumns(enabledResultsColumns); } void ColumnsDialog::accept() { // Update the GUI (again). apply(); QDialog::accept(); } void ColumnsDialog::reject() { // When there is only one column which is also stretched then reestablishing // the column width would not work correctly. By disabling stretching of the // last column before resizing the columns it works as expected. bool runnerViewStretched = runnerView()->header()->stretchLastSection(); bool resultsViewStretched = resultsView()->header()->stretchLastSection(); runnerView()->header()->setStretchLastSection(false); resultsView()->header()->setStretchLastSection(false); // Establish columns as they have been before. for (int i = 0; i < runnerModel()->columnCount(); i++) { runnerView()->setColumnHidden(i, !m_prevRunnerColumns[i]); resultsView()->setColumnHidden(i, !m_prevResultsColumns[i]); runnerView()->header()->resizeSection(i, m_prevRunnerColumnSizes[i]); resultsView()->header()->resizeSection(i, m_prevResultsColumnSizes[i]); } runnerView()->header()->setStretchLastSection(runnerViewStretched); resultsView()->header()->setStretchLastSection(resultsViewStretched); // Also reset the proxy models. runnerProxyModel()->setEnabledColumns(m_prevRunnerColumns); resultsProxyModel()->setEnabledColumns(m_prevResultsColumns); QDialog::reject(); } void ColumnsDialog::setItemDisabled(QTreeWidgetItem* item) const { QColor textColor; textColor = QApplication::palette().color(QPalette::Disabled, QPalette::WindowText); item->setFlags(Qt::ItemIsEnabled); item->setTextColor(0, textColor); } bool ColumnsDialog::eventFilter(QObject* obj, QEvent* event) { if (event->type() != QEvent::KeyPress) { // Pass the event on to the parent class. return QObject::eventFilter(obj, event); } QKeyEvent* keyEvent = static_cast(event); int key = keyEvent->key(); // Support +/- for expanding/collapsing branches. if (key == Qt::Key_Minus || key == Qt::Key_Plus) { if (key == Qt::Key_Minus) { key = Qt::Key_Left; } else { key = Qt::Key_Right; } // Create and send key to the tree view. QKeyEvent* newKeyEvent = new QKeyEvent(QEvent::KeyPress, key, keyEvent->modifiers()); QCoreApplication::postEvent(ui.treeColumns, newKeyEvent); return true; } // Only space bar gets handled further. if (key != Qt::Key_Space) { return QObject::eventFilter(obj, event); } QTreeWidgetItem* item = ui.treeColumns->currentItem(); if (!item) { return QObject::eventFilter(obj, event); } // Must be an item with a checkbox. if (item->childCount() > 0) { return QObject::eventFilter(obj, event); } // Disabled items aren't selectable. if (!ui.treeColumns->isItemSelected(item)) { return QObject::eventFilter(obj, event); } if (item->checkState(0) == Qt::Checked) { item->setCheckState(0, Qt::Unchecked); } else { item->setCheckState(0, Qt::Checked); } return true; } } // namespace qxrunner/src/qxrunner/columnsdialog.ui0000700000000000000000000000450010502553146017277 0ustar rootroot ColumnsDialog 0 0 294 195 Columns true 9 6 0 6 OK true Cancel &Apply Qt::Horizontal 25 31 1 Visible Columns for Views treeColumns buttonOk buttonCancel buttonApply qxrunner/src/qxrunner/mainpage.h0000700000000000000000000006070410522432316016037 0ustar rootroot/*! * \file mainpage.h * * \brief Contains documentation. * * This file contains text and doxygen formatting commands for the * \ref main "Main Page" and other parts of the API documentation. */ /*!*/ /*! \page license License \verbatim QxRunner Library Copyright (C) 2006 systest.ch This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA \endverbatim */ namespace QxRunner { // Enables doxygen to create links to documented items /*!*/ /*! \mainpage \image html qxrunner_64x64.png \section intro Introduction The QxRunner library helps in developing small C++ GUI applications where the user can select from a list of items for execution. Each executed item returns a result which is displayed accordingly. By subclassing from RunnerModel and RunnerItem it is possible to create this type of GUI application with little effort. The library is based on the model/view framework of Qt. It is recommended to become familiar with this framework before writing QxRunner applications. */ /*!*/ /*! \page runner_model_item Runner Model and Runner Item RunnerModel and RunnerItem are the two classes of most interest for those wanting to write their own QxRunner based program. By subclassing these classes and linking with the QxRunner library one has the program ready. These sections give some insight into these classes. Please also read the RunnerModel and RunnerItem description . \section runner_model The Runner Model The RunnerModel class implements a tree model with the data contained in RunnerItem objects. At initialization time the model gets populated with RunnerItem objects that are linked together in a pointer-based tree structure or in a less complex non-hierarchical list. Thus RunnerModel isn't limited to represent tree strucutures only. A simple non-hierarchical list can be seen as a tree structure with parent items only that have no child items. Generally, a RunnerItem has a parent item, and can have a number of child items. Each RunnerItem object contains information about its place in the tree structure, it can return its parent item and its row number. The use of a pointer-based tree structure allows to store the runner item object pointer in the QModelIndex which refers to the runner item. Use QModelIndex's \c internalPointer() method to get the pointer. There must be a root item in the tree structure of the model which is the top level parent of all runner items. The root item has no parent item. It is never referenced outside the model but defines the number of columns and the column headers for the views attached to the model. Although the root item is automatically assigned a row number of 0, this information is never used by the model. The model can run code in the runner items and observe their execution. Signals are fired to inform the environment about ongoing execution status. The current model implementation only executes code in items which have no children, but this could change in the future. Therefore the code in a runner item should check whether it is a parent or not. Only selected runner items get executed. Execution is strictly sequential, i.e. the first runner item found for execution in the tree structure is run, or if it has children these are run, then the next selected sibling item is run and so on. Runner items get executed asynchronously in a separate thread allocated by RunnerModelThread. Stopping item execution is only possible in the moment between termination of a runner item and the start of the next one. The thread isn't stopped the 'hard way' by terminating it which is dangerous and discouraged in the Qt documentation. Instead a flag is set which indicates that the thread must stop. This flag is checked regularly in the method that drives item execution. Data updates with RunnerModel::setData() are not possible during item execution. Although the code in runner items can do anything thinkable it is recommended to keep the code to a minimum and to forego lengthy operations because a running item can't be interrupted. Due to the parallelism induced by the thread the item execution must be synchronized with clients that consume item execution related information. The GUI for example displays state information about item execution. If the items are executing faster in the thread than the GUI is able to upate its widgets in its own thread the information shown in the GUI won't be reasonable. Therefore the model waits after each executed item until the signals it emits are completely processed by the signal receivers. The model can be set to minimal update mode. In this mode only a reduced amount of item data and execution state information is returned. It's up to clients to decide when this is useful. QxRunner uses minimal update mode to speed up item execution because not all item data must be updated in views for an executing runner item. Data changes from the outside of the model with RunnerModel::setData() are allowed for the selected flag in column 0 only. Of course there occur data changes all the time during item execution but this happens behind the scenes. The model name uniquely identifies a model which has its unique structure. It is used to identify the settings of a program using the model. Therefore it's not recommended to use a version number or other variable information as part of the model name. Furthermore it is essential that the model name can be part of a valid filename, i.e. no special characters must be used in the name. \note The RunnerModel isn't designed to add additional RunnerItem instances to the model after it is constructed and set up. \subsection results_model The Results Model The ResultsModel is tightly coupled to the RunnerModel, more precisely, the RunnerModel class creates the ResultsModel to hold the results of its runner items and defines the model structure. The ResultsModel class has mainly been introduced because the RunnerModel class isn't suitable for displaying chronological data as a simple non-hierarchical list instead of in a tree structure. \section runner_item The Runner Item All runner items have the same number of columns. The first two columns have a fixed meaning which should not be overriden: - Column 0 has the name of the item. This column also carries the selected flag which indicates whether a runner item is selected for execution or not. In views this flag is presented as a checkbox. - Column 1 is the textual representation of the result after a runner item has been executed. In general this result text is set by QxRunner but can also be provided otherwise. In the latter case the semantical meaning should be that of describing a result type. The other columns, if any, can be used freely. \note It is important that all RunnerItem objects in RunnerModel have the same number of columns otherwise some view manipulations could throw assertions as learned by experience. Therefore the RunnerItem constructor takes care of the correct number of columns for an item. \sa \ref runner_item_index */ /*!*/ /*! \page implementation_ascpects Implementation Aspects \section settings Settings Program settings are kept in INI text files. Settings must be managed for programs using this library and not for the library itself. Therefore the AppSettings class gives the INI file an unique name based on the application executable name. Since different executables could use the same runner model it further makes sense to save settings for a specific model type rather than for a particular program. It's assumed that users running different programs with the same model type expect that settings are applied on a per model type basis. An application name specific INI file only gets one entry which is the name of the model used by the program. The model name identifies the INI file containing the 'real' settings. If no usable model name is available the settings are kept in the INI file with the executable specific name. At the moment there's support for only one settings file for a particular program. This could change in the future if applications get the ability to support loading different models at run-time. All INI files created by the AppSettings class are stored in a folder named \b qxrunner in the user-specific location for INI files on the target platform. \section qt_forms Qt Forms Qt Designer is used for GUI design. Implementation of the forms is done using the single inheritance approach as described in the Qt documentation. GUI classes simply call the uic generated base class's constructor and then set up the form's user interface by calling the Ui object's setupUi() function. \section agument_validation Argument Validation Where applicable the methods of a class perform simple validation of arguments to prevent from crashes. In case of invalid arguments the methods either do nothing or return values indicating false or something similar that fits according to the context. \section runner_item_index Runner Item Index When programming with the model/view framework one is confronted with indexes and items again and again. An index can refer to an item of a model or a view. To know the meaning of an index depends on the context where it is used. One cannot deduce from the index variable type to what kind of item it refers to, since its always a QModelIndex type. Sometimes it is essential to have a QModelIndex that refers to a RunnerItem instance. In comments and the documentation the term runner item index is used to refer to such a QModelIndex. To make this clear in code the index variable gets named accordingly. Also methods related to such a QModelIndex have appropriate names, for example: \code QModelIndex runnerItemIndex; runnerItemIndex = mapToRunnerItemIndex(index(row, 0)); \endcode The pointer to the RunnerItem object is retrieved with QModelIndex's \c internalPointer() method: \code QModelIndex runnerItemIndex = mapToRunnerItemIndex(index(row, 0)); RunnerItem* item = runnerItemIndex.internalPointer(); if (item->isSelected()) { ... } else { ... } \endcode An \a item in general is a term used in descriptions or is part of an abstract concept. The RunnerItem on the other side is a type of this library. Therefore runner item is used in comments, the documentation or as part of a variable or method name of this library when it must be made clear that it has to do with a RunnerItem type. \note A QModelIndex is located in a given row and column in a model. If not mentioned otherwise the library code uses the index of column 0 for a runner item index returned by a method, provided as an argument in a signal or saved for later use. \sa \ref runner_model_item \section selected_item Selected Item A selected item is one that has been chosen from the items presented in \ref runner_view for execution. But often \a selected means that something is highlighted in the GUI too. To distinguish between these two different meanings the term \a highlighted is used in the code to emphasize when something in the GUI is, well, selected in the meaning of the latter. For example in method names: \code void setHighlightedRow(const QModelIndex& index) const; \endcode \section main_window The Main Window RunnerWindow is the class that implements the main window for a QxRunner application. It creates the most relevant objects and seams them together. It's responsible to store the appliciation settings at program exit and to restore the main window from the settings at next program start-up. Users can customize the look of the main window to some extents. On the other side developers have few possibilites to influence the initial appearance of the main window. This is on purpose because it's assumed that it should be the user's choice to define how the window appears. The main window adapts to its model by providing just those interface elements that make sense. If a model, for example, has no runner items that return a QxRunner::RunInfo result the button for filtering info results isn't visible. If there is no valid model then nearly all user interaction elements are disabled. The main window starts item execution in the RunnerModel and prevents user interactions that could distract the ongoing item execution. \note The statusbar shows counters for the number of different result types returned from runner items. Even when a particular result type isn't expected it will be shown in the statusbar. This can give a hint to the developer of a QxRunner application that the runner item or the model code must be corrected. \sa \ref result_types \section views Views, View Controllers and Proxy Models There are 2 views in the main window which represent data from the models. The views always have as many columns as defined in the model they are representing. There are only horizontal headers for the views. The views represent the data of the model they are attached to either as a simple non-hierarchical list of items without children or as a hierarchical tree structure where items that have children can be expanded (children are visible) or collapsed (children are hidden). Users can define the column visibilities in the ColumnsDialog. Column 0 is the most important one and cannot be hidden. Hiding or showing of a column is done by disabling or enabling it in the proxy model as described under \ref proxy_models. \subsection runner_view The Runner View The runner view is attached to a RunnerProxyModel which in turn has a RunnerModel as its source model. The view represents the runner items according to the tree structure defined in the model. The items to be executed are selected in the runner view. The selected flag is represented with a checkbox. Parent item checkboxes are tri-state to show whether all, none or some of its children are selected. Fine grained control over the view is implemented in RunnerViewController. Sorting of columns isn't supported in the runner view. \subsection results_view The Results View The results view is attached to a ResultsProxyModel which in turn has a ResultsModel as its source model. The view represents the runner item results as a simple non-hierarchical list of items without children. Results of certain types can be filtered out in the results view. Fine grained control over the view is implemented in ResultsViewController. The results view allows sorting of columns when there is data in the results model. If sorting is enabled the sort indicator in the header of the active column is shown and the items are sorted in the corresponding sort order. When the results get removed from the results model sorting also gets disabled. \subsection view_controllers View Controllers Due to the chosen approach for GUI design (see \ref qt_forms) it was not appropriate to subclass from QTreeView to implement view specific behaviour. Instead composition was chosen by introducing view controller classes which acquire a reference to the view object at run-time. Controller classes expect that the controlled view is attached to a model. Specific view controllers subclass ViewControllerCommon. \subsection proxy_models Proxy Models Views in QxRunner access data through a sorting filter proxy model which refers to the 'real' data in a source model. No column of a model ever gets filtered out because this would change the structure of the model for a view. Therefore a view always has as many columns as defined in the source model of a proxy model which greatly simplifies view handling. But columns can be 'disabled' which is done by maintaing a flag for each column. Disabled columns are not visible in a view (which must be guaranteed by the GUI classes that control a view). Therefore no data should be returned for disabled columns to improve performance. This must be guaranteed by the sorting filter model classes which derive from ProxyModelCommon. A proxy model can be set to active or inactive. How this is used depends on the classes that subclass ProxyModelCommon which merely maintains the state of the active flag. \section symbols Exported Symbols This applies for the Win32 world only. By default symbols of the library are 'hidden' when created as a DLL. Therefore symbols, in particular classes, that must be accessible from the outside of the library are exported with the QXRUNNER_EXPORT macro: \code class QXRUNNER_EXPORT RunnerItem { public: // Operations ... \endcode Only a few classes are exported right now, the other classes are for internal use only. This might be reconsidered in the future and more classes could become exported to be used somewhere outside the library. */ /*!*/ /*! \page result_types Result Types At the end of its execution a runner item returns a result code to report the execution status. The result code is of type QxRunner::RunnerResult. This set of predefined result types is inspired by good old VMS condition handling. All result types except QxRunner::RunSuccess and QxRunner::RunException should have an accompanying result message which describes the reason for the result. A RunnerModel knows which result types to expect from its runner items. The GUI can retrieve the expected result set from the model and adjust its appearance accordingly. Developers of a new model may limit the expected results to a subset of QxRunner::RunnerResult. \note Runner items shouldn't return the QxRunner::RunException code. It is used by QxRunner to indicate failed execution of a runner item. Exceptions aren't filtered out by ResultsProxyModel since they mostly turn out to be a programming error in RunnerItem::run(). Developers should patch that code by implementing a reasonable error handling.

A further developed version of the library could also provide a result message reporting the error reason for an exception. */ /*!*/ /*! \namespace QxRunner \brief Namespace for the QxRunner library entities. \namespace Ui \brief Generated GUI components expose their widgets and layouts in the Ui namespace. The Ui namespace is defined by the uic generated files for the forms created with Qt Designer. It contains all the widgets and layouts used in the forms which expose their elements via the Ui namespace to other objects in the project. */ /*!*/ /*! \page examples Examples The demo program shipped with the QxRunner library can be used as the starting point for developping a QxRunner based program. It subclasses RunnerModel and RunnerItem and uses a Runner instance in the main program to launch the GUI. The model constructs a tree structure of runner items which randomly generate a result of type QxRunner::RunnerResult. An item also reports the location of where in the code the result was created and supplies a related result message. \sa For a deeper insight into the details of the model/view framework and how to create a basic model to use with Qt's standard view classes see the Simple Tree Model Example provided with the Qt installation. And, yes, much of this example documentation uses slightly modified text from that Qt example. \section demo_model The Demo Model \subsection demo_model_header Demo Model Header File The constructor takes an argument containing the data that the model will share with views. The \c name() method returns the model name used by QxRunner for display in the about box and as the identifier for the settings file. The model's internal data structure is populated with \c DemoItem instances by the \c setupModelData() helper method. The model isn't designed to add data to the model after it is constructed and set up. \includelineno demomodel.h \subsection demo_model_impl Demo Model Implementation File The constructor creates the root item for the model. This item only contains horizontal header data. It is also used to reference the internal data structure that contains the model data, and it is used to represent an imaginary parent of top-level items in the model. The model's internal data structure is populated with items by the \c setupModelData() function. The destructor does nothing, it relies on the parent RunnerModel destructor who deletes the root item and all of its descendants when the model is destroyed. The \c setupModelData() method sets up the initial data in the model. It iterates over a list of 'keywords' which define the position of an item in the tree strucuture and the related item name. Of course this is a very simple model and is only intended for demonstrational purposes. The keyword meanings are: - \b L0 defines a top level item. - \b L1 defines an item which is a child of a L0 item and itself has child items, thus starts a new branch. - \b L2 defines an item which is a child of a L1 item and itself has child items, thus starts a new branch. - \b L3 defines an item which is a child of a L2 item and itself has child items, thus starts a new branch. - \b CH defines a child item which has no child items of itws own (a leaf). It is appended as a child to the last parent item encountered in the list. \includelineno demomodel.cpp \section demo_item The Demo Item \subsection demo_item_header Demo Item Header File The constructor is used to record the item's parent and the data associated with each column. The abstract \c run() method from the parent RunnerItem class must be reimplemented and contains the custom code that gets executed when the items are run by QxRunner. \includelineno demoitem.h \subsection demo_item_impl Demo Item Implementation File The constructor simply calls the parent RunnerItem constructor. The destructor does nothing, it relies on the parent RunnerItem destructor who ensures that all child items get deleted. The \c run() method first checks whether it is a parent item or not (see \ref runner_model). Only leafs have custom logic for execution. If it is a child the method randomly creates a result type and fills related data into the item columns. A special case is the unhandled exception which gets caught by the model. The commented out code at the beginning was used during development to slow down item execution. \includelineno demoitem.cpp \section demo_main The Demo Main Program The main program is straightforward: \includelineno main.cpp */ } // namespace qxrunner/src/qxrunner/proxymodelcommon.cpp0000700000000000000000000000147710476335350020236 0ustar rootroot/*! * \file proxymodelcommon.cpp * * \brief Implements class ProxyModelCommon. */ #include "proxymodelcommon.h" namespace QxRunner { ProxyModelCommon::ProxyModelCommon() { m_active = true; } ProxyModelCommon::~ProxyModelCommon() { } bool ProxyModelCommon::isActive() const { return m_active; } void ProxyModelCommon::setActive(bool active) { m_active = active; } QBitArray ProxyModelCommon::enabledColumns() const { return m_enabledColumns; } void ProxyModelCommon::setEnabledColumns(const QBitArray& enabledColumns) { m_enabledColumns = enabledColumns; } bool ProxyModelCommon::isColumnEnabled(int column) const { if (column >= 0 && column < m_enabledColumns.size()) { return m_enabledColumns[column]; } else { return false; } } } // namespace qxrunner/src/qxrunner/qxrunner.pro0000700000000000000000000000507410506761364016522 0ustar rootroot#---------------------------------------------------------------------- # File: qxrunner.pro # Purpose: qmake config file for the QxRunner library. #---------------------------------------------------------------------- TEMPLATE = lib include(../../qxconfig.pro) TARGET = $$QX_RUNNERFILENAME # From qxconfig #---------------------------------------------------------------------- # OS Independent #---------------------------------------------------------------------- QX_LIBDIR = ../../lib # Location of Qx libraries RESOURCES += resources/qxrunner.qrc DEPENDPATH += ../../include/qxrunner INCLUDEPATH += . $$DEPENDPATH #---------------------------------------------------------------------- # MS Windows #---------------------------------------------------------------------- win32 { QMAKE_POST_LINK = $$winCopyLib() debug: QMAKE_CXXFLAGS_DEBUG += $$compilerOptions() } win32:dll { DEFINES += QXRUNNER_DLL_BUILD } #---------------------------------------------------------------------- # Linux/Unix #---------------------------------------------------------------------- unix { DESTDIR = $$QX_LIBDIR # Override from qxconfig } #---------------------------------------------------------------------- HEADERS = \ aboutdialog.h \ appsettings.h \ columnsdialog.h \ proxymodelcommon.h \ qxrunner_global.h \ resultsmodel.h \ resultsproxymodel.h \ resultsviewcontroller.h \ runner.h \ runneritem.h \ runnermodel.h \ runnermodelthread.h \ runnerproxymodel.h \ runnerviewcontroller.h \ runnerwindow.h \ runnerwindowclient.h \ settingsdialog.h \ statuswidget.h \ stoppingdialog.h \ utils.h \ viewcontrollercommon.h SOURCES = \ aboutdialog.cpp \ appsettings.cpp \ columnsdialog.cpp \ proxymodelcommon.cpp \ qxrunner_global.cpp \ resultsmodel.cpp \ resultsproxymodel.cpp \ resultsviewcontroller.cpp \ runner.cpp \ runneritem.cpp \ runnermodel.cpp \ runnermodelthread.cpp \ runnerproxymodel.cpp \ runnerviewcontroller.cpp \ runnerwindow.cpp \ runnerwindowclient.cpp \ settingsdialog.cpp \ statuswidget.cpp \ stoppingdialog.cpp \ utils.cpp \ viewcontrollercommon.cpp INTERFACES = \ aboutdialog.ui \ columnsdialog.ui \ runnerwindow.ui \ settingsdialog.ui \ statuswidget.ui \ stoppingdialog.ui qxrunner/src/qxrunner/qxrunner.sln0000700000000000000000000000243210522437660016506 0ustar rootroot Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qxrunner", "qxrunner.vcproj", "{A143759E-685E-4553-8325-AA3968DF8C65}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_DLL|Win32 = Debug_DLL|Win32 Debug|Win32 = Debug|Win32 Release_DLL|Win32 = Release_DLL|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A143759E-685E-4553-8325-AA3968DF8C65}.Debug_DLL|Win32.ActiveCfg = Debug_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug_DLL|Win32.Build.0 = Debug_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug|Win32.ActiveCfg = Debug|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Debug|Win32.Build.0 = Debug|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release_DLL|Win32.ActiveCfg = Release_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release_DLL|Win32.Build.0 = Release_DLL|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release|Win32.ActiveCfg = Release|Win32 {A143759E-685E-4553-8325-AA3968DF8C65}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal qxrunner/src/qxrunner/qxrunner.vcproj0000700000000000000000000041517710522432533017225 0ustar rootroot qxrunner/src/qxrunner/qxrunner_global.cpp0000700000000000000000000000033710477612330020014 0ustar rootroot/*! * \file qxrunner_global.cpp * * \brief Implements global functions. */ #include "qxrunner_global.h" namespace QxRunner { const char* version() { return QXRUNNER_VERSION_STR; } } // namespace qxrunner/src/qxrunner/resources/0000700000000000000000000000000010521421041016075 5ustar rootrootqxrunner/src/qxrunner/resources/checkedbox.png0000700000000000000000000000072710457775570020746 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ6#U¼¢á pHYs  ÒÝ~ügAMA± üafIDATxÚ•RÍJÃ@ÞÝllˆÅ7ðÐ^ +€A€€¿¸Ù¸¶D/†ó§F &29M„Ëô„3Ü[%Ž’‡÷ªÓ>Ädï<?ô·ï³.¹IEND®B`‚qxrunner/src/qxrunner/resources/collapsed.png0000700000000000000000000000101410457775304020576 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ2+? ï× pHYs  ÒÝ~ügAMA± üa›IDATxÚµS=KA þ ±;ƒbg%bú‚MÐB"‚¢þkÅ*ˆ©µl¬"‚ jcT”51bN’ûÜÝqg’»h¢ìí1;óöÝ›9¡ÇÙõ;Aò%ûFÆ(âzƒ§ôÇ&8ouq5uD6¶3hVfª|q\ Šo.Ë^-åèä‚ÉhQ9sä eÜÏœƒ¤^ D»;a Úc°ŒÔÖ–+>K¹ÊUð4k† Dë ï©:’—í©PU‹Ìf´Mà+Ò;TJj‘¾^’¦Æ†A*DWßk¹5 wùìí2BŸƒÃØh*¶„’é4¬£GPI Ýêk©rmy‰“…lÿÒžÏ8Þ[oˆü“í ^Ò»‡Ä„d‰ç+´ÉsQ2=||uñ¾`óŒ4Ë ”  Ù2»nÛP|²Ö_[° —7ùï;Eð}Á…d!ù ž˜æôþL •{°™ZáäDr† )Öl ÷KK}.•¡jéÑtÌÏ-ÀmîI¸þDE¿Øvá·ø* Yxà ‡IEND®B`‚qxrunner/src/qxrunner/resources/columns.png0000700000000000000000000000105610251335534020303 0ustar rootroot‰PNG  IHDRóÿa pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF¤IDATxÚ¤“ËjTA†¿‘,ÝŠ"Ä¥./t%Yù>‚{@ô9ÜE”,ÌèÀ‰qp2bIpãB”,„dr.]7=9z&;§ é®j꯿þîêE‹ØÀÓ—Qh$¨RP6AùÏ^'¨% ><[î-$¿pó@,P ’g%h$h4Hâ$ Qg4Ù–i~ý<rå2Á´v¦U0­ƒiå” 4ú—¨›äCDðüÍ(ܽ]›ão½øîI,Ž*‹¯?Æ#"2Uí£î]_ ±@’fÖQTø²÷ƒã²A=psúÃ]Ô UÃÌxÕcj¨¢s*µËÛàÆp—Õ•+¹ºký1÷ïÞ NA•`PlÎ̵àæmò åJ NPI`æ]3c´óã µåwdF_ÕØlÍîó¹n_½Ô×úVï]Ï@‚·ƒ-nÞZ¡JN™œÏÅi€VqË”“µu Ôl–œ5p÷ÓÅö>¿QÍ”×ßó x¦½ý©ÀÝ;É€GŸü×0õÆ3,hW˜u‚¬&ÓHIEND®B`‚qxrunner/src/qxrunner/resources/document.png0000700000000000000000000000060610251334214020433 0ustar rootroot‰PNG  IHDRóÿa pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFüIDATxÚ¤S»NBA=ÜøM·´´k l),M” K¨ 0„„;01!4bAi´’/€?aç±c{s…½<ä$“Íîž93›S23œƒ‹Ì¾V;L"f@÷æ:mì0˜Ì oŸK+ÂóäÃÒrÝÆ³ïN¸" DªZ(Ó9‡Vó½Áðáå}ÑÍŸ%y¹EðÞã±ýè †÷Ñs!Ámí*ËG¯Sœ¤ÀÌ@¬¨V.³}”€%®€ÅÑbMñɾÔ+Ö¤p¤"-0o:’ÃÛß(ê«Ëq-ÄçèoM\¶²î÷B@4ÿŸ™ -×Ovcé\;ÿ éÒyUÜ‘IEND®B`‚qxrunner/src/qxrunner/resources/error.png0000700000000000000000000000126410462220244017750 0ustar rootroot‰PNG  IHDRóÿa{IDATxœ¥“;hSQÆ÷aÔ¶©HéC±¢%B-.,¦ˆm¬8¸"Z:«ƒ èäVÜ”"DÄt ÕÁ‚/ŠÑŠÖWµ­µ’½¹¹sÏ9Ñ'ÿãïwþßw¾ÿ9ÆŸ“ƒén©tF*•Фî’J!•ÎI¥Ç•ÖÙÝ×î>ú'`r0=`ƉøÒXGc̤qY %…o˜/KY>öÐëÿ4V­8f[C-kV7·nJR×¶«®[Kâ…´~}ð¼D^Z½™äúüéùÇUÀä`ºÛÐz¨5±ª9‘Ü+›À)ÀÜkø2 îwð\¼¾0ru¸F]Ún°6Â4pîSq?`e²*zºQIEND®B`‚qxrunner/src/qxrunner/resources/expanded.png0000700000000000000000000000074010457775400020422 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ4/n<ŒH pHYs  ÒÝ~ügAMA± üaoIDATxÚµR½JAž;Rú¶’2(¾˜7ì´ÒÊg°VP¬‚˜J°Q;ÁÆ*"ˆ  •±1‘$wû3;ÞLrwzQг»·óÍ·ßÍŒGDÀæór}ÿF^|µfHSs‹|£4R|!éâ’à¶ÖV!͘¿{P¡v×Rõ©+?T=h¼*h´tr~y+dìœ.µz‹N*7`­ŒÜ‘ƒÂä8ÌòžÈ(íŸR«cDÊÝc‡®ªí„!Ç´Újy§¢x ]¢jHfÖFä‰òa…œÃH¤‰%°²0ë% èˆTônOõ5t„üĘ—Ô9ä=)/Ù dƒ*û›q{>ÚÅñN*òOue~|(1qI´qÔ Qæ¢ÙÖôü¢è¡ÈŒdåæâƒC Q"X$0ìÖE=ì&=Ù)6c¬ ƒŠóËCÀíõŸ ÐY)3ƒöJ›éëƒËÏê¾%~v(‘‡edþ± ¿µwÑ gžäZ1IEND®B`‚qxrunner/src/qxrunner/resources/fatal.png0000700000000000000000000000122110462220530017675 0ustar rootroot‰PNG  IHDRóÿaXIDATxœ­‘MHTa†Ÿ;(þAþ$h-,3Ì,PÂ0‚ŠŒŠ +w´¨UD›VA›©MD‹"ZA ÑPS²0hÆ¿LHÄÇPjFï\gîÜûÝï~-J™œ]ônÎ÷¼Ïâ=ð¿5 ƒÐ1µ›½÷p¹G£¯ NÞOFxFÎrÅÝójLÓÞ¥{!81UYd«‹•j¡¦@õxµQØDQå…Á²æZÍ€­ÇöC+@êTYAgUS¹ÓÂÎñcIÎÄ"ÑN1·–EiýœÂœö^8jçw V塯aX‚©‘XÄ73ùð|~pR¡€”Íþ`uqVQ^_CKM zW:L|ÖÝ<˽r ô À.˜ŒÏ áþl?-{5t¤`zÁ ¾xtÞ¬g2š4¥Û674 ÒË‚x„ÍX’/Ÿ¢cÜJ¿ÿ ‚rnddƒ`Û ìß»)p+ð¦g´õù®²mËý§« |2IçD€’ÄVS |ˆ…ò]‚Çáûà-œ©¨¯xµ³¡ VâàH)l¼ÒÁéHP.©”` l,™I·µú=« »Â‚Ÿ1H¥À²ˆ¯%èê]tfç 4$Ê•8ŽƒOS4Õe•špg£¿Wkß^‘ ¦ –Ųž``p9ª Ñ4:¦?þ1ÁuQŽÄ–’ЬMžø’RõKcmŸ•­11ù:®ç¸ê\3Ìï' ÇÞ}Ì,ÚXQùà¼Øè Šržn×§•¤’òIÚ®•ÞöK¸g@ ž]€©Íïÿgý>*¿+ô¥IIEND®B`‚qxrunner/src/qxrunner/resources/group.png0000700000000000000000000000136510457777564020007 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ 0º(Á¶ pHYsÃÃÇo¨dgAMA± üa„IDATxÚRKHTaþ®©a{-‚\”=ÕÂ…´ *!ÜVPa[-rÓ¦•Y-ZHF¢0\$X ™’i¨3Ò0ia’šŽÎÃïã¿ss:÷܉4wøîî9ßžÿ6"±ºó¤ a‚´‘}›[[~²í+ .2i|Z§"ÅB.0ÆßŸ9h£ÑYZÍèÈætL%([XÊàCòîwÍ#•Π<™ÎÁ›ëÀ|A:³å+é,Ej¡a. „YÞÅùð©í Qs'Ññë“ü?KÍwS§ÂÒJ–¿k¸Ý¸ˆí¿:ëä‹X’BHrØHO5ÞG«8üLÎÂá¦yd×òº[Ûº)65Çó๠υçáû~HÿN¦eÃR”íÀ.„gË•3Zi8Ôú‚èâCÅú<©Ü«Àˆrˆ×NùXH¸@p ñ”6Cáàþ Ãdݲ ¦ÄK΢Z´I001³µMqÜë©Ç`´d%…PZOŽoir[ñúès쬧IŠÆ«/árÿ®Ì „_<€Ï}ø³qÂàØ4ý•¢´M´¬3rŒ4[—eD?¨åîCJ’׃ô>Ñ2"=È›XLU">W£—&¹DC´×Æ`ZjãݰKãò$PÿÐ zûóp¬ü*ÛnîÏ9ù­Le³Sq—ÿ\œ­A~]¬ë #È~R*${jkJJ|ÐWƒ,s3U—yŸ6º#Q´÷5ˆíÆ3æé6žž{ U¨ÜÀ²ÂEvõÆ6•­ÝªÝb£ÓËüØöý ô¯ãSdä³îq@_ÁHÄññf¨]‹}¼g~¹Ž[½ñ!ü¿ü( éq°XIØIEND®B`‚qxrunner/src/qxrunner/resources/info.png0000700000000000000000000000137610462220244017556 0ustar rootroot‰PNG  IHDRóÿaÅIDATxœ¥’ohUeÇ?÷9Ϲ÷Ügc››65-L ‰) "ÿl!! ÅL,‚™¡‚ô¢ ¤(#Á^”h´—B/RDœbje¾pWËHTœs™™¦lwg÷ß¹çžóœÇ7ÖîÄWý^~Ÿç÷y~¿üÏŠL ¶ìnK'd§”Ö ×£’uœbÔ¹W'ó§>ÙºòÚc½_^ÄÑÍ­MVÏ’ùumÍI#5 BUáöÝ2¿ß¾8ðÛP]ÚÚÓ÷Qw®ðÖÞ+F*ß¹dýþº…ñïáxI¡ÑÔ'$¹¢GÿÙ+|ÛÿË™„]ðó €aè®9-òƒ®IÍÿd]V¿w[dd¬€ŒÑ½º—_œÿ’“+~ս훀ØôY¦ÞŽov>Ÿ®ñÑhÇè\lóʲfÒIk"߸n1OLK­Í—ÊBå•M–ß>wz}œ‘1Ž¥ÍôtÌ%•ø•  yuù³R‡º@ócOÅcÈ©v®Ý§gׯôîÎð [@å<Ùbc™âéêHǘØü¿šÙÇRqœ¬O%ô«Æø*$•01¤ÐBJ#Wò”C]0¥ÀŒTˆ›!¦¬>jŸBÙC)mˆÆ4wò¹|QMDMí*¤‚dÂÀu]ŒˆâÖQŠå`@Ìœ–¼P(¹™†jN^1tkœÁa§T%–K }Žœ½p@ìx£½jvýtñf!W*Oþø+KÃ,Ÿ¨­È\úTކ”æÈé«\ÿÓ´“Ö0é+¿óñ¡ ­Mñ¯­]d¶¶4V<\|ðC´5Nü<Ⱦ×HÄè:þõæïkë·÷­1Íȧs¦§v´?Ãsóšð<ŸKWïÒnX_¾9zÞÆ‡ÇöW›t¾½ov¨ÔëãÅòª\Á5…aƒ¿Ÿ°Ìïü <~²ïÝÑÉ÷4°Èý qIEND®B`‚qxrunner/src/qxrunner/resources/info_blue_24x24.png0000700000000000000000000000262410464711144021433 0ustar rootroot‰PNG  IHDRàw=ø[IDATxœ…VÏ\Gþª_¿ù±;3Þ™ýaãub–l$,3QD±… E‰rò?€ˆÄ…r€ƒE‚DN®(9DŠrÉ! DA¶Y –¼Ah#‚…VM²³Ù]ïξ™÷º_wUqx»¶줤R뵪ê{UÝ_U>GÒÆa4Û‹°õ™ûÑo¢Èþ‰àÖ?ÓŸî¶=u付>þ8:½ûçAôè¡–íÏL×çT¡[~m4ŽK€¾=Üú`}kõ·Ø\ Ÿ6Žàø©ŸbjæÔ3½úsßxpú|ÿT7™îÖ÷U´¾Yè{ËÛñ¯K[¯í솋ÛË×W—àâ%·4Ú÷áËýÚôfî¹xîìá—Ÿ8?¿xìH›Œ©¡QO±x²‰Cƒ ÂâØÑIóàéÞWýÁ¬3lÏ»šm½‡Xný?@ZŸÃÂ×~ez½éÿÞñŸøâTâCJ®Lქo}½AÝC µ& j)Ñ?VÎù:<ÛLŽÌÖθ›݇/ï þ áñA€ùÓÏ¢Ó;yñÜÙ/<=99 êäC ¾¬¡Œ)=tÚ Iª"åÓµeÀ•–œ §°ÖP·cÏ|<àmž¼¶3øÃ-€öìY¾÷‹ S/÷ºò¡êð¡Ž2¦ˆ‘P–‚Ǫõ­?î`s؆ó…7(PxAb€2„oç¡÷Jž­ Ëüà àè}?B§{ü…{ç{÷—±Iel¢Œ ŠlI`!Zýe© +W lí¢ | *¼¡ÂœS*|¤z éú§£LëwÃÁeXc[huûóvãüîØÂÚƦHS‹zYaà«‹„'¿3Â5ñÒŒÁ& „@pÞ"ÆSpHÐnÕ/ø^ÿic[™i¶J%“šlœh–[Ír‹ÜA ¯š;`œ«~ÿ›ª­ ÕÙp¦ït” r§Z)!Ë­Vþ L’NÉ#ÖlR›úÎD²ÑÀ¦F"DU"P½TU Ê‹º‚â8¯Z¸„bHƒÑ èÛÚÔ›4WxÀ*Ô2!‚1ª À$@·b0«ºRRå¸(<4B, ¡„˜»ÏMf1ˆÀ0”™ˆ©î3~?@‰J¦²aVe1,ªÌJû}ÃìÑ`MUe¨ TÕWz7¹Ý¦ò‘› ` Ì^7\R PP‰aD˜ï r{`a 2 ÂP P©ÀRpë°n´a÷6Œ"Îñ)¢Õ4Œ’¤JWo!© ª"£B¤T•"*a(ì®¸Ñ ŒŠG¶ùî:$¾&± á‚„ ÄX’ó ïP‚TADD{P@Y¹£Gå—“p(¿”m¾[¨øê n|ô:Tå"sî8Ž <†Ä1ÊàQ8EávzTíÁ Bé q Ž#pCb¾£*ÏßøèuÜ<ä|ø>†ƒË×!ü ÇL9ì¢Z3 a çK]¾.ª{5úû…ú2"„±rÌ4Æ›ö¢*O —×óáû»éx{ 홇¯Ú´ÝTg J€Pu³˜Þ¹æhc3£ßÿio\RÂ9Ïc»ªžñ£¿¸ºü3¨Fÿ3Ñlm'úÏ£Ñ:ùCPòKc›“IÒTJêD”‚ª„U!¤TÄ“p‰ù6Tžr£•Wÿó·ŸÜyà€pµKHÒεFëK¯@B[Ø/ŠøTÙC¤€pÞ«¹Äñ®²ÿ*_Øþä­««Ë?‡ÄìÀ•¾ËЭt=†Îì™¶­M= Šþ `MKv®ìn¼Slü&Üè_wŒsW€[bPk½ã³¥,ÖÈgzÿq[ƒ´NËX„IEND®B`‚qxrunner/src/qxrunner/resources/item.png0000700000000000000000000000114610460000714017550 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ\±’Š pHYsÃÃÇo¨dgAMA± üaõIDATxÚ•RMhQþ^ÈA^ê¹7/Þ¤h½è! ¢´ž"¨”€"*‚¢{÷žSQ¨^¢ƒ‡J{ðÄ´FA¼ÖŸ Ї€Á””M6›·ï3o³/UKÞîÌì|ßûffaùõG‚8Ó7„•õ/$A¶úyß¿='%Ñí¥Õ6ÔáfD¿:ï?Ô ¶­Ns³Ó*Ó <\›ÀL~JòÈln¶s|þ{g1¸;—C{ë°K U’šµD‹_ÐÑ3W=R$4·–Zhüš­.‚ö>Ì_<—Ü!¹8¡s”ØnÙÔ©-/ødŽO¹\/žN[}S÷°0 qpò¦M*/’¶™Ž-½|»A••5'2“"/—ZÈ/4ÑXÔ¿þ@éþ£‘H©„J4ž¸ù ³§òI.-èk’ï|”+ B㻂0²5Gzv¼Ínhq§°½Èpqݾ/(\º†Ú°Íô_ø«ñzèÁ“ªÛOeuRÌØ¢(ÚAnYx<°R ¥{e›¹ê[ò}.HÍpƒØ"Ò dp‡pþìI<-/¢x¡àG8¶ë0ì!6DZÞ×sBÞZÓ•ž@Z-j– A¬„åÄ.gYÕÜ:xüB cŒnv¾Æ»¼Ïg¯ªØ‹)"ÚàOû 0°£I,IEND®B`‚qxrunner/src/qxrunner/resources/item_run.png0000700000000000000000000000136310457777204020462 0ustar rootroot‰PNG  IHDRhôÏ÷tIMEÖ/›•ƒO pHYsÃÃÇo¨dgAMA± üa‚IDATxÚuR]HSa~¾Ó*K¼²È’îLºT°` AdE–”’í"ì*(ºNH¼ÄdZ´nF±B£P(Ö…Š´tÅ´HdÄæg;?;?oßùÜÑ­ð÷œ—ï{ÿžçýaäÃOb޳´bžøA•»vBš×°mG9Ä&áq(Œ-ÛK|›‰¢çÁw;s„_ñ'ïexŠD´óq›x:O²V EµÑÕ…žIá^§Z7“sþ†AEzFG“4Ká@u%VÓ*zûâ°¨„¼Á`áúÝzAÃäc9O²RCC9“³b³Ëè÷w¡þ°‰ú:“J±H£µ½†¯ÆÎ/ØFVµ‹ °s-(úƒªƒ^dd¦$awÙ~î/#¥|Cbn¾[ÿ‰ ¯±íb?µ´úÅz|¦æ³~*\ñfö™*ðÙÚYIEND®B`‚qxrunner/src/qxrunner/resources/none.png0000700000000000000000000000115110464733004017556 0ustar rootroot‰PNG  IHDRóÿa0IDATxœ­“=hSQÇ7Ék’¾Z«ÄF¬”Æ ŠØ%VQ+¸¤u¬›‚› :ꢂà"89 ¶.ÖÚÔZmL-ŠÆ”¤ZÓ"‰M^>ÞKÞsð¾‹ÝüÃîÇùqîùŸ+h’ „A ´ÓÀ¸ºŸ€É‰¦ä›À…¤â7BÑ+מ0 P¨›¤Ê:ßju Ë¢ÝåÚÒv6¾y»œË† ph‘À pÎÞP‚ Û5Ë–Ä\±Úñ®T»KiårOè.°hY#‹­a!ت8Ç´H :¼Z+ôgŠ·€Óí¯ã;.?zØ&sqȦ‘­ñ÷Zm@k˜ÙÀ)-ˆ¨ ù8] EŽù}'€]€Ç°V7§,ió›A,gÀ­ý@ðÙ€@·G`3ˆXÎútÓèh®` OuÇìjþIRZå†ÉWÅ[jö×Üp;Äaiç_]õ­{ž®<ø˜I?å< õÓèÐlèÕÄ>|m–¾7šnÏ/%ý¡‡ï+N€/Uƒ¹ÞƒÅá±§÷€G@¨YE0128³sîE¸Õ¹ÞW Ëb±bî=Pz<ù˜&`Ù£Üt_?sòjC;åͦTJE~èuô¾ýÕ‰ŠùùÎó—3@˜2€n?&H°GÆvÀ+/®)«@ÍNjÀŸ¿Ñ*mò. ”dãÊrýÿômlììÄöEIEND®B`‚qxrunner/src/qxrunner/resources/play.png0000700000000000000000000000054310251335440017564 0ustar rootroot‰PNG  IHDRóÿa pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÙIDATxÚ´Ó1 Â@П`k¥v ¦ÑF¯áI,í x !6AìEÒ[iB’&"fWb²Ñ¸ÖâĬ¦™á?–Õ¤”(S:5œ¬GƒR@p8¯T=o±Yn•H)&CS !ñØù–BiØùŒžñ!HDàŒÃs}¸ŽkÆ0_ÌV}Óè(7qçW¸ŽKÈàž=Ô«î~j•€XDoáV­I† B^Æx†Ya8ˆEŒ Ãù¯pO”Â)åG÷Æí5§ZûËoü¥^ìÕ¬jY¤ýIEND®B`‚qxrunner/src/qxrunner/resources/properties.png0000700000000000000000000000127110251335440021012 0ustar rootroot‰PNG  IHDRóÿa pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF/IDATxÚ¤“]HTA†mUJˆD° ¢$R6RCmQº+¢(è&ú‘‚ÜEÒ¡"‚ˆn*ÉŠ-È2J2×@‚¡H5ÂÖÖÜ={ÖsÎÌùºð'ŵ‹ü`nfæ}Þw˜ïK–Sž¥ß»š¼ÓZ£…c;ضƒrÀ…ä­ëÒR3âfž|cnϵ ÜXˆ!›žÏkÒR30V'ñ_â‹þÎb ²nåWönie`4Àà¯÷x<ïœÉ€/ßÀ_ ±±ˆšóÔVg£cA”ÄŠŒžŒ ‡pÓME„ŠÒmìòf‘l|œWÈ¥º®—Úêlj›†ø=6ÌÀ—a>ôG¸Ñ¶‚ŸA¦¦,<âºt½|D^n ]€òŠc\¾~‹S‡3©¹òå(¾3ã¤$98:…˜e_ËÜ:™ê¬‚»OzDiWÆÆ†åÒ¹C22òMLé tÉé#>é˜#%Þr³¹U¼»Šˆ "ͯ*«/n·u‹)²hMØZºß¾‘ªƒÒ7–ןB 3ôDwæ ó˲]Ì)ÍšM^Ô?%U„£jѽWM]“WiZî¿@i¡b_ wšÛÑZpçuiÖfoüNÔ3 öW–b9Óξ²""¦šs6L…aêø€Ù_hié@i—Ââ´?ëœNàþM”‘àŠ‹åh|å…±i×Üí;ˆDS5¦¥±lw©Bñžãÿ= Ëç?žÃgIØÑ›ÑIEND®B`‚qxrunner/src/qxrunner/resources/qxrunner.qrc0000700000000000000000000000146210501477732020514 0ustar rootroot checkedbox.png collapsed.png columns.png document.png error.png exception.png expanded.png fatal.png group.png info.png info_blue_24x24.png item.png item_run.png play.png properties.png qxrunner_16x16.png qxrunner_24x24.png qxrunner_64x64.png stop.png success.png uncheckedbox.png warning.png qxrunner/src/qxrunner/resources/qxrunner_16x16.png0000700000000000000000000000111210464245770021353 0ustar rootroot‰PNG  IHDRóÿaIDATxœ…’=kUA†ŸÙÝsooˆA¹’DÁH‚"ˆ`o¡E@l,mRXYZˆ…¥ZÄ? X)þAAP 6*Ä/”û•›{ÎÙݱØM4Á–a÷™wvF2#Üœorh´>ÔH¶…*(I0øØÍ¿Þyý ·8»Ÿ[gŽ>âÔùF`$v ¢B¯­<²Ô÷ñš›ÚS›àĹfOVÿP…¨B÷çÕ©—Ÿn8 F,¡õœùÙ É Á™`£ íÏà,X!(¼Ò>ó2BÍÈv@P( : à`½•Ô,XCʽ¸L“:—d’9;Œ5’ª‡E€î&@ ßN€ºgP¯¬Ä>Ï –9m›\7SL[‡„¹‡~ªºÐ10äR^Y køXð˜UžÉ®È4‹ + z ïC_!fYÔG~øï !5¼ŒCPx(6¶‚_¤’ä`àsÊ pÁä¶™aÆfˆ/Á—BPÝeàpÌŒs×ál6Š31þsÏýÞ®PÉD,°df¹hÆv&£&@ÜzÞlÁǤ2ÙÊŒpYö¦¹W9¨ !åBrãòsõQ%/­¶Ì첉±æ%ê5ä!–ö}KÖ÷ ÕϹã‚à”Õ²ü­¼„Â˼í=¼ÿ®õT 4ÆÎMZ#ÙÎ¥·‡Z¬{¿ ½ö/°FÕ/wŠIEND®B`‚qxrunner/src/qxrunner/resources/qxrunner_24x24.png0000700000000000000000000000205210464246254021353 0ustar rootroot‰PNG  IHDRàw=øñIDATxœ•Ë‹\EŧnuÏ#ÉÄÇ"pa6ºÑ!""¾ YŠD—®Tpá_àÂ…¸pçÖ씈¢î\¹ %Íc2=ÉôëÞªãâ>º'ˆ T×½·º¾ó}§N@?ˆWÖ`u±`ÖboÍݷƉ/¯n1ÍFQðÍóÇyvmÿ†àpÀ A 4‡äºm0Ø ìvþ¶à“ï®ßûùôWWˆgŽ`cmÿ†×Ö¿æì…«k Õq¤ù˜ÿŠÑd_?gÃߘKŸ¾¾Áõ§Ï9ðKXéؾÀ©×¢­–kKiôLí&ã™ä9Wø@ó’WXZ r}ÈZç³çlìÎ »ß÷jÃrÑã­ðïòˆWbë$íÚfkíf\GQèÖˆ°](è…þ1>ÌÇ8{îÅ ãú Õqk/ª+´°Z°Øm[ë%9C5*™…Bü˜ŸâÑ,š )åÝ›‘ ™Umoœ )ãÔ–1ÁØDÁ‰"x>ð./ªóÀ)¹hât´ÙW•=LeÅ Bhê³kc µ#§l¥,ÊŒ«d¥,7"‰“dÆÉ›‹j| µí*ïÍ®[j«TÇHf”¼9I¦¸3Þ‹·ÏY<_˜‚ÜȬå³ÊÿÝSš.Tf§ÌÛoÿ°uñòõí[‚beùäêÂÙóÇ—_^ŽÚÌ.›=]8tÚß.óög¿¿øm0ý6³=n¢ P,C±HsÓÿÿfCAÂÀÿöN¯U%’>IEND®B`‚qxrunner/src/qxrunner/resources/qxrunner_64x64.png0000700000000000000000000000655610471355524021377 0ustar rootroot‰PNG  IHDR@@ªiqÞ 5IDATxœå›YŒGÇÕÇôÌì1ö.&ÄÄŽc‡†ÄA ‘w8% Q ®@Ü(xñÀ ‰Ä)à!Ž DLq…+ÊØ$kÇ{ywvfº«Š‡®ê®êéYï16A|ÒlßÝõýëÿýë«cáÿÜĨ ¯=š+f[Ûx«8Í6hÚÙÑëÝ8ÚþrrïY®½6T¼«Ïà–«÷²oª±¹¯X§…{\û‰Mšö6ùvó`<|jÀ¿8Ê/Ž­zç½Ò½í¢ÜrÍÞêõCÀUÀ,5îyG¢®ÖÇF=t©b0r/Üxø(·Þ·0\ºgÎ4ùË/vï½ø9õ&L»µ_ÑöÍe€e¢£Þ$ð„ø Z@\ñ½{øë|Ï/æí¯z×ìž´‡ï¾ Ä `÷~8ï´§“NM{ÛëQ¦+€ˆòœ’°<ý ³œ@¯F«ßž[áE?| ,öù“1¿åR{ó5ÀO˜ó/…—Ýçî§¼Û±±ÅùfL;߫т÷ün»Õ1â Ð'ö}óŸYI‰Wð9ícö^×}‚²AYëö®!g•µàžÒ.¼ÎÙ_ýtOíý àû\àØ¡ü'àEo)sJÁ°Ê«™Û®¹`T›L 4'ày×ÂÏ¿pð µwV¸ €söÂì¹eÍWã¼ï£@8u:7D}G<}ÐðôçÀáoƒ’3ÀEÀ?ícUfxò^Hû¥È¢'Ö …ÿbT©_4“Œ0„»`þ8À“ÜWUh4MíSå>øN‹³„€®qÞÍ ªh IÛ>á² €yPAÖ/wk¾Ú â[¸B=.ÓC;à ‘vé¯JçG‰&£PҀʤ§âøÙ²*nM{`hPÚgEÅF0@B:( D †Ä?.¬ÊŠ-¹6ÚteK…ò®“6Ctf€9Ҿ㨓æ¤jÂÿü¸LWª©±ç°sNmrذ p̱¤F$‡ «”Î%A@°‘tµïWî‡ÌŸ¢ö© L9ýìÑÀ:¤2#‚‚À¯ýõQã1a­Ÿ‘I]\CA‡ˆ` @¸±-*Çî¾uØ ¥sQtŸ«À–T ã4% ‚ t¸1¤üJiÒ~ÆogbîLãÁ.®\¤ý>IÒˆƒÍƒà‚!*T/öU)| PÊ %…Ú“§ÀY„ 0Î*‘Ÿ+¨oÏ;`@”Tè,ãp÷–û§øÇùMs–×&Oe÷r—AšIHn¯ý¯¶ø5^€  &,ƒ†pU¼Ð€ Âe„ù)óœ6, ÄR£³”^Ö£—å}ïûWå‹bŽg·÷ðšl†ìÔ ( ™D±Ö7‘;$(·ÝÉÿÎçe(ºÈ^3X"'„s^)'ŒSÑeî œ—M¢) "ÿx–ÒÏzô Ö~•ÞË£„WNíç…«ƒ¥Uš¤"j…ÒV±(-¶.LÙU… …R2Ö8€¸í·ÊrÔ`µL(j£ù‡t¦Ñ逞ì p­—õøzïÏÜޜẩýXèÒ_Ó´›qÔ¤Õ5í~ÑëÓ£(ßG³?k@ÚÏ;§Ê0()t6 ŸÕ`íÁ•9>ËÏÚÇõò)È¥eâ( ÝŒ Ã:Dî$8‰Ï¤v4À†€ÿÎõSaí@>8bkÛ-œ=§êè­ €µ;ïæ7ἡs1×vÛ¤‹§h&!­$r†*¶a`0A*ã0%Òˆ`mGU&DÚÙz! €¤Bg)}9؇ŭý;¹­9ÃÛ;xÎbJ¿Û£ÝŠIA‰G}§ÉÃuØÒß²iÒ¼5pCGáÓvëå ö³>ý¬¿!¬Y9ÆÍãªÎ…Ü”žÃžÅUz‘`¢çÍæpš=U@ç!½©ÎP5B“h刟£z8´ÌC` ûôåæ°vÇü?øup7oš=Èõ+S Vh5"ÚͰhm‹Z·€! !s5`K 0”×FQ%BJ¥VFVC7$Z¦ ä`Ë á–“¿ã﹌—.jz §˜L"šIh Ì<X!Ü,´™æo-èm(2>'Šs¾¥¤rÀ lcDz|ª{˜ïLíåÃ\Ä…'évaª‡aÙ1’–[  €©] %œ>8÷T19ã²;ïçºà!^·ë2Þ³:K¶°ÄÌTB¦5¨Ó€l³¨ü!¡+è²Gù¾vp $ÈŒL¥ TZû™-›JùæüùY²ƒ¶® ßï%‘qº €ÊÀf4À†€íqÙ°€x5o®W0ÊŒLŽ€¢ðBfyeIjØr(SƒÆ9a,†Ãðó\ 0²yG¦RÒ13 bnÚñ,Þ±8A²¼@sº™§ïE&(ËäHª-  j…£ÆIëðHÀ2@+‰V’LI2•Ëw®Þq 7§°ïè“â%ÿî!äãtZ±Ó J?ª`S ° h£¬Ú6ƒAÑ)+F€ŠŒ çÀ¦¨¥5zý9üu- Þßy6ï^ž&>¹ÄD3fr*ÉûÞ h5=®üFØhžvíÌ3ùd»çHâ:;[„aPöÇ`OH.žQqΊÚéŸYçÝÚ¼cãµuåô|6¸œƒÇˆÂ:Ó F´ýzX¯ŽpGCw{`ØTØ^ÓþX]õ#îs~ó0d³I‡¶ñæù1˜gj"f¢¯ yyub¤z¨<âîh†.–! ] èáò»EAD9DØ¡ªÀs¢Z‘BÞù¤çó¾Å):Ç–i'S;›áéâÜö;¬3޳չªÕ-š06,‚§CÍ2¢`ŠÄx«ìœ0RBð‚Î>§/aÿÑÇiD+LwZÄqPóóœ¨qÜ+#e÷Ø«Øasà8èM7 3 !|t]– ç^³šdèý­ƒ|-~÷p¯\#²LOÄ´šæÓmÓÝqQ­ñ¦ÆŠ2iã¸öϹì¨\öàâ.(vHÌf‰8i@¢  Õ¹áH—8D—v3¹£I°‘ÉÑ:}±å©ÔgsëÐk8ùp—Mgm|ÛB(sCÑñ³×mL–±¼c²ÁdK!µ&‚Üñ‚-[0û¬õIér4xTZŒs^ ·FÜ0p8^ÌÅQŠå¥ Ñç¡ ªŠëvÌ­Ýb(Ü”Iêò|ˆ‘6b<LI­¨ÙÁPÛß3`P—qz¦V‹y!iv eûîš ;Cä†OÅFhaœJšÛš¶«1€bºÜm ¶Ñû[ת‚§5Åzîè°v©åhSãºtV˜.±Ô¹FXÚ–þ~k3n8áãvs¥­yü1÷žu–ÕØ>{1WMn”$?B rç%†þº\B7:UÛº̪Ôj1 Né¼û«ˆ_ul¢è ˜Ä®ºQ:_ VÄ|@îmXiò(ÅϲæLš}WÜŠVAùÔW”ÂXšt[ÆÈ¾sMj’PÌEÞè–¡· ‚–å4¹)vA(†Î_¸å/2<*,PåÖ](Uiú2¥¨ò•Eüéñ”ó&ƒ;öMÅR˜L [·”¶sƒZ—KfÜÕ¤¶dg¢¨Ë‹qw_•b(ý¶/Sú‡WäÑãÝò|9'n{¤Çl38òŠ=âÇOß½ÚûÔ¹r¯öÝÁRÁkë÷BÁiòì|@Å~ô¯ÞWûŠ{—2N]=cæ\±«Æ+©¼ôŽkwý¬ŠÙ¡7x‹&©Ô¾“'ˆ34aûÚ9ö2CJ *ö¯•ìÎË¿{â¯ß—,þùd–Ý5 °TúMÑÍtx÷Ò w×|öWíi¾8 EÛ{‹E[»Çøµ2t<ÆŸªn)çÿjâÝÚ}KÙ]/ÿÉÉwÍu剞ÔéýË™’ºë uK¬e*Pˆøž%¹ü­z¿œm“:ÑSã@$uâ¯Í! /ãOºÇF›¬Âhx[“Ç¿ô÷Õ¯½õö…Ï_SÇAwWR•  ÖO®f ׄ&ˆˆ@g2Ó—îŒÏkEbšêûÙÁõnÕÈ¥:ù÷…ôQ©YA/Ë û€‚ùjQ§1+bZ Ú@DtèÜzöGM7g6AÑy›Mtô*èåÔÉÿ—Øq&Ú‡EAœo ñ×qþ`M*Ìô±HAg€‚.¯Zqú biÐË(×Ê>ÑeF1…£L)¹¯¹ý¿ªfþâ1ƒIEND®B`‚qxrunner/src/qxrunner/resources/stop.png0000700000000000000000000000063210251335534017607 0ustar rootroot‰PNG  IHDRóÿa pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚÔ“¹QCADŸTžÈ@A™( L€ RÁ%ýkÏÙù‹‹$CE{í¼êžš^´Ö¸FK®ÔßV?ÍÃÛÜÌ 5¥VC«RkEÍPUæ¹¹§Ýöö$À̸¿[Òk¦¸Â…Š(ŒAy|yß°ÛžN ¦¬Wk†Ç©rcð3bFödÉç+Ôjˆ®ü̽¯Œ¡’0uÉùüµ*!‚“†Ë Ÿ!U\¨ì¿:r¾˜ âdÆGÈbŒÞè0Nç#’å<@Íð.\Fç ÁSK¦”r Êè ýá“þ8ö޾ïÈ)“¢GUÏæ¹¹ç×M)…”1Db ¤˜‘_iñÿÇô=YÄàkB²%ÑIEND®B`‚qxrunner/src/qxrunner/resources/success.png0000700000000000000000000000126210462220434020266 0ustar rootroot‰PNG  IHDRóÿayIDATxœ¥’OH“qÆ?ï»é Jd©3D„NÝBÑÌN;D‡N‰`T(F %)B‰ ºt(R!†×º " ²òhøC‚Õ«[™›séönsï¿ßÛÁRdtòïå χ‡‡))çó‚""tÉù²ïxaYešR,¥íŒp„1úIþà§¹<[2Ùq¶ÝS_yš°&’Þà·¦ŒFX^Yã}¼ÍøinpV¿8ßá §¿L.±­eHi:)ÝDÕ5’šÆZHÕ Yøèc @þ»|§xr°©Óµ´=KP]À²2¶-aÛ6‰lšë5ÝTÕ”ä—üÜ£t°F×ÕÆ6OXUˆî„BB3-4K` A$ç}Û<÷G4MQPá®DãÖ> _}e-‹ñY~$¤ Œ¡“5 ~ª1Þ]X¤ºÄ N˜ÞzEVä$ùö…euë™_Ì*1Z·™[ÐÒ„“Q¦Z¨.ó‚ž+ƒôÌŒ‚^¸ÎìlKH_6Ö=áNC/Ï}@Í8xÝ2Ï©ÒZÆ•AzgF&)±Û½ °™Tƒ¶$Ý%a&©q×òùRˆê"/ʽŸF0,@—!í#Üï`GV£1v„+sMH²„a[à„‰•!º?£™ ­kLû€bƾ*áˆi;˜/Ó1ß–µÊ¸2Àéa4„l…­`®Ä±xzpH£\tZrÀé‘ó³–‰;ÔÀú{'!î{Ù¤ q™Ç» Nùíd%?%®Jò\`8!S©c`¤ÀÅ)Ö:y´kÎôSJš›‡9Ï‹-Iú7„@ðŒ â9žÃèÍë.÷ûgÈ?IEND®B`‚qxrunner/src/qxrunner/resources/uncheckedbox.png0000700000000000000000000000043210457776244021301 0ustar rootroot‰PNG  IHDRóÿatIMEÖ;% qy™ pHYs  d_‘gAMA± üa©IDATxÚc` 0‚™À†ÿ¤j|²¾¬—&plb,ÂTF&&&fffÒÌp$¦×WË„á$šA0«ù÷ï_P9fìÒ V u2€‡L3++˜®¦†‘‘» `6#ø¨šyyùÁšq†ÌFÀ¥äU.€øæ\šqz9ª89¹pjƈx±‰ÑŒˆ0ͰÐ&¤%‘“çÐì ¨dïOIEND®B`‚qxrunner/src/qxrunner/resources/warning.png0000700000000000000000000000126010462220340020255 0ustar rootroot‰PNG  IHDRóÿawIDATxœµÑKHTaÆñÿùÎefŽÇã)ÅifRS+-…Ä[h”º)¡ÙŠ2ZA‹(hA¸( \µŠ ]D­Ä6µ й E'ÁÊÑñ6£s9s¾Ö"ºnzw/¼üày^ø_óî1‘¯Ó³o[ä󇯛¾‹S¿º¿„Æ;²dlÞµ…p…ѨkîÝ3]Õú?Ï(l¶/Øá|5ûò…Ï]½u²çŸ=À9§´n'j3ÑwxR“ íÝWþ LVÕ`SV/¤ik³é¿S¨´ h†!K®ž)>þG ³L—n®Aä32g*ZÁ«y€Fm£4 íå¿ÆŸ`kfè¼iæÙ]™DPÈÁŽy Góþºî•_>:ðKÀoÑm—6Ô)z0ÁžÚJ ÊÙÛ’…\¿m±}{N8ÖÊ­Ÿ€Ä¶â+ì±·VQ Šé¬c9“XÎ"$\riÖvM5ýéúÞ£Õ?É›ÁÊ=ÆÀûÂ&;IãîQL= k WR8!›HØÓBEs} @b”‚ù%s(ØÔÞæ·\HŒÁÚ˜9>}ð*[‡EȤJ$Hlz‰Gnj-í €xŒNÓ)hñY‹°: ‹HÕcp@Ð{Ýcø©LP2ÙØ*[J-‚Ež‘uµûâö%±-Ó.çÛÂPQø<—t&ǽ9††1òòäFX "‘D®»tì“ÂÍ;ÔîNµRQÕk––ÑRó –\–ã]… £PUV̉ÎÜ•YâK k HÆÓèŠ$ÂToªf$(úßOɳÙìF'ò[9ª¶±yxÞFeÊ÷÷©)ý3_½8Ý ]ç½@IEND®B`‚qxrunner/src/qxrunner/resultsmodel.cpp0000700000000000000000000000615210501355374017335 0ustar rootroot/*! * \file resultsmodel.cpp * * \brief Implements class ResultsModel. */ #include "resultsmodel.h" #include "runneritem.h" #include "utils.h" #include "qxrunner_global.h" namespace QxRunner { ResultsModel::ResultsModel(const QStringList& headerData, QObject* parent) : QAbstractListModel(parent), m_headerData(headerData) { } ResultsModel::~ResultsModel() { } QVariant ResultsModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } if (role == Qt::CheckStateRole) { // Results have no items with checked state. return QVariant(); } if (role == Qt::TextAlignmentRole) { return int(Qt::AlignLeft | Qt::AlignTop); } RunnerItem* item = itemFromIndex(m_runnerItemIndexes.at(index.row())); if (role == Qt::DisplayRole) { return item->data(index.column()); } if (role != Qt::DecorationRole || index.column() != 0) { // First column only has a decoration. return QVariant(); } // Icon corresponding to the item's result code. return Utils::resultIcon(item->result()); } QVariant ResultsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { return m_headerData.at(section); } return QVariant(); } int ResultsModel::rowCount(const QModelIndex& parent) const { return m_runnerItemIndexes.count(); } int ResultsModel::columnCount(const QModelIndex& parent) const { return m_headerData.count(); } int ResultsModel::result(int row) const { QModelIndex runnerItemIndex = mapToRunnerItemIndex(index(row, 0)); if (!runnerItemIndex.isValid()) { return QxRunner::NoResult; } RunnerItem* item = itemFromIndex(runnerItemIndex); return item->result(); } QModelIndex ResultsModel::mapToRunnerItemIndex(const QModelIndex& index) const { if (!index.isValid()) { return QModelIndex(); } return m_runnerItemIndexes.value(index.row()); // Note: QList provides sensible default values if the row // number is out of range. } QModelIndex ResultsModel::mapFromRunnerItemIndex(const QModelIndex& runnerItemIndex) const { if (!runnerItemIndex.isValid()) { return QModelIndex(); } QModelIndex modelIndex; qint64 id = runnerItemIndex.internalId(); if (m_runnerItemMap.contains(id)) { modelIndex = index(m_runnerItemMap[id], 0); } return modelIndex; } void ResultsModel::addResult(const QModelIndex& runnerItemIndex) { if (!runnerItemIndex.isValid()) { return; } beginInsertRows(QModelIndex(), rowCount(), rowCount() + 1); m_runnerItemIndexes.append(QPersistentModelIndex(runnerItemIndex)); m_runnerItemMap[runnerItemIndex.internalId()] = rowCount() - 1; endInsertRows(); } void ResultsModel::clear() { m_runnerItemIndexes.clear(); m_runnerItemMap.clear(); reset(); } RunnerItem* ResultsModel::itemFromIndex(const QModelIndex& runnerItemIndex) const { return static_cast(runnerItemIndex.internalPointer()); } } // namespace qxrunner/src/qxrunner/resultsproxymodel.cpp0000700000000000000000000000256310476335730020446 0ustar rootroot/*! * \file resultsproxymodel.cpp * * \brief Implements class ResultsProxyModel. */ #include "resultsproxymodel.h" #include "resultsmodel.h" namespace QxRunner { ResultsProxyModel::ResultsProxyModel(QObject* parent, int filter) : QSortFilterProxyModel(parent), m_filter(filter) { } ResultsProxyModel::~ResultsProxyModel() { } QVariant ResultsProxyModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } if (isColumnEnabled(index.column())) { return QSortFilterProxyModel::data(index, role); } return QVariant(); } int ResultsProxyModel::filter() const { return m_filter; } void ResultsProxyModel::setFilter(int filter) { if (m_filter != filter) { // Update only when not same filter. m_filter = filter; reset(); } } bool ResultsProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { // No data when proxy model is inactive. if (!isActive()) { return false; } int result = model()->result(source_row); if (result & m_filter || result == QxRunner::RunException) { return true; } else { return false; } } ResultsModel* ResultsProxyModel::model() const { return static_cast(sourceModel()); } } // namespace qxrunner/src/qxrunner/resultsviewcontroller.cpp0000700000000000000000000000352310501616504021305 0ustar rootroot/*! * \file resultsviewcontroller.cpp * * \brief Implements class ResultsViewController. */ #include "resultsviewcontroller.h" #include "resultsmodel.h" #include "resultsproxymodel.h" namespace QxRunner { ResultsViewController::ResultsViewController(QObject* parent, QTreeView* view) : QObject(parent), ViewControllerCommon(view) { // Allow clicking in the header, sorting gets enabled only when there are results. header()->setClickable(true); connect(header(), SIGNAL(sectionClicked(int)), SLOT(setupSorting())); } ResultsViewController::~ResultsViewController() { } void ResultsViewController::enableSorting(bool enable) const { if (!enable) { header()->setSortIndicatorShown(false); // Sorting non-existent column removes any sorting. proxyModel()->sort(-1); return; } if (header()->isSortIndicatorShown()) { // Sorting columns already enabled. return; } // Initial sorting of current column. int section = header()->sortIndicatorSection(); proxyModel()->sort(section, Qt::DescendingOrder); header()->setSortIndicator(section, Qt::DescendingOrder); header()->setSortIndicatorShown(true); /// /// \todo Verify that sort(-1) is the correct way to remove sorting /// from the model. /// } ResultsModel* ResultsViewController::resultsModel() const { return static_cast(model()); } ResultsProxyModel* ResultsViewController::resultsProxyModel() const { return static_cast(proxyModel()); } void ResultsViewController::setupSorting() const { bool enable; if (proxyModel()->rowCount() < 1) { // No sorting when no results are displayed. enable = false; } else { // Sorting enabled when results are displayed. enable = true; } enableSorting(enable); } } // namespace qxrunner/src/qxrunner/runner.cpp0000700000000000000000000000126310501400614016106 0ustar rootroot/*! * \file runner.cpp * * \brief Implements class Runner. */ #include "runner.h" #include "runnerwindow.h" #include namespace QxRunner { Runner::Runner(RunnerModel* model) : m_model(model) { m_icon = 0; } Runner::~Runner() { delete m_icon; } void Runner::run() { RunnerWindow runnerWindow; if (m_icon) { // Application specific icon. runnerWindow.setWindowIcon(*m_icon); } runnerWindow.setModel(m_model); runnerWindow.show(); qApp->connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit())); qApp->exec(); } void Runner::setWindowIcon(const QIcon& icon) { m_icon = new QIcon(icon); } } // namespace qxrunner/src/qxrunner/runneritem.cpp0000700000000000000000000000417610501353676017012 0ustar rootroot/*! * \file runneritem.cpp * * \brief Implements class RunnerItem. */ #include "runneritem.h" namespace QxRunner { RunnerItem::RunnerItem(const QList& data, RunnerItem* parent) { m_parentItem = parent; m_itemData = data; // Make sure this item has as many columns as the parent. if (m_parentItem) { int parentColumns = m_parentItem->columnCount(); int itemColumns = m_itemData.count(); for (int i = itemColumns; i < parentColumns; i++) { m_itemData.append(""); } } setSelected(true); setResult(QxRunner::NoResult); } RunnerItem::~RunnerItem() { qDeleteAll(m_childItems); } RunnerItem* RunnerItem::parent() const { return m_parentItem; } RunnerItem* RunnerItem::child(int row) const { return m_childItems.value(row); // Note: QList provides sensible default values if the row // number is out of range. } void RunnerItem::appendChild(RunnerItem* item) { m_childItems.append(item); } int RunnerItem::childCount() const { return m_childItems.count(); } int RunnerItem::row() const { if (m_parentItem) { return m_parentItem->m_childItems.indexOf(const_cast(this)); } return 0; } int RunnerItem::columnCount() const { return m_itemData.count(); } QVariant RunnerItem::data(int column) const { return m_itemData.value(column); // Note: QList provides sensible default values if the column // number is out of range. } void RunnerItem::setData(int column, const QVariant& value) { if (column >= 0 && column < columnCount()) { m_itemData.replace(column, value.toString()); } } bool RunnerItem::isSelected() const { return m_selected; } void RunnerItem::setSelected(bool select) { m_selected = select; } int RunnerItem::result() const { return m_result; } void RunnerItem::setResult(int result) { m_result = result; } void RunnerItem::clear() { // Initialize columns except column 0 which contains the item name. for (int i = 1; i < columnCount(); i++) { setData(i, ""); } setResult(QxRunner::NoResult); } } // namespace qxrunner/src/qxrunner/runnermodel.cpp0000700000000000000000000005426110522425464017152 0ustar rootroot/*! * \file runnermodel.cpp * * \brief Implements class RunnerModel. */ #include "runnermodel.h" #include "runnermodelthread.h" #include "runneritem.h" #include "resultsmodel.h" #include "utils.h" #include #include #include namespace QxRunner { RunnerModel::RunnerModel(QObject* parent) : QAbstractItemModel(parent) { // Initialize counters. m_numSelected = 0; m_numStarted = 0; m_numSuccess = 0; m_numInfos = 0; m_numWarnings = 0; m_numErrors = 0; m_numFatals = 0; m_numExceptions = 0; // Other attributes. m_rootItem = 0; m_resultsModel = 0; setMustStop(false); setMustWait(false); setMinimalUpdate(false); setExpectedResults(QxRunner::AllResults); // Thread for asynchronous execution of items. m_thread = new RunnerModelThread(this); } RunnerModel::~RunnerModel() { stopItems(); delete m_resultsModel; delete m_rootItem; // Learned by experience that the thread should get deleted last. m_thread->terminate(); delete m_thread; /// /// \todo Stopping items and deleting the thread must become /// bullet proof. /// } QString RunnerModel::about() const { return ""; } QVariant RunnerModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } if (role == Qt::TextAlignmentRole) { return int(Qt::AlignLeft | Qt::AlignTop); } if (isRunning() && isMinimalUpdate()) { return dataForMinimalUpdate(index, role); } RunnerItem* item = itemFromIndex(index); if (role == Qt::DisplayRole) { return item->data(index.column()); } // The other roles are supported for the first column only. if (index.column() != 0) { return QVariant(); } if (role == Qt::CheckStateRole) { return itemCheckState(index); } if (role != Qt::DecorationRole) { return QVariant(); } // Return decoration which reflects the item's result state. if (index == m_startedItemIndex) { return QIcon(":/icons/play.png"); } if (index.child(0, 0).isValid()) { return QIcon(":/icons/group.png"); } // Ready to run but no result yet. if (item->isSelected() && item->result() == QxRunner::NoResult) { return QIcon(":/icons/item_run.png"); } // Icon corresponding to the item's result code. return Utils::resultIcon(item->result()); } bool RunnerModel::setData (const QModelIndex& index, const QVariant& value, int role) { if (!index.isValid()) { return false; } // No data changes from the outside when items are running. if (isRunning()) { return false; } // The only data which can be set from the outside is the selected flag. if (role != Qt::CheckStateRole || index.column() != 0) { return false; } if (index.child(0, 0).isValid()) { setParentItemChecked(index, value.toBool()); } else { setChildItemChecked(index, value.toBool()); } return true; } Qt::ItemFlags RunnerModel::flags(const QModelIndex& index) const { if (!index.isValid()) { return Qt::ItemIsEnabled; } if (index.column() > 0) { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } else { return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; } } QVariant RunnerModel::headerData(int section, Qt::Orientation orientation, int role) const { if (!m_rootItem) { return QVariant(); } if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { return m_rootItem->data(section); } return QVariant(); } QModelIndex RunnerModel::index(int row, int column, const QModelIndex& parent) const { if (!m_rootItem) { return QModelIndex(); } RunnerItem* parentItem; if (!parent.isValid()) { parentItem = m_rootItem; } else { parentItem = itemFromIndex(parent); } RunnerItem* childItem = parentItem->child(row); if (childItem) { return createIndex(row, column, childItem); } return QModelIndex(); } QModelIndex RunnerModel::parent(const QModelIndex& index) const { if (!index.isValid()) { return QModelIndex(); } RunnerItem* childItem = itemFromIndex(index); RunnerItem* parentItem = childItem->parent(); if (parentItem == m_rootItem) { return QModelIndex(); } return createIndex(parentItem->row(), 0, parentItem); } int RunnerModel::rowCount(const QModelIndex& parent) const { if (!m_rootItem) { return 0; } RunnerItem* parentItem; if (!parent.isValid()) { parentItem = m_rootItem; } else { parentItem = itemFromIndex(parent); } return parentItem->childCount(); } int RunnerModel::columnCount(const QModelIndex& parent) const { if (!m_rootItem) { return 0; } if (parent.isValid()) { return itemFromIndex(parent)->columnCount(); } return m_rootItem->columnCount(); } void RunnerModel::countItems() { int numTotal = 0; m_numSelected = 0; m_numSuccess = 0; m_numInfos = 0; m_numWarnings = 0; m_numErrors = 0; m_numFatals = 0; m_numExceptions = 0; // Non-recursive traversal of the tree structure. QModelIndex currentIndex = index(0, 0); while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // Go down. currentIndex = currentIndex.child(0, 0); continue; } // Have an item. RunnerItem* item = itemFromIndex(currentIndex); numTotal++; if (item->isSelected()) { m_numSelected++; } switch (item->result()) { case QxRunner::RunSuccess: m_numSuccess++; break; case QxRunner::RunInfo: m_numInfos++; break; case QxRunner::RunWarning: m_numWarnings++; break; case QxRunner::RunError: m_numErrors++; break; case QxRunner::RunFatal: m_numFatals++; break; case QxRunner::RunException: m_numExceptions++; break; } QModelIndex siblingIndex; siblingIndex = currentIndex.sibling(currentIndex.row() + 1, 0); if (siblingIndex.isValid()) { // Proceed on same level. currentIndex = siblingIndex; continue; } // Go up one or more levels. QModelIndex parentIndex = currentIndex.parent(); currentIndex = parentIndex.sibling(parentIndex.row() + 1, 0); while (!currentIndex.isValid()) { if (parentIndex.isValid()) { parentIndex = parentIndex.parent(); currentIndex = parentIndex.sibling(parentIndex.row() + 1, 0); continue; } // No more items. break; } } emit numTotalChanged(numTotal); emit numSelectedChanged(m_numSelected); emit numSuccessChanged(m_numInfos); emit numInfosChanged(m_numInfos); emit numWarningsChanged(m_numWarnings); emit numErrorsChanged(m_numErrors); emit numFatalsChanged(m_numFatals); emit numExceptionsChanged(m_numExceptions); } int RunnerModel::expectedResults() const { return m_expectedResults; } void RunnerModel::setItemChecked(const QModelIndex& index, bool checked) { if (!index.isValid()) { return; } if (index.child(0, 0).isValid()) { // Children of parent items get the same check state. setParentItemChecked(index, checked); } else { // Set check state for this item. This also calculates the // check state of any parent items. setData(index, checked, Qt::CheckStateRole); } } void RunnerModel::runItems() { // No start when thread already/still runs. if (isRunning(WAIT_TIME_MILLI)) { return; } // Remove all results. clearItem(index(0, 0)); resultsModel()->clear(); // Initialize counters. m_numStarted = 0; m_numSuccess = 0; m_numInfos = 0; m_numWarnings = 0; m_numErrors = 0; m_numFatals = 0; m_numExceptions = 0; emit numStartedChanged(m_numStarted); emit numCompletedChanged(m_numStarted); emit numSuccessChanged(m_numSuccess); emit numInfosChanged(m_numInfos); emit numWarningsChanged(m_numWarnings); emit numErrorsChanged(m_numErrors); emit numFatalsChanged(m_numFatals); emit numExceptionsChanged(m_numExceptions); setMustStop(false); // Start asynchronous processing of the items. m_thread->start(); } bool RunnerModel::stopItems() { if (!isRunning()) { return true; } setMustWait(false); // Unblock waiting thread setMustStop(true); // Force soft stop // Give thread a chance to run if it's waiting. isRunning(WAIT_TIME_MILLI); setMustStop(false); // Proceed if not successful if (!isRunning()) { return true; } else { return false; } } void RunnerModel::emitItemResults() { // Recursively process the items. emitItemResult(index(0, 0)); } bool RunnerModel::isRunning(unsigned long time) const { if (!m_thread->isRunning()) { return false; } if (!time) { return true; } m_thread->wait(time); return m_thread->isRunning(); } ResultsModel* RunnerModel::resultsModel() { if (!m_rootItem) { return 0; } if (!m_resultsModel) { // Create the results model. QStringList resultHeaders; for (int i = 0; i < m_rootItem->columnCount(); i++) { resultHeaders.append(m_rootItem->data(i).toString()); } m_resultsModel = new ResultsModel(resultHeaders); } return m_resultsModel; } void RunnerModel::setMinimalUpdate(bool minimalUpdate) { m_minimalUpdate = minimalUpdate; } RunnerItem* RunnerModel::rootItem() const { return m_rootItem; } void RunnerModel::setRootItem(RunnerItem* rootItem) { delete m_rootItem; m_rootItem = rootItem; delete m_resultsModel; m_resultsModel = 0; // Create the results model (anew). resultsModel()->clear(); } void RunnerModel::setExpectedResults(int expectedResults) { m_expectedResults = expectedResults; } RunnerItem* RunnerModel::itemFromIndex(const QModelIndex& index) const { return static_cast(index.internalPointer()); } QVariant RunnerModel::dataForMinimalUpdate(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } // Only first column gets displayed in minimal update mode. if (index.column() != 0) { return QVariant(); } RunnerItem* item = itemFromIndex(index); if (role == Qt::DecorationRole) { if (index.child(0, 0).isValid()) { return QIcon(":/icons/group.png"); } if (item->isSelected()) { return QIcon(":/icons/item_run.png"); } return QIcon(":/icons/item.png"); } if (role == Qt::CheckStateRole) { return itemCheckState(index); } if (role == Qt::DisplayRole) { return item->data(index.column()); } return QVariant(); } void RunnerModel::initializeSelectionMap() { m_selectionMap.clear(); // Process all top level items. QModelIndex currentIndex = index(0, 0); while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // Recursively process sub branches. updateSelectionMap(currentIndex.child(0, 0)); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::updateSelectionMap(const QModelIndex& index) { if (!index.isValid()) { return; } QModelIndex currentIndex = index; while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // Recursively process sub branches. updateSelectionMap(currentIndex.child(0, 0)); currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); continue; } // Update counters for all parents depending on the item state. RunnerItem* item = itemFromIndex(currentIndex); QModelIndex parentIndex = currentIndex.parent(); SelectionPair pair; while (parentIndex.isValid()) { if (m_selectionMap.contains(parentIndex.internalId())) { pair = m_selectionMap.value(parentIndex.internalId()); } else { pair = SelectionPair(0, 0); } pair.first++; if (item->isSelected()) { pair.second++; } m_selectionMap[parentIndex.internalId()] = pair; // Next parent. parentIndex = parentIndex.parent(); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::threadCode() { // Recursively process the items. runItem(index(0, 0)); // Notify that all items have completed. AllItemsCompletedEvent* completedEvent; completedEvent = new AllItemsCompletedEvent(QModelIndex()); QCoreApplication::postEvent(this, completedEvent); } bool RunnerModel::mustStop() { QMutexLocker locker(&m_lock); return m_stop; } void RunnerModel::setMustStop(bool stop) { QMutexLocker locker(&m_lock); m_stop = stop; } bool RunnerModel::mustWait(bool block) { m_lock.lock(); while (block) { if (m_wait) { m_lock.unlock(); m_thread->msleep(10); // Minimal wait m_lock.lock(); } else { block = false; } } bool b = m_wait; m_lock.unlock(); return b; } void RunnerModel::setMustWait(bool wait) { QMutexLocker locker(&m_lock); m_wait = wait; } void RunnerModel::clearItem(const QModelIndex& index) { if (!index.isValid()) { return; } QModelIndex currentIndex = index; while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { clearItem(currentIndex.child(0, 0)); } RunnerItem* item = itemFromIndex(currentIndex); item->clear(); QModelIndex lastIndex = this->index(currentIndex.row(), item->columnCount() - 1); emit dataChanged(currentIndex, lastIndex); currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::runItem(const QModelIndex& index) { // This is thread code! if (!index.isValid()) { return; } if (mustStop()) { return; // Soft stop } QModelIndex currentIndex = index; while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // Go down one level. runItem(currentIndex.child(0, 0)); currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); continue; } if (mustStop()) { break; // Soft stop } RunnerItem* item = itemFromIndex(currentIndex); if (item->isSelected()) { // Set flag for thread synchronisation. setMustWait(true); // Send notification to main thread. ItemGetsStartedEvent* startedEvent; startedEvent = new ItemGetsStartedEvent(currentIndex); QCoreApplication::postEvent(this, startedEvent); // Check stop flag before item processing. if (mustStop()) { break; // Soft stop } // Don't proceed until event is processed in main thread. mustWait(true); // Execute custom code. try { item->run(); } catch (...) { item->setResult(QxRunner::RunException); } setMustWait(true); ItemCompletedEvent* completedEvent; completedEvent = new ItemCompletedEvent(currentIndex); QCoreApplication::postEvent(this, completedEvent); if (mustStop()) { break; // Soft stop } mustWait(true); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::emitItemResult(const QModelIndex& index) { if (!index.isValid()) { return; } QModelIndex currentIndex = index; while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { emitItemResult(currentIndex.child(0, 0)); } RunnerItem* item = itemFromIndex(currentIndex); if (item->isSelected() && item->result() != QxRunner::NoResult) { RunnerItem* item = itemFromIndex(currentIndex); QModelIndex lastIndex = this->index(currentIndex.row(), item->columnCount() - 1); emit dataChanged(currentIndex, lastIndex); // Also update views emit itemCompleted(currentIndex); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::setResultText(RunnerItem* item, const QString& text) const { // Set result text in column 1 but without overwriting an existing text. if (item->data(1).toString().trimmed().isEmpty()) { item->setData(1, text); } } bool RunnerModel::isMinimalUpdate() const { return m_minimalUpdate; } void RunnerModel::setParentItemChecked(const QModelIndex& index, bool checked) { if (!index.isValid()) { return; } // Note that the check state of parent items is calculated whenever the // check state of one of its children is changed. Parent items are tri-state // and their check state depends on the number of checked/unchecked children. // Start with first child. QModelIndex currentIndex = index.child(0, 0); while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // Recursively process a sub branch. setParentItemChecked(currentIndex, checked); } else { // Set check state for this child item. This also calculates the // check state of the parent items. setData(currentIndex, checked, Qt::CheckStateRole); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerModel::setChildItemChecked(const QModelIndex& index, bool checked) { if (!index.isValid()) { return; } // The same item can get processed more than once per activation due to // how it gets selected in the GUI and how the model/view framework reacts // to the selection, therefore only 'real' changes are counted. bool changed = false; RunnerItem* item = itemFromIndex(index); bool newState = checked; bool oldState = item->isSelected(); if (newState != oldState) { if (newState) { m_numSelected++; } else { m_numSelected--; } item->setSelected(newState); changed = true; emit numSelectedChanged(m_numSelected); } // Update views anyway. emit dataChanged(index, index); // Done when no changes occured. if (!changed) { return; } // Updated counters of the child item's parents for their // tri-state handling. QModelIndex parentIndex = index.parent(); SelectionPair pair; while (parentIndex.isValid()) { if (m_selectionMap.contains(parentIndex.internalId())) { pair = m_selectionMap.value(parentIndex.internalId()); } else { pair = SelectionPair(0, 0); // Shouldn't happen } if (item->isSelected()) { pair.second++; } else { pair.second--; } m_selectionMap[parentIndex.internalId()] = pair; // Update views to reflect state of parent item. emit dataChanged(parentIndex, parentIndex); parentIndex = parentIndex.parent(); } } QVariant RunnerModel::itemCheckState(const QModelIndex& index) const { if (!index.isValid()) { return Qt::Unchecked; } RunnerItem* item = itemFromIndex(index); if (!index.child(0, 0).isValid()) { // Non-parents have two states. if (item->isSelected()) { return Qt::Checked; } else { return Qt::Unchecked; } } // If not yet there then setup selection map for tri-state handling. if (m_selectionMap.count() < 1) { const_cast(this)->initializeSelectionMap(); } // Parent items are tri-state. SelectionPair pair; if (m_selectionMap.contains(index.internalId())) { pair = m_selectionMap.value(index.internalId()); } else { pair = SelectionPair(0, 0); // Shouldn't happen } if (pair.first == pair.second) { return Qt::Checked; } else if (pair.second > 0) { return Qt::PartiallyChecked; } else { return Qt::Unchecked; } } bool RunnerModel::event(QEvent* event) { if (event->type() < QEvent::User) { return QAbstractItemModel::event(event); } if (event->type() == AllItemsCompleted) { emit allItemsCompleted(); // Last item completed return true; } ItemStateChangedEvent* stateChangedEvent = static_cast(event); QModelIndex firstIndex = stateChangedEvent->index(); RunnerItem* item = itemFromIndex(firstIndex); QModelIndex lastIndex = index(firstIndex.row(), item->columnCount() - 1); if (event->type() == ItemGetsStarted) { m_startedItemIndex = stateChangedEvent->index(); emit itemStarted(m_startedItemIndex); m_numStarted++; emit numStartedChanged(m_numStarted); } else { m_startedItemIndex = QModelIndex(); } if (event->type() == ItemCompleted) { // Update result counters and provide default result type string if not // set in the item itself. switch (item->result()) { case QxRunner::RunSuccess: setResultText(item, tr("Success")); m_numSuccess++; emit numSuccessChanged(m_numSuccess); break; case QxRunner::RunInfo: setResultText(item, tr("Info")); m_numInfos++; emit numInfosChanged(m_numInfos); break; case QxRunner::RunWarning: setResultText(item, tr("Warning")); m_numWarnings++; emit numWarningsChanged(m_numWarnings); break; case QxRunner::RunError: setResultText(item, tr("Error")); m_numErrors++; emit numErrorsChanged(m_numErrors); break; case QxRunner::RunFatal: setResultText(item, tr("Fatal")); m_numFatals++; emit numFatalsChanged(m_numFatals); break; case QxRunner::RunException: setResultText(item, tr("Exception")); m_numExceptions++; emit numExceptionsChanged(m_numExceptions); break; } emit numCompletedChanged(m_numStarted); if (!isMinimalUpdate()) { emit itemCompleted(stateChangedEvent->index()); } } // Thread can continue after posted events are processed. setMustWait(false); // Force view updates. // As an optimization no updates are forced when an item gets started since this // does not involve any data changes (but could change in the future). // Additionally when minimal update is active the views should not get updated // when an item has completed in order to speed up item execution since updating // the views is time consuming. if (event->type() == ItemGetsStarted) { return true; } if (event->type() != ItemCompleted) { emit dataChanged(firstIndex, lastIndex); return true; } if (!isMinimalUpdate()) { emit dataChanged(firstIndex, lastIndex); } return true; } } // namespace qxrunner/src/qxrunner/runnermodelthread.cpp0000700000000000000000000000115410477615604020341 0ustar rootroot/*! * \file runnermodelthread.cpp * * \brief Implements class RunnerModelThread. */ #include "runnermodelthread.h" #include "runnermodel.h" namespace QxRunner { RunnerModelThread::RunnerModelThread(RunnerModel* parent) : QThread(parent) { } RunnerModelThread::~RunnerModelThread() { } void RunnerModelThread::msleep(unsigned long msecs) const { QThread::msleep(msecs); } void RunnerModelThread::run() { setTerminationEnabled(); RunnerModel* model = static_cast(parent()); if (model) { model->threadCode(); } } } // namespace qxrunner/src/qxrunner/runnerproxymodel.cpp0000700000000000000000000000111510476320250020235 0ustar rootroot/*! * \file runnerproxymodel.cpp * * \brief Implements class RunnerProxyModel. */ #include "runnerproxymodel.h" namespace QxRunner { RunnerProxyModel::RunnerProxyModel(QObject* parent) : QSortFilterProxyModel(parent) { } RunnerProxyModel::~RunnerProxyModel() { } QVariant RunnerProxyModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) { return QVariant(); } if (isColumnEnabled(index.column())) { return QSortFilterProxyModel::data(index, role); } return QVariant(); } } // namespace qxrunner/src/qxrunner/runnerviewcontroller.cpp0000700000000000000000000001204110504537556021124 0ustar rootroot/*! * \file runnerviewcontroller.cpp * * \brief Implements class RunnerViewController. */ #include "runnerviewcontroller.h" #include "runnermodel.h" #include "runnerproxymodel.h" #include "utils.h" #include #include namespace QxRunner { RunnerViewController::RunnerViewController(QObject* parent, QTreeView* view) : QObject(parent), ViewControllerCommon(view) { // Intercept tree view events for key press handling. view->installEventFilter(static_cast(this)); } RunnerViewController::~RunnerViewController() { } RunnerModel* RunnerViewController::runnerModel() const { return static_cast(model()); } RunnerProxyModel* RunnerViewController::runnerProxyModel() const { return static_cast(proxyModel()); } void RunnerViewController::selectAll() const { selectAllItems(true); } void RunnerViewController::unselectAll() const { selectAllItems(false); } void RunnerViewController::expandAll() const { // Recursively expand all branches. QModelIndex currentIndex; currentIndex = view()->indexBelow(view()->rootIndex()); expand(currentIndex); // Make highlighted row visible. currentIndex = highlightedRow(); if (currentIndex.isValid()) { // This will expand any parents. view()->scrollTo(currentIndex); } } void RunnerViewController::collapseAll() const { // Recursively collapse all branches. QModelIndex currentIndex; currentIndex = view()->indexBelow(view()->rootIndex()); collapse(currentIndex); // Highlight and show top level parent of current branch. currentIndex = highlightedRow(); if (!currentIndex.isValid()) { return; // No selection at all } QModelIndex parentIndex = currentIndex.parent(); // Search top level parent. while (parentIndex.isValid()) { currentIndex = parentIndex; parentIndex = parentIndex.parent(); } setHighlightedRow(currentIndex); } void RunnerViewController::expand(const QModelIndex& index) const { if (!index.isValid()) { return; } QModelIndex currentIndex = index; // Recursively expand branches. while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // First proceed the levels down. expand(currentIndex.child(0, 0)); // Expand this level. if (!view()->isExpanded(currentIndex)) { view()->expand(currentIndex); } } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerViewController::collapse(const QModelIndex& index) const { if (!index.isValid()) { return; } QModelIndex currentIndex = index; // Recursively collapse branches. while (currentIndex.isValid()) { if (currentIndex.child(0, 0).isValid()) { // First collapse this level. if (view()->isExpanded(currentIndex)) { view()->collapse(currentIndex); } // Proceed one level down. collapse(currentIndex.child(0, 0)); } currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } } void RunnerViewController::selectAllItems(bool select) const { QModelIndex runnerItemIndex; QModelIndex currentIndex = view()->indexBelow(view()->rootIndex()); while (currentIndex.isValid()) { runnerItemIndex = Utils::modelIndexFromProxy(proxyModel(), currentIndex); runnerModel()->setItemChecked(runnerItemIndex, select); currentIndex = currentIndex.sibling(currentIndex.row() + 1, 0); } // Update counters. runnerModel()->countItems(); } bool RunnerViewController::eventFilter(QObject* obj, QEvent* event) { if (event->type() != QEvent::KeyPress) { // Pass the event on to the parent class. return QObject::eventFilter(obj, event); } QKeyEvent* keyEvent = static_cast(event); int key = keyEvent->key(); // Tree view relevant keys make the currently highlighted row visible. if (key == Qt::Key_Minus || key == Qt::Key_Plus || key == Qt::Key_Left || key == Qt::Key_Right || key == Qt::Key_Up || key == Qt::Key_Down || key == Qt::Key_Space) { if (highlightedRow().isValid()) { view()->scrollTo(highlightedRow()); } } // Support +/- for expanding/collapsing branches. if (key == Qt::Key_Minus || key == Qt::Key_Plus) { if (key == Qt::Key_Minus) { key = Qt::Key_Left; } else { key = Qt::Key_Right; } // Create and send key to the tree view. QKeyEvent* newKeyEvent = new QKeyEvent(QEvent::KeyPress, key, keyEvent->modifiers()); QCoreApplication::postEvent(view(), newKeyEvent); return true; } if (key != Qt::Key_Space) { return QObject::eventFilter(obj, event); } // Mimick a click of the user. QModelIndex runnerItemIndex; runnerItemIndex = Utils::modelIndexFromProxy(proxyModel(), highlightedRow()); bool checked = runnerModel()->data(runnerItemIndex, Qt::CheckStateRole).toBool(); runnerModel()->setItemChecked(runnerItemIndex, !checked); return true; } } // namespace qxrunner/src/qxrunner/runnerwindow.cpp0000700000000000000000000010270510522137427017355 0ustar rootroot/*! * \file runnerwindow.cpp * * \brief Implements class RunnerWindow. */ #include "runnerwindow.h" #include "runnerviewcontroller.h" #include "resultsviewcontroller.h" #include "runnermodel.h" #include "resultsmodel.h" #include "runnerproxymodel.h" #include "resultsproxymodel.h" #include "statuswidget.h" #include "stoppingdialog.h" #include "columnsdialog.h" #include "settingsdialog.h" #include "aboutdialog.h" #include "appsettings.h" #include "utils.h" #include #include // Helper function needed to expand Q_INIT_RESOURCE outside the namespace. static void initQxRunnerResource() { Q_INIT_RESOURCE(qxrunner); } namespace QxRunner { RunnerWindow::RunnerWindow(QWidget* parent, Qt::WFlags flags) : QMainWindow(parent, flags) { initQxRunnerResource(); ui.setupUi(this); // Controllers for the tree views, it's best to create them at the // very beginning. m_runnerViewController = new RunnerViewController(this, runnerView()); m_resultsViewController = new ResultsViewController(this, resultsView()); // Adjust GUI. ui.actionMinimalUpdate->setCheckable(true); resultsView()->header()->setResizeMode(QHeaderView::Stretch); // Replace results menu item which serves as a placeholder // for the action from the dock widget. QAction* actionResults = ui.dockResults->toggleViewAction(); actionResults->setText(ui.actionResults->text()); ui.menuView->insertAction(ui.actionResults, actionResults); ui.menuView->removeAction(ui.actionResults); qSwap(ui.actionResults, actionResults); delete actionResults; connect(ui.actionResults, SIGNAL(toggled(bool)), SLOT(showResults(bool))); // Insert menu items for toolbar selection submenu. QMenu* toolbarsMenu = new QMenu(this); toolbarsMenu->insertAction(0, ui.runnerToolBar->toggleViewAction()); toolbarsMenu->insertAction(0, ui.viewToolBar->toggleViewAction()); ui.actionToolbars->setMenu(toolbarsMenu); // Apply settings. AppSettings settings(this); settings.applyBaseSettings(); // Fine tuning of the focus rect handling because there should // always be a focus rect visible in the views. connect(runnerView(), SIGNAL(clicked(const QModelIndex&)), SLOT(ensureFocusRect(const QModelIndex&))); connect(resultsView(), SIGNAL(clicked(const QModelIndex&)), SLOT(ensureFocusRect(const QModelIndex&))); // To keep the views synchronized when there are highlighted rows // which get clicked again.. connect(runnerView(), SIGNAL(pressed(const QModelIndex&)), SLOT(scrollToHighlightedRows())); connect(resultsView(), SIGNAL(pressed(const QModelIndex&)), SLOT(scrollToHighlightedRows())); // Set-up statusbar. m_statusWidget = new StatusWidget(0); statusBar()->addPermanentWidget(m_statusWidget, 1); statusWidget()->progressRun->hide(); // Disable user interaction while there is no data. enableItemActions(false); enableResultsFilter(false); // Initial results. displayNumInfos(0); displayNumWarnings(0); displayNumErrors(0); displayNumFatals(0); displayNumExceptions(0); // Results filter commands. connect(ui.buttonInfos, SIGNAL(toggled(bool)), SLOT(setResultsFilter())); connect(ui.buttonWarnings, SIGNAL(toggled(bool)), SLOT(setResultsFilter())); connect(ui.buttonErrors, SIGNAL(toggled(bool)), SLOT(setResultsFilter())); connect(ui.buttonFatals, SIGNAL(toggled(bool)), SLOT(setResultsFilter())); // File commands. connect(ui.actionExit, SIGNAL(triggered(bool)), SLOT(close())); // Item commands. ui.actionStart->setShortcut(QKeySequence(tr("Ctrl+R"))); connect(ui.actionStart, SIGNAL(triggered(bool)), SLOT(runItems())); ui.actionStop->setShortcut(QKeySequence(tr("Ctrl+K"))); connect(ui.actionStop, SIGNAL(triggered(bool)), SLOT(stopItems())); // View commands ui.actionSelectAll->setShortcut(QKeySequence(tr("Ctrl+A"))); connect(ui.actionSelectAll, SIGNAL(triggered(bool)), runnerController(), SLOT(selectAll())); ui.actionUnselectAll->setShortcut(QKeySequence(tr("Ctrl+U"))); connect(ui.actionUnselectAll, SIGNAL(triggered(bool)), runnerController(), SLOT(unselectAll())); ui.actionExpandAll->setShortcut(QKeySequence(tr("Ctrl++"))); connect(ui.actionExpandAll, SIGNAL(triggered(bool)), runnerController(), SLOT(expandAll())); ui.actionCollapseAll->setShortcut(QKeySequence(tr("Ctrl+-"))); connect(ui.actionCollapseAll, SIGNAL(triggered(bool)), runnerController(), SLOT(collapseAll())); connect(ui.actionColumns, SIGNAL(triggered(bool)), SLOT(showColumnsSelection())); connect(ui.actionSettings, SIGNAL(triggered(bool)), SLOT(showSettings())); // Help commands connect(ui.actionAbout, SIGNAL(triggered(bool)), SLOT(showAbout())); // Set initially available. m_sema.release(); } RunnerWindow::~RunnerWindow() { // Deleting the model is left to the owner of the model instance. } void RunnerWindow::show() { setUpdatesEnabled(false); // Reduce flickering AppSettings settings(this); settings.applyWindowSettings(); // Could enable updates again QMainWindow::show(); // Workaround: The results tree view has a maximum height defined in // Designer which now is reset. Without the height restriction the // dock window would occupy half the main window after construcution // instead of sitting "nicely" at the bottom. // This is only for the situation when the main window geometry isn't // restored from the settings. resultsView()->setMaximumSize(QSize(16777215, 16777215)); setUpdatesEnabled(true); // Change the results tree view to manual adjustment after the columns // have been stretched over the tree view at inital display. // This is only for the situation when the column sizes aren't restored // from the settings. resultsView()->header()->setResizeMode(QHeaderView::Interactive); // Some menus depend on current state. adjustMenus(); QApplication::setActiveWindow(this); } void RunnerWindow::setModel(RunnerModel* model) { // It's not expected to set another model at the moment but if done so then // at least remove the previous model from the views to prevent the runner // from crashing. Deleting a previous model is left to the owner of the model // instance. The fact that a previous model could have a running thread is // taken into account by simply asking the model to stop it without further // verification. A better solution must consider this in a later version. RunnerModel* prevModel = runnerModel(); if (prevModel) { // Hope it stops the thread if it is running. prevModel->stopItems(); // As long as the proxy models can't be set from outside they // get deleted. RunnerProxyModel* m1 = runnerProxyModel(); ResultsProxyModel* m2 = resultsProxyModel(); runnerView()->setModel(0); resultsView()->setModel(0); runnerView()->reset(); resultsView()->reset(); delete m1; delete m2; prevModel->disconnect(); } // Set initial title. QStringList tokens = windowTitle().split(" "); setWindowTitle(tokens[0].trimmed()); // No user interaction without a model or a model without columns. bool valid = true; if (!model) { valid = false; } else if (model->columnCount() < 1) { valid = false; } if (!valid) { enableItemActions(false); enableResultsFilter(false); return; } // Set title with model name. if (!model->name().trimmed().isEmpty()) { setWindowTitle(windowTitle() + " - " + model->name()); } // Hide filter buttons for results that are not expected. int results = model->expectedResults(); bool expected; expected = results & QxRunner::RunInfo; ui.buttonInfos->setVisible(expected); expected = results & QxRunner::RunWarning; ui.buttonWarnings->setVisible(expected); expected = results & QxRunner::RunError; ui.buttonErrors->setVisible(expected); expected = results & QxRunner::RunFatal; ui.buttonFatals->setVisible(expected); // Proxy models for the views with the source model as their parent // to have the proxies deleted when the model gets deleted. RunnerProxyModel* runnerProxyModel = new RunnerProxyModel(model); runnerProxyModel->setSourceModel(model); runnerView()->setModel(runnerProxyModel); // Results model is contained in the runner model. ResultsModel* resultsModel = model->resultsModel(); ResultsProxyModel* resultsProxyModel = new ResultsProxyModel(model); resultsProxyModel->setSourceModel(resultsModel); resultsView()->setModel(resultsProxyModel); // Filter actions enabled, item actions only when there is data. enableResultsFilter(true); // Get the relevant column count. int columnCount = model->columnCount(); // Set the defaults for enabled and thus visible columns. QBitArray enabledRunnerColumns(columnCount); QBitArray enabledResultsColumns(columnCount, true); for (int i = 0; i < 2; i++) { if (i < columnCount) { runnerView()->showColumn(i); enabledRunnerColumns[i] = true; } } for (int i = 2; i < columnCount; i++) { runnerView()->hideColumn(i); } for (int i = 0; i < columnCount; i++) { resultsView()->showColumn(i); } // Set the defaults in the proxy models. runnerProxyModel->setEnabledColumns(enabledRunnerColumns); resultsProxyModel->setEnabledColumns(enabledResultsColumns); // Suppress results data display if view isn't shown. showResults(isResultsViewVisible()); // Very limited user interaction without data. if (model->rowCount() < 1) { enableItemActions(false); ui.actionColumns->setEnabled(true); ui.actionSettings->setEnabled(true); AppSettings settings(this); settings.applyColumnSettings(); // Have no data in columns return; } // Item statistics. connect(model, SIGNAL(numTotalChanged(int)), SLOT(displayNumTotal(int))); connect(model, SIGNAL(numSelectedChanged(int)), SLOT(displayNumSelected(int))); connect(model, SIGNAL(numSuccessChanged(int)), SLOT(displayNumSuccess(int))); connect(model, SIGNAL(numInfosChanged(int)), SLOT(displayNumInfos(int))); connect(model, SIGNAL(numWarningsChanged(int)), SLOT(displayNumWarnings(int))); connect(model, SIGNAL(numErrorsChanged(int)), SLOT(displayNumErrors(int))); connect(model, SIGNAL(numFatalsChanged(int)), SLOT(displayNumFatals(int))); connect(model, SIGNAL(numExceptionsChanged(int)), SLOT(displayNumExceptions(int))); // This will fire the signals connected above. model->countItems(); // Expand the branches, do it in the brackground to reduce flickering. runnerView()->setUpdatesEnabled(false); runnerController()->expandAll(); AppSettings settings(this); settings.applyColumnSettings(); // Have data in columns runnerView()->setUpdatesEnabled(true); // How much data is wanted when running the items. connect(ui.actionMinimalUpdate, SIGNAL(triggered(bool)), model, SLOT(setMinimalUpdate(bool))); model->setMinimalUpdate(isMinimalUpdate()); // Get notified of items run. connect(model, SIGNAL(numStartedChanged(int)), SLOT(displayProgress(int))); connect(model, SIGNAL(itemStarted(const QModelIndex&)), SLOT(highlightRunningItem(const QModelIndex&))); connect(model, SIGNAL(numCompletedChanged(int)), SLOT(displayNumCompleted(int))); connect(model, SIGNAL(allItemsCompleted()), SLOT(displayCompleted())); connect(model, SIGNAL(itemCompleted(const QModelIndex&)), resultsModel, SLOT(addResult(const QModelIndex&))); enableItemActions(true); ui.actionStop->setDisabled(true); // Set the filter in the results model. setResultsFilter(); // Start with top row highlighted. QModelIndex index = runnerView()->indexBelow(runnerView()->rootIndex()); runnerView()->setCurrentIndex(index); } QTreeView* RunnerWindow::runnerView() const { return ui.treeRunner; } QTreeView* RunnerWindow::resultsView() const { return ui.treeResults; } RunnerModel* RunnerWindow::runnerModel() const { return runnerController()->runnerModel(); } RunnerProxyModel* RunnerWindow::runnerProxyModel() const { return runnerController()->runnerProxyModel(); } ResultsModel* RunnerWindow::resultsModel() const { // The results model is contained in the runner model // (but could also be retrieved from the results view controller). return runnerModel()->resultsModel(); } ResultsProxyModel* RunnerWindow::resultsProxyModel() const { return resultsController()->resultsProxyModel(); } void RunnerWindow::displayProgress(int numItems) const { // Display only when there are selected items if (statusWidget()->progressRun->maximum() > 0) { statusWidget()->progressRun->setValue(numItems); statusWidget()->progressRun->show(); } } void RunnerWindow::displayCompleted() const { statusWidget()->progressRun->hide(); enableControlsAfterRunning(); } bool RunnerWindow::isResultsViewVisible() const { return ui.actionResults->isChecked(); } void RunnerWindow::displayNumTotal(int numItems) const { statusWidget()->labelNumTotal->setText(QString().setNum(numItems)); } void RunnerWindow::displayNumSelected(int numItems) const { statusWidget()->labelNumSelected->setText(QString().setNum(numItems)); // During item selection the progress bar shouldn't be visible. statusWidget()->progressRun->hide(); statusWidget()->progressRun->setMaximum(numItems); } void RunnerWindow::displayNumCompleted(int numItems) const { statusWidget()->labelNumRun->setText(QString().setNum(numItems)); } void RunnerWindow::displayNumSuccess(int numItems) const { displayStatusNum(statusWidget()->labelNumSuccess, statusWidget()->labelNumSuccess, numItems); // Num success always visible. statusWidget()->labelNumSuccess->show(); } void RunnerWindow::displayNumInfos(int numItems) const { if (numItems != 1) { ui.buttonInfos->setText(QString().setNum(numItems) + tr(" Infos")); } else { ui.buttonInfos->setText(tr("1 Info")); } displayStatusNum(statusWidget()->labelNumInfos, statusWidget()->labelNumInfosPic, numItems); } void RunnerWindow::displayNumWarnings(int numItems) const { if (numItems != 1) { ui.buttonWarnings->setText(QString().setNum(numItems) + tr(" Warnings")); } else { ui.buttonWarnings->setText(tr("1 Warning")); } displayStatusNum(statusWidget()->labelNumWarnings, statusWidget()->labelNumWarningsPic, numItems); } void RunnerWindow::displayNumErrors(int numItems) const { if (numItems != 1) { ui.buttonErrors->setText(QString().setNum(numItems) + tr(" Errors")); } else { ui.buttonErrors->setText(tr("1 Error")); } displayStatusNum(statusWidget()->labelNumErrors, statusWidget()->labelNumErrorsPic, numItems); } void RunnerWindow::displayNumFatals(int numItems) const { if (numItems != 1) { ui.buttonFatals->setText(QString().setNum(numItems) + tr(" Fatals")); } else { ui.buttonFatals->setText(tr("1 Fatal")); } displayStatusNum(statusWidget()->labelNumFatals, statusWidget()->labelNumFatalsPic, numItems); } void RunnerWindow::displayNumExceptions(int numItems) const { displayStatusNum(statusWidget()->labelNumExceptions, statusWidget()->labelNumExceptionsPic, numItems); } void RunnerWindow::highlightRunningItem(const QModelIndex& runnerItemIndex) const { if (isMinimalUpdate()) { return; } // Determine runner model proxy index and highlight related row. QModelIndex index; index = Utils::proxyIndexFromModel(runnerProxyModel(), runnerItemIndex); runnerController()->setHighlightedRow(index); } void RunnerWindow::setResultsFilter() const { // Remember currently highlighted result. QModelIndex resultIndex; QModelIndexList indexes; indexes = resultsView()->selectionModel()->selectedIndexes(); if (indexes.count() > 0) { resultIndex = Utils::modelIndexFromProxy(resultsProxyModel(), indexes.first()); } // Determine filter settings. int filter = 0; if (ui.buttonInfos->isEnabled() && ui.buttonInfos->isChecked()) { filter = QxRunner::RunInfo; } if (ui.buttonWarnings->isEnabled() && ui.buttonWarnings->isChecked()) { filter = filter | QxRunner::RunWarning; } if (ui.buttonErrors->isEnabled() && ui.buttonErrors->isChecked()) { filter = filter | QxRunner::RunError; } if (ui.buttonFatals->isEnabled() && ui.buttonFatals->isChecked()) { filter = filter | QxRunner::RunFatal; } // Setting the filter updates the view. resultsProxyModel()->setFilter(filter); // When no result was highlighted before than try to highlight the // one that corresponds to the currently highlighted runner item. if (!resultIndex.isValid()) { syncResultWithRunnerItem(runnerView()->selectionModel()->selection(), runnerView()->selectionModel()->selection()); return; } // At least there should be a current but not necessarily highlighted result // in order to see the focus rect when the results view gets the focus. ensureCurrentResult(); // Try to highlight same result as was highlighted before. QModelIndex currentIndex; currentIndex = Utils::proxyIndexFromModel(resultsProxyModel(), resultIndex); if (!currentIndex.isValid()) { // Previously highlighted result is filtered out now. return; } // Highlight result without affecting the runner view. enableResultSync(false); resultsView()->setCurrentIndex(currentIndex); enableResultSync(true); // Make the row in every tree view visible and expand corresponding parents. scrollToHighlightedRows(); } void RunnerWindow::syncResultWithRunnerItem(const QItemSelection& selected, const QItemSelection& deselected) const { // Do nothing when there are no results or no runner item is selected. if (!resultsView()->indexBelow(resultsView()->rootIndex()).isValid()) { return; } QModelIndexList indexes = selected.indexes(); if (indexes.count() < 1 ) { return; } // Prevent from circular dependencies. enableResultSync(false); // Try to highlight the corresponding result. resultsView()->clearSelection(); // Get the results model index that corresponds to the runner item index. QModelIndex runnerItemIndex; runnerItemIndex = Utils::modelIndexFromProxy(runnerProxyModel(), indexes.first()); QModelIndex resultIndex = resultsModel()->mapFromRunnerItemIndex(runnerItemIndex); // At least there should be a current but not necessarily highlighted result // in order to see the focus rect when the results view gets the focus. ensureCurrentResult(); // If not found then there is no result for this runner item. if (!resultIndex.isValid()) { // Enable selection handler again. enableResultSync(true); return; } // Prepare row highlighting. QModelIndex currentIndex = Utils::proxyIndexFromModel(resultsProxyModel(), resultIndex); // When results proxy model index not exists it is filtered out. if (!currentIndex.isValid()) { // Enable selection handler again. enableResultSync(true); return; } // Highlight corresponding result now. resultsView()->setCurrentIndex(currentIndex); // Make the row in every tree view visible and expand corresponding parents. scrollToHighlightedRows(); // Enable selection handler again. enableResultSync(true); } void RunnerWindow::syncRunnerItemWithResult(const QItemSelection& selected, const QItemSelection& deselected) const { // Do nothing when no result is selected. QModelIndexList indexes = selected.indexes(); if (indexes.count() < 1 ) { return; } // Determine the results model index. QModelIndex resultIndex; resultIndex = Utils::modelIndexFromProxy(resultsProxyModel(), indexes.first()); // Get the corresponding runner item index contained in the results model. QModelIndex runnerItemIndex; runnerItemIndex = resultsModel()->mapToRunnerItemIndex(resultIndex); // Prevent from circular dependencies. enableRunnerItemSync(false); // Determine the proxy model index and highlight it. QModelIndex currentIndex; currentIndex = Utils::proxyIndexFromModel(runnerProxyModel(), runnerItemIndex); runnerView()->setCurrentIndex(currentIndex); // Make the row in every tree view visible and expand corresponding parents. scrollToHighlightedRows(); // Enable selection handler again. enableRunnerItemSync(true); } void RunnerWindow::ensureFocusRect(const QModelIndex& index) { QTreeView* treeView; if (runnerView()->hasFocus()) { treeView = runnerView(); } else { treeView = resultsView(); } // No relevance when selections not allowed. if (treeView->selectionMode() == QAbstractItemView::NoSelection) { return; } // Focus rect is there when column entry not empty. QString data = index.data().toString(); if (!data.trimmed().isEmpty()) { return; } // No relevance when column 0 is empty. if (index.column() == 0) { return; } // Tree views are already synchronized. enableRunnerItemSync(false); enableResultSync(false); // This ensures that there is a focus rect. treeView->clearSelection(); QItemSelectionModel* selectionModel = treeView->selectionModel(); selectionModel->setCurrentIndex(index.sibling(index.row(), 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); // Enable selection handler again. enableRunnerItemSync(true); enableResultSync(true); } void RunnerWindow::scrollToHighlightedRows() const { // No relevance when selections not allowed. if (runnerView()->selectionMode() == QAbstractItemView::NoSelection || resultsView()->selectionMode() == QAbstractItemView::NoSelection) { return; } // Note: It's important not to use the current index but work with the // selection instead due to the fact that these indexes might not be the same. QModelIndex index; QModelIndexList indexes; indexes = runnerView()->selectionModel()->selectedIndexes(); if (indexes.count() > 0) { index = indexes.first(); } if (index.isValid()) { runnerView()->scrollTo(index); } index = QModelIndex(); indexes = resultsView()->selectionModel()->selectedIndexes(); if (indexes.count() > 0) { index = indexes.first(); } if (index.isValid()) { resultsView()->scrollTo(index); } else { // Try to highlight a result. syncResultWithRunnerItem(runnerView()->selectionModel()->selection(), runnerView()->selectionModel()->selection()); } } void RunnerWindow::runItems() { // Do not interfere with stopping the items. Could happen because Qt // input processing could be faster than executing event handlers. if (!m_sema.tryAcquire()) { return; } disableControlsBeforeRunning(); runnerModel()->runItems(); m_sema.release(); } void RunnerWindow::stopItems() { // Do not interfere with running the items. Could happen because Qt // input processing could be faster than executing event handlers. if (!m_sema.tryAcquire()) { return; } ui.actionStop->setDisabled(true); QCoreApplication::processEvents(); // Disable command immediately // Stopping is done in a dialog which shows itself only when // it takes several attempts to succeed (if ever). StoppingDialog dlg(this, runnerModel()); int r = dlg.exec(); if (r == QDialog::Accepted) { enableControlsAfterRunning(); m_sema.release(); return; } // Give a chance for another stop request. ui.actionStop->setEnabled(true); m_sema.release(); } void RunnerWindow::showResults(bool show) { if (!runnerModel()) { return; } resultsProxyModel()->setActive(show); // An invisible results view means that the dock widget was closed // and is shown now. In this case the data is retrieved again. bool visible = ui.treeResults->isVisible(); if (show && !visible) { // Show data according to current filtering. resultsProxyModel()->clear(); setResultsFilter(); // Make sure that highlighted row sync works as expected. ui.dockResults->show(); } if (!show || runnerModel()->isRunning()) { return; } // Let the dock widget get its position and size before // synchronizing the highlighted rows display. QCoreApplication::processEvents(); scrollToHighlightedRows(); } void RunnerWindow::showColumnsSelection() { ColumnsDialog dlg(this, this); dlg.exec(); } void RunnerWindow::showSettings() { SettingsDialog dlg(this, this); dlg.exec(); } void RunnerWindow::showAbout() { AboutDialog dlg(this, runnerModel()); dlg.exec(); } void RunnerWindow::disableControlsBeforeRunning() { enableItemActions(false); resultsController()->enableSorting(false); ui.actionStop->setEnabled(true); runnerView()->setCursor(QCursor(Qt::BusyCursor)); runnerView()->setFocus(); runnerView()->setSelectionMode(QAbstractItemView::NoSelection); resultsView()->setSelectionMode(QAbstractItemView::NoSelection); enableRunnerItemSync(false); enableResultSync(false); // Change color for highlighted rows to orange. If a similar color is // defined for the background then green is used. Determining a color // could be more sophisticated but must suffice for now. QPalette palette(runnerView()->palette()); // Save current highlighting color for restoring it later. m_highlightBrush = palette.brush(QPalette::Active, QPalette::Highlight); // Create kind of orange ('pure' orange is QColor(255, 165, 0, 255)). QBrush orange(QColor(255, 153, 51, 255)); QBrush newBrush; // Look at RGB values of background (base). QBrush baseBrush = palette.brush(QPalette::Active, QPalette::Base); bool rOk = (baseBrush.color().red() == 255) || (baseBrush.color().red() < 205); bool gOk = (baseBrush.color().green() > orange.color().green() + 50) || (baseBrush.color().green() < orange.color().green() - 50); bool bOk = (baseBrush.color().blue() > orange.color().blue() + 50) || (baseBrush.color().blue() < orange.color().blue() - 50); if (rOk && gOk && bOk) { newBrush = orange; } else { newBrush = QBrush(QColor(Qt::green)); } palette.setBrush(QPalette::Active, QPalette::Highlight, newBrush); runnerView()->setPalette(palette); } void RunnerWindow::enableControlsAfterRunning() const { // Wait until all items stopped. while (runnerModel()->isRunning(100)) { // Prevent GUI from freezing. QCoreApplication::processEvents(); } // Show results now if minimal update was active. if (isMinimalUpdate()) { runnerModel()->emitItemResults(); } // Give the GUI a chance to update. QCoreApplication::processEvents(); // Enable user interaction. enableItemActions(true); ui.actionStop->setDisabled(true); runnerView()->setCursor(QCursor()); runnerView()->setFocus(); runnerView()->setSelectionMode(QAbstractItemView::SingleSelection); resultsView()->setSelectionMode(QAbstractItemView::SingleSelection); enableRunnerItemSync(true); enableResultSync(true); ensureCurrentResult(); // Reset color for highlighted rows. QPalette palette(runnerView()->palette()); palette.setBrush(QPalette::Active, QPalette::Highlight, m_highlightBrush); runnerView()->setPalette(palette); if (!isMinimalUpdate()) { return; } // Scroll to the last processed item when in minimal update mode. // Determine the results model index first. int row = resultsModel()->rowCount() - 1; if (row < 1) { return; } QModelIndex resultIndex = resultsModel()->index(row, 0); QModelIndex runnerItemIndex; runnerItemIndex = resultsModel()->mapToRunnerItemIndex(resultIndex); QModelIndex currentIndex = Utils::proxyIndexFromModel(runnerProxyModel(), runnerItemIndex); // Suppress synchronisation of results view. enableRunnerItemSync(false); // Highlight row of runner item. runnerController()->setHighlightedRow(currentIndex); // Enable selection handler again. enableRunnerItemSync(true); } void RunnerWindow::enableItemActions(bool enable) const { ui.actionStart->setEnabled(enable); ui.actionStop->setEnabled(enable); ui.actionSelectAll->setEnabled(enable); ui.actionUnselectAll->setEnabled(enable); ui.actionExpandAll->setEnabled(enable); ui.actionCollapseAll->setEnabled(enable); ui.actionMinimalUpdate->setEnabled(enable); ui.actionColumns->setEnabled(enable); ui.actionSettings->setEnabled(enable); } void RunnerWindow::enableResultsFilter(bool enable) const { ui.buttonInfos->setEnabled(enable); ui.buttonWarnings->setEnabled(enable); ui.buttonErrors->setEnabled(enable); ui.buttonFatals->setEnabled(enable); } void RunnerWindow::enableRunnerItemSync(bool enable) const { if (enable) { connect(runnerView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), SLOT(syncResultWithRunnerItem(const QItemSelection&, const QItemSelection&))); } else { disconnect(runnerView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(syncResultWithRunnerItem(const QItemSelection&, const QItemSelection&))); } } void RunnerWindow::enableResultSync(bool enable) const { if (enable) { connect(resultsView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), SLOT(syncRunnerItemWithResult(const QItemSelection&, const QItemSelection&))); } else { disconnect(resultsView()->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(syncRunnerItemWithResult(const QItemSelection&, const QItemSelection&))); } } void RunnerWindow::ensureCurrentResult() const { // Do nothing if there is a current index or no data at all. if (resultsView()->currentIndex().isValid()) { return; } // Try to make first visible index the current one. QModelIndex currentIndex = resultsView()->indexAt(QPoint(1, 1)); if (!currentIndex.isValid()) { return; } // Set current index without highlighting. resultsView()->selectionModel()->setCurrentIndex(currentIndex, QItemSelectionModel::NoUpdate); } void RunnerWindow::adjustMenus() const { bool haveChildren = false; // Look for an item with children. QModelIndex index; index = runnerView()->indexBelow(runnerView()->rootIndex()); while (index.isValid()) { if (index.child(0, 0).isValid()) { haveChildren = true; break; } index = index.sibling(index.row() + 1, 0); } QList viewActions = ui.menuView->actions(); for (int i = 3; i < 6; i++) { viewActions[i]->setVisible(haveChildren); } } void RunnerWindow::displayStatusNum(QLabel* labelForText, QLabel* labelForPic, int numItems) const { labelForText->setText(": " + QString().setNum(numItems)); bool visible; if (numItems > 0) { visible = true; } else { visible =false; } labelForText->setVisible(visible); labelForPic->setVisible(visible); } bool RunnerWindow::isMinimalUpdate() const { return ui.actionMinimalUpdate->isChecked(); } Ui::StatusWidget* RunnerWindow::statusWidget() const { return &(m_statusWidget->ui); } RunnerViewController* RunnerWindow::runnerController() const { return m_runnerViewController; } ResultsViewController* RunnerWindow::resultsController() const { return m_resultsViewController; } void RunnerWindow::closeEvent(QCloseEvent* event) { AppSettings settings(this); settings.writeSettings(); if (!runnerModel()) { return; } // Stopping is done in a dialog which shows itself only when // it takes several attempts to succeed (if ever). StoppingDialog dlg(this, runnerModel()); int r = dlg.exec(); if (r == QDialog::Accepted) { return; } // Items not stoppable. QString msg; msg = tr("There are items running which can't be stopped immediately.\n" "Should the program exit anyway which could result in inconsistent data?"); r = QMessageBox::warning(this, tr("QxRunner"), msg, tr("&Yes"), tr("&No"), 0, 0, 1); if (r) { event->ignore(); return; } // Exit the hard way. QApplication::quit(); exit(1); } } // namespace qxrunner/src/qxrunner/runnerwindow.ui0000700000000000000000000002534210501516574017212 0ustar rootroot RunnerWindow 0 0 602 390 QxRunner :/icons/qxrunner_16x16.png 9 6 true QAbstractItemView::SingleSelection 0 0 602 21 &File &Help &Runner &View Ru&nner Toolbar Qt::Horizontal 4 QDockWidget::AllDockWidgetFeatures Results 8 9 3 0 0 Qt::StrongFocus dummy :/icons/fatal.png true true Qt::ToolButtonTextBesideIcon true Qt::StrongFocus dummy :/icons/error.png true true Qt::ToolButtonTextBesideIcon true Qt::StrongFocus dummy :/icons/warning.png true true Qt::ToolButtonTextBesideIcon true Qt::StrongFocus dummy :/icons/info.png true true Qt::ToolButtonTextBesideIcon true Qt::Horizontal 40 20 16777215 80 true &View Toolbar Qt::Horizontal 4 :/icons/play.png &Start :/icons/stop.png S&top :/icons/checkedbox.png Select &All :/icons/uncheckedbox.png &Unselect All &About E&xit :/icons/expanded.png &Collapse All :/icons/collapsed.png &Expand All &Minimal Update :/icons/columns.png C&olumns... &Results :/icons/properties.png &Settings... &Toolbars qxrunner/src/qxrunner/runnerwindowclient.cpp0000700000000000000000000000221610476411504020547 0ustar rootroot/*! * \file runnerwindowclient.cpp * * \brief Implements class RunnerWindowClient. */ #include "runnerwindowclient.h" #include "runnerwindow.h" namespace QxRunner { RunnerWindowClient::RunnerWindowClient(RunnerWindow* runnerWindow) : m_window(runnerWindow) { } RunnerWindowClient::~RunnerWindowClient() { } RunnerWindow* RunnerWindowClient::window() const { return m_window; } QTreeView* RunnerWindowClient::runnerView() const { return window()->runnerView(); } QTreeView* RunnerWindowClient::resultsView() const { return window()->resultsView(); } RunnerModel* RunnerWindowClient::runnerModel() const { return window()->runnerModel(); } RunnerProxyModel* RunnerWindowClient::runnerProxyModel() const { return window()->runnerProxyModel(); } ResultsModel* RunnerWindowClient::resultsModel() const { return window()->resultsModel(); } ResultsProxyModel* RunnerWindowClient::resultsProxyModel() const { return window()->resultsProxyModel(); } bool RunnerWindowClient::isResultsViewVisible() const { return window()->isResultsViewVisible(); } } // namespace qxrunner/src/qxrunner/settingsdialog.cpp0000700000000000000000000000250510501343500017615 0ustar rootroot/*! * \file settingsdialog.cpp * * \brief Implements class SettingsDialog. */ #include "settingsdialog.h" #include "runnerwindow.h" namespace QxRunner { SettingsDialog::SettingsDialog(QWidget* parent, RunnerWindow* window) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint), RunnerWindowClient(window) { ui.setupUi(this); connect(ui.buttonOk, SIGNAL(clicked()), SLOT(accept())); connect(ui.buttonApply, SIGNAL(clicked()), SLOT(apply())); connect(ui.buttonCancel, SIGNAL(clicked()), SLOT(reject())); m_alternatingRowColors = runnerView()->alternatingRowColors(); ui.checkBoxRowColors->setChecked(m_alternatingRowColors); } SettingsDialog::~SettingsDialog() { } void SettingsDialog::apply() { bool b = ui.checkBoxRowColors->isChecked(); runnerView()->setAlternatingRowColors(b); resultsView()->setAlternatingRowColors(b); } void SettingsDialog::accept() { // Update the GUI (again). apply(); QDialog::accept(); } void SettingsDialog::reject() { runnerView()->setAlternatingRowColors(m_alternatingRowColors); resultsView()->setAlternatingRowColors(m_alternatingRowColors); QDialog::reject(); } } // namespace qxrunner/src/qxrunner/settingsdialog.ui0000700000000000000000000000570210502553110017453 0ustar rootroot SettingsDialog 0 0 286 164 Settings 9 6 0 6 Qt::Horizontal 17 31 OK Cancel &Apply 0 &View 9 6 A&lternating row colors Qt::Vertical 20 40 tabWidget checkBoxRowColors buttonOk buttonCancel buttonApply qxrunner/src/qxrunner/statuswidget.cpp0000700000000000000000000000045410477607046017351 0ustar rootroot/*! * \file statuswidget.cpp * * \brief Implements class StatusWidget. */ #include "statuswidget.h" namespace QxRunner { StatusWidget::StatusWidget(QWidget* parent) : QWidget(parent) { ui.setupUi(this); } StatusWidget::~StatusWidget() { } } // namespace qxrunner/src/qxrunner/statuswidget.ui0000700000000000000000000001661510501516120017166 0ustar rootroot StatusWidget 0 0 510 20 StatusWidget 0 6 Qt::Horizontal QSizePolicy::Fixed 6 12 Total: 0 Selected: 0 Run: 0 0 3 Success :/icons/success.png 0 0 3 Exceptions :/icons/exception.png 0 0 3 Fatals :/icons/fatal.png 0 0 3 Errors :/icons/error.png 0 0 3 Warnings :/icons/warning.png 0 0 3 Infos :/icons/info.png 0 Qt::Horizontal 16 20 7 0 1 0 16777215 16 0 Qt::Horizontal qxrunner/src/qxrunner/stoppingdialog.cpp0000700000000000000000000000266210477630030017635 0ustar rootroot/*! * \file stoppingdialog.cpp * * \brief Implements class StoppingDialog. */ #include "stoppingdialog.h" #include "runnermodel.h" namespace QxRunner { StoppingDialog::StoppingDialog(QWidget* parent, RunnerModel* model) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint), m_model(model) { ui.setupUi(this); connect(ui.buttonCancel, SIGNAL(clicked()), SLOT(reject())); m_shouldClose = false; } StoppingDialog::~StoppingDialog() { } int StoppingDialog::exec() { bool stopped = m_model->stopItems(); if (stopped) { return QDialog::Accepted; } // If not successfull at first attempt then show the dialog. adjustSize(); show(); while (!(stopped || m_shouldClose)) { // Prevent GUI from freezing. QCoreApplication::processEvents(); ui.progressBar->setValue(ui.progressBar->value() + 1); stopped = m_model->stopItems(); if (ui.progressBar->value() >= ui.progressBar->maximum()) { ui.progressBar->setValue(ui.progressBar->minimum()); } } if (stopped) { return QDialog::Accepted; } else { return QDialog::Rejected; } } void StoppingDialog::reject() { // Notify the exec() loop to end because the dialog gets closed. m_shouldClose = true; QDialog::reject(); } } // namespace qxrunner/src/qxrunner/stoppingdialog.ui0000700000000000000000000000567710477417476017522 0ustar rootroot StoppingDialog 0 0 200 73 QxRunner true 9 6 0 6 Qt::Horizontal 16 20 Cancel true Qt::Horizontal 20 20 :/icons/info_blue_24x24.png 16777215 16 1 10 1 false Qt::Horizontal Stopping... qxrunner/src/qxrunner/utils.cpp0000700000000000000000000000375710501354076015761 0ustar rootroot/*! * \file utils.cpp * * \brief Implements class Utils. */ #include "utils.h" #include "runneritem.h" #include #include #include #include namespace QxRunner { QList Utils::columnSizes(QTreeView* view) { QList sizes; for (int i = 0; i < view->header()->count(); i++) { sizes.append(view->columnWidth(i)); } return sizes; } QVariant Utils::resultIcon(int result) { switch (result) { case QxRunner::RunSuccess: return QIcon(":/icons/success.png"); break; case QxRunner::RunInfo: return QIcon(":/icons/info.png"); break; case QxRunner::RunWarning: return QIcon(":/icons/warning.png"); break; case QxRunner::RunError: return QIcon(":/icons/error.png"); break; case QxRunner::RunFatal: return QIcon(":/icons/fatal.png"); break; case QxRunner::RunException: return QIcon(":/icons/exception.png"); break; default: return QIcon(":/icons/item.png"); break; } } QAbstractItemModel* Utils::modelFromProxy(QAbstractItemModel* model) { QSortFilterProxyModel* proxyModel; proxyModel = static_cast(model); if (proxyModel) { return proxyModel->sourceModel(); } else { return 0; } } QModelIndex Utils::modelIndexFromProxy(QAbstractItemModel* model, const QModelIndex& index) { if (!index.isValid()) { return QModelIndex(); } QSortFilterProxyModel* proxyModel; proxyModel = static_cast(model); return proxyModel->mapToSource(index); } QModelIndex Utils::proxyIndexFromModel(QAbstractItemModel* model, const QModelIndex& index) { if (!index.isValid()) { return QModelIndex(); } QSortFilterProxyModel* proxyModel; proxyModel = static_cast(model); return proxyModel->mapFromSource(index); } } // namespace qxrunner/src/qxrunner/viewcontrollercommon.cpp0000700000000000000000000000313210501322716021067 0ustar rootroot/*! * \file viewcontrollercommon.cpp * * \brief Implements class ViewControllerCommon. */ #include "viewcontrollercommon.h" #include "utils.h" namespace QxRunner { ViewControllerCommon::ViewControllerCommon(QTreeView* view) : m_view(view) { header()->setDefaultAlignment(Qt::AlignLeft); header()->setMovable(false); } ViewControllerCommon::~ViewControllerCommon() { } QModelIndex ViewControllerCommon::highlightedRow() const { QItemSelectionModel* selectionModel = view()->selectionModel(); QModelIndexList indexes = selectionModel->selectedIndexes(); QModelIndex index; if (indexes.count() > 0) { index = indexes.first(); } return index; } void ViewControllerCommon::setHighlightedRow(const QModelIndex& index) const { // Row gets highlighted anyway, independent of current selection mode. view()->clearSelection(); QItemSelectionModel* selectionModel = view()->selectionModel(); selectionModel->setCurrentIndex(index, QItemSelectionModel::Select | QItemSelectionModel::Rows); // This will expand any parents. view()->scrollTo(index); } QTreeView* ViewControllerCommon::view() const { return m_view; } QHeaderView* ViewControllerCommon::header() const { return view()->header(); } QAbstractItemModel* ViewControllerCommon::model() const { return static_cast(Utils::modelFromProxy(view()->model())); } QSortFilterProxyModel* ViewControllerCommon::proxyModel() const { return static_cast(view()->model()); } } // namespace