taskjuggler 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +280 -0
- data/README +31 -0
- data/Rakefile +20 -0
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/benchmarks/allocate.tjp +30 -0
- data/benchmarks/booking.tjp +62 -0
- data/benchmarks/depends.tjp +112 -0
- data/benchmarks/htmltaskreport.tjp +45 -0
- data/benchmarks/runbench.rb +24 -0
- data/bin/tj3 +3 -0
- data/bin/tj3man +3 -0
- data/doc/classes/AppConfig.html +808 -0
- data/doc/classes/Arguments.html +226 -0
- data/doc/classes/String.html +395 -0
- data/doc/classes/TaskJuggler.html +1358 -0
- data/doc/classes/TaskJuggler/Account.html +257 -0
- data/doc/classes/TaskJuggler/AccountScenario.html +218 -0
- data/doc/classes/TaskJuggler/Allocation.html +419 -0
- data/doc/classes/TaskJuggler/AllocationAttribute.html +291 -0
- data/doc/classes/TaskJuggler/AttributeBase.html +608 -0
- data/doc/classes/TaskJuggler/AttributeDefinition.html +259 -0
- data/doc/classes/TaskJuggler/Booking.html +307 -0
- data/doc/classes/TaskJuggler/BookingListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/BooleanAttribute.html +261 -0
- data/doc/classes/TaskJuggler/CSVFile.html +325 -0
- data/doc/classes/TaskJuggler/Charge.html +279 -0
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +229 -0
- data/doc/classes/TaskJuggler/ChargeSet.html +440 -0
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +276 -0
- data/doc/classes/TaskJuggler/ColumnTable.html +260 -0
- data/doc/classes/TaskJuggler/DateAttribute.html +194 -0
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/DurationAttribute.html +229 -0
- data/doc/classes/TaskJuggler/FixnumAttribute.html +194 -0
- data/doc/classes/TaskJuggler/FlagListAttribute.html +263 -0
- data/doc/classes/TaskJuggler/FloatAttribute.html +229 -0
- data/doc/classes/TaskJuggler/GanttChart.html +667 -0
- data/doc/classes/TaskJuggler/GanttContainer.html +441 -0
- data/doc/classes/TaskJuggler/GanttHeader.html +280 -0
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +245 -0
- data/doc/classes/TaskJuggler/GanttLine.html +398 -0
- data/doc/classes/TaskJuggler/GanttLoadStack.html +327 -0
- data/doc/classes/TaskJuggler/GanttMilestone.html +415 -0
- data/doc/classes/TaskJuggler/GanttRouter.html +425 -0
- data/doc/classes/TaskJuggler/GanttTaskBar.html +429 -0
- data/doc/classes/TaskJuggler/HTMLDocument.html +240 -0
- data/doc/classes/TaskJuggler/HTMLGraphics.html +231 -0
- data/doc/classes/TaskJuggler/Interval.html +552 -0
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +796 -0
- data/doc/classes/TaskJuggler/Limits.html +416 -0
- data/doc/classes/TaskJuggler/Limits/Limit.html +381 -0
- data/doc/classes/TaskJuggler/LimitsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/Log.html +613 -0
- data/doc/classes/TaskJuggler/LogicalAttribute.html +226 -0
- data/doc/classes/TaskJuggler/LogicalExpression.html +251 -0
- data/doc/classes/TaskJuggler/LogicalFlag.html +229 -0
- data/doc/classes/TaskJuggler/LogicalFunction.html +324 -0
- data/doc/classes/TaskJuggler/LogicalOperation.html +299 -0
- data/doc/classes/TaskJuggler/Macro.html +194 -0
- data/doc/classes/TaskJuggler/MacroParser.html +360 -0
- data/doc/classes/TaskJuggler/MacroTable.html +366 -0
- data/doc/classes/TaskJuggler/Message.html +281 -0
- data/doc/classes/TaskJuggler/MessageHandler.html +215 -0
- data/doc/classes/TaskJuggler/Project.html +1606 -0
- data/doc/classes/TaskJuggler/ProjectFileParser.html +412 -0
- data/doc/classes/TaskJuggler/PropertyList.html +597 -0
- data/doc/classes/TaskJuggler/PropertySet.html +1200 -0
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +1449 -0
- data/doc/classes/TaskJuggler/Query.html +600 -0
- data/doc/classes/TaskJuggler/RealFormat.html +252 -0
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +194 -0
- data/doc/classes/TaskJuggler/Report.html +528 -0
- data/doc/classes/TaskJuggler/ReportElement.html +1070 -0
- data/doc/classes/TaskJuggler/ReportTable.html +497 -0
- data/doc/classes/TaskJuggler/ReportTableCell.html +518 -0
- data/doc/classes/TaskJuggler/ReportTableColumn.html +364 -0
- data/doc/classes/TaskJuggler/ReportTableElement.html +644 -0
- data/doc/classes/TaskJuggler/ReportTableLegend.html +343 -0
- data/doc/classes/TaskJuggler/ReportTableLine.html +431 -0
- data/doc/classes/TaskJuggler/Resource.html +211 -0
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/ResourceListRE.html +249 -0
- data/doc/classes/TaskJuggler/ResourceScenario.html +1137 -0
- data/doc/classes/TaskJuggler/RichText.html +537 -0
- data/doc/classes/TaskJuggler/RichTextAttribute.html +229 -0
- data/doc/classes/TaskJuggler/RichTextDocument.html +418 -0
- data/doc/classes/TaskJuggler/RichTextElement.html +829 -0
- data/doc/classes/TaskJuggler/RichTextException.html +212 -0
- data/doc/classes/TaskJuggler/RichTextParser.html +317 -0
- data/doc/classes/TaskJuggler/RichTextProtocolExample.html +303 -0
- data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +194 -0
- data/doc/classes/TaskJuggler/RichTextScanner.html +561 -0
- data/doc/classes/TaskJuggler/RichTextSnip.html +364 -0
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +883 -0
- data/doc/classes/TaskJuggler/Scenario.html +163 -0
- data/doc/classes/TaskJuggler/ScenarioData.html +354 -0
- data/doc/classes/TaskJuggler/Scoreboard.html +638 -0
- data/doc/classes/TaskJuggler/Shift.html +255 -0
- data/doc/classes/TaskJuggler/ShiftAssignment.html +488 -0
- data/doc/classes/TaskJuggler/ShiftAssignments.html +715 -0
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +261 -0
- data/doc/classes/TaskJuggler/ShiftScenario.html +282 -0
- data/doc/classes/TaskJuggler/SourceFileInfo.html +247 -0
- data/doc/classes/TaskJuggler/StringAttribute.html +229 -0
- data/doc/classes/TaskJuggler/SymbolAttribute.html +194 -0
- data/doc/classes/TaskJuggler/SyntaxReference.html +516 -0
- data/doc/classes/TaskJuggler/TOCEntry.html +242 -0
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +273 -0
- data/doc/classes/TaskJuggler/TableOfContents.html +256 -0
- data/doc/classes/TaskJuggler/Task.html +203 -0
- data/doc/classes/TaskJuggler/TaskDependency.html +251 -0
- data/doc/classes/TaskJuggler/TaskListAttribute.html +267 -0
- data/doc/classes/TaskJuggler/TaskListRE.html +250 -0
- data/doc/classes/TaskJuggler/TaskScenario.html +2206 -0
- data/doc/classes/TaskJuggler/TextParser.html +670 -0
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +923 -0
- data/doc/classes/TaskJuggler/TextParser/Rule.html +779 -0
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +267 -0
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +212 -0
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +221 -0
- data/doc/classes/TaskJuggler/TextScanner.html +708 -0
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +355 -0
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +341 -0
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +260 -0
- data/doc/classes/TaskJuggler/TjException.html +185 -0
- data/doc/classes/TaskJuggler/TjTime.html +1845 -0
- data/doc/classes/TaskJuggler/TjpExample.html +310 -0
- data/doc/classes/TaskJuggler/TjpExportRE.html +329 -0
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +8928 -0
- data/doc/classes/TaskJuggler/UserManual.html +606 -0
- data/doc/classes/TaskJuggler/WorkingHours.html +582 -0
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +284 -0
- data/doc/classes/TaskJuggler/XMLBlob.html +207 -0
- data/doc/classes/TaskJuggler/XMLComment.html +206 -0
- data/doc/classes/TaskJuggler/XMLDocument.html +293 -0
- data/doc/classes/TaskJuggler/XMLElement.html +341 -0
- data/doc/classes/TaskJuggler/XMLNamedText.html +174 -0
- data/doc/classes/TaskJuggler/XMLText.html +221 -0
- data/doc/files/COPYING.html +448 -0
- data/doc/files/README.html +134 -0
- data/doc/files/lib/AccountScenario_rb.html +116 -0
- data/doc/files/lib/Account_rb.html +118 -0
- data/doc/files/lib/Allocation_rb.html +118 -0
- data/doc/files/lib/AppConfig_rb.html +116 -0
- data/doc/files/lib/AttributeBase_rb.html +106 -0
- data/doc/files/lib/AttributeDefinition_rb.html +106 -0
- data/doc/files/lib/Attributes_rb.html +130 -0
- data/doc/files/lib/Booking_rb.html +106 -0
- data/doc/files/lib/ChargeSet_rb.html +116 -0
- data/doc/files/lib/Charge_rb.html +116 -0
- data/doc/files/lib/HTMLDocument_rb.html +116 -0
- data/doc/files/lib/Interval_rb.html +116 -0
- data/doc/files/lib/KeywordDocumentation_rb.html +122 -0
- data/doc/files/lib/Limits_rb.html +116 -0
- data/doc/files/lib/Log_rb.html +116 -0
- data/doc/files/lib/LogicalExpression_rb.html +122 -0
- data/doc/files/lib/LogicalFlag_rb.html +116 -0
- data/doc/files/lib/LogicalFunction_rb.html +116 -0
- data/doc/files/lib/LogicalOperation_rb.html +116 -0
- data/doc/files/lib/MacroParser_rb.html +118 -0
- data/doc/files/lib/MacroTable_rb.html +122 -0
- data/doc/files/lib/MessageHandler_rb.html +106 -0
- data/doc/files/lib/Message_rb.html +116 -0
- data/doc/files/lib/ProjectFileParser_rb.html +122 -0
- data/doc/files/lib/Project_rb.html +148 -0
- data/doc/files/lib/PropertyList_rb.html +106 -0
- data/doc/files/lib/PropertySet_rb.html +118 -0
- data/doc/files/lib/PropertyTreeNode_rb.html +106 -0
- data/doc/files/lib/Query_rb.html +116 -0
- data/doc/files/lib/RealFormat_rb.html +106 -0
- data/doc/files/lib/ResourceScenario_rb.html +116 -0
- data/doc/files/lib/Resource_rb.html +118 -0
- data/doc/files/lib/RichTextDocument_rb.html +120 -0
- data/doc/files/lib/RichTextElement_rb.html +120 -0
- data/doc/files/lib/RichTextParser_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolExample_rb.html +120 -0
- data/doc/files/lib/RichTextProtocolHandler_rb.html +106 -0
- data/doc/files/lib/RichTextScanner_rb.html +116 -0
- data/doc/files/lib/RichTextSnip_rb.html +118 -0
- data/doc/files/lib/RichTextSyntaxRules_rb.html +106 -0
- data/doc/files/lib/RichText_rb.html +118 -0
- data/doc/files/lib/ScenarioData_rb.html +118 -0
- data/doc/files/lib/Scenario_rb.html +116 -0
- data/doc/files/lib/Scoreboard_rb.html +106 -0
- data/doc/files/lib/ShiftAssignments_rb.html +116 -0
- data/doc/files/lib/ShiftScenario_rb.html +116 -0
- data/doc/files/lib/Shift_rb.html +118 -0
- data/doc/files/lib/SourceFileInfo_rb.html +106 -0
- data/doc/files/lib/SyntaxReference_rb.html +122 -0
- data/doc/files/lib/TOCEntry_rb.html +118 -0
- data/doc/files/lib/TableColumnDefinition_rb.html +106 -0
- data/doc/files/lib/TableOfContents_rb.html +118 -0
- data/doc/files/lib/TaskDependency_rb.html +106 -0
- data/doc/files/lib/TaskJuggler_rb.html +120 -0
- data/doc/files/lib/TaskScenario_rb.html +116 -0
- data/doc/files/lib/Task_rb.html +118 -0
- data/doc/files/lib/TextParser/Pattern_rb.html +116 -0
- data/doc/files/lib/TextParser/Rule_rb.html +106 -0
- data/doc/files/lib/TextParser/StackElement_rb.html +106 -0
- data/doc/files/lib/TextParser/TokenDoc_rb.html +106 -0
- data/doc/files/lib/TextParser_rb.html +124 -0
- data/doc/files/lib/TextScanner_rb.html +128 -0
- data/doc/files/lib/Tj3Config_rb.html +118 -0
- data/doc/files/lib/TjException_rb.html +106 -0
- data/doc/files/lib/TjTime_rb.html +118 -0
- data/doc/files/lib/TjpExample_rb.html +116 -0
- data/doc/files/lib/TjpSyntaxRules_rb.html +106 -0
- data/doc/files/lib/UTF8String_rb.html +132 -0
- data/doc/files/lib/UserManual_rb.html +124 -0
- data/doc/files/lib/WorkingHours_rb.html +116 -0
- data/doc/files/lib/XMLDocument_rb.html +116 -0
- data/doc/files/lib/XMLElement_rb.html +116 -0
- data/doc/files/lib/reports/CSVFile_rb.html +116 -0
- data/doc/files/lib/reports/ColumnTable_rb.html +116 -0
- data/doc/files/lib/reports/GanttChart_rb.html +122 -0
- data/doc/files/lib/reports/GanttContainer_rb.html +116 -0
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +106 -0
- data/doc/files/lib/reports/GanttHeader_rb.html +116 -0
- data/doc/files/lib/reports/GanttLine_rb.html +126 -0
- data/doc/files/lib/reports/GanttLoadStack_rb.html +116 -0
- data/doc/files/lib/reports/GanttMilestone_rb.html +116 -0
- data/doc/files/lib/reports/GanttRouter_rb.html +106 -0
- data/doc/files/lib/reports/GanttTaskBar_rb.html +116 -0
- data/doc/files/lib/reports/HTMLGraphics_rb.html +106 -0
- data/doc/files/lib/reports/ReportElement_rb.html +118 -0
- data/doc/files/lib/reports/ReportTableCell_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableColumn_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableElement_rb.html +122 -0
- data/doc/files/lib/reports/ReportTableLegend_rb.html +106 -0
- data/doc/files/lib/reports/ReportTableLine_rb.html +116 -0
- data/doc/files/lib/reports/ReportTable_rb.html +118 -0
- data/doc/files/lib/reports/Report_rb.html +126 -0
- data/doc/files/lib/reports/ResourceListRE_rb.html +122 -0
- data/doc/files/lib/reports/TaskListRE_rb.html +122 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +116 -0
- data/doc/files/lib/taskjuggler3_rb.html +276 -0
- data/doc/files/lib/tj3man_rb.html +189 -0
- data/doc/fr_class_index.html +285 -0
- data/doc/fr_file_index.html +223 -0
- data/doc/fr_method_index.html +1953 -0
- data/doc/index.html +21 -0
- data/doc/rdoc-style.css +299 -0
- data/examples/tutorial.tjp +361 -0
- data/gem_spec.rb +30 -0
- data/lib/Account.rb +50 -0
- data/lib/AccountScenario.rb +39 -0
- data/lib/Allocation.rb +102 -0
- data/lib/AppConfig.rb +134 -0
- data/lib/AttributeBase.rb +131 -0
- data/lib/AttributeDefinition.rb +47 -0
- data/lib/Attributes.rb +478 -0
- data/lib/BatchProcessor.rb +209 -0
- data/lib/Booking.rb +59 -0
- data/lib/Charge.rb +71 -0
- data/lib/ChargeSet.rb +126 -0
- data/lib/HTMLDocument.rb +59 -0
- data/lib/Interval.rb +127 -0
- data/lib/KeywordDocumentation.rb +560 -0
- data/lib/Limits.rb +219 -0
- data/lib/Log.rb +160 -0
- data/lib/LogicalExpression.rb +71 -0
- data/lib/LogicalFlag.rb +34 -0
- data/lib/LogicalFunction.rb +102 -0
- data/lib/LogicalOperation.rb +118 -0
- data/lib/MacroParser.rb +77 -0
- data/lib/MacroTable.rb +84 -0
- data/lib/Message.rb +56 -0
- data/lib/MessageHandler.rb +34 -0
- data/lib/Project.rb +662 -0
- data/lib/ProjectFileParser.rb +333 -0
- data/lib/PropertyList.rb +181 -0
- data/lib/PropertySet.rb +304 -0
- data/lib/PropertyTreeNode.rb +461 -0
- data/lib/Query.rb +227 -0
- data/lib/RealFormat.rb +73 -0
- data/lib/Resource.rb +42 -0
- data/lib/ResourceScenario.rb +511 -0
- data/lib/RichText.rb +147 -0
- data/lib/RichTextDocument.rb +139 -0
- data/lib/RichTextElement.rb +391 -0
- data/lib/RichTextParser.rb +66 -0
- data/lib/RichTextProtocolExample.rb +65 -0
- data/lib/RichTextProtocolHandler.rb +35 -0
- data/lib/RichTextScanner.rb +390 -0
- data/lib/RichTextSnip.rb +104 -0
- data/lib/RichTextSyntaxRules.rb +265 -0
- data/lib/Scenario.rb +27 -0
- data/lib/ScenarioData.rb +65 -0
- data/lib/Scoreboard.rb +141 -0
- data/lib/Shift.rb +48 -0
- data/lib/ShiftAssignments.rb +291 -0
- data/lib/ShiftScenario.rb +46 -0
- data/lib/SourceFileInfo.rb +37 -0
- data/lib/SyntaxReference.rb +284 -0
- data/lib/TOCEntry.rb +76 -0
- data/lib/TableColumnDefinition.rb +54 -0
- data/lib/TableOfContents.rb +46 -0
- data/lib/Task.rb +37 -0
- data/lib/TaskDependency.rb +39 -0
- data/lib/TaskJuggler.rb +84 -0
- data/lib/TaskScenario.rb +1622 -0
- data/lib/TextParser.rb +416 -0
- data/lib/TextParser/Pattern.rb +263 -0
- data/lib/TextParser/Rule.rb +171 -0
- data/lib/TextParser/StackElement.rb +45 -0
- data/lib/TextParser/TokenDoc.rb +38 -0
- data/lib/TextScanner.rb +682 -0
- data/lib/Tj3Config.rb +27 -0
- data/lib/TjException.rb +27 -0
- data/lib/TjTime.rb +395 -0
- data/lib/TjpExample.rb +119 -0
- data/lib/TjpSyntaxRules.rb +4022 -0
- data/lib/UTF8String.rb +100 -0
- data/lib/UserManual.rb +282 -0
- data/lib/WorkingHours.rb +323 -0
- data/lib/XMLDocument.rb +54 -0
- data/lib/XMLElement.rb +175 -0
- data/lib/reports/CSVFile.rb +146 -0
- data/lib/reports/ColumnTable.rb +66 -0
- data/lib/reports/GanttChart.rb +308 -0
- data/lib/reports/GanttContainer.rb +107 -0
- data/lib/reports/GanttHeader.rb +141 -0
- data/lib/reports/GanttHeaderScaleItem.rb +42 -0
- data/lib/reports/GanttLine.rb +329 -0
- data/lib/reports/GanttLoadStack.rb +113 -0
- data/lib/reports/GanttMilestone.rb +80 -0
- data/lib/reports/GanttRouter.rb +375 -0
- data/lib/reports/GanttTaskBar.rb +95 -0
- data/lib/reports/HTMLGraphics.rb +65 -0
- data/lib/reports/Report.rb +344 -0
- data/lib/reports/ReportElement.rb +427 -0
- data/lib/reports/ReportTable.rb +144 -0
- data/lib/reports/ReportTableCell.rb +142 -0
- data/lib/reports/ReportTableColumn.rb +82 -0
- data/lib/reports/ReportTableElement.rb +852 -0
- data/lib/reports/ReportTableLegend.rb +167 -0
- data/lib/reports/ReportTableLine.rb +87 -0
- data/lib/reports/ResourceListRE.rb +72 -0
- data/lib/reports/TaskListRE.rb +73 -0
- data/lib/reports/TjpExportRE.rb +394 -0
- data/lib/taskjuggler3.rb +106 -0
- data/lib/tj3man.rb +88 -0
- data/manual/Day_To_Day_Juggling +168 -0
- data/manual/Getting_Started +61 -0
- data/manual/How_To_Contribute +185 -0
- data/manual/Installation +68 -0
- data/manual/Intro +102 -0
- data/manual/Reporting_Bugs +26 -0
- data/manual/Rich_Text_Attributes +90 -0
- data/manual/TaskJuggler_2x_Migration +40 -0
- data/manual/Tutorial +579 -0
- data/manual/fdl +450 -0
- data/prj_cfg.rb +43 -0
- data/setup.rb +1585 -0
- data/tasks/csts.rake +72 -0
- data/tasks/gem.rake +14 -0
- data/tasks/manual.rake +10 -0
- data/tasks/missing.rake +21 -0
- data/tasks/rcov.rake +14 -0
- data/tasks/rdoc.rake +17 -0
- data/tasks/rexml_fix.rb +16 -0
- data/tasks/rexml_fix_19.rb +49 -0
- data/tasks/show.rake +21 -0
- data/tasks/stats.rake +25 -0
- data/tasks/test.rake +11 -0
- data/test/MessageChecker.rb +53 -0
- data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/celltext.tjp +7 -0
- data/test/TestSuite/CSV-Reports/genrefs +6 -0
- data/test/TestSuite/CSV-Reports/project-1.tji +57 -0
- data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -0
- data/test/TestSuite/CSV-Reports/resourcereport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -0
- data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +11 -0
- data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortByTree.tjp +8 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +10 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -0
- data/test/TestSuite/CSV-Reports/taskreport.tjp +10 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +24 -0
- data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +11 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +86 -0
- data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +63 -0
- data/test/TestSuite/Scheduler/Correct/Booking.tjp +161 -0
- data/test/TestSuite/Scheduler/Correct/Depends.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Duration.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +129 -0
- data/test/TestSuite/Scheduler/Correct/Limits.tjp +81 -0
- data/test/TestSuite/Scheduler/Correct/MultipleMandatories.tjp +43 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +28 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +33 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +34 -0
- data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +62 -0
- data/test/TestSuite/Scheduler/Correct/Precedes.tjp +50 -0
- data/test/TestSuite/Scheduler/Correct/Shift.tjp +102 -0
- data/test/TestSuite/Scheduler/Errors/account_no_leaf.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/booking_conflict.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/booking_no_duty.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/booking_on_vacation.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/container_booking.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/container_duration.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/effort_no_allocations.tjp +7 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +19 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +27 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +26 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +24 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +18 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +36 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +37 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +35 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +46 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +51 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +20 -0
- data/test/TestSuite/Scheduler/Errors/maxend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/maxstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_booking.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/milestone_duration.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/milestone_start_end.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minend.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/minstart.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/no_tasks.tjp +6 -0
- data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_child.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +13 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_parent.tjp +11 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_self.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_unknown.tjp +10 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_1.tjp +9 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_2.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_overspecified_3.tjp +14 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_1.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +8 -0
- data/test/TestSuite/Scheduler/Errors/task_underspecified_3.tjp +9 -0
- data/test/TestSuite/Syntax/Correct/Account.tjp +53 -0
- data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/Alternative.tjp +13 -0
- data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Booking.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Caption.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Comments.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Complete.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/CompletedWork.tji +20 -0
- data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +14 -0
- data/test/TestSuite/Syntax/Correct/Depends1.tjp +22 -0
- data/test/TestSuite/Syntax/Correct/Durations.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Efficiency.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Export.tjp +40 -0
- data/test/TestSuite/Syntax/Correct/Flags.tjp +32 -0
- data/test/TestSuite/Syntax/Correct/Freeze.tjp +28 -0
- data/test/TestSuite/Syntax/Correct/Gap.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/Limits-1.tjp +71 -0
- data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +31 -0
- data/test/TestSuite/Syntax/Correct/Macro-1.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Mandatory.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Milestone.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/MinMax.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Numberformat.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Period.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Persistent.tjp +11 -0
- data/test/TestSuite/Syntax/Correct/Precedes1.tjp +17 -0
- data/test/TestSuite/Syntax/Correct/Priority.tjp +30 -0
- data/test/TestSuite/Syntax/Correct/Project.tjp +21 -0
- data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +23 -0
- data/test/TestSuite/Syntax/Correct/RawHTML.tjp +29 -0
- data/test/TestSuite/Syntax/Correct/Reports.tjp +54 -0
- data/test/TestSuite/Syntax/Correct/Resource.tjp +20 -0
- data/test/TestSuite/Syntax/Correct/Responsible.tjp +16 -0
- data/test/TestSuite/Syntax/Correct/Scenario.tjp +15 -0
- data/test/TestSuite/Syntax/Correct/Scheduling.tjp +26 -0
- data/test/TestSuite/Syntax/Correct/Select.tjp +27 -0
- data/test/TestSuite/Syntax/Correct/Shift.tjp +55 -0
- data/test/TestSuite/Syntax/Correct/Simple.tjp +25 -0
- data/test/TestSuite/Syntax/Correct/String.tjp +12 -0
- data/test/TestSuite/Syntax/Correct/Supplement.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +34 -0
- data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +19 -0
- data/test/TestSuite/Syntax/Correct/Timezone.tjp +8 -0
- data/test/TestSuite/Syntax/Correct/Vacation.tjp +33 -0
- data/test/TestSuite/Syntax/Correct/csvtest +16 -0
- data/test/TestSuite/Syntax/Correct/manual2example.rb +24 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +485 -0
- data/test/TestSuite/Syntax/Errors/bad_include.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/booking_group.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/booking_milestone.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/booking_no_leaf.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/chargeset.tjp +14 -0
- data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/container_attribute.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/date_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/effort_zero.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/empty.tjp +1 -0
- data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/extend_id_cap.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_end_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/interval_start_in_range.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/leaf_resource_id_expected.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/misaligned_date.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/operand_attribute.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/overtime_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/purge_unknown_id.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/report_end.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/report_start.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/resource_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/resource_id_expected.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +24 -0
- data/test/TestSuite/Syntax/Errors/scenario_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_assignment_overlap.tjp +15 -0
- data/test/TestSuite/Syntax/Errors/shift_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/shift_id_expected.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/sloppy_range.tjp +13 -0
- data/test/TestSuite/Syntax/Errors/sort_direction.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/start_before_end1.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/start_before_end2.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/task_complete.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_exists.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/task_priority.tjp +8 -0
- data/test/TestSuite/Syntax/Errors/task_without_chargeset.tjp +9 -0
- data/test/TestSuite/Syntax/Errors/time_interval.tjp +12 -0
- data/test/TestSuite/Syntax/Errors/too_many_bangs.tjp +10 -0
- data/test/TestSuite/Syntax/Errors/undecl_flag.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_projectid.tjp +7 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_id.tjp +6 -0
- data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +11 -0
- data/test/TestSuite/Syntax/Errors/unknown_task.tjp +10 -0
- data/test/all.rb +31 -0
- data/test/test_BatchProcessor.rb +54 -0
- data/test/test_CSV-Reports.rb +101 -0
- data/test/test_Limits.rb +104 -0
- data/test/test_LogicalExpression.rb +110 -0
- data/test/test_MacroTable.rb +51 -0
- data/test/test_Project.rb +57 -0
- data/test/test_PropertySet.rb +71 -0
- data/test/test_Query.rb +83 -0
- data/test/test_RealFormat.rb +83 -0
- data/test/test_RichText.rb +869 -0
- data/test/test_Scheduler.rb +42 -0
- data/test/test_ShiftAssignments.rb +77 -0
- data/test/test_Syntax.rb +41 -0
- data/test/test_TextScanner.rb +95 -0
- data/test/test_TjTime.rb +114 -0
- data/test/test_TjpExample.rb +169 -0
- data/test/test_UTF8String.rb +84 -0
- data/test/test_WorkingHours.rb +56 -0
- metadata +649 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = ReportTableLegend.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
class TaskJuggler
|
|
14
|
+
|
|
15
|
+
# The ReportTableLegend models an output format independent legend for the
|
|
16
|
+
# ReportTable. It lists the graphical symbols used in the table together with
|
|
17
|
+
# a short textual description.
|
|
18
|
+
class ReportTableLegend
|
|
19
|
+
|
|
20
|
+
attr_accessor :showGanttItems
|
|
21
|
+
|
|
22
|
+
# Create a new ReportTableLegend object.
|
|
23
|
+
def initialize
|
|
24
|
+
@showGanttItems = false
|
|
25
|
+
@ganttItems = []
|
|
26
|
+
@calendarItems = []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Add another Gantt item to the legend. Make sure we don't have any
|
|
30
|
+
# duplicates.
|
|
31
|
+
def addGanttItem(text, color)
|
|
32
|
+
@ganttItems << [ text, color ] unless @ganttItems.include?([ text, color ])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Add another chart item to the legend. Make sure we don't have any
|
|
36
|
+
# duplicates.
|
|
37
|
+
def addCalendarItem(text, color)
|
|
38
|
+
unless @calendarItems.include?([ text, color ])
|
|
39
|
+
@calendarItems << [ text, color ]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Convert the abstract description into HTML elements.
|
|
44
|
+
def to_html
|
|
45
|
+
return nil if !@showGanttItems && @ganttItems.empty? &&
|
|
46
|
+
@calendarItems.empty?
|
|
47
|
+
|
|
48
|
+
table = XMLElement.new('table', 'class' => 'legendback',
|
|
49
|
+
'style' => 'width:100%', 'border' => '0',
|
|
50
|
+
'cellspacing' => '1', 'align' => 'center')
|
|
51
|
+
table << (tbody = XMLElement.new('tbody'))
|
|
52
|
+
tbody << (tr = XMLElement.new('tr'))
|
|
53
|
+
|
|
54
|
+
# Empty line to create a bit of a vertical gap.
|
|
55
|
+
tr << XMLElement.new('td', 'colspan' => '8', 'style' => 'height:5px')
|
|
56
|
+
|
|
57
|
+
tbody << headlineToHTML('Gantt Chart Symbols:')
|
|
58
|
+
# Generate the Gantt chart symbols
|
|
59
|
+
if @showGanttItems
|
|
60
|
+
tbody << (tr = XMLElement.new('tr'))
|
|
61
|
+
|
|
62
|
+
tr << ganttItemToHTML(GanttContainer.new(nil, 0, 15, 10, 35, 0),
|
|
63
|
+
'Container Task', 40)
|
|
64
|
+
tr << spacerToHTML(8)
|
|
65
|
+
tr << ganttItemToHTML(GanttTaskBar.new(nil, 0, 15, 5, 35, 0),
|
|
66
|
+
'Normal Task', 40)
|
|
67
|
+
tr << spacerToHTML
|
|
68
|
+
tr << ganttItemToHTML(GanttMilestone.new(nil, 15, 10, 0),
|
|
69
|
+
'Milestone', 20)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
tbody << itemsToHTML(@ganttItems)
|
|
73
|
+
|
|
74
|
+
tbody << headlineToHTML('Calendar Symbols:')
|
|
75
|
+
tbody << itemsToHTML(@calendarItems)
|
|
76
|
+
|
|
77
|
+
# Empty line to create a bit of a vertical gap.
|
|
78
|
+
tbody << (tr = XMLElement.new('tr'))
|
|
79
|
+
tr << XMLElement.new('td', 'colspan' => '8', 'style' => 'height:5px')
|
|
80
|
+
|
|
81
|
+
table
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
# In case we have both the calendar and the Gantt chart in the report
|
|
87
|
+
# element, we have to add description lines before the symbols. The two
|
|
88
|
+
# charts use the same colors for different meanings. This function generates
|
|
89
|
+
# the HTML version of the headlines.
|
|
90
|
+
def headlineToHTML(text)
|
|
91
|
+
tbody = []
|
|
92
|
+
unless @calendarItems.empty? || @ganttItems.empty?
|
|
93
|
+
tbody << (tr = XMLElement.new('tr'))
|
|
94
|
+
tr << (td = XMLElement.new('td', 'colspan' => '8',
|
|
95
|
+
'style' => 'font-weight:bold; ' +
|
|
96
|
+
'padding-left:10px'))
|
|
97
|
+
td << XMLText.new(text)
|
|
98
|
+
else
|
|
99
|
+
nil
|
|
100
|
+
end
|
|
101
|
+
tbody
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Turn the Gantt symbold descriptions into HTML elements.
|
|
105
|
+
def ganttItemToHTML(item, name, width)
|
|
106
|
+
tr = []
|
|
107
|
+
tr << (td = XMLElement.new('td', 'style' => 'width:19%; ' +
|
|
108
|
+
'padding-left:10px; '))
|
|
109
|
+
td << XMLText.new(name)
|
|
110
|
+
tr << (td = XMLElement.new('td', 'style' => 'width:8%'))
|
|
111
|
+
td << (div = XMLElement.new('div',
|
|
112
|
+
'style' => "position:relative; width:#{width}px; height:15px;"))
|
|
113
|
+
div << item.to_html
|
|
114
|
+
tr
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Turn the color items into HTML elements.
|
|
118
|
+
def itemsToHTML(items)
|
|
119
|
+
tbody = []
|
|
120
|
+
|
|
121
|
+
gridCells = ((items.length / 3) + (items.length % 3 != 0 ? 1 : 0)) * 3
|
|
122
|
+
tr = nil
|
|
123
|
+
gridCells.times do |i|
|
|
124
|
+
# We show no more than 3 items in a row.
|
|
125
|
+
tbody << (tr = XMLElement.new('tr')) if i % 3 == 0
|
|
126
|
+
|
|
127
|
+
# If we run out of items before the line is filled, we just insert
|
|
128
|
+
# spacers to fill the line.
|
|
129
|
+
if i < items.length
|
|
130
|
+
tr << itemToHTML(items[i])
|
|
131
|
+
else
|
|
132
|
+
tr << spacerToHTML(19)
|
|
133
|
+
tr << spacerToHTML(8)
|
|
134
|
+
end
|
|
135
|
+
tr << spacerToHTML() if i % 3 != 2
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
tbody
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Turn a single color item into HTML elements.
|
|
142
|
+
def itemToHTML(item)
|
|
143
|
+
tr = []
|
|
144
|
+
tr << (td = XMLElement.new('td', 'style' => 'width:19%; ' +
|
|
145
|
+
'padding-left:10px; '))
|
|
146
|
+
td << XMLText.new(item[0])
|
|
147
|
+
tr << (td = XMLElement.new('td', 'style' => 'width:8%'))
|
|
148
|
+
td << (div = XMLElement.new('div', 'style' => 'position:relative; ' +
|
|
149
|
+
'width:20px; height:15px')
|
|
150
|
+
div << XMLElement.new('div', 'class' => 'loadstackframe',
|
|
151
|
+
'style' => 'position:absolute; ' +
|
|
152
|
+
'left:5px; width:16px; height:15px;')
|
|
153
|
+
div << XMLElement.new('div', 'class' => "#{item[1]}",
|
|
154
|
+
'style' => 'position:absolute; left:1px; top:1px; ' +
|
|
155
|
+
'width:14px; height:13px;'))
|
|
156
|
+
tr
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Generate an empty HTML cell. _width_ is the requested width in pixels.
|
|
160
|
+
def spacerToHTML(width = 9)
|
|
161
|
+
XMLElement.new('td', 'style' => "width:#{width}%")
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
end
|
|
167
|
+
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = ReportTableLine.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'reports/ReportTableCell'
|
|
14
|
+
|
|
15
|
+
class TaskJuggler
|
|
16
|
+
|
|
17
|
+
class ReportTableLine
|
|
18
|
+
|
|
19
|
+
attr_reader :table, :property, :scopeLine
|
|
20
|
+
attr_accessor :height, :indentation, :fontSize, :no, :lineNo, :subLineNo
|
|
21
|
+
|
|
22
|
+
# Create a ReportTableCell object and initialize the variables with default
|
|
23
|
+
# values. _table_ is a reference to the ReportTable object this line belongs
|
|
24
|
+
# to. _property_ is a reference to the Task or Resource that is displayed in
|
|
25
|
+
# this line. _scopeLine_ is the line that sets the scope for this line. The
|
|
26
|
+
# value is nil if this is a primary line.
|
|
27
|
+
def initialize(table, property, scopeLine)
|
|
28
|
+
@table = table
|
|
29
|
+
@property = property
|
|
30
|
+
@scopeLine = scopeLine
|
|
31
|
+
|
|
32
|
+
# Register the new line with the table it belongs to.
|
|
33
|
+
@table.addLine(self)
|
|
34
|
+
# The cells of this line. Should be references to ReportTableCell objects.
|
|
35
|
+
@cells = []
|
|
36
|
+
# Heigh of the line in screen pixels
|
|
37
|
+
@height = 21
|
|
38
|
+
# Indentation for hierachiecal columns in screen pixels.
|
|
39
|
+
@indentation = 0
|
|
40
|
+
# The factor used to enlarge or shrink the font size for this line.
|
|
41
|
+
@fontSize = 12
|
|
42
|
+
# Counter that counts primary and nested lines separately. It restarts
|
|
43
|
+
# with 0 for each new nested line set. Scenario lines don't count.
|
|
44
|
+
@no = nil
|
|
45
|
+
# Counter that counts the primary lines. Scenario lines don't count.
|
|
46
|
+
@lineNo = nil
|
|
47
|
+
# Counter that counts all lines.
|
|
48
|
+
@subLineNo = nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Return the last non-hidden cell of the line. Start to look for the cell at
|
|
52
|
+
# the first cell after _count_ cells.
|
|
53
|
+
def last(count = 0)
|
|
54
|
+
(1 + count).upto(@cells.length) do |i|
|
|
55
|
+
return @cells[-i] unless @cells[-i].hidden
|
|
56
|
+
end
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Add the new cell to the line. _cell_ must reference a ReportTableCell
|
|
61
|
+
# object.
|
|
62
|
+
def addCell(cell)
|
|
63
|
+
@cells << cell
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Return this line as a set of XMLElement that represent the line in HTML.
|
|
67
|
+
def to_html
|
|
68
|
+
style = ""
|
|
69
|
+
style += "height:#{@height}px; " if @table.equiLines
|
|
70
|
+
style += "font-size:#{@fontSize}px; " if @fontSize
|
|
71
|
+
tr = XMLElement.new('tr', 'class' => 'tabline', 'style' => style)
|
|
72
|
+
@cells.each { |cell| tr << cell.to_html }
|
|
73
|
+
tr
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Convert the intermediate format into an Array of values. One entry for
|
|
77
|
+
# every column cell of this line.
|
|
78
|
+
def to_csv(csv)
|
|
79
|
+
@cells.each do |cell|
|
|
80
|
+
cell.to_csv(csv)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end
|
|
87
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = ResourceListRE.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'reports/ReportTableElement'
|
|
14
|
+
require 'reports/ReportTable'
|
|
15
|
+
require 'TableColumnDefinition'
|
|
16
|
+
require 'LogicalExpression'
|
|
17
|
+
|
|
18
|
+
class TaskJuggler
|
|
19
|
+
|
|
20
|
+
# This specialization of ReportTableElement implements a resource listing. It
|
|
21
|
+
# generates a list of resources that can optionally have the assigned tasks
|
|
22
|
+
# nested underneath each resource line.
|
|
23
|
+
class ResourceListRE < ReportTableElement
|
|
24
|
+
|
|
25
|
+
# Create a new object and set some default values.
|
|
26
|
+
def initialize(report)
|
|
27
|
+
super
|
|
28
|
+
# Set the default columns for this report.
|
|
29
|
+
%w( no name ).each do |col|
|
|
30
|
+
@columns << TableColumnDefinition.new(col, defaultColumnTitle(col))
|
|
31
|
+
end
|
|
32
|
+
# Show all resources, sorted by tree and id-up.
|
|
33
|
+
@hideResource = LogicalExpression.new(LogicalOperation.new(0))
|
|
34
|
+
@sortResources = [ [ 'tree', true, -1 ],
|
|
35
|
+
[ 'id', true, -1 ] ]
|
|
36
|
+
# Hide all resources, but set sorting to tree, start-up, seqno-up.
|
|
37
|
+
@hideTask = LogicalExpression.new(LogicalOperation.new(1))
|
|
38
|
+
@sortTasks = [ [ 'tree', true, -1 ],
|
|
39
|
+
[ 'start', true, 0 ],
|
|
40
|
+
[ 'seqno', true, -1 ] ]
|
|
41
|
+
|
|
42
|
+
@table = ReportTable.new
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Generate the table in the intermediate format.
|
|
46
|
+
def generateIntermediateFormat
|
|
47
|
+
# Generate the table header.
|
|
48
|
+
@columns.each do |columnDescr|
|
|
49
|
+
generateHeaderCell(columnDescr)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Prepare the resource list.
|
|
53
|
+
resourceList = PropertyList.new(@project.resources)
|
|
54
|
+
resourceList.setSorting(@sortResources)
|
|
55
|
+
resourceList = filterResourceList(resourceList, nil, @hideResource,
|
|
56
|
+
@rollupResource)
|
|
57
|
+
resourceList.sort!
|
|
58
|
+
|
|
59
|
+
# Prepare the task list.
|
|
60
|
+
taskList = PropertyList.new(@project.tasks)
|
|
61
|
+
taskList.setSorting(@sortTasks)
|
|
62
|
+
taskList = filterTaskList(taskList, nil, @hideTask, @rollupTask)
|
|
63
|
+
taskList.sort!
|
|
64
|
+
|
|
65
|
+
# Generate the list.
|
|
66
|
+
generateResourceList(resourceList, taskList, nil)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = TaskListRE.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'reports/ReportTableElement'
|
|
14
|
+
require 'reports/ReportTable'
|
|
15
|
+
require 'TableColumnDefinition'
|
|
16
|
+
require 'LogicalExpression'
|
|
17
|
+
|
|
18
|
+
class TaskJuggler
|
|
19
|
+
|
|
20
|
+
# This specialization of ReportTableElement implements a task listing. It
|
|
21
|
+
# generates a list of tasks that can optionally have the allocated resources
|
|
22
|
+
# nested underneath each task line.
|
|
23
|
+
class TaskListRE < ReportTableElement
|
|
24
|
+
|
|
25
|
+
# Create a new object and set some default values.
|
|
26
|
+
def initialize(report)
|
|
27
|
+
super
|
|
28
|
+
# Set the default columns for this report.
|
|
29
|
+
%w( wbs name start end effort chart ).each do |col|
|
|
30
|
+
@columns << TableColumnDefinition.new(col, defaultColumnTitle(col))
|
|
31
|
+
end
|
|
32
|
+
# Show all tasks, sorted by tree, start-up, seqno-up.
|
|
33
|
+
@hideTask = LogicalExpression.new(LogicalOperation.new(0))
|
|
34
|
+
@sortTasks = [ [ 'tree', true, -1 ],
|
|
35
|
+
[ 'start', true, 0 ],
|
|
36
|
+
[ 'seqno', true, -1 ] ]
|
|
37
|
+
# Show no resources, but set sorting to id-up.
|
|
38
|
+
@hideResource = LogicalExpression.new(LogicalOperation.new(1))
|
|
39
|
+
@sortResources = [ [ 'id', true, -1 ] ]
|
|
40
|
+
|
|
41
|
+
@table = ReportTable.new
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Generate the table in the intermediate format.
|
|
45
|
+
def generateIntermediateFormat
|
|
46
|
+
# Prepare the task list.
|
|
47
|
+
taskList = PropertyList.new(@project.tasks)
|
|
48
|
+
taskList.setSorting(@sortTasks)
|
|
49
|
+
taskList = filterTaskList(taskList, nil, @hideTask, @rollupTask)
|
|
50
|
+
taskList.sort!
|
|
51
|
+
|
|
52
|
+
adjustReportPeriod(taskList, @scenarios) unless @userDefinedPeriod
|
|
53
|
+
|
|
54
|
+
# Prepare the resource list.
|
|
55
|
+
resourceList = PropertyList.new(@project.resources)
|
|
56
|
+
resourceList.setSorting(@sortResources)
|
|
57
|
+
resourceList = filterResourceList(resourceList, nil, @hideResource,
|
|
58
|
+
@rollupResource)
|
|
59
|
+
resourceList.sort!
|
|
60
|
+
|
|
61
|
+
# Generate the table header.
|
|
62
|
+
@columns.each do |columnDescr|
|
|
63
|
+
generateHeaderCell(columnDescr)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Generate the list.
|
|
67
|
+
generateTaskList(taskList, resourceList, nil)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w
|
|
2
|
+
# encoding: UTF-8
|
|
3
|
+
#
|
|
4
|
+
# = TjpExportRE.rb -- The TaskJuggler III Project Management Software
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
|
10
|
+
# published by the Free Software Foundation.
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'reports/ReportElement'
|
|
14
|
+
|
|
15
|
+
class TaskJuggler
|
|
16
|
+
|
|
17
|
+
# This specialization of ReportTableElement implements an export of the
|
|
18
|
+
# project data in the TJP syntax format.
|
|
19
|
+
class TjpExportRE < ReportElement
|
|
20
|
+
|
|
21
|
+
attr_writer :resourceAttrs, :taskAttrs
|
|
22
|
+
attr_reader :mainFile
|
|
23
|
+
|
|
24
|
+
# Create a new object and set some default values.
|
|
25
|
+
def initialize(report, mainFile)
|
|
26
|
+
super(report)
|
|
27
|
+
|
|
28
|
+
# Indicates whether this is a full .tjp file or just an .tji include file.
|
|
29
|
+
@mainFile = mainFile
|
|
30
|
+
|
|
31
|
+
@supportedTaskAttrs = %w( booking complete depends flags maxend
|
|
32
|
+
maxstart minend minstart note priority
|
|
33
|
+
responsible )
|
|
34
|
+
@supportedResourceAttrs = %w( vacation workinghours )
|
|
35
|
+
@taskAttrs = %w( all )
|
|
36
|
+
@resourceAttrs = %w( all )
|
|
37
|
+
@scenarios = [ 0 ]
|
|
38
|
+
|
|
39
|
+
# Show all tasks, sorted by seqno-up.
|
|
40
|
+
@hideTask =
|
|
41
|
+
LogicalExpression.new(LogicalOperation.new(0))
|
|
42
|
+
@sortTasks = [ [ 'seqno', true, -1 ] ]
|
|
43
|
+
# Show all resources, sorted by seqno-up.
|
|
44
|
+
@hideResource =
|
|
45
|
+
LogicalExpression.new(LogicalOperation.new(0))
|
|
46
|
+
@sortResources = [ [ 'seqno', true, -1 ] ]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# There is nothing to do here.
|
|
50
|
+
def generateIntermediateFormat
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Return the project data in TJP syntax format.
|
|
54
|
+
def to_tjp
|
|
55
|
+
# Prepare the resource list.
|
|
56
|
+
@resourceList = PropertyList.new(@project.resources)
|
|
57
|
+
@resourceList.setSorting(@sortResources)
|
|
58
|
+
@resourceList = filterResourceList(@resourceList, nil, @hideResource,
|
|
59
|
+
@rollupResource)
|
|
60
|
+
@resourceList.sort!
|
|
61
|
+
|
|
62
|
+
# Prepare the task list.
|
|
63
|
+
@taskList = PropertyList.new(@project.tasks)
|
|
64
|
+
@taskList.setSorting(@sortTasks)
|
|
65
|
+
@taskList = filterTaskList(@taskList, nil, @hideTask, @rollupTask)
|
|
66
|
+
@taskList.sort!
|
|
67
|
+
|
|
68
|
+
getBookings
|
|
69
|
+
|
|
70
|
+
@file = ''
|
|
71
|
+
|
|
72
|
+
if @mainFile
|
|
73
|
+
generateProjectProperty
|
|
74
|
+
generateFlagDeclaration
|
|
75
|
+
generateResourceList
|
|
76
|
+
generateTaskList
|
|
77
|
+
end
|
|
78
|
+
generateTaskAttributes unless @taskAttrs.empty?
|
|
79
|
+
generateResourceAttributes unless @resourceAttrs.empty?
|
|
80
|
+
|
|
81
|
+
@file
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
|
|
86
|
+
def generateProjectProperty
|
|
87
|
+
@file << "project #{@project['projectid']} \"#{@project['name']}\" " +
|
|
88
|
+
"\"#{@project['version']}\" #{@project['start']} - " +
|
|
89
|
+
"#{@project['end']} {\n"
|
|
90
|
+
generateCustomAttributeDeclarations('resource', @project.resources,
|
|
91
|
+
@resourceAttrs)
|
|
92
|
+
generateCustomAttributeDeclarations('task', @project.tasks, @taskAttrs)
|
|
93
|
+
@file << "}\n\n"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def generateCustomAttributeDeclarations(tag, propertySet, attributes)
|
|
97
|
+
# First we search the attribute definitions for any user defined
|
|
98
|
+
# attributes and count them.
|
|
99
|
+
customAttributes = 0
|
|
100
|
+
propertySet.eachAttributeDefinition do |ad|
|
|
101
|
+
customAttributes += 1 if ad.userDefined
|
|
102
|
+
end
|
|
103
|
+
# Return if there are no user defined attributes.
|
|
104
|
+
return if customAttributes == 0
|
|
105
|
+
|
|
106
|
+
# Generate definitions for each user defined attribute that is in the
|
|
107
|
+
# taskAttributes list.
|
|
108
|
+
@file << ' extend ' + tag + "{\n"
|
|
109
|
+
propertySet.eachAttributeDefinition do |ad|
|
|
110
|
+
next unless ad.userDefined &&
|
|
111
|
+
(attributes.include?(ad.id) || attributes.include?('all'))
|
|
112
|
+
|
|
113
|
+
@file << " #{ad.objClass.tjpId} #{ad.id} \"#{ad.name}\"\n"
|
|
114
|
+
end
|
|
115
|
+
@file << " }\n"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def generateFlagDeclaration
|
|
119
|
+
flags = []
|
|
120
|
+
|
|
121
|
+
properties = @resourceList + @taskList
|
|
122
|
+
|
|
123
|
+
properties.each do |property|
|
|
124
|
+
@scenarios.each do |scenarioIdx|
|
|
125
|
+
property['flags', scenarioIdx].each do |flag|
|
|
126
|
+
flags << flag unless flags.include?(flag)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
flags.sort
|
|
131
|
+
unless flags.empty?
|
|
132
|
+
@file << "flags #{flags.join(', ')}\n\n"
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def generateResourceList
|
|
137
|
+
# The resource definitions are generated recursively. So we only need to
|
|
138
|
+
# start it for the top-level resources.
|
|
139
|
+
@resourceList.each do |resource|
|
|
140
|
+
if resource.parent.nil?
|
|
141
|
+
generateResource(resource, 0)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
@file << "\n"
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def generateResource(resource, indent)
|
|
148
|
+
Log.activity if resource.sequenceNo % 100 == 0
|
|
149
|
+
|
|
150
|
+
@file << ' ' * indent + "resource #{resource.id} \"#{resource.name}\""
|
|
151
|
+
@file << ' {' unless resource.children.empty?
|
|
152
|
+
@file << "\n"
|
|
153
|
+
|
|
154
|
+
# Call this function recursively for all children that are included in the
|
|
155
|
+
# resource list as well.
|
|
156
|
+
resource.children.each do |subresource|
|
|
157
|
+
if @resourceList.include?(subresource)
|
|
158
|
+
generateResource(subresource, indent + 2)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
@file << ' ' * indent + "}\n" unless resource.children.empty?
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def generateTaskList
|
|
166
|
+
# The task definitions are generated recursively. So we only need to start
|
|
167
|
+
# it for the top-level tasks.
|
|
168
|
+
@taskList.each do |task|
|
|
169
|
+
if task.parent.nil?
|
|
170
|
+
generateTask(task, 0)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Generate a task definition. It only contains a very small set of
|
|
176
|
+
# attributes that have to be passed on the the nested tasks at creation
|
|
177
|
+
# time. All other attributes are declared in subsequent supplement
|
|
178
|
+
# statements.
|
|
179
|
+
def generateTask(task, indent)
|
|
180
|
+
Log.activity if task.sequenceNo % 100 == 0
|
|
181
|
+
|
|
182
|
+
@file << ' ' * indent + "task #{task.id} \"#{task.name}\" {\n"
|
|
183
|
+
|
|
184
|
+
if @taskAttrs.include?('depends') || @taskAttrs.include?('all')
|
|
185
|
+
@scenarios.each do |scenarioIdx|
|
|
186
|
+
generateTaskDependency(scenarioIdx, task, 'depends', indent + 2)
|
|
187
|
+
generateTaskDependency(scenarioIdx, task, 'precedes', indent + 2)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Call this function recursively for all children that are included in the
|
|
192
|
+
# task list as well.
|
|
193
|
+
task.children.each do |subtask|
|
|
194
|
+
if @taskList.include?(subtask)
|
|
195
|
+
generateTask(subtask, indent + 2)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Determine whether this task has subtasks that are included in the
|
|
200
|
+
# report or whether this is a leaf task for the report.
|
|
201
|
+
isLeafTask = true
|
|
202
|
+
task.children.each do |subtask|
|
|
203
|
+
if @taskList.include?(subtask)
|
|
204
|
+
isLeafTask = false
|
|
205
|
+
break
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# For leaf tasks we put some attributes right here.
|
|
210
|
+
if isLeafTask
|
|
211
|
+
@scenarios.each do |scenarioIdx|
|
|
212
|
+
generateAttribute(task, 'start', indent + 2, scenarioIdx)
|
|
213
|
+
unless task['milestone', scenarioIdx]
|
|
214
|
+
generateAttribute(task, 'end', indent + 2, scenarioIdx)
|
|
215
|
+
end
|
|
216
|
+
if task['scheduled', scenarioIdx]
|
|
217
|
+
generateAttributeText('scheduled', indent + 2, scenarioIdx)
|
|
218
|
+
end
|
|
219
|
+
generateAttributeText('scheduling ' +
|
|
220
|
+
(task['forward', scenarioIdx] ?
|
|
221
|
+
'asap' : 'alap'),
|
|
222
|
+
indent + 2, scenarioIdx)
|
|
223
|
+
if task['milestone', scenarioIdx]
|
|
224
|
+
generateAttributeText('milestone', indent + 2, scenarioIdx)
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
@file << ' ' * indent + "}\n"
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# Generate 'depends' or 'precedes' attributes for a task.
|
|
233
|
+
def generateTaskDependency(scenarioIdx, task, tag, indent)
|
|
234
|
+
return unless @taskAttrs.include?('depends') || !@taskAttrs.include?('all')
|
|
235
|
+
|
|
236
|
+
taskDeps = task[tag, scenarioIdx]
|
|
237
|
+
unless taskDeps.empty?
|
|
238
|
+
@file << ' ' * indent + tag + ' '
|
|
239
|
+
first = true
|
|
240
|
+
taskDeps.each do |dep|
|
|
241
|
+
if first
|
|
242
|
+
first = false
|
|
243
|
+
else
|
|
244
|
+
@file << ', '
|
|
245
|
+
end
|
|
246
|
+
@file << dep.task.fullId
|
|
247
|
+
end
|
|
248
|
+
@file << "\n"
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Generate a list of resource supplement statements that include the rest of
|
|
253
|
+
# the attributes.
|
|
254
|
+
def generateResourceAttributes
|
|
255
|
+
@resourceList.each do |resource|
|
|
256
|
+
Log.activity if resource.sequenceNo % 100 == 0
|
|
257
|
+
|
|
258
|
+
@file << "supplement resource #{resource.fullId} {\n"
|
|
259
|
+
@project.resources.eachAttributeDefinition do |attrDef|
|
|
260
|
+
id = attrDef.id
|
|
261
|
+
attr = resource.getAttr(id)
|
|
262
|
+
next if (!@supportedResourceAttrs.include?(id) &&
|
|
263
|
+
! attrDef.userDefined) ||
|
|
264
|
+
(!@resourceAttrs.include?('all') &&
|
|
265
|
+
!@resourceAttrs.include?(id))
|
|
266
|
+
|
|
267
|
+
if attrDef.scenarioSpecific
|
|
268
|
+
@scenarios.each do |scenarioIdx|
|
|
269
|
+
generateAttribute(resource, id, 2, scenarioIdx)
|
|
270
|
+
end
|
|
271
|
+
else
|
|
272
|
+
generateAttribute(resource, id, 2)
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
@file << "}\n"
|
|
277
|
+
end
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Generate a list of task supplement statements that include the rest of the
|
|
281
|
+
# attributes.
|
|
282
|
+
def generateTaskAttributes
|
|
283
|
+
@taskList.each do |task|
|
|
284
|
+
Log.activity if task.sequenceNo % 100 == 0
|
|
285
|
+
|
|
286
|
+
@file << "supplement task #{task.fullId} {\n"
|
|
287
|
+
@project.tasks.eachAttributeDefinition do |attrDef|
|
|
288
|
+
id = attrDef.id
|
|
289
|
+
attr = task.getAttr(id)
|
|
290
|
+
next if (!@supportedTaskAttrs.include?(id) &&
|
|
291
|
+
! attrDef.userDefined) ||
|
|
292
|
+
(!@taskAttrs.include?('all') && !@taskAttrs.include?(id))
|
|
293
|
+
|
|
294
|
+
if attrDef.scenarioSpecific
|
|
295
|
+
@scenarios.each do |scenarioIdx|
|
|
296
|
+
# Some attributes need special treatment.
|
|
297
|
+
case id
|
|
298
|
+
when 'depends'
|
|
299
|
+
next # already taken care of
|
|
300
|
+
when 'booking'
|
|
301
|
+
generateBooking(task, 2, scenarioIdx)
|
|
302
|
+
else
|
|
303
|
+
generateAttribute(task, id, 2, scenarioIdx)
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
else
|
|
307
|
+
generateAttribute(task, id, 2)
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
@file << "}\n"
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def generateAttribute(property, attrId, indent, scenarioIdx = nil)
|
|
316
|
+
if scenarioIdx.nil?
|
|
317
|
+
return if property.getAttr(attrId).nil?
|
|
318
|
+
else
|
|
319
|
+
return if property[attrId, scenarioIdx].nil?
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
generateAttributeText(property.getAttr(attrId, scenarioIdx).to_tjp,
|
|
323
|
+
indent, scenarioIdx)
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def generateAttributeText(text, indent, scenarioIdx)
|
|
327
|
+
@file << ' ' * indent
|
|
328
|
+
tag = ''
|
|
329
|
+
unless scenarioIdx.nil?
|
|
330
|
+
tag = @project.scenario(scenarioIdx).id
|
|
331
|
+
@file << "#{tag}:"
|
|
332
|
+
end
|
|
333
|
+
@file << "#{indentBlock(text, indent + tag.length + 2)}\n"
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# Get the booking data for all resources that should be included in the
|
|
337
|
+
# report.
|
|
338
|
+
def getBookings
|
|
339
|
+
@bookings = {}
|
|
340
|
+
if @taskAttrs.include?('booking') ||
|
|
341
|
+
@taskAttrs.include?('all')
|
|
342
|
+
@scenarios.each do |scenarioIdx|
|
|
343
|
+
@bookings[scenarioIdx] = {}
|
|
344
|
+
@resourceList.each do |resource|
|
|
345
|
+
# Get the bookings for this resource hashed by task.
|
|
346
|
+
bookings = resource.getBookings(scenarioIdx)
|
|
347
|
+
next if bookings.nil?
|
|
348
|
+
|
|
349
|
+
# Now convert/add them to a tripple-stage hash by scenarioIdx, task
|
|
350
|
+
# and then resource.
|
|
351
|
+
bookings.each do |task, booking|
|
|
352
|
+
if !@bookings[scenarioIdx].include?(task)
|
|
353
|
+
@bookings[scenarioIdx][task] = {}
|
|
354
|
+
end
|
|
355
|
+
@bookings[scenarioIdx][task][resource] = booking
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def generateBooking(task, indent, scenarioIdx)
|
|
363
|
+
return unless @bookings[scenarioIdx].include?(task)
|
|
364
|
+
|
|
365
|
+
@bookings[scenarioIdx][task].each_value do |booking|
|
|
366
|
+
generateAttributeText('booking ' + booking.to_tjp, indent, scenarioIdx)
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
# This utility function is used to indent multi-line attributes. All
|
|
371
|
+
# attributes should be filtered through this function. Attributes that
|
|
372
|
+
# contain line breaks will be indented properly. In addition to the
|
|
373
|
+
# indentation specified by _indent_ all but the first line will be indented
|
|
374
|
+
# after the first word of the first line. The text may not end with a line
|
|
375
|
+
# break.
|
|
376
|
+
def indentBlock(text, indent)
|
|
377
|
+
out = ''
|
|
378
|
+
firstSpace = 0
|
|
379
|
+
text.length.times do |i|
|
|
380
|
+
if firstSpace == 0 && text[i] == ?\ # There must be a space after ?
|
|
381
|
+
firstSpace = i
|
|
382
|
+
end
|
|
383
|
+
out << text[i]
|
|
384
|
+
if text[i] == ?\n
|
|
385
|
+
out += ' ' * (indent + firstSpace)
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
out
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
end
|
|
394
|
+
|