taskjuggler 0.0.8 → 0.0.9
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/CHANGELOG +1144 -2047
- data/README +1 -1
- data/Rakefile +6 -6
- data/data/css/tjmanual.css +20 -0
- data/data/css/tjreport.css +7 -6
- data/doc/AppConfig.html +136 -130
- data/doc/Arguments.html +46 -40
- data/doc/CHANGELOG.html +1162 -2057
- data/doc/COPYING.html +8 -2
- data/doc/Object.html +205 -199
- data/doc/README.html +9 -3
- data/doc/RuntimeConfig.html +75 -69
- data/doc/String.html +69 -63
- data/doc/TaskJuggler.html +350 -291
- data/doc/TaskJuggler/Account.html +26 -20
- data/doc/TaskJuggler/AccountAttribute.html +24 -18
- data/doc/TaskJuggler/AccountScenario.html +24 -18
- data/doc/TaskJuggler/Allocation.html +74 -68
- data/doc/TaskJuggler/AllocationAttribute.html +54 -48
- data/doc/TaskJuggler/AttributeBase.html +172 -93
- data/doc/TaskJuggler/AttributeDefinition.html +22 -16
- data/doc/TaskJuggler/AttributeOverwrite.html +586 -0
- data/doc/TaskJuggler/BatchProcessor.html +263 -257
- data/doc/TaskJuggler/Booking.html +44 -38
- data/doc/TaskJuggler/BookingListAttribute.html +25 -21
- data/doc/TaskJuggler/BooleanAttribute.html +24 -18
- data/doc/TaskJuggler/CSVFile.html +193 -187
- data/doc/TaskJuggler/CellSettingPattern.html +13 -7
- data/doc/TaskJuggler/CellSettingPatternList.html +25 -19
- data/doc/TaskJuggler/Charge.html +49 -43
- data/doc/TaskJuggler/ChargeListAttribute.html +21 -15
- data/doc/TaskJuggler/ChargeSet.html +94 -88
- data/doc/TaskJuggler/ChargeSetListAttribute.html +29 -25
- data/doc/TaskJuggler/CollisionDetector.html +142 -136
- data/doc/TaskJuggler/ColumnListAttribute.html +21 -17
- data/doc/TaskJuggler/ColumnTable.html +50 -44
- data/doc/TaskJuggler/Daemon.html +71 -50
- data/doc/TaskJuggler/DataCache.html +110 -58
- data/doc/TaskJuggler/DataCacheEntry.html +22 -16
- data/doc/TaskJuggler/DateAttribute.html +24 -18
- data/doc/TaskJuggler/DefinitionListAttribute.html +12 -6
- data/doc/TaskJuggler/DependencyListAttribute.html +29 -25
- data/doc/TaskJuggler/DurationAttribute.html +25 -19
- data/doc/TaskJuggler/FileList.html +25 -19
- data/doc/TaskJuggler/FileRecord.html +17 -11
- data/doc/TaskJuggler/FixnumAttribute.html +16 -10
- data/doc/TaskJuggler/FlagListAttribute.html +25 -21
- data/doc/TaskJuggler/FloatAttribute.html +20 -14
- data/doc/TaskJuggler/FormatListAttribute.html +17 -11
- data/doc/TaskJuggler/GanttChart.html +242 -236
- data/doc/TaskJuggler/GanttContainer.html +71 -67
- data/doc/TaskJuggler/GanttHeader.html +113 -107
- data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -20
- data/doc/TaskJuggler/GanttLine.html +217 -210
- data/doc/TaskJuggler/GanttLoadStack.html +89 -83
- data/doc/TaskJuggler/GanttMilestone.html +11 -6
- data/doc/TaskJuggler/GanttRouter.html +194 -186
- data/doc/TaskJuggler/GanttTaskBar.html +41 -34
- data/doc/TaskJuggler/HTMLDocument.html +52 -46
- data/doc/TaskJuggler/HTMLGraphics.html +58 -52
- data/doc/TaskJuggler/Interval.html +90 -84
- data/doc/TaskJuggler/IntervalList.html +777 -0
- data/doc/TaskJuggler/IntervalListAttribute.html +29 -25
- data/doc/TaskJuggler/JobInfo.html +36 -30
- data/doc/TaskJuggler/Journal.html +188 -177
- data/doc/TaskJuggler/JournalEntry.html +36 -30
- data/doc/TaskJuggler/JournalEntryList.html +88 -82
- data/doc/TaskJuggler/KeywordArray.html +12 -6
- data/doc/TaskJuggler/KeywordDocumentation.html +512 -503
- data/doc/TaskJuggler/Limits.html +111 -105
- data/doc/TaskJuggler/Limits/Limit.html +71 -65
- data/doc/TaskJuggler/LimitsAttribute.html +21 -15
- data/doc/TaskJuggler/ListAttributeBase.html +16 -10
- data/doc/TaskJuggler/Log.html +111 -105
- data/doc/TaskJuggler/LogFile.html +54 -48
- data/doc/TaskJuggler/LogicalAttribute.html +35 -29
- data/doc/TaskJuggler/LogicalExpression.html +32 -26
- data/doc/TaskJuggler/LogicalExpressionAttribute.html +16 -10
- data/doc/TaskJuggler/LogicalExpressionListAttribute.html +671 -0
- data/doc/TaskJuggler/LogicalFlag.html +24 -18
- data/doc/TaskJuggler/LogicalFunction.html +164 -158
- data/doc/TaskJuggler/LogicalOperation.html +138 -132
- data/doc/TaskJuggler/Macro.html +14 -8
- data/doc/TaskJuggler/MacroTable.html +42 -36
- data/doc/TaskJuggler/ManagerResponsibilities.html +19 -13
- data/doc/TaskJuggler/ManagerStatusRecord.html +23 -17
- data/doc/TaskJuggler/Message.html +56 -50
- data/doc/TaskJuggler/MessageHandler.html +73 -67
- data/doc/TaskJuggler/Navigator.html +92 -86
- data/doc/TaskJuggler/NavigatorElement.html +88 -82
- data/doc/TaskJuggler/NikuProject.html +15 -9
- data/doc/TaskJuggler/NikuReport.html +405 -370
- data/doc/TaskJuggler/NikuResource.html +13 -7
- data/doc/TaskJuggler/NodeListAttribute.html +13 -9
- data/doc/TaskJuggler/PlaceHolderCell.html +22 -16
- data/doc/TaskJuggler/ProcessIntercom.html +116 -110
- data/doc/TaskJuggler/ProcessIntercomIface.html +39 -33
- data/doc/TaskJuggler/Project.html +1064 -895
- data/doc/TaskJuggler/ProjectBroker.html +439 -366
- data/doc/TaskJuggler/ProjectBrokerIface.html +63 -53
- data/doc/TaskJuggler/ProjectFileParser.html +329 -319
- data/doc/TaskJuggler/ProjectFileScanner.html +351 -345
- data/doc/TaskJuggler/ProjectRecord.html +66 -60
- data/doc/TaskJuggler/ProjectServer.html +287 -280
- data/doc/TaskJuggler/ProjectServerIface.html +43 -37
- data/doc/TaskJuggler/PropertyAttribute.html +16 -10
- data/doc/TaskJuggler/PropertyList.html +205 -199
- data/doc/TaskJuggler/PropertySet.html +264 -296
- data/doc/TaskJuggler/PropertyTreeNode.html +455 -505
- data/doc/TaskJuggler/Query.html +309 -524
- data/doc/TaskJuggler/RTFHandlers.html +17 -11
- data/doc/TaskJuggler/RTFNavigator.html +33 -27
- data/doc/TaskJuggler/RTFQuery.html +135 -129
- data/doc/TaskJuggler/RTFReport.html +63 -57
- data/doc/TaskJuggler/RTFReportLink.html +55 -49
- data/doc/TaskJuggler/RTFWithQuerySupport.html +17 -11
- data/doc/TaskJuggler/RealFormat.html +64 -58
- data/doc/TaskJuggler/RealFormatAttribute.html +12 -6
- data/doc/TaskJuggler/ReferenceAttribute.html +35 -29
- data/doc/TaskJuggler/Report.html +294 -249
- data/doc/TaskJuggler/ReportBase.html +229 -223
- data/doc/TaskJuggler/ReportContext.html +52 -46
- data/doc/TaskJuggler/ReportServer.html +143 -137
- data/doc/TaskJuggler/ReportServerIface.html +51 -43
- data/doc/TaskJuggler/ReportServerRecord.html +36 -30
- data/doc/TaskJuggler/ReportServlet.html +167 -140
- data/doc/TaskJuggler/ReportTable.html +137 -131
- data/doc/TaskJuggler/ReportTableCell.html +332 -292
- data/doc/TaskJuggler/ReportTableColumn.html +46 -40
- data/doc/TaskJuggler/ReportTableLegend.html +43 -38
- data/doc/TaskJuggler/ReportTableLine.html +66 -60
- data/doc/TaskJuggler/Resource.html +166 -160
- data/doc/TaskJuggler/ResourceListAttribute.html +54 -32
- data/doc/TaskJuggler/ResourceListRE.html +47 -41
- data/doc/TaskJuggler/ResourceScenario.html +671 -644
- data/doc/TaskJuggler/RichText.html +51 -45
- data/doc/TaskJuggler/RichTextAttribute.html +28 -22
- data/doc/TaskJuggler/RichTextDocument.html +96 -90
- data/doc/TaskJuggler/RichTextElement.html +503 -497
- data/doc/TaskJuggler/RichTextFunctionExample.html +41 -35
- data/doc/TaskJuggler/RichTextFunctionHandler.html +19 -13
- data/doc/TaskJuggler/RichTextImage.html +14 -8
- data/doc/TaskJuggler/RichTextIntermediate.html +86 -80
- data/doc/TaskJuggler/RichTextParser.html +59 -53
- data/doc/TaskJuggler/RichTextScanner.html +184 -178
- data/doc/TaskJuggler/RichTextSnip.html +69 -63
- data/doc/TaskJuggler/RichTextSyntaxRules.html +416 -410
- data/doc/TaskJuggler/Scenario.html +13 -7
- data/doc/TaskJuggler/ScenarioData.html +40 -34
- data/doc/TaskJuggler/ScenarioListAttribute.html +21 -15
- data/doc/TaskJuggler/Scoreboard.html +129 -107
- data/doc/TaskJuggler/SheetHandlerBase.html +245 -239
- data/doc/TaskJuggler/SheetReceiver.html +333 -327
- data/doc/TaskJuggler/SheetSender.html +227 -221
- data/doc/TaskJuggler/Shift.html +26 -20
- data/doc/TaskJuggler/ShiftAssignment.html +45 -39
- data/doc/TaskJuggler/ShiftAssignments.html +178 -172
- data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +21 -15
- data/doc/TaskJuggler/ShiftScenario.html +29 -23
- data/doc/TaskJuggler/SimpleQueryExpander.html +36 -30
- data/doc/TaskJuggler/SortListAttribute.html +17 -13
- data/doc/TaskJuggler/SourceFileInfo.html +19 -13
- data/doc/TaskJuggler/StatusSheetReceiver.html +31 -25
- data/doc/TaskJuggler/StatusSheetReport.html +166 -159
- data/doc/TaskJuggler/StatusSheetSender.html +80 -74
- data/doc/TaskJuggler/StringAttribute.html +20 -14
- data/doc/TaskJuggler/SymbolAttribute.html +16 -10
- data/doc/TaskJuggler/SyntaxReference.html +231 -225
- data/doc/TaskJuggler/TOCEntry.html +46 -40
- data/doc/TaskJuggler/TSResourceRecord.html +15 -9
- data/doc/TaskJuggler/TSTaskRecord.html +16 -10
- data/doc/TaskJuggler/TableColumnDefinition.html +84 -39
- data/doc/TaskJuggler/TableOfContents.html +28 -22
- data/doc/TaskJuggler/TableReport.html +906 -866
- data/doc/TaskJuggler/Task.html +99 -93
- data/doc/TaskJuggler/TaskDependency.html +24 -18
- data/doc/TaskJuggler/TaskListAttribute.html +29 -25
- data/doc/TaskJuggler/TaskListRE.html +46 -39
- data/doc/TaskJuggler/TaskScenario.html +2218 -1965
- data/doc/TaskJuggler/TextFormatter.html +154 -148
- data/doc/TaskJuggler/TextParser.html +362 -348
- data/doc/TaskJuggler/TextParser/Pattern.html +313 -307
- data/doc/TaskJuggler/TextParser/Rule.html +147 -141
- data/doc/TaskJuggler/TextParser/StackElement.html +58 -52
- data/doc/TaskJuggler/TextParser/State.html +88 -82
- data/doc/TaskJuggler/TextParser/StateTransition.html +42 -36
- data/doc/TaskJuggler/TextParser/TextParserResultArray.html +20 -14
- data/doc/TaskJuggler/TextParser/TokenDoc.html +19 -13
- data/doc/TaskJuggler/TextReport.html +80 -74
- data/doc/TaskJuggler/TextScanner.html +284 -272
- data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +14 -8
- data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +21 -15
- data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +15 -9
- data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
- data/doc/TaskJuggler/TimeSheet.html +123 -117
- data/doc/TaskJuggler/TimeSheetReceiver.html +28 -22
- data/doc/TaskJuggler/TimeSheetRecord.html +212 -206
- data/doc/TaskJuggler/TimeSheetReport.html +206 -199
- data/doc/TaskJuggler/TimeSheetSender.html +27 -21
- data/doc/TaskJuggler/TimeSheetSummary.html +140 -134
- data/doc/TaskJuggler/TimeSheets.html +20 -14
- data/doc/TaskJuggler/Tj3AppBase.html +100 -94
- data/doc/TaskJuggler/Tj3Client.html +407 -483
- data/doc/TaskJuggler/Tj3Daemon.html +116 -107
- data/doc/TaskJuggler/Tj3SheetAppBase.html +45 -39
- data/doc/TaskJuggler/Tj3SsReceiver.html +31 -25
- data/doc/TaskJuggler/Tj3SsSender.html +64 -58
- data/doc/TaskJuggler/Tj3TsReceiver.html +31 -25
- data/doc/TaskJuggler/Tj3TsSender.html +51 -45
- data/doc/TaskJuggler/Tj3TsSummary.html +59 -53
- data/doc/TaskJuggler/TjException.html +13 -7
- data/doc/TaskJuggler/TjTime.html +444 -438
- data/doc/TaskJuggler/TjpExample.html +84 -78
- data/doc/TaskJuggler/TjpExportRE.html +356 -349
- data/doc/TaskJuggler/TjpSyntaxRules.html +4279 -4151
- data/doc/TaskJuggler/URLParameter.html +16 -10
- data/doc/TaskJuggler/UserManual.html +185 -179
- data/doc/TaskJuggler/VimSyntax.html +144 -138
- data/doc/TaskJuggler/WebServer.html +46 -39
- data/doc/TaskJuggler/WelcomePage.html +769 -0
- data/doc/TaskJuggler/WorkingHours.html +185 -179
- data/doc/TaskJuggler/WorkingHoursAttribute.html +42 -36
- data/doc/TaskJuggler/XMLBlob.html +21 -15
- data/doc/TaskJuggler/XMLComment.html +17 -11
- data/doc/TaskJuggler/XMLDocument.html +33 -27
- data/doc/TaskJuggler/XMLElement.html +97 -91
- data/doc/TaskJuggler/XMLNamedText.html +13 -7
- data/doc/TaskJuggler/XMLText.html +32 -26
- data/doc/index.html +601 -563
- data/doc/lib/AccountScenario_rb.html +5 -3
- data/doc/lib/Account_rb.html +5 -3
- data/doc/lib/Allocation_rb.html +5 -3
- data/doc/lib/AppConfig_rb.html +5 -3
- data/doc/lib/AttributeBase_rb.html +5 -3
- data/doc/lib/AttributeDefinition_rb.html +5 -3
- data/doc/lib/Attributes_rb.html +5 -3
- data/doc/lib/BatchProcessor_rb.html +5 -3
- data/doc/lib/Booking_rb.html +5 -3
- data/doc/lib/ChargeSet_rb.html +5 -3
- data/doc/lib/Charge_rb.html +5 -3
- data/doc/lib/DataCache_rb.html +5 -3
- data/doc/lib/FileList_rb.html +5 -3
- data/doc/lib/HTMLDocument_rb.html +5 -3
- data/doc/lib/IntervalList_rb.html +69 -0
- data/doc/lib/Interval_rb.html +5 -3
- data/doc/lib/Journal_rb.html +5 -3
- data/doc/lib/KeywordArray_rb.html +5 -3
- data/doc/lib/KeywordDocumentation_rb.html +5 -3
- data/doc/lib/Limits_rb.html +5 -3
- data/doc/lib/LogFile_rb.html +5 -3
- data/doc/lib/Log_rb.html +5 -3
- data/doc/lib/LogicalExpression_rb.html +5 -3
- data/doc/lib/LogicalFunction_rb.html +5 -3
- data/doc/lib/LogicalOperation_rb.html +5 -3
- data/doc/lib/MacroTable_rb.html +5 -3
- data/doc/lib/MessageHandler_rb.html +5 -3
- data/doc/lib/ProjectFileParser_rb.html +5 -3
- data/doc/lib/ProjectFileScanner_rb.html +5 -3
- data/doc/lib/Project_rb.html +5 -3
- data/doc/lib/PropertyList_rb.html +5 -3
- data/doc/lib/PropertySet_rb.html +5 -3
- data/doc/lib/PropertyTreeNode_rb.html +5 -3
- data/doc/lib/Query_rb.html +5 -3
- data/doc/lib/RTFHandlers_rb.html +5 -3
- data/doc/lib/RTFNavigator_rb.html +5 -3
- data/doc/lib/RTFQuery_rb.html +5 -3
- data/doc/lib/RTFReportLink_rb.html +5 -3
- data/doc/lib/RTFReport_rb.html +5 -3
- data/doc/lib/RTFWithQuerySupport_rb.html +5 -3
- data/doc/lib/RealFormat_rb.html +5 -3
- data/doc/lib/ResourceScenario_rb.html +5 -3
- data/doc/lib/Resource_rb.html +5 -3
- data/doc/lib/RichTextDocument_rb.html +5 -3
- data/doc/lib/RichTextElement_rb.html +5 -3
- data/doc/lib/RichTextFunctionExample_rb.html +5 -3
- data/doc/lib/RichTextFunctionHandler_rb.html +5 -3
- data/doc/lib/RichTextParser_rb.html +5 -3
- data/doc/lib/RichTextScanner_rb.html +5 -3
- data/doc/lib/RichTextSnip_rb.html +5 -3
- data/doc/lib/RichTextSyntaxRules_rb.html +5 -3
- data/doc/lib/RichText_rb.html +5 -3
- data/doc/lib/RuntimeConfig_rb.html +5 -3
- data/doc/lib/ScenarioData_rb.html +5 -3
- data/doc/lib/Scenario_rb.html +5 -3
- data/doc/lib/Scoreboard_rb.html +7 -3
- data/doc/lib/SheetHandlerBase_rb.html +5 -3
- data/doc/lib/SheetReceiver_rb.html +5 -3
- data/doc/lib/SheetSender_rb.html +5 -3
- data/doc/lib/ShiftAssignments_rb.html +5 -3
- data/doc/lib/ShiftScenario_rb.html +5 -3
- data/doc/lib/Shift_rb.html +5 -3
- data/doc/lib/SimpleQueryExpander_rb.html +5 -3
- data/doc/lib/SourceFileInfo_rb.html +5 -3
- data/doc/lib/StatusSheetReceiver_rb.html +5 -3
- data/doc/lib/StatusSheetSender_rb.html +5 -3
- data/doc/lib/SyntaxReference_rb.html +5 -3
- data/doc/lib/TOCEntry_rb.html +5 -3
- data/doc/lib/TableColumnDefinition_rb.html +5 -3
- data/doc/lib/TableOfContents_rb.html +5 -3
- data/doc/lib/TaskDependency_rb.html +5 -3
- data/doc/lib/TaskJuggler_rb.html +5 -3
- data/doc/lib/TaskScenario_rb.html +5 -3
- data/doc/lib/Task_rb.html +5 -3
- data/doc/lib/TextFormatter_rb.html +6 -4
- data/doc/lib/TextParser/Pattern_rb.html +5 -3
- data/doc/lib/TextParser/Rule_rb.html +5 -3
- data/doc/lib/TextParser/StackElement_rb.html +5 -3
- data/doc/lib/TextParser/State_rb.html +6 -4
- data/doc/lib/TextParser/TokenDoc_rb.html +5 -3
- data/doc/lib/TextParser_rb.html +5 -3
- data/doc/lib/TextScanner_rb.html +5 -3
- data/doc/lib/TimeSheetReceiver_rb.html +5 -3
- data/doc/lib/TimeSheetSender_rb.html +5 -3
- data/doc/lib/TimeSheetSummary_rb.html +6 -4
- data/doc/lib/TimeSheets_rb.html +5 -3
- data/doc/lib/Tj3AppBase_rb.html +5 -3
- data/doc/lib/Tj3Config_rb.html +5 -3
- data/doc/lib/Tj3SheetAppBase_rb.html +5 -3
- data/doc/lib/TjException_rb.html +5 -3
- data/doc/lib/TjTime_rb.html +5 -3
- data/doc/lib/TjpExample_rb.html +5 -3
- data/doc/lib/TjpSyntaxRules_rb.html +5 -3
- data/doc/lib/URLParameter_rb.html +5 -3
- data/doc/lib/UTF8String_rb.html +5 -3
- data/doc/lib/UserManual_rb.html +5 -3
- data/doc/lib/VimSyntax_rb.html +6 -4
- data/doc/lib/WorkingHours_rb.html +5 -3
- data/doc/lib/XMLDocument_rb.html +5 -3
- data/doc/lib/XMLElement_rb.html +5 -3
- data/doc/lib/daemon/Daemon_rb.html +5 -3
- data/doc/lib/daemon/ProcessIntercom_rb.html +7 -3
- data/doc/lib/daemon/ProjectBroker_rb.html +5 -3
- data/doc/lib/daemon/ProjectServer_rb.html +5 -3
- data/doc/lib/daemon/ReportServer_rb.html +5 -3
- data/doc/lib/daemon/ReportServlet_rb.html +69 -0
- data/doc/lib/daemon/WebServer_rb.html +9 -3
- data/doc/lib/daemon/WelcomePage_rb.html +71 -0
- data/doc/lib/deep_copy_rb.html +5 -3
- data/doc/lib/reports/CSVFile_rb.html +5 -3
- data/doc/lib/reports/CollisionDetector_rb.html +5 -3
- data/doc/lib/reports/ColumnTable_rb.html +5 -3
- data/doc/lib/reports/GanttChart_rb.html +5 -3
- data/doc/lib/reports/GanttContainer_rb.html +5 -3
- data/doc/lib/reports/GanttHeaderScaleItem_rb.html +5 -3
- data/doc/lib/reports/GanttHeader_rb.html +5 -3
- data/doc/lib/reports/GanttLine_rb.html +5 -3
- data/doc/lib/reports/GanttLoadStack_rb.html +5 -3
- data/doc/lib/reports/GanttMilestone_rb.html +5 -3
- data/doc/lib/reports/GanttRouter_rb.html +5 -3
- data/doc/lib/reports/GanttTaskBar_rb.html +5 -3
- data/doc/lib/reports/HTMLGraphics_rb.html +5 -3
- data/doc/lib/reports/Navigator_rb.html +5 -3
- data/doc/lib/reports/NikuReport_rb.html +5 -3
- data/doc/lib/reports/ReportBase_rb.html +5 -3
- data/doc/lib/reports/ReportContext_rb.html +5 -3
- data/doc/lib/reports/ReportTableCell_rb.html +5 -3
- data/doc/lib/reports/ReportTableColumn_rb.html +5 -3
- data/doc/lib/reports/ReportTableLegend_rb.html +5 -3
- data/doc/lib/reports/ReportTableLine_rb.html +5 -3
- data/doc/lib/reports/ReportTable_rb.html +5 -3
- data/doc/lib/reports/Report_rb.html +5 -3
- data/doc/lib/reports/ResourceListRE_rb.html +5 -3
- data/doc/lib/reports/StatusSheetReport_rb.html +5 -3
- data/doc/lib/reports/TableReport_rb.html +5 -3
- data/doc/lib/reports/TaskListRE_rb.html +5 -3
- data/doc/lib/reports/TextReport_rb.html +5 -3
- data/doc/lib/reports/TimeSheetReport_rb.html +5 -3
- data/doc/lib/reports/TjpExportRE_rb.html +5 -3
- data/doc/lib/{taskjuggler3_rb.html → tj3_rb.html} +7 -5
- data/doc/lib/tj3client_rb.html +5 -3
- data/doc/lib/tj3d_rb.html +6 -4
- data/doc/lib/tj3man_rb.html +5 -3
- data/doc/lib/tj3ss_receiver_rb.html +5 -3
- data/doc/lib/tj3ss_sender_rb.html +5 -3
- data/doc/lib/tj3ts_receiver_rb.html +5 -3
- data/doc/lib/tj3ts_sender_rb.html +5 -3
- data/doc/lib/tj3ts_summary_rb.html +5 -3
- data/examples/tutorial.tjp +13 -5
- data/gem_spec.rb +3 -0
- data/lib/Account.rb +2 -1
- data/lib/AccountScenario.rb +2 -1
- data/lib/Allocation.rb +2 -1
- data/lib/AppConfig.rb +2 -1
- data/lib/AttributeBase.rb +19 -5
- data/lib/AttributeDefinition.rb +2 -1
- data/lib/Attributes.rb +49 -38
- data/lib/BatchProcessor.rb +2 -1
- data/lib/Booking.rb +2 -1
- data/lib/Charge.rb +2 -1
- data/lib/ChargeSet.rb +2 -1
- data/lib/DataCache.rb +15 -1
- data/lib/FileList.rb +2 -1
- data/lib/HTMLDocument.rb +2 -1
- data/lib/Interval.rb +2 -1
- data/lib/IntervalList.rb +100 -0
- data/lib/Journal.rb +8 -2
- data/lib/KeywordArray.rb +2 -1
- data/lib/KeywordDocumentation.rb +10 -6
- data/lib/Limits.rb +2 -1
- data/lib/Log.rb +3 -2
- data/lib/LogFile.rb +2 -1
- data/lib/LogicalExpression.rb +2 -1
- data/lib/LogicalFunction.rb +2 -1
- data/lib/LogicalOperation.rb +2 -1
- data/lib/MacroTable.rb +2 -1
- data/lib/MessageHandler.rb +2 -1
- data/lib/Project.rb +92 -25
- data/lib/ProjectFileParser.rb +7 -2
- data/lib/ProjectFileScanner.rb +2 -1
- data/lib/PropertyList.rb +2 -1
- data/lib/PropertySet.rb +2 -6
- data/lib/PropertyTreeNode.rb +22 -44
- data/lib/Query.rb +32 -13
- data/lib/RTFHandlers.rb +2 -1
- data/lib/RTFNavigator.rb +2 -1
- data/lib/RTFQuery.rb +3 -2
- data/lib/RTFReport.rb +2 -1
- data/lib/RTFReportLink.rb +2 -1
- data/lib/RTFWithQuerySupport.rb +2 -1
- data/lib/RealFormat.rb +2 -1
- data/lib/Resource.rb +2 -1
- data/lib/ResourceScenario.rb +35 -14
- data/lib/RichText.rb +2 -1
- data/lib/RichTextDocument.rb +2 -1
- data/lib/RichTextElement.rb +2 -1
- data/lib/RichTextFunctionExample.rb +2 -1
- data/lib/RichTextFunctionHandler.rb +2 -1
- data/lib/RichTextParser.rb +2 -1
- data/lib/RichTextScanner.rb +2 -1
- data/lib/RichTextSnip.rb +2 -1
- data/lib/RichTextSyntaxRules.rb +2 -1
- data/lib/RuntimeConfig.rb +2 -1
- data/lib/Scenario.rb +2 -1
- data/lib/ScenarioData.rb +2 -1
- data/lib/Scoreboard.rb +27 -8
- data/lib/SheetHandlerBase.rb +2 -1
- data/lib/SheetReceiver.rb +2 -1
- data/lib/SheetSender.rb +2 -1
- data/lib/Shift.rb +2 -1
- data/lib/ShiftAssignments.rb +2 -1
- data/lib/ShiftScenario.rb +2 -1
- data/lib/SimpleQueryExpander.rb +2 -1
- data/lib/SourceFileInfo.rb +2 -1
- data/lib/StatusSheetReceiver.rb +2 -1
- data/lib/StatusSheetSender.rb +2 -1
- data/lib/SyntaxReference.rb +2 -1
- data/lib/TOCEntry.rb +2 -1
- data/lib/TableColumnDefinition.rb +9 -2
- data/lib/TableOfContents.rb +2 -1
- data/lib/Task.rb +2 -1
- data/lib/TaskDependency.rb +2 -1
- data/lib/TaskJuggler.rb +8 -6
- data/lib/TaskScenario.rb +337 -153
- data/lib/TextFormatter.rb +3 -2
- data/lib/TextParser.rb +7 -2
- data/lib/TextParser/Pattern.rb +2 -1
- data/lib/TextParser/Rule.rb +2 -1
- data/lib/TextParser/StackElement.rb +2 -1
- data/lib/TextParser/State.rb +3 -2
- data/lib/TextParser/TokenDoc.rb +2 -1
- data/lib/TextScanner.rb +12 -5
- data/lib/TimeSheetReceiver.rb +2 -1
- data/lib/TimeSheetSender.rb +2 -1
- data/lib/TimeSheetSummary.rb +3 -2
- data/lib/TimeSheets.rb +2 -1
- data/lib/Tj3AppBase.rb +6 -5
- data/lib/Tj3Config.rb +5 -4
- data/lib/Tj3SheetAppBase.rb +2 -1
- data/lib/TjException.rb +2 -1
- data/lib/TjTime.rb +2 -1
- data/lib/TjpExample.rb +2 -1
- data/lib/TjpSyntaxRules.rb +264 -65
- data/lib/URLParameter.rb +2 -1
- data/lib/UTF8String.rb +2 -1
- data/lib/UserManual.rb +2 -1
- data/lib/VimSyntax.rb +3 -2
- data/lib/WorkingHours.rb +2 -1
- data/lib/XMLDocument.rb +2 -1
- data/lib/XMLElement.rb +2 -1
- data/lib/daemon/Daemon.rb +3 -1
- data/lib/daemon/ProcessIntercom.rb +3 -1
- data/lib/daemon/ProjectBroker.rb +84 -32
- data/lib/daemon/ProjectServer.rb +5 -3
- data/lib/daemon/ReportServer.rb +8 -5
- data/lib/daemon/ReportServlet.rb +166 -0
- data/lib/daemon/WebServer.rb +6 -150
- data/lib/daemon/WelcomePage.rb +80 -0
- data/lib/deep_copy.rb +2 -1
- data/lib/reports/CSVFile.rb +2 -1
- data/lib/reports/CollisionDetector.rb +2 -1
- data/lib/reports/ColumnTable.rb +2 -1
- data/lib/reports/GanttChart.rb +2 -1
- data/lib/reports/GanttContainer.rb +3 -4
- data/lib/reports/GanttHeader.rb +2 -1
- data/lib/reports/GanttHeaderScaleItem.rb +2 -1
- data/lib/reports/GanttLine.rb +12 -10
- data/lib/reports/GanttLoadStack.rb +2 -1
- data/lib/reports/GanttMilestone.rb +3 -3
- data/lib/reports/GanttRouter.rb +4 -1
- data/lib/reports/GanttTaskBar.rb +9 -7
- data/lib/reports/HTMLGraphics.rb +2 -1
- data/lib/reports/Navigator.rb +2 -1
- data/lib/reports/NikuReport.rb +79 -49
- data/lib/reports/Report.rb +42 -10
- data/lib/reports/ReportBase.rb +2 -1
- data/lib/reports/ReportContext.rb +2 -1
- data/lib/reports/ReportTable.rb +2 -1
- data/lib/reports/ReportTableCell.rb +63 -28
- data/lib/reports/ReportTableColumn.rb +2 -1
- data/lib/reports/ReportTableLegend.rb +5 -5
- data/lib/reports/ReportTableLine.rb +2 -1
- data/lib/reports/ResourceListRE.rb +2 -1
- data/lib/reports/StatusSheetReport.rb +4 -2
- data/lib/reports/TableReport.rb +42 -38
- data/lib/reports/TaskListRE.rb +4 -2
- data/lib/reports/TextReport.rb +2 -1
- data/lib/reports/TimeSheetReport.rb +4 -2
- data/lib/reports/TjpExportRE.rb +4 -2
- data/lib/{taskjuggler3.rb → tj3.rb} +6 -5
- data/lib/tj3client.rb +19 -36
- data/lib/tj3d.rb +6 -2
- data/lib/tj3man.rb +4 -3
- data/lib/tj3ss_receiver.rb +2 -1
- data/lib/tj3ss_sender.rb +2 -1
- data/lib/tj3ts_receiver.rb +2 -1
- data/lib/tj3ts_sender.rb +2 -1
- data/lib/tj3ts_summary.rb +2 -1
- data/manual/Day_To_Day_Juggling +36 -0
- data/manual/How_To_Contribute +9 -4
- data/manual/Installation +10 -3
- data/manual/TaskJuggler_Internals +0 -2
- data/manual/Tutorial +25 -3
- data/prj_cfg.rb +4 -2
- data/spec/IntervalList_spec.rb +138 -0
- data/spec/ProjectBroker_spec.rb +133 -0
- data/tasks/changelog.rake +41 -24
- data/tasks/csts.rake +1 -0
- data/tasks/gem.rake +1 -0
- data/tasks/rcov.rake +1 -1
- data/tasks/spec.rake +7 -0
- data/tasks/test.rake +1 -0
- data/test/MessageChecker.rb +2 -1
- data/test/TestSuite/CSV-Reports/niku.tjp +70 -0
- data/test/TestSuite/CSV-Reports/{celltext-Reference.csv → refs/celltext.csv} +0 -0
- data/test/TestSuite/CSV-Reports/refs/niku.csv +5 -0
- data/test/TestSuite/CSV-Reports/{resourcereport-Reference.csv → refs/resourcereport.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{resourcereport_with_tasks-Reference.csv → refs/resourcereport_with_tasks.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{sortByTree-Reference.csv → refs/sortByTree.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{sortBy_duration.down-Reference.csv → refs/sortBy_duration.down.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{sortBy_effort.up-Reference.csv → refs/sortBy_effort.up.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{sortBy_plan.start.down-Reference.csv → refs/sortBy_plan.start.down.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{taskreport-Reference.csv → refs/taskreport.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{taskreport_with_resources-Reference.csv → refs/taskreport_with_resources.csv} +0 -0
- data/test/TestSuite/CSV-Reports/{weekly-Reference.csv → refs/weekly.csv} +0 -0
- data/test/TestSuite/HTML-Reports/Alerts.tjp +12 -0
- data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
- data/test/TestSuite/Scheduler/Correct/Container-2.tjp +1 -2
- data/test/TestSuite/Scheduler/Correct/InheritedAttributes.tjp +77 -0
- data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +40 -0
- data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +2 -2
- data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +3 -4
- data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +2 -2
- data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +8 -7
- data/test/TestSuite/Scheduler/Errors/onend_wrong_direction.tjp +19 -0
- data/test/TestSuite/Scheduler/Errors/onstart_wrong_direction.tjp +18 -0
- data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +1 -2
- data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/boss_2002-03-02.tji +46 -0
- data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/dev2_2002-03-02.tji +22 -0
- data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/resources.yml +11 -0
- data/test/TestSuite/StatusSheets/StatusSheetTemplates/acceptable_intervals +1 -0
- data/test/TestSuite/StatusSheets/sender.log +256 -0
- data/test/TestSuite/StatusSheets/statussheets.log +9 -0
- data/test/TestSuite/StatusSheets/tj3d.log +395 -0
- data/test/TestSuite/Syntax/Correct/Limits-1.tjp +2 -0
- data/test/TestSuite/Syntax/Correct/Niku.tjp +6 -1
- data/test/TestSuite/Syntax/Correct/Scenario.tjp +4 -1
- data/test/TestSuite/Syntax/Correct/Supplement.tjp +12 -5
- data/test/TestSuite/Syntax/Correct/TaskPrefix.tji +3 -0
- data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +24 -0
- data/test/TestSuite/Syntax/Correct/css/tjreport.css +7 -2
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +15 -5
- data/test/all.rb +2 -4
- data/test/test_BatchProcessor.rb +2 -1
- data/test/test_CSV-Reports.rb +34 -23
- data/test/test_CSVFile.rb +2 -1
- data/test/test_CollisionDetector.rb +3 -2
- data/test/test_Journal.rb +2 -1
- data/test/test_Limits.rb +2 -1
- data/test/test_LogicalExpression.rb +2 -1
- data/test/test_MacroTable.rb +2 -1
- data/test/test_Project.rb +3 -2
- data/test/test_ProjectFileScanner.rb +2 -1
- data/test/test_PropertySet.rb +2 -1
- data/test/test_Query.rb +2 -1
- data/test/test_RealFormat.rb +2 -1
- data/test/test_ReportGenerator.rb +2 -1
- data/test/test_RichText.rb +2 -1
- data/test/test_Scheduler.rb +2 -1
- data/test/test_ShiftAssignments.rb +2 -1
- data/test/test_SimpleQueryExpander.rb +2 -1
- data/test/test_Syntax.rb +2 -1
- data/test/test_TextFormatter.rb +3 -2
- data/test/test_TjTime.rb +2 -1
- data/test/test_TjpExample.rb +2 -1
- data/test/test_URLParameter.rb +2 -1
- data/test/test_UTF8String.rb +2 -1
- data/test/test_WorkingHours.rb +2 -1
- data/test/test_deep_copy.rb +2 -1
- metadata +74 -20
- data/doc/StringIO.html +0 -595
- data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +0 -46
- data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +0 -51
- data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +0 -11
data/lib/RichTextElement.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextElement.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextFunctionExample.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextFunctionHandler.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/RichTextParser.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextParser.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/RichTextScanner.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextScanner.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/RichTextSnip.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextSnip.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/RichTextSyntaxRules.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RichTextSyntaxRules.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/RuntimeConfig.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = RuntimeConfig.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/Scenario.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Scenario.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/ScenarioData.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = ScenarioData.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/Scoreboard.rb
CHANGED
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Scoreboard.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
10
11
|
# published by the Free Software Foundation.
|
|
11
12
|
#
|
|
12
13
|
|
|
14
|
+
require 'IntervalList'
|
|
15
|
+
|
|
13
16
|
class TaskJuggler
|
|
14
17
|
|
|
15
18
|
# Scoreboard objects are instrumental during the scheduling process. The
|
|
@@ -106,19 +109,30 @@ class TaskJuggler
|
|
|
106
109
|
# Return a list of intervals that describe a contiguous part of the
|
|
107
110
|
# scoreboard that contains only the values that yield true for the passed
|
|
108
111
|
# block. The intervals must be within the interval described by _iv_ and
|
|
109
|
-
# must be at least _minDuration_ long. The return value is an
|
|
110
|
-
#
|
|
112
|
+
# must be at least _minDuration_ long. The return value is an
|
|
113
|
+
# IntervalList.
|
|
111
114
|
def collectIntervals(iv, minDuration)
|
|
112
|
-
# Determine the start and stop index for the scoreboard search.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
# Determine the start and stop index for the scoreboard search. We save
|
|
116
|
+
# the original values for later use as well.
|
|
117
|
+
startIdx = sIdx = dateToIdx(iv.start, true)
|
|
118
|
+
endIdx = eIdx = dateToIdx(iv.end, true)
|
|
115
119
|
|
|
116
120
|
# Convert the minDuration into number of slots.
|
|
117
121
|
minDuration /= @resolution
|
|
118
122
|
minDuration = 1 if minDuration <= 0
|
|
119
123
|
|
|
124
|
+
# Expand the interval with the minDuration to both sides. This will
|
|
125
|
+
# reduce the failure to detect intervals at the iv boundary. However,
|
|
126
|
+
# this will not prevent undetected intervals at the project time frame
|
|
127
|
+
# boundaries.
|
|
128
|
+
startIdx -= minDuration
|
|
129
|
+
startIdx = 0 if startIdx < 0
|
|
130
|
+
endIdx += minDuration
|
|
131
|
+
endIdx = @size - 1 if endIdx > @size - 1
|
|
132
|
+
|
|
120
133
|
# This is collects the resulting intervals.
|
|
121
|
-
intervals =
|
|
134
|
+
intervals = IntervalList.new
|
|
135
|
+
|
|
122
136
|
# The duration counter for the currently analyzed interval and the start
|
|
123
137
|
# index.
|
|
124
138
|
duration = start = 0
|
|
@@ -135,7 +149,12 @@ class TaskJuggler
|
|
|
135
149
|
# interval.
|
|
136
150
|
if duration > 0
|
|
137
151
|
if duration >= minDuration
|
|
138
|
-
intervals
|
|
152
|
+
# Make sure that all intervals are within the originally
|
|
153
|
+
# requested Interval.
|
|
154
|
+
start = sIdx if start < sIdx
|
|
155
|
+
idx = eIdx if idx > eIdx
|
|
156
|
+
|
|
157
|
+
intervals << Interval.new(idxToDate(start), idxToDate(idx))
|
|
139
158
|
end
|
|
140
159
|
duration = start = 0
|
|
141
160
|
end
|
data/lib/SheetHandlerBase.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SheetHandlerBase.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/SheetReceiver.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SheetReceiver.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/SheetSender.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SheetSender.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/Shift.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Shift.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/ShiftAssignments.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = ShiftAssignments.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/ShiftScenario.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = ShiftScenario.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/SimpleQueryExpander.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SimpleQueryExpander.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/SourceFileInfo.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SourceFileInfo.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/StatusSheetReceiver.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = StatusSheetReceiver.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/StatusSheetSender.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = StatusSheetSender.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/SyntaxReference.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = SyntaxReference.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/TOCEntry.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TOCEntry.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TableColumnDefinition.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -58,7 +59,8 @@ class TaskJuggler
|
|
|
58
59
|
class TableColumnDefinition
|
|
59
60
|
|
|
60
61
|
attr_reader :id, :cellText, :tooltip, :hAlign, :cellColor, :fontColor
|
|
61
|
-
attr_accessor :title, :start, :end, :scale, :
|
|
62
|
+
attr_accessor :title, :start, :end, :scale, :listType, :listMode,
|
|
63
|
+
:width, :content, :column
|
|
62
64
|
|
|
63
65
|
def initialize(id, title)
|
|
64
66
|
# The column ID. It must be unique within the report.
|
|
@@ -86,6 +88,11 @@ class TaskJuggler
|
|
|
86
88
|
# An alternative font color for the cell. The format is equivalent to
|
|
87
89
|
# the @cellColor setting.
|
|
88
90
|
@fontColor = CellSettingPatternList.new
|
|
91
|
+
# Specifies whether list items are comma separated, bullet or numbered
|
|
92
|
+
# list.
|
|
93
|
+
@listType = nil
|
|
94
|
+
# Specifies how the list entries look like.
|
|
95
|
+
@listMode = nil
|
|
89
96
|
# The scale attribute is only used for Gantt chart columns. It specifies
|
|
90
97
|
# the minimum resolution of the chart.
|
|
91
98
|
@scale = 'week'
|
data/lib/TableOfContents.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TableOfContents.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/Task.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = Task.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/TaskDependency.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TaskDependency.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
data/lib/TaskJuggler.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TaskJuggler.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -166,13 +167,14 @@ class TaskJuggler
|
|
|
166
167
|
|
|
167
168
|
# Generate the report with the ID _reportId_. If _regExpMode_ is true,
|
|
168
169
|
# _reportId_ is interpreted as a Regular Expression and all reports with
|
|
169
|
-
# matching IDs are generated.
|
|
170
|
-
#
|
|
171
|
-
#
|
|
172
|
-
|
|
170
|
+
# matching IDs are generated. _formats_ is a list of formats (e. g. :html,
|
|
171
|
+
# :csv, etc.). _dynamicAtributes_ is a String that may contain attributes to
|
|
172
|
+
# supplement the report definition. The String must be in TJP format and may
|
|
173
|
+
# be nil if no additional attributes are provided.
|
|
174
|
+
def generateReport(reportId, regExpMode, formats, dynamicAttributes = nil)
|
|
173
175
|
begin
|
|
174
176
|
Log.enter('generateReport', 'Generating report #{reportId} ...')
|
|
175
|
-
@project.generateReport(reportId, regExpMode, dynamicAttributes)
|
|
177
|
+
@project.generateReport(reportId, regExpMode, formats, dynamicAttributes)
|
|
176
178
|
rescue TjException => msg
|
|
177
179
|
if msg.message && !msg.message.empty?
|
|
178
180
|
@messageHandler.critical('generate_report', msg.message)
|
data/lib/TaskScenario.rb
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = TaskScenario.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011
|
|
7
|
+
# by Chris Schlaeger <chris@linux.com>
|
|
7
8
|
#
|
|
8
9
|
# This program is free software; you can redistribute it and/or modify
|
|
9
10
|
# it under the terms of version 2 of the GNU General Public License as
|
|
@@ -187,7 +188,8 @@ class TaskJuggler
|
|
|
187
188
|
# If an effort has been specified resources must be allocated as well.
|
|
188
189
|
if a('effort') > 0 && a('allocate').empty?
|
|
189
190
|
error('effort_no_allocations',
|
|
190
|
-
"Task #{@property.fullId} has an effort but no
|
|
191
|
+
"Task #{@property.fullId} has an effort but no resource " +
|
|
192
|
+
"allocations.")
|
|
191
193
|
end
|
|
192
194
|
|
|
193
195
|
durationSpecs = 0
|
|
@@ -320,6 +322,19 @@ class TaskJuggler
|
|
|
320
322
|
'certain attributes like \'end\' or \'precedes\' automatically ' +
|
|
321
323
|
'switch the task to ALAP mode.')
|
|
322
324
|
end
|
|
325
|
+
|
|
326
|
+
a('startsuccs').each do |task, onEnd|
|
|
327
|
+
unless task['forward', @scenarioIdx]
|
|
328
|
+
task.error(@scenarioIdx, 'onstart_wrong_direction',
|
|
329
|
+
'Tasks with on-start dependencies must be ASAP scheduled')
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
a('endpreds').each do |task, onEnd|
|
|
333
|
+
if task['forward', @scenarioIdx]
|
|
334
|
+
task.error(@scenarioIdx, 'onend_wrong_direction',
|
|
335
|
+
'Tasks with on-end dependencies must be ALAP scheduled')
|
|
336
|
+
end
|
|
337
|
+
end
|
|
323
338
|
end
|
|
324
339
|
|
|
325
340
|
# When the actual scheduling process has been completed, this function must
|
|
@@ -521,7 +536,7 @@ class TaskJuggler
|
|
|
521
536
|
"end date.")
|
|
522
537
|
end
|
|
523
538
|
|
|
524
|
-
if a('fail') || a('warn')
|
|
539
|
+
if !a('fail').empty? || !a('warn').empty?
|
|
525
540
|
queryAttrs = { 'project' => @project,
|
|
526
541
|
'scenarioIdx' => @scenarioIdx,
|
|
527
542
|
'property' => @property,
|
|
@@ -533,18 +548,22 @@ class TaskJuggler
|
|
|
533
548
|
'timeFormat' => @project['timeFormat'],
|
|
534
549
|
'currencyFormat' => @project['currencyFormat'] }
|
|
535
550
|
query = Query.new(queryAttrs)
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
551
|
+
a('fail').each do |expr|
|
|
552
|
+
if expr.eval(query)
|
|
553
|
+
error('task_fail_check',
|
|
554
|
+
"User defined check failed for task #{@property.fullId} \n" +
|
|
555
|
+
"Condition: #{expr.to_s}\n" +
|
|
556
|
+
"Result: #{expr.to_s(query)}")
|
|
557
|
+
end
|
|
541
558
|
end
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
559
|
+
a('warn').each do |expr|
|
|
560
|
+
if expr.eval(query)
|
|
561
|
+
warning('task_warn_check',
|
|
562
|
+
"User defined warning triggered for task " +
|
|
563
|
+
"#{@property.fullId} \n" +
|
|
564
|
+
"Condition: #{expr.to_s}\n" +
|
|
565
|
+
"Result: #{expr.to_s(query)}")
|
|
566
|
+
end
|
|
548
567
|
end
|
|
549
568
|
end
|
|
550
569
|
|
|
@@ -555,7 +574,18 @@ class TaskJuggler
|
|
|
555
574
|
@deadEndFlags = Array.new(4, false)
|
|
556
575
|
end
|
|
557
576
|
|
|
558
|
-
|
|
577
|
+
# To ensure that we can properly schedule the project, we need to make
|
|
578
|
+
# sure that it does not contain any circular dependencies. This method
|
|
579
|
+
# recursively checks for such loops by remembering the _path_. Each entry
|
|
580
|
+
# is marks the start or end of a task. _atEnd_ specifies whether we are
|
|
581
|
+
# currently at the start or end of the task. _fromOutside_ specifies
|
|
582
|
+
# whether we are coming from a inside or outside that tasks. See
|
|
583
|
+
# specification below. _forward_ specifies whether we are checking the
|
|
584
|
+
# dependencies from start to end or in the opposite direction. If we are
|
|
585
|
+
# moving forward, we only move from start to end of ASAP tasks, not ALAP
|
|
586
|
+
# tasks and vice versa. For milestones, we ignore the scheduling
|
|
587
|
+
# direction.
|
|
588
|
+
def checkForLoops(path, atEnd, fromOutside, forward)
|
|
559
589
|
# Check if we have been here before on this path.
|
|
560
590
|
if path.include?([ @property, atEnd ])
|
|
561
591
|
warning('loop_detected',
|
|
@@ -618,7 +648,7 @@ class TaskJuggler
|
|
|
618
648
|
# V
|
|
619
649
|
#
|
|
620
650
|
@property.children.each do |child|
|
|
621
|
-
child.checkForLoops(@scenarioIdx, path, false, true)
|
|
651
|
+
child.checkForLoops(@scenarioIdx, path, false, true, forward)
|
|
622
652
|
end
|
|
623
653
|
else
|
|
624
654
|
# |
|
|
@@ -627,7 +657,9 @@ class TaskJuggler
|
|
|
627
657
|
# -->| o---->
|
|
628
658
|
# +--------
|
|
629
659
|
#
|
|
630
|
-
|
|
660
|
+
if (forward && a('forward')) || a('milestone')
|
|
661
|
+
checkForLoops(path, true, false, true)
|
|
662
|
+
end
|
|
631
663
|
end
|
|
632
664
|
else
|
|
633
665
|
if a('startpreds').empty?
|
|
@@ -641,7 +673,8 @@ class TaskJuggler
|
|
|
641
673
|
# |
|
|
642
674
|
#
|
|
643
675
|
if @property.parent
|
|
644
|
-
@property.parent.checkForLoops(@scenarioIdx, path, false, false
|
|
676
|
+
@property.parent.checkForLoops(@scenarioIdx, path, false, false,
|
|
677
|
+
forward)
|
|
645
678
|
end
|
|
646
679
|
else
|
|
647
680
|
|
|
@@ -652,7 +685,7 @@ class TaskJuggler
|
|
|
652
685
|
# |
|
|
653
686
|
#
|
|
654
687
|
a('startpreds').each do |task, targetEnd|
|
|
655
|
-
task.checkForLoops(@scenarioIdx, path, targetEnd, true)
|
|
688
|
+
task.checkForLoops(@scenarioIdx, path, targetEnd, true, forward)
|
|
656
689
|
end
|
|
657
690
|
end
|
|
658
691
|
end
|
|
@@ -669,7 +702,7 @@ class TaskJuggler
|
|
|
669
702
|
# v
|
|
670
703
|
#
|
|
671
704
|
@property.children.each do |child|
|
|
672
|
-
child.checkForLoops(@scenarioIdx, path, true, true)
|
|
705
|
+
child.checkForLoops(@scenarioIdx, path, true, true, forward)
|
|
673
706
|
end
|
|
674
707
|
else
|
|
675
708
|
# |
|
|
@@ -678,7 +711,9 @@ class TaskJuggler
|
|
|
678
711
|
# <----o |<--
|
|
679
712
|
# --------+
|
|
680
713
|
#
|
|
681
|
-
|
|
714
|
+
if (!forward && !a('forward')) || a('milestone')
|
|
715
|
+
checkForLoops(path, false, false, false)
|
|
716
|
+
end
|
|
682
717
|
end
|
|
683
718
|
else
|
|
684
719
|
if a('endsuccs').empty?
|
|
@@ -692,7 +727,8 @@ class TaskJuggler
|
|
|
692
727
|
# |
|
|
693
728
|
#
|
|
694
729
|
if @property.parent
|
|
695
|
-
@property.parent.checkForLoops(@scenarioIdx, path, true, false
|
|
730
|
+
@property.parent.checkForLoops(@scenarioIdx, path, true, false,
|
|
731
|
+
forward)
|
|
696
732
|
end
|
|
697
733
|
else
|
|
698
734
|
# --------+
|
|
@@ -702,7 +738,7 @@ class TaskJuggler
|
|
|
702
738
|
# |
|
|
703
739
|
#
|
|
704
740
|
a('endsuccs').each do |task, targetEnd|
|
|
705
|
-
task.checkForLoops(@scenarioIdx, path, targetEnd, true)
|
|
741
|
+
task.checkForLoops(@scenarioIdx, path, targetEnd, true, forward)
|
|
706
742
|
end
|
|
707
743
|
end
|
|
708
744
|
end
|
|
@@ -896,7 +932,10 @@ class TaskJuggler
|
|
|
896
932
|
|
|
897
933
|
# For leaf tasks, propagate start may set the date. Container task dates
|
|
898
934
|
# are only set in scheduleContainer().
|
|
899
|
-
|
|
935
|
+
if @property.leaf?
|
|
936
|
+
@property[thisEnd, @scenarioIdx] = date
|
|
937
|
+
Log << "Task #{@property.fullId}: #{a('start')} -> #{a('end')}"
|
|
938
|
+
end
|
|
900
939
|
|
|
901
940
|
if a('milestone')
|
|
902
941
|
# Start and end date of a milestone are identical.
|
|
@@ -911,12 +950,20 @@ class TaskJuggler
|
|
|
911
950
|
@property['scheduled', @scenarioIdx] = true
|
|
912
951
|
end
|
|
913
952
|
|
|
914
|
-
# Propagate date to all dependent tasks.
|
|
915
|
-
|
|
916
|
-
|
|
953
|
+
# Propagate date to all dependent tasks. Don't do this for start
|
|
954
|
+
# successors or end predecessors if this task is effort based. In this
|
|
955
|
+
# case, the date might still change to align with the first/last
|
|
956
|
+
# allocation. In these cases, bookResoruce() has to propagate the final
|
|
957
|
+
# date.
|
|
958
|
+
unless atEnd && a('effort') > 0
|
|
959
|
+
a(thisEnd + 'preds').each do |task, onEnd|
|
|
960
|
+
propagateDateToDep(task, onEnd)
|
|
961
|
+
end
|
|
917
962
|
end
|
|
918
|
-
a(
|
|
919
|
-
|
|
963
|
+
unless !atEnd && a('effort') > 0
|
|
964
|
+
a(thisEnd + 'succs').each do |task, onEnd|
|
|
965
|
+
propagateDateToDep(task, onEnd)
|
|
966
|
+
end
|
|
920
967
|
end
|
|
921
968
|
|
|
922
969
|
# Propagate date to sub tasks which have only an implicit
|
|
@@ -939,52 +986,42 @@ class TaskJuggler
|
|
|
939
986
|
def canInheritDate?(atEnd)
|
|
940
987
|
# Inheriting a start or end date from the enclosing task or the project
|
|
941
988
|
# is allowed for the following scenarios:
|
|
942
|
-
# - --> -
|
|
943
|
-
#
|
|
944
|
-
# -
|
|
989
|
+
# - --> - inhS*1 - <-- - inhE*1
|
|
990
|
+
# - --> | inhS | <-- - inhE
|
|
991
|
+
# - x-> - inhS - <-x - inhE
|
|
992
|
+
# - x-> | inhS | <-x - inhE
|
|
993
|
+
# - x-> -D inhS -D <-x - inhE
|
|
994
|
+
# - x-> |D inhS |D <-x - inhE
|
|
995
|
+
# - --> -D inhS -D <-- - inhE
|
|
996
|
+
# - --> |D inhS |D <-- - inhE
|
|
997
|
+
# - <-- | inhS | --> - inhE
|
|
945
998
|
#
|
|
946
|
-
#
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
#
|
|
950
|
-
#
|
|
951
|
-
|
|
952
|
-
# - --> |D inhS
|
|
953
|
-
# - <-- | inhS
|
|
954
|
-
# | --> - inhE
|
|
955
|
-
# | <-x - inhE
|
|
956
|
-
# |D <-x - inhE
|
|
957
|
-
# - <-x - inhE
|
|
958
|
-
# -D <-x - inhE
|
|
959
|
-
# | <-- - inhE
|
|
960
|
-
# |D <-- - inhE
|
|
961
|
-
# -D <-- - inhE
|
|
962
|
-
# Return false if we already have a date or if we have a dependency for
|
|
963
|
-
# this end.
|
|
964
|
-
thisEnd = atEnd ? 'end' : 'start'
|
|
965
|
-
hasThisDeps = !a(thisEnd + 'preds').empty? || !a(thisEnd + 'succs').empty?
|
|
966
|
-
hasThisSpec = a(thisEnd) || hasThisDeps
|
|
967
|
-
return false if hasThisSpec
|
|
999
|
+
# *1 when no bookings but allocations are present
|
|
1000
|
+
|
|
1001
|
+
thisEnd, thatEnd = atEnd ? [ 'end', 'start' ] : [ 'start', 'end' ]
|
|
1002
|
+
# Return false if we already have a date for this end or if we have a
|
|
1003
|
+
# strong dependency for this end.
|
|
1004
|
+
return false if a(thisEnd) || hasStrongDeps(thisEnd)
|
|
968
1005
|
|
|
969
|
-
# Containter task can inherit the date if they have no dependencies
|
|
1006
|
+
# Containter task can inherit the date if they have no dependencies at
|
|
1007
|
+
# this end.
|
|
970
1008
|
return true if @property.container?
|
|
971
1009
|
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
hasThatSpec = a(thatEnd) || hasThatDeps
|
|
1010
|
+
hasThatSpec = a(thatEnd) || hasStrongDeps(thatEnd)
|
|
1011
|
+
hasDurationSpec = hasDurationSpec?
|
|
975
1012
|
|
|
976
1013
|
# Check for tasks that have no start and end spec, no duration spec but
|
|
977
1014
|
# allocates. They can inherit the start and end date.
|
|
978
|
-
return true if hasThatSpec && !hasDurationSpec
|
|
1015
|
+
return true if hasThatSpec && !hasDurationSpec && !a('allocate').empty?
|
|
979
1016
|
|
|
980
1017
|
if a('forward') ^ atEnd
|
|
981
1018
|
# the scheduling direction is pointing away from this end
|
|
982
|
-
return true if hasDurationSpec
|
|
1019
|
+
return true if hasDurationSpec || !a('booking').empty?
|
|
983
1020
|
|
|
984
1021
|
return hasThatSpec
|
|
985
1022
|
else
|
|
986
1023
|
# the scheduling direction is pointing towards this end
|
|
987
|
-
return a(thatEnd) && !hasDurationSpec
|
|
1024
|
+
return a(thatEnd) && !hasDurationSpec &&
|
|
988
1025
|
a('booking').empty? #&& a('allocate').empty?
|
|
989
1026
|
end
|
|
990
1027
|
end
|
|
@@ -1231,88 +1268,89 @@ class TaskJuggler
|
|
|
1231
1268
|
end
|
|
1232
1269
|
|
|
1233
1270
|
def query_followers(query)
|
|
1234
|
-
|
|
1271
|
+
list = []
|
|
1235
1272
|
|
|
1236
1273
|
# First gather the task that depend on the start of this task.
|
|
1237
1274
|
a('startsuccs').each do |task, onEnd|
|
|
1238
|
-
str += "* <nowiki>#{task.name}</nowiki> (#{task.fullId}) "
|
|
1239
1275
|
if onEnd
|
|
1240
|
-
|
|
1241
|
-
|
|
1276
|
+
date = task['end', query.scenarioIdx].to_s(query.timeFormat)
|
|
1277
|
+
dep "[->]"
|
|
1242
1278
|
else
|
|
1243
|
-
|
|
1244
|
-
|
|
1279
|
+
date = task['start', query.scenarioIdx].to_s(query.timeFormat)
|
|
1280
|
+
dep "[->["
|
|
1245
1281
|
end
|
|
1246
|
-
|
|
1282
|
+
list << generateDepencyListItem(query.listMode, task, dep, date)
|
|
1247
1283
|
end
|
|
1248
1284
|
# Than add the tasks that depend on the end of this task.
|
|
1249
1285
|
a('endsuccs').each do |task, onEnd|
|
|
1250
|
-
str += "* <nowiki>#{task.name}</nowiki> (#{task.fullId}) "
|
|
1251
1286
|
if onEnd
|
|
1252
|
-
|
|
1253
|
-
|
|
1287
|
+
date = task['end', query.scenarioIdx].to_s(query.timeFormat)
|
|
1288
|
+
dep = "]->]"
|
|
1254
1289
|
else
|
|
1255
|
-
|
|
1256
|
-
|
|
1290
|
+
date = task['start', query.scenarioIdx].to_s(query.timeFormat)
|
|
1291
|
+
dep = "]->["
|
|
1257
1292
|
end
|
|
1258
|
-
|
|
1293
|
+
list << generateDepencyListItem(query.listMode, task, dep, date)
|
|
1259
1294
|
end
|
|
1260
1295
|
|
|
1261
|
-
|
|
1262
|
-
unless (query.rti = rText.generateIntermediateFormat)
|
|
1263
|
-
@property.project.messageHandler.warning(
|
|
1264
|
-
'task_sc_followers', 'Syntax error in followers')
|
|
1265
|
-
end
|
|
1296
|
+
query.assignList(list)
|
|
1266
1297
|
end
|
|
1267
1298
|
|
|
1268
1299
|
def query_precursors(query)
|
|
1269
|
-
|
|
1300
|
+
list = []
|
|
1270
1301
|
|
|
1271
1302
|
# First gather the task that depend on the start of this task.
|
|
1272
1303
|
a('startpreds').each do |task, onEnd|
|
|
1273
|
-
str += "* <nowiki>#{task.name}</nowiki> (#{task.fullId}) "
|
|
1274
1304
|
if onEnd
|
|
1275
|
-
|
|
1276
|
-
|
|
1305
|
+
date = task['end', query.scenarioIdx].to_s(query.timeFormat)
|
|
1306
|
+
dep = "]->["
|
|
1277
1307
|
else
|
|
1278
|
-
|
|
1279
|
-
|
|
1308
|
+
date = task['start', query.scenarioIdx].to_s(query.timeFormat)
|
|
1309
|
+
dep = "[->["
|
|
1280
1310
|
end
|
|
1281
|
-
|
|
1311
|
+
list << generateDepencyListItem(query.listMode, task, dep, date)
|
|
1282
1312
|
end
|
|
1283
1313
|
# Than add the tasks that depend on the end of this task.
|
|
1284
1314
|
a('endpreds').each do |task, onEnd|
|
|
1285
|
-
str += "* <nowiki>#{task.name}</nowiki> (#{task.fullId}) "
|
|
1286
1315
|
if onEnd
|
|
1287
|
-
|
|
1288
|
-
|
|
1316
|
+
date = task['end', query.scenarioIdx].to_s(query.timeFormat)
|
|
1317
|
+
dep = "]->]"
|
|
1289
1318
|
else
|
|
1290
|
-
|
|
1291
|
-
|
|
1319
|
+
date = task['start', query.scenarioIdx].to_s(query.timeFormat)
|
|
1320
|
+
dep = "[->]"
|
|
1292
1321
|
end
|
|
1293
|
-
|
|
1322
|
+
list << generateDepencyListItem(query.listMode, task, dep, date)
|
|
1294
1323
|
end
|
|
1295
1324
|
|
|
1296
|
-
|
|
1297
|
-
query.rti = rText.generateIntermediateFormat
|
|
1325
|
+
query.assignList(list)
|
|
1298
1326
|
end
|
|
1299
1327
|
|
|
1300
1328
|
# A list of the resources that have been allocated to work on the task in
|
|
1301
1329
|
# the report time frame.
|
|
1302
1330
|
def query_resources(query)
|
|
1303
|
-
|
|
1304
|
-
return list unless @property.leaf?
|
|
1331
|
+
return '' unless @property.leaf?
|
|
1305
1332
|
|
|
1333
|
+
list = []
|
|
1306
1334
|
a('assignedresources').each do |resource|
|
|
1307
1335
|
if resource.allocated?(@scenarioIdx,
|
|
1308
1336
|
Interval.new(query.start, query.end), @property)
|
|
1309
|
-
|
|
1310
|
-
|
|
1337
|
+
case query.listMode
|
|
1338
|
+
when 1
|
|
1339
|
+
list << "#{resource.fullId}"
|
|
1340
|
+
when 2
|
|
1341
|
+
list << "#{resource.name}"
|
|
1342
|
+
when 3, nil
|
|
1343
|
+
list << "#{resource.name} (#{resource.fullId})"
|
|
1344
|
+
when 4
|
|
1345
|
+
list << "#{resource.fullId}: #{resource.name}"
|
|
1346
|
+
else
|
|
1347
|
+
error('bad_listmode_qr',
|
|
1348
|
+
"Unsupported list mode #{query.listMode} used for " +
|
|
1349
|
+
"resources column.")
|
|
1350
|
+
end
|
|
1311
1351
|
end
|
|
1312
1352
|
end
|
|
1313
|
-
query.
|
|
1314
|
-
rText = RichText.new(list)
|
|
1315
|
-
query.rti = rText.generateIntermediateFormat
|
|
1353
|
+
query.assignList(list)
|
|
1316
1354
|
end
|
|
1317
1355
|
|
|
1318
1356
|
# Compute the revenue generated by this Task for a given Account during a
|
|
@@ -1347,13 +1385,32 @@ class TaskJuggler
|
|
|
1347
1385
|
['seqno', true, -1 ]])
|
|
1348
1386
|
targetList.sort!
|
|
1349
1387
|
|
|
1350
|
-
|
|
1388
|
+
list = []
|
|
1351
1389
|
targetList.each do |task|
|
|
1352
1390
|
date = task['start', @scenarioIdx].to_s(@property.project['timeFormat'])
|
|
1353
|
-
|
|
1391
|
+
case query.listMode
|
|
1392
|
+
when 1
|
|
1393
|
+
list << "#{task.fullId}"
|
|
1394
|
+
when 2
|
|
1395
|
+
list << "#{task.name}"
|
|
1396
|
+
when 3
|
|
1397
|
+
list << "#{task.name} (#{task.fullId})"
|
|
1398
|
+
when 4
|
|
1399
|
+
list << "#{task.fullId}: #{task.name}"
|
|
1400
|
+
when 5
|
|
1401
|
+
list << "#{task.fullId} (#{date})"
|
|
1402
|
+
when 6
|
|
1403
|
+
list << "#{task.name} (#{date})"
|
|
1404
|
+
when 7, nil
|
|
1405
|
+
list << "#{task.name} (#{task.fullId}) #{date}"
|
|
1406
|
+
when 8
|
|
1407
|
+
list << "#{task.fullId}: #{task.name} #{date}"
|
|
1408
|
+
else
|
|
1409
|
+
error('bad_listmode_qt',
|
|
1410
|
+
"Bad listmode #{query.listMode}. Use 1 - 8.")
|
|
1411
|
+
end
|
|
1354
1412
|
end
|
|
1355
|
-
|
|
1356
|
-
query.rti = rText.generateIntermediateFormat
|
|
1413
|
+
query.assignList(list)
|
|
1357
1414
|
end
|
|
1358
1415
|
|
|
1359
1416
|
|
|
@@ -1364,28 +1421,27 @@ class TaskJuggler
|
|
|
1364
1421
|
(resource && !a('assignedresources').include?(resource))
|
|
1365
1422
|
|
|
1366
1423
|
key = [ self, :TaskScenarioAllocatedTime, startIdx, endIdx, resource ].hash
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
resource)
|
|
1375
|
-
end
|
|
1376
|
-
else
|
|
1377
|
-
if resource
|
|
1378
|
-
allocatedTime += resource.getAllocatedTime(@scenarioIdx,
|
|
1379
|
-
startIdx, endIdx,
|
|
1380
|
-
@property)
|
|
1424
|
+
@dCache.cached(key) do
|
|
1425
|
+
allocatedTime = 0.0
|
|
1426
|
+
if @property.container?
|
|
1427
|
+
@property.children.each do |task|
|
|
1428
|
+
allocatedTime += task.getAllocatedTime(@scenarioIdx,
|
|
1429
|
+
startIdx, endIdx, resource)
|
|
1430
|
+
end
|
|
1381
1431
|
else
|
|
1382
|
-
|
|
1383
|
-
allocatedTime +=
|
|
1384
|
-
|
|
1432
|
+
if resource
|
|
1433
|
+
allocatedTime += resource.getAllocatedTime(@scenarioIdx,
|
|
1434
|
+
startIdx, endIdx,
|
|
1435
|
+
@property)
|
|
1436
|
+
else
|
|
1437
|
+
a('assignedresources').each do |r|
|
|
1438
|
+
allocatedTime += r.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
|
|
1439
|
+
@property)
|
|
1440
|
+
end
|
|
1385
1441
|
end
|
|
1386
1442
|
end
|
|
1443
|
+
allocatedTime
|
|
1387
1444
|
end
|
|
1388
|
-
@dCache.store(allocatedTime, key)
|
|
1389
1445
|
end
|
|
1390
1446
|
|
|
1391
1447
|
# Compute the effective work a _resource_ or all resources do during the
|
|
@@ -1396,36 +1452,59 @@ class TaskJuggler
|
|
|
1396
1452
|
(resource && !a('assignedresources').include?(resource))
|
|
1397
1453
|
|
|
1398
1454
|
key = [ self, :TaskScenarioEffectiveWork, startIdx, endIdx, resource ].hash
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
resource)
|
|
1407
|
-
end
|
|
1408
|
-
else
|
|
1409
|
-
if resource
|
|
1410
|
-
workLoad += resource.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
|
|
1411
|
-
@property)
|
|
1455
|
+
@dCache.cached(key) do
|
|
1456
|
+
workLoad = 0.0
|
|
1457
|
+
if @property.container?
|
|
1458
|
+
@property.children.each do |task|
|
|
1459
|
+
workLoad += task.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
|
|
1460
|
+
resource)
|
|
1461
|
+
end
|
|
1412
1462
|
else
|
|
1413
|
-
|
|
1414
|
-
workLoad +=
|
|
1415
|
-
|
|
1463
|
+
if resource
|
|
1464
|
+
workLoad += resource.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
|
|
1465
|
+
@property)
|
|
1466
|
+
else
|
|
1467
|
+
a('assignedresources').each do |r|
|
|
1468
|
+
workLoad += r.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
|
|
1469
|
+
@property)
|
|
1470
|
+
end
|
|
1416
1471
|
end
|
|
1417
1472
|
end
|
|
1473
|
+
workLoad
|
|
1418
1474
|
end
|
|
1419
|
-
@dCache.store(workLoad, key)
|
|
1420
1475
|
end
|
|
1421
1476
|
|
|
1422
1477
|
# Return a list of intervals that lay within _iv_ and are at least
|
|
1423
1478
|
# minDuration long and contain no working time.
|
|
1424
1479
|
def collectTimeOffIntervals(iv, minDuration)
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1480
|
+
# This function is often called recursively for the same parameters. We
|
|
1481
|
+
# store the results in the cache to avoid repeated computations of the
|
|
1482
|
+
# same results.
|
|
1483
|
+
key = [ self, :TaskScenarioCollectTimeOffIntervals, iv, minDuration ].hash
|
|
1484
|
+
@dCache.cached(key) do
|
|
1485
|
+
workLoad = @dCache.load(key)
|
|
1486
|
+
il = IntervalList.new
|
|
1487
|
+
il << Interval.new(@project['start'], @project['end'])
|
|
1488
|
+
if @property.leaf?
|
|
1489
|
+
unless (resources = a('assignedresources')).empty?
|
|
1490
|
+
# The task has assigned resources, so we can use their common time
|
|
1491
|
+
# off intervals.
|
|
1492
|
+
resources.each do |resource|
|
|
1493
|
+
il &= resource.collectTimeOffIntervals(@scenarioIdx, iv,
|
|
1494
|
+
minDuration)
|
|
1495
|
+
end
|
|
1496
|
+
else
|
|
1497
|
+
# The task has no assigned resources. We simply use the global time
|
|
1498
|
+
# off intervals.
|
|
1499
|
+
il &= @project.collectTimeOffIntervals(iv, minDuration)
|
|
1500
|
+
end
|
|
1501
|
+
else
|
|
1502
|
+
@property.children.each do |task|
|
|
1503
|
+
il &= task.collectTimeOffIntervals(@scenarioIdx, iv, minDuration)
|
|
1504
|
+
end
|
|
1505
|
+
end
|
|
1506
|
+
|
|
1507
|
+
il
|
|
1429
1508
|
end
|
|
1430
1509
|
end
|
|
1431
1510
|
|
|
@@ -1547,8 +1626,8 @@ class TaskJuggler
|
|
|
1547
1626
|
elsif a('effort') > 0
|
|
1548
1627
|
bookResources(slot, slotDuration) if @doneEffort < a('effort')
|
|
1549
1628
|
if @doneEffort >= a('effort')
|
|
1550
|
-
# The specified effort has been reached. The has been fully
|
|
1551
|
-
# now.
|
|
1629
|
+
# The specified effort has been reached. The task has been fully
|
|
1630
|
+
# scheduled now.
|
|
1552
1631
|
if a('forward')
|
|
1553
1632
|
propagateDate(@tentativeEnd, true)
|
|
1554
1633
|
else
|
|
@@ -1694,11 +1773,17 @@ class TaskJuggler
|
|
|
1694
1773
|
|
|
1695
1774
|
if r.book(@scenarioIdx, sbIdx, @property)
|
|
1696
1775
|
|
|
1697
|
-
if a('assignedresources').empty?
|
|
1776
|
+
if a('effort') > 0 && a('assignedresources').empty?
|
|
1698
1777
|
if a('forward')
|
|
1699
1778
|
@property['start', @scenarioIdx] = @project.idxToDate(sbIdx)
|
|
1779
|
+
a('startsuccs').each do |task, onEnd|
|
|
1780
|
+
task.propagateDate(@scenarioIdx, a('start'), false)
|
|
1781
|
+
end
|
|
1700
1782
|
else
|
|
1701
1783
|
@property['end', @scenarioIdx] = @project.idxToDate(sbIdx + 1)
|
|
1784
|
+
a('endpreds').each do |task, onEnd|
|
|
1785
|
+
task.propagateDate(@scenarioIdx, a('end'), true)
|
|
1786
|
+
end
|
|
1702
1787
|
end
|
|
1703
1788
|
end
|
|
1704
1789
|
|
|
@@ -1827,6 +1912,69 @@ class TaskJuggler
|
|
|
1827
1912
|
false
|
|
1828
1913
|
end
|
|
1829
1914
|
|
|
1915
|
+
def hasStrongDeps(thisEnd)
|
|
1916
|
+
# A dependency that could determine the date on this side of the
|
|
1917
|
+
# dependency is a strong dependency. If the scheduling direction of the
|
|
1918
|
+
# task on the other side leads away from the dependency point, then the
|
|
1919
|
+
# dependency is weak. This date will influence the other date for weak
|
|
1920
|
+
# dependencies.
|
|
1921
|
+
#
|
|
1922
|
+
# +--- SS -> SP> : Weak
|
|
1923
|
+
# |-+ SS -> SP< : Illegal
|
|
1924
|
+
# +-|- SP -> SS> : Strong
|
|
1925
|
+
# | +--- SP -> SS< : Illegal
|
|
1926
|
+
# +-|
|
|
1927
|
+
# +---
|
|
1928
|
+
#
|
|
1929
|
+
#
|
|
1930
|
+
# ---+ ES -> SP> : Weak
|
|
1931
|
+
# |-+ ES -> SP< : Strong
|
|
1932
|
+
# ---+ | SP -> ES> : Strong
|
|
1933
|
+
# | +--- SP -> ES< : Weak
|
|
1934
|
+
# +-|
|
|
1935
|
+
# +---
|
|
1936
|
+
#
|
|
1937
|
+
#
|
|
1938
|
+
# ---+ ES -> EP> : Illegal
|
|
1939
|
+
# |-+ ES -> EP< : Strong
|
|
1940
|
+
# ---+ | EP -> ES> : Illegal
|
|
1941
|
+
# -|-+ EP -> ES< : Weak
|
|
1942
|
+
# +-|
|
|
1943
|
+
# ---+
|
|
1944
|
+
#
|
|
1945
|
+
# All other combinations are illegal and should be caught earlier. So,
|
|
1946
|
+
# illegal values can be considered don't care values.
|
|
1947
|
+
#
|
|
1948
|
+
# f/t SP> SP< SS> SS< EP> EP< ES> ES<
|
|
1949
|
+
# SP x x S x x x S W Row 1
|
|
1950
|
+
# SS W x x x x x x x Row 2
|
|
1951
|
+
# EP x x x x x x x W Row 3
|
|
1952
|
+
# ES W S x x x S x x Row 4
|
|
1953
|
+
if thisEnd == 'start'
|
|
1954
|
+
# Row 1
|
|
1955
|
+
a('startpreds').each do |task, onEnd|
|
|
1956
|
+
if (onEnd && (task['forward', @scenarioIdx] ||
|
|
1957
|
+
task['end', @scenarioIdx])) ||
|
|
1958
|
+
(!onEnd && (task['forward', @scenarioIdx] ||
|
|
1959
|
+
task['start']))
|
|
1960
|
+
return true
|
|
1961
|
+
end
|
|
1962
|
+
end
|
|
1963
|
+
else
|
|
1964
|
+
# Row 4
|
|
1965
|
+
a('endsuccs').each do |task, onEnd|
|
|
1966
|
+
if (onEnd && (!task['forward', @scenarioIdx] ||
|
|
1967
|
+
task['end', @scenarioIdx])) ||
|
|
1968
|
+
(!onEnd && (!task['forward', @scenarioIdx] ||
|
|
1969
|
+
task['start', @scenarioIdx]))
|
|
1970
|
+
return true
|
|
1971
|
+
end
|
|
1972
|
+
end
|
|
1973
|
+
end
|
|
1974
|
+
|
|
1975
|
+
false
|
|
1976
|
+
end
|
|
1977
|
+
|
|
1830
1978
|
def markAsRunaway
|
|
1831
1979
|
warning('runaway', "Task #{@property.fullId} does not fit into " +
|
|
1832
1980
|
"project time frame")
|
|
@@ -1944,19 +2092,19 @@ class TaskJuggler
|
|
|
1944
2092
|
maxCriticalness = 0.0
|
|
1945
2093
|
# Gather a list of all end-successors of this task and its parent task.
|
|
1946
2094
|
tList = []
|
|
2095
|
+
depStruct = Struct.new(:task, :onEnd)
|
|
1947
2096
|
p = @property
|
|
1948
2097
|
while (p)
|
|
1949
2098
|
p['endsuccs', @scenarioIdx].each do |task, onEnd|
|
|
1950
|
-
|
|
2099
|
+
dep = depStruct.new(task, onEnd)
|
|
2100
|
+
tList << dep unless tList.include?(dep)
|
|
1951
2101
|
end
|
|
1952
2102
|
p = p.parent
|
|
1953
2103
|
end
|
|
1954
2104
|
|
|
1955
|
-
tList.each do |
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
maxCriticalness = criticalness
|
|
1959
|
-
end
|
|
2105
|
+
tList.each do |dep|
|
|
2106
|
+
criticalness = dep.task.calcPathCriticalness(@scenarioIdx, dep.onEnd)
|
|
2107
|
+
maxCriticalness = criticalness if criticalness > maxCriticalness
|
|
1960
2108
|
end
|
|
1961
2109
|
|
|
1962
2110
|
maxCriticalness
|
|
@@ -2126,6 +2274,42 @@ class TaskJuggler
|
|
|
2126
2274
|
amount
|
|
2127
2275
|
end
|
|
2128
2276
|
|
|
2277
|
+
def generateDepencyListItem(mode, task, dep, date)
|
|
2278
|
+
str =
|
|
2279
|
+
case mode
|
|
2280
|
+
when 1
|
|
2281
|
+
"#{task.fullId} #{dep} #{date}"
|
|
2282
|
+
when 2
|
|
2283
|
+
"#{task.name} #{dep} #{date}"
|
|
2284
|
+
when 3, nil
|
|
2285
|
+
"#{task.name} (#{task.fullId}) #{dep} #{date}"
|
|
2286
|
+
when 4
|
|
2287
|
+
"#{task.fullId}: #{task.name} #{dep} #{date}"
|
|
2288
|
+
when 5
|
|
2289
|
+
"#{task.fullId} #{dep}"
|
|
2290
|
+
when 6
|
|
2291
|
+
"#{task.name} #{dep}"
|
|
2292
|
+
when 7
|
|
2293
|
+
"#{task.name} (#{task.fullId}) #{dep}"
|
|
2294
|
+
when 8
|
|
2295
|
+
"#{task.fullId}: #{task.name} #{dep}"
|
|
2296
|
+
when 9
|
|
2297
|
+
"#{task.fullId}"
|
|
2298
|
+
when 10
|
|
2299
|
+
"#{task.name}"
|
|
2300
|
+
when 11
|
|
2301
|
+
"#{task.name} (#{task.fullId})"
|
|
2302
|
+
when 12
|
|
2303
|
+
"#{task.fullId}: #{task.name}"
|
|
2304
|
+
else
|
|
2305
|
+
error('bad_listmode_deps',
|
|
2306
|
+
"Unsupported list mode #{query.listMode} used for " +
|
|
2307
|
+
"dependency column. Use 1 - 12.")
|
|
2308
|
+
end
|
|
2309
|
+
|
|
2310
|
+
"* <nowiki>#{str}</nowiki>"
|
|
2311
|
+
end
|
|
2312
|
+
|
|
2129
2313
|
end
|
|
2130
2314
|
|
|
2131
2315
|
end
|