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.
Files changed (613) hide show
  1. data/CHANGELOG +1144 -2047
  2. data/README +1 -1
  3. data/Rakefile +6 -6
  4. data/data/css/tjmanual.css +20 -0
  5. data/data/css/tjreport.css +7 -6
  6. data/doc/AppConfig.html +136 -130
  7. data/doc/Arguments.html +46 -40
  8. data/doc/CHANGELOG.html +1162 -2057
  9. data/doc/COPYING.html +8 -2
  10. data/doc/Object.html +205 -199
  11. data/doc/README.html +9 -3
  12. data/doc/RuntimeConfig.html +75 -69
  13. data/doc/String.html +69 -63
  14. data/doc/TaskJuggler.html +350 -291
  15. data/doc/TaskJuggler/Account.html +26 -20
  16. data/doc/TaskJuggler/AccountAttribute.html +24 -18
  17. data/doc/TaskJuggler/AccountScenario.html +24 -18
  18. data/doc/TaskJuggler/Allocation.html +74 -68
  19. data/doc/TaskJuggler/AllocationAttribute.html +54 -48
  20. data/doc/TaskJuggler/AttributeBase.html +172 -93
  21. data/doc/TaskJuggler/AttributeDefinition.html +22 -16
  22. data/doc/TaskJuggler/AttributeOverwrite.html +586 -0
  23. data/doc/TaskJuggler/BatchProcessor.html +263 -257
  24. data/doc/TaskJuggler/Booking.html +44 -38
  25. data/doc/TaskJuggler/BookingListAttribute.html +25 -21
  26. data/doc/TaskJuggler/BooleanAttribute.html +24 -18
  27. data/doc/TaskJuggler/CSVFile.html +193 -187
  28. data/doc/TaskJuggler/CellSettingPattern.html +13 -7
  29. data/doc/TaskJuggler/CellSettingPatternList.html +25 -19
  30. data/doc/TaskJuggler/Charge.html +49 -43
  31. data/doc/TaskJuggler/ChargeListAttribute.html +21 -15
  32. data/doc/TaskJuggler/ChargeSet.html +94 -88
  33. data/doc/TaskJuggler/ChargeSetListAttribute.html +29 -25
  34. data/doc/TaskJuggler/CollisionDetector.html +142 -136
  35. data/doc/TaskJuggler/ColumnListAttribute.html +21 -17
  36. data/doc/TaskJuggler/ColumnTable.html +50 -44
  37. data/doc/TaskJuggler/Daemon.html +71 -50
  38. data/doc/TaskJuggler/DataCache.html +110 -58
  39. data/doc/TaskJuggler/DataCacheEntry.html +22 -16
  40. data/doc/TaskJuggler/DateAttribute.html +24 -18
  41. data/doc/TaskJuggler/DefinitionListAttribute.html +12 -6
  42. data/doc/TaskJuggler/DependencyListAttribute.html +29 -25
  43. data/doc/TaskJuggler/DurationAttribute.html +25 -19
  44. data/doc/TaskJuggler/FileList.html +25 -19
  45. data/doc/TaskJuggler/FileRecord.html +17 -11
  46. data/doc/TaskJuggler/FixnumAttribute.html +16 -10
  47. data/doc/TaskJuggler/FlagListAttribute.html +25 -21
  48. data/doc/TaskJuggler/FloatAttribute.html +20 -14
  49. data/doc/TaskJuggler/FormatListAttribute.html +17 -11
  50. data/doc/TaskJuggler/GanttChart.html +242 -236
  51. data/doc/TaskJuggler/GanttContainer.html +71 -67
  52. data/doc/TaskJuggler/GanttHeader.html +113 -107
  53. data/doc/TaskJuggler/GanttHeaderScaleItem.html +26 -20
  54. data/doc/TaskJuggler/GanttLine.html +217 -210
  55. data/doc/TaskJuggler/GanttLoadStack.html +89 -83
  56. data/doc/TaskJuggler/GanttMilestone.html +11 -6
  57. data/doc/TaskJuggler/GanttRouter.html +194 -186
  58. data/doc/TaskJuggler/GanttTaskBar.html +41 -34
  59. data/doc/TaskJuggler/HTMLDocument.html +52 -46
  60. data/doc/TaskJuggler/HTMLGraphics.html +58 -52
  61. data/doc/TaskJuggler/Interval.html +90 -84
  62. data/doc/TaskJuggler/IntervalList.html +777 -0
  63. data/doc/TaskJuggler/IntervalListAttribute.html +29 -25
  64. data/doc/TaskJuggler/JobInfo.html +36 -30
  65. data/doc/TaskJuggler/Journal.html +188 -177
  66. data/doc/TaskJuggler/JournalEntry.html +36 -30
  67. data/doc/TaskJuggler/JournalEntryList.html +88 -82
  68. data/doc/TaskJuggler/KeywordArray.html +12 -6
  69. data/doc/TaskJuggler/KeywordDocumentation.html +512 -503
  70. data/doc/TaskJuggler/Limits.html +111 -105
  71. data/doc/TaskJuggler/Limits/Limit.html +71 -65
  72. data/doc/TaskJuggler/LimitsAttribute.html +21 -15
  73. data/doc/TaskJuggler/ListAttributeBase.html +16 -10
  74. data/doc/TaskJuggler/Log.html +111 -105
  75. data/doc/TaskJuggler/LogFile.html +54 -48
  76. data/doc/TaskJuggler/LogicalAttribute.html +35 -29
  77. data/doc/TaskJuggler/LogicalExpression.html +32 -26
  78. data/doc/TaskJuggler/LogicalExpressionAttribute.html +16 -10
  79. data/doc/TaskJuggler/LogicalExpressionListAttribute.html +671 -0
  80. data/doc/TaskJuggler/LogicalFlag.html +24 -18
  81. data/doc/TaskJuggler/LogicalFunction.html +164 -158
  82. data/doc/TaskJuggler/LogicalOperation.html +138 -132
  83. data/doc/TaskJuggler/Macro.html +14 -8
  84. data/doc/TaskJuggler/MacroTable.html +42 -36
  85. data/doc/TaskJuggler/ManagerResponsibilities.html +19 -13
  86. data/doc/TaskJuggler/ManagerStatusRecord.html +23 -17
  87. data/doc/TaskJuggler/Message.html +56 -50
  88. data/doc/TaskJuggler/MessageHandler.html +73 -67
  89. data/doc/TaskJuggler/Navigator.html +92 -86
  90. data/doc/TaskJuggler/NavigatorElement.html +88 -82
  91. data/doc/TaskJuggler/NikuProject.html +15 -9
  92. data/doc/TaskJuggler/NikuReport.html +405 -370
  93. data/doc/TaskJuggler/NikuResource.html +13 -7
  94. data/doc/TaskJuggler/NodeListAttribute.html +13 -9
  95. data/doc/TaskJuggler/PlaceHolderCell.html +22 -16
  96. data/doc/TaskJuggler/ProcessIntercom.html +116 -110
  97. data/doc/TaskJuggler/ProcessIntercomIface.html +39 -33
  98. data/doc/TaskJuggler/Project.html +1064 -895
  99. data/doc/TaskJuggler/ProjectBroker.html +439 -366
  100. data/doc/TaskJuggler/ProjectBrokerIface.html +63 -53
  101. data/doc/TaskJuggler/ProjectFileParser.html +329 -319
  102. data/doc/TaskJuggler/ProjectFileScanner.html +351 -345
  103. data/doc/TaskJuggler/ProjectRecord.html +66 -60
  104. data/doc/TaskJuggler/ProjectServer.html +287 -280
  105. data/doc/TaskJuggler/ProjectServerIface.html +43 -37
  106. data/doc/TaskJuggler/PropertyAttribute.html +16 -10
  107. data/doc/TaskJuggler/PropertyList.html +205 -199
  108. data/doc/TaskJuggler/PropertySet.html +264 -296
  109. data/doc/TaskJuggler/PropertyTreeNode.html +455 -505
  110. data/doc/TaskJuggler/Query.html +309 -524
  111. data/doc/TaskJuggler/RTFHandlers.html +17 -11
  112. data/doc/TaskJuggler/RTFNavigator.html +33 -27
  113. data/doc/TaskJuggler/RTFQuery.html +135 -129
  114. data/doc/TaskJuggler/RTFReport.html +63 -57
  115. data/doc/TaskJuggler/RTFReportLink.html +55 -49
  116. data/doc/TaskJuggler/RTFWithQuerySupport.html +17 -11
  117. data/doc/TaskJuggler/RealFormat.html +64 -58
  118. data/doc/TaskJuggler/RealFormatAttribute.html +12 -6
  119. data/doc/TaskJuggler/ReferenceAttribute.html +35 -29
  120. data/doc/TaskJuggler/Report.html +294 -249
  121. data/doc/TaskJuggler/ReportBase.html +229 -223
  122. data/doc/TaskJuggler/ReportContext.html +52 -46
  123. data/doc/TaskJuggler/ReportServer.html +143 -137
  124. data/doc/TaskJuggler/ReportServerIface.html +51 -43
  125. data/doc/TaskJuggler/ReportServerRecord.html +36 -30
  126. data/doc/TaskJuggler/ReportServlet.html +167 -140
  127. data/doc/TaskJuggler/ReportTable.html +137 -131
  128. data/doc/TaskJuggler/ReportTableCell.html +332 -292
  129. data/doc/TaskJuggler/ReportTableColumn.html +46 -40
  130. data/doc/TaskJuggler/ReportTableLegend.html +43 -38
  131. data/doc/TaskJuggler/ReportTableLine.html +66 -60
  132. data/doc/TaskJuggler/Resource.html +166 -160
  133. data/doc/TaskJuggler/ResourceListAttribute.html +54 -32
  134. data/doc/TaskJuggler/ResourceListRE.html +47 -41
  135. data/doc/TaskJuggler/ResourceScenario.html +671 -644
  136. data/doc/TaskJuggler/RichText.html +51 -45
  137. data/doc/TaskJuggler/RichTextAttribute.html +28 -22
  138. data/doc/TaskJuggler/RichTextDocument.html +96 -90
  139. data/doc/TaskJuggler/RichTextElement.html +503 -497
  140. data/doc/TaskJuggler/RichTextFunctionExample.html +41 -35
  141. data/doc/TaskJuggler/RichTextFunctionHandler.html +19 -13
  142. data/doc/TaskJuggler/RichTextImage.html +14 -8
  143. data/doc/TaskJuggler/RichTextIntermediate.html +86 -80
  144. data/doc/TaskJuggler/RichTextParser.html +59 -53
  145. data/doc/TaskJuggler/RichTextScanner.html +184 -178
  146. data/doc/TaskJuggler/RichTextSnip.html +69 -63
  147. data/doc/TaskJuggler/RichTextSyntaxRules.html +416 -410
  148. data/doc/TaskJuggler/Scenario.html +13 -7
  149. data/doc/TaskJuggler/ScenarioData.html +40 -34
  150. data/doc/TaskJuggler/ScenarioListAttribute.html +21 -15
  151. data/doc/TaskJuggler/Scoreboard.html +129 -107
  152. data/doc/TaskJuggler/SheetHandlerBase.html +245 -239
  153. data/doc/TaskJuggler/SheetReceiver.html +333 -327
  154. data/doc/TaskJuggler/SheetSender.html +227 -221
  155. data/doc/TaskJuggler/Shift.html +26 -20
  156. data/doc/TaskJuggler/ShiftAssignment.html +45 -39
  157. data/doc/TaskJuggler/ShiftAssignments.html +178 -172
  158. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +21 -15
  159. data/doc/TaskJuggler/ShiftScenario.html +29 -23
  160. data/doc/TaskJuggler/SimpleQueryExpander.html +36 -30
  161. data/doc/TaskJuggler/SortListAttribute.html +17 -13
  162. data/doc/TaskJuggler/SourceFileInfo.html +19 -13
  163. data/doc/TaskJuggler/StatusSheetReceiver.html +31 -25
  164. data/doc/TaskJuggler/StatusSheetReport.html +166 -159
  165. data/doc/TaskJuggler/StatusSheetSender.html +80 -74
  166. data/doc/TaskJuggler/StringAttribute.html +20 -14
  167. data/doc/TaskJuggler/SymbolAttribute.html +16 -10
  168. data/doc/TaskJuggler/SyntaxReference.html +231 -225
  169. data/doc/TaskJuggler/TOCEntry.html +46 -40
  170. data/doc/TaskJuggler/TSResourceRecord.html +15 -9
  171. data/doc/TaskJuggler/TSTaskRecord.html +16 -10
  172. data/doc/TaskJuggler/TableColumnDefinition.html +84 -39
  173. data/doc/TaskJuggler/TableOfContents.html +28 -22
  174. data/doc/TaskJuggler/TableReport.html +906 -866
  175. data/doc/TaskJuggler/Task.html +99 -93
  176. data/doc/TaskJuggler/TaskDependency.html +24 -18
  177. data/doc/TaskJuggler/TaskListAttribute.html +29 -25
  178. data/doc/TaskJuggler/TaskListRE.html +46 -39
  179. data/doc/TaskJuggler/TaskScenario.html +2218 -1965
  180. data/doc/TaskJuggler/TextFormatter.html +154 -148
  181. data/doc/TaskJuggler/TextParser.html +362 -348
  182. data/doc/TaskJuggler/TextParser/Pattern.html +313 -307
  183. data/doc/TaskJuggler/TextParser/Rule.html +147 -141
  184. data/doc/TaskJuggler/TextParser/StackElement.html +58 -52
  185. data/doc/TaskJuggler/TextParser/State.html +88 -82
  186. data/doc/TaskJuggler/TextParser/StateTransition.html +42 -36
  187. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +20 -14
  188. data/doc/TaskJuggler/TextParser/TokenDoc.html +19 -13
  189. data/doc/TaskJuggler/TextReport.html +80 -74
  190. data/doc/TaskJuggler/TextScanner.html +284 -272
  191. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +14 -8
  192. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +21 -15
  193. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +15 -9
  194. data/doc/TaskJuggler/TextScanner/StreamHandle.html +102 -96
  195. data/doc/TaskJuggler/TimeSheet.html +123 -117
  196. data/doc/TaskJuggler/TimeSheetReceiver.html +28 -22
  197. data/doc/TaskJuggler/TimeSheetRecord.html +212 -206
  198. data/doc/TaskJuggler/TimeSheetReport.html +206 -199
  199. data/doc/TaskJuggler/TimeSheetSender.html +27 -21
  200. data/doc/TaskJuggler/TimeSheetSummary.html +140 -134
  201. data/doc/TaskJuggler/TimeSheets.html +20 -14
  202. data/doc/TaskJuggler/Tj3AppBase.html +100 -94
  203. data/doc/TaskJuggler/Tj3Client.html +407 -483
  204. data/doc/TaskJuggler/Tj3Daemon.html +116 -107
  205. data/doc/TaskJuggler/Tj3SheetAppBase.html +45 -39
  206. data/doc/TaskJuggler/Tj3SsReceiver.html +31 -25
  207. data/doc/TaskJuggler/Tj3SsSender.html +64 -58
  208. data/doc/TaskJuggler/Tj3TsReceiver.html +31 -25
  209. data/doc/TaskJuggler/Tj3TsSender.html +51 -45
  210. data/doc/TaskJuggler/Tj3TsSummary.html +59 -53
  211. data/doc/TaskJuggler/TjException.html +13 -7
  212. data/doc/TaskJuggler/TjTime.html +444 -438
  213. data/doc/TaskJuggler/TjpExample.html +84 -78
  214. data/doc/TaskJuggler/TjpExportRE.html +356 -349
  215. data/doc/TaskJuggler/TjpSyntaxRules.html +4279 -4151
  216. data/doc/TaskJuggler/URLParameter.html +16 -10
  217. data/doc/TaskJuggler/UserManual.html +185 -179
  218. data/doc/TaskJuggler/VimSyntax.html +144 -138
  219. data/doc/TaskJuggler/WebServer.html +46 -39
  220. data/doc/TaskJuggler/WelcomePage.html +769 -0
  221. data/doc/TaskJuggler/WorkingHours.html +185 -179
  222. data/doc/TaskJuggler/WorkingHoursAttribute.html +42 -36
  223. data/doc/TaskJuggler/XMLBlob.html +21 -15
  224. data/doc/TaskJuggler/XMLComment.html +17 -11
  225. data/doc/TaskJuggler/XMLDocument.html +33 -27
  226. data/doc/TaskJuggler/XMLElement.html +97 -91
  227. data/doc/TaskJuggler/XMLNamedText.html +13 -7
  228. data/doc/TaskJuggler/XMLText.html +32 -26
  229. data/doc/index.html +601 -563
  230. data/doc/lib/AccountScenario_rb.html +5 -3
  231. data/doc/lib/Account_rb.html +5 -3
  232. data/doc/lib/Allocation_rb.html +5 -3
  233. data/doc/lib/AppConfig_rb.html +5 -3
  234. data/doc/lib/AttributeBase_rb.html +5 -3
  235. data/doc/lib/AttributeDefinition_rb.html +5 -3
  236. data/doc/lib/Attributes_rb.html +5 -3
  237. data/doc/lib/BatchProcessor_rb.html +5 -3
  238. data/doc/lib/Booking_rb.html +5 -3
  239. data/doc/lib/ChargeSet_rb.html +5 -3
  240. data/doc/lib/Charge_rb.html +5 -3
  241. data/doc/lib/DataCache_rb.html +5 -3
  242. data/doc/lib/FileList_rb.html +5 -3
  243. data/doc/lib/HTMLDocument_rb.html +5 -3
  244. data/doc/lib/IntervalList_rb.html +69 -0
  245. data/doc/lib/Interval_rb.html +5 -3
  246. data/doc/lib/Journal_rb.html +5 -3
  247. data/doc/lib/KeywordArray_rb.html +5 -3
  248. data/doc/lib/KeywordDocumentation_rb.html +5 -3
  249. data/doc/lib/Limits_rb.html +5 -3
  250. data/doc/lib/LogFile_rb.html +5 -3
  251. data/doc/lib/Log_rb.html +5 -3
  252. data/doc/lib/LogicalExpression_rb.html +5 -3
  253. data/doc/lib/LogicalFunction_rb.html +5 -3
  254. data/doc/lib/LogicalOperation_rb.html +5 -3
  255. data/doc/lib/MacroTable_rb.html +5 -3
  256. data/doc/lib/MessageHandler_rb.html +5 -3
  257. data/doc/lib/ProjectFileParser_rb.html +5 -3
  258. data/doc/lib/ProjectFileScanner_rb.html +5 -3
  259. data/doc/lib/Project_rb.html +5 -3
  260. data/doc/lib/PropertyList_rb.html +5 -3
  261. data/doc/lib/PropertySet_rb.html +5 -3
  262. data/doc/lib/PropertyTreeNode_rb.html +5 -3
  263. data/doc/lib/Query_rb.html +5 -3
  264. data/doc/lib/RTFHandlers_rb.html +5 -3
  265. data/doc/lib/RTFNavigator_rb.html +5 -3
  266. data/doc/lib/RTFQuery_rb.html +5 -3
  267. data/doc/lib/RTFReportLink_rb.html +5 -3
  268. data/doc/lib/RTFReport_rb.html +5 -3
  269. data/doc/lib/RTFWithQuerySupport_rb.html +5 -3
  270. data/doc/lib/RealFormat_rb.html +5 -3
  271. data/doc/lib/ResourceScenario_rb.html +5 -3
  272. data/doc/lib/Resource_rb.html +5 -3
  273. data/doc/lib/RichTextDocument_rb.html +5 -3
  274. data/doc/lib/RichTextElement_rb.html +5 -3
  275. data/doc/lib/RichTextFunctionExample_rb.html +5 -3
  276. data/doc/lib/RichTextFunctionHandler_rb.html +5 -3
  277. data/doc/lib/RichTextParser_rb.html +5 -3
  278. data/doc/lib/RichTextScanner_rb.html +5 -3
  279. data/doc/lib/RichTextSnip_rb.html +5 -3
  280. data/doc/lib/RichTextSyntaxRules_rb.html +5 -3
  281. data/doc/lib/RichText_rb.html +5 -3
  282. data/doc/lib/RuntimeConfig_rb.html +5 -3
  283. data/doc/lib/ScenarioData_rb.html +5 -3
  284. data/doc/lib/Scenario_rb.html +5 -3
  285. data/doc/lib/Scoreboard_rb.html +7 -3
  286. data/doc/lib/SheetHandlerBase_rb.html +5 -3
  287. data/doc/lib/SheetReceiver_rb.html +5 -3
  288. data/doc/lib/SheetSender_rb.html +5 -3
  289. data/doc/lib/ShiftAssignments_rb.html +5 -3
  290. data/doc/lib/ShiftScenario_rb.html +5 -3
  291. data/doc/lib/Shift_rb.html +5 -3
  292. data/doc/lib/SimpleQueryExpander_rb.html +5 -3
  293. data/doc/lib/SourceFileInfo_rb.html +5 -3
  294. data/doc/lib/StatusSheetReceiver_rb.html +5 -3
  295. data/doc/lib/StatusSheetSender_rb.html +5 -3
  296. data/doc/lib/SyntaxReference_rb.html +5 -3
  297. data/doc/lib/TOCEntry_rb.html +5 -3
  298. data/doc/lib/TableColumnDefinition_rb.html +5 -3
  299. data/doc/lib/TableOfContents_rb.html +5 -3
  300. data/doc/lib/TaskDependency_rb.html +5 -3
  301. data/doc/lib/TaskJuggler_rb.html +5 -3
  302. data/doc/lib/TaskScenario_rb.html +5 -3
  303. data/doc/lib/Task_rb.html +5 -3
  304. data/doc/lib/TextFormatter_rb.html +6 -4
  305. data/doc/lib/TextParser/Pattern_rb.html +5 -3
  306. data/doc/lib/TextParser/Rule_rb.html +5 -3
  307. data/doc/lib/TextParser/StackElement_rb.html +5 -3
  308. data/doc/lib/TextParser/State_rb.html +6 -4
  309. data/doc/lib/TextParser/TokenDoc_rb.html +5 -3
  310. data/doc/lib/TextParser_rb.html +5 -3
  311. data/doc/lib/TextScanner_rb.html +5 -3
  312. data/doc/lib/TimeSheetReceiver_rb.html +5 -3
  313. data/doc/lib/TimeSheetSender_rb.html +5 -3
  314. data/doc/lib/TimeSheetSummary_rb.html +6 -4
  315. data/doc/lib/TimeSheets_rb.html +5 -3
  316. data/doc/lib/Tj3AppBase_rb.html +5 -3
  317. data/doc/lib/Tj3Config_rb.html +5 -3
  318. data/doc/lib/Tj3SheetAppBase_rb.html +5 -3
  319. data/doc/lib/TjException_rb.html +5 -3
  320. data/doc/lib/TjTime_rb.html +5 -3
  321. data/doc/lib/TjpExample_rb.html +5 -3
  322. data/doc/lib/TjpSyntaxRules_rb.html +5 -3
  323. data/doc/lib/URLParameter_rb.html +5 -3
  324. data/doc/lib/UTF8String_rb.html +5 -3
  325. data/doc/lib/UserManual_rb.html +5 -3
  326. data/doc/lib/VimSyntax_rb.html +6 -4
  327. data/doc/lib/WorkingHours_rb.html +5 -3
  328. data/doc/lib/XMLDocument_rb.html +5 -3
  329. data/doc/lib/XMLElement_rb.html +5 -3
  330. data/doc/lib/daemon/Daemon_rb.html +5 -3
  331. data/doc/lib/daemon/ProcessIntercom_rb.html +7 -3
  332. data/doc/lib/daemon/ProjectBroker_rb.html +5 -3
  333. data/doc/lib/daemon/ProjectServer_rb.html +5 -3
  334. data/doc/lib/daemon/ReportServer_rb.html +5 -3
  335. data/doc/lib/daemon/ReportServlet_rb.html +69 -0
  336. data/doc/lib/daemon/WebServer_rb.html +9 -3
  337. data/doc/lib/daemon/WelcomePage_rb.html +71 -0
  338. data/doc/lib/deep_copy_rb.html +5 -3
  339. data/doc/lib/reports/CSVFile_rb.html +5 -3
  340. data/doc/lib/reports/CollisionDetector_rb.html +5 -3
  341. data/doc/lib/reports/ColumnTable_rb.html +5 -3
  342. data/doc/lib/reports/GanttChart_rb.html +5 -3
  343. data/doc/lib/reports/GanttContainer_rb.html +5 -3
  344. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +5 -3
  345. data/doc/lib/reports/GanttHeader_rb.html +5 -3
  346. data/doc/lib/reports/GanttLine_rb.html +5 -3
  347. data/doc/lib/reports/GanttLoadStack_rb.html +5 -3
  348. data/doc/lib/reports/GanttMilestone_rb.html +5 -3
  349. data/doc/lib/reports/GanttRouter_rb.html +5 -3
  350. data/doc/lib/reports/GanttTaskBar_rb.html +5 -3
  351. data/doc/lib/reports/HTMLGraphics_rb.html +5 -3
  352. data/doc/lib/reports/Navigator_rb.html +5 -3
  353. data/doc/lib/reports/NikuReport_rb.html +5 -3
  354. data/doc/lib/reports/ReportBase_rb.html +5 -3
  355. data/doc/lib/reports/ReportContext_rb.html +5 -3
  356. data/doc/lib/reports/ReportTableCell_rb.html +5 -3
  357. data/doc/lib/reports/ReportTableColumn_rb.html +5 -3
  358. data/doc/lib/reports/ReportTableLegend_rb.html +5 -3
  359. data/doc/lib/reports/ReportTableLine_rb.html +5 -3
  360. data/doc/lib/reports/ReportTable_rb.html +5 -3
  361. data/doc/lib/reports/Report_rb.html +5 -3
  362. data/doc/lib/reports/ResourceListRE_rb.html +5 -3
  363. data/doc/lib/reports/StatusSheetReport_rb.html +5 -3
  364. data/doc/lib/reports/TableReport_rb.html +5 -3
  365. data/doc/lib/reports/TaskListRE_rb.html +5 -3
  366. data/doc/lib/reports/TextReport_rb.html +5 -3
  367. data/doc/lib/reports/TimeSheetReport_rb.html +5 -3
  368. data/doc/lib/reports/TjpExportRE_rb.html +5 -3
  369. data/doc/lib/{taskjuggler3_rb.html → tj3_rb.html} +7 -5
  370. data/doc/lib/tj3client_rb.html +5 -3
  371. data/doc/lib/tj3d_rb.html +6 -4
  372. data/doc/lib/tj3man_rb.html +5 -3
  373. data/doc/lib/tj3ss_receiver_rb.html +5 -3
  374. data/doc/lib/tj3ss_sender_rb.html +5 -3
  375. data/doc/lib/tj3ts_receiver_rb.html +5 -3
  376. data/doc/lib/tj3ts_sender_rb.html +5 -3
  377. data/doc/lib/tj3ts_summary_rb.html +5 -3
  378. data/examples/tutorial.tjp +13 -5
  379. data/gem_spec.rb +3 -0
  380. data/lib/Account.rb +2 -1
  381. data/lib/AccountScenario.rb +2 -1
  382. data/lib/Allocation.rb +2 -1
  383. data/lib/AppConfig.rb +2 -1
  384. data/lib/AttributeBase.rb +19 -5
  385. data/lib/AttributeDefinition.rb +2 -1
  386. data/lib/Attributes.rb +49 -38
  387. data/lib/BatchProcessor.rb +2 -1
  388. data/lib/Booking.rb +2 -1
  389. data/lib/Charge.rb +2 -1
  390. data/lib/ChargeSet.rb +2 -1
  391. data/lib/DataCache.rb +15 -1
  392. data/lib/FileList.rb +2 -1
  393. data/lib/HTMLDocument.rb +2 -1
  394. data/lib/Interval.rb +2 -1
  395. data/lib/IntervalList.rb +100 -0
  396. data/lib/Journal.rb +8 -2
  397. data/lib/KeywordArray.rb +2 -1
  398. data/lib/KeywordDocumentation.rb +10 -6
  399. data/lib/Limits.rb +2 -1
  400. data/lib/Log.rb +3 -2
  401. data/lib/LogFile.rb +2 -1
  402. data/lib/LogicalExpression.rb +2 -1
  403. data/lib/LogicalFunction.rb +2 -1
  404. data/lib/LogicalOperation.rb +2 -1
  405. data/lib/MacroTable.rb +2 -1
  406. data/lib/MessageHandler.rb +2 -1
  407. data/lib/Project.rb +92 -25
  408. data/lib/ProjectFileParser.rb +7 -2
  409. data/lib/ProjectFileScanner.rb +2 -1
  410. data/lib/PropertyList.rb +2 -1
  411. data/lib/PropertySet.rb +2 -6
  412. data/lib/PropertyTreeNode.rb +22 -44
  413. data/lib/Query.rb +32 -13
  414. data/lib/RTFHandlers.rb +2 -1
  415. data/lib/RTFNavigator.rb +2 -1
  416. data/lib/RTFQuery.rb +3 -2
  417. data/lib/RTFReport.rb +2 -1
  418. data/lib/RTFReportLink.rb +2 -1
  419. data/lib/RTFWithQuerySupport.rb +2 -1
  420. data/lib/RealFormat.rb +2 -1
  421. data/lib/Resource.rb +2 -1
  422. data/lib/ResourceScenario.rb +35 -14
  423. data/lib/RichText.rb +2 -1
  424. data/lib/RichTextDocument.rb +2 -1
  425. data/lib/RichTextElement.rb +2 -1
  426. data/lib/RichTextFunctionExample.rb +2 -1
  427. data/lib/RichTextFunctionHandler.rb +2 -1
  428. data/lib/RichTextParser.rb +2 -1
  429. data/lib/RichTextScanner.rb +2 -1
  430. data/lib/RichTextSnip.rb +2 -1
  431. data/lib/RichTextSyntaxRules.rb +2 -1
  432. data/lib/RuntimeConfig.rb +2 -1
  433. data/lib/Scenario.rb +2 -1
  434. data/lib/ScenarioData.rb +2 -1
  435. data/lib/Scoreboard.rb +27 -8
  436. data/lib/SheetHandlerBase.rb +2 -1
  437. data/lib/SheetReceiver.rb +2 -1
  438. data/lib/SheetSender.rb +2 -1
  439. data/lib/Shift.rb +2 -1
  440. data/lib/ShiftAssignments.rb +2 -1
  441. data/lib/ShiftScenario.rb +2 -1
  442. data/lib/SimpleQueryExpander.rb +2 -1
  443. data/lib/SourceFileInfo.rb +2 -1
  444. data/lib/StatusSheetReceiver.rb +2 -1
  445. data/lib/StatusSheetSender.rb +2 -1
  446. data/lib/SyntaxReference.rb +2 -1
  447. data/lib/TOCEntry.rb +2 -1
  448. data/lib/TableColumnDefinition.rb +9 -2
  449. data/lib/TableOfContents.rb +2 -1
  450. data/lib/Task.rb +2 -1
  451. data/lib/TaskDependency.rb +2 -1
  452. data/lib/TaskJuggler.rb +8 -6
  453. data/lib/TaskScenario.rb +337 -153
  454. data/lib/TextFormatter.rb +3 -2
  455. data/lib/TextParser.rb +7 -2
  456. data/lib/TextParser/Pattern.rb +2 -1
  457. data/lib/TextParser/Rule.rb +2 -1
  458. data/lib/TextParser/StackElement.rb +2 -1
  459. data/lib/TextParser/State.rb +3 -2
  460. data/lib/TextParser/TokenDoc.rb +2 -1
  461. data/lib/TextScanner.rb +12 -5
  462. data/lib/TimeSheetReceiver.rb +2 -1
  463. data/lib/TimeSheetSender.rb +2 -1
  464. data/lib/TimeSheetSummary.rb +3 -2
  465. data/lib/TimeSheets.rb +2 -1
  466. data/lib/Tj3AppBase.rb +6 -5
  467. data/lib/Tj3Config.rb +5 -4
  468. data/lib/Tj3SheetAppBase.rb +2 -1
  469. data/lib/TjException.rb +2 -1
  470. data/lib/TjTime.rb +2 -1
  471. data/lib/TjpExample.rb +2 -1
  472. data/lib/TjpSyntaxRules.rb +264 -65
  473. data/lib/URLParameter.rb +2 -1
  474. data/lib/UTF8String.rb +2 -1
  475. data/lib/UserManual.rb +2 -1
  476. data/lib/VimSyntax.rb +3 -2
  477. data/lib/WorkingHours.rb +2 -1
  478. data/lib/XMLDocument.rb +2 -1
  479. data/lib/XMLElement.rb +2 -1
  480. data/lib/daemon/Daemon.rb +3 -1
  481. data/lib/daemon/ProcessIntercom.rb +3 -1
  482. data/lib/daemon/ProjectBroker.rb +84 -32
  483. data/lib/daemon/ProjectServer.rb +5 -3
  484. data/lib/daemon/ReportServer.rb +8 -5
  485. data/lib/daemon/ReportServlet.rb +166 -0
  486. data/lib/daemon/WebServer.rb +6 -150
  487. data/lib/daemon/WelcomePage.rb +80 -0
  488. data/lib/deep_copy.rb +2 -1
  489. data/lib/reports/CSVFile.rb +2 -1
  490. data/lib/reports/CollisionDetector.rb +2 -1
  491. data/lib/reports/ColumnTable.rb +2 -1
  492. data/lib/reports/GanttChart.rb +2 -1
  493. data/lib/reports/GanttContainer.rb +3 -4
  494. data/lib/reports/GanttHeader.rb +2 -1
  495. data/lib/reports/GanttHeaderScaleItem.rb +2 -1
  496. data/lib/reports/GanttLine.rb +12 -10
  497. data/lib/reports/GanttLoadStack.rb +2 -1
  498. data/lib/reports/GanttMilestone.rb +3 -3
  499. data/lib/reports/GanttRouter.rb +4 -1
  500. data/lib/reports/GanttTaskBar.rb +9 -7
  501. data/lib/reports/HTMLGraphics.rb +2 -1
  502. data/lib/reports/Navigator.rb +2 -1
  503. data/lib/reports/NikuReport.rb +79 -49
  504. data/lib/reports/Report.rb +42 -10
  505. data/lib/reports/ReportBase.rb +2 -1
  506. data/lib/reports/ReportContext.rb +2 -1
  507. data/lib/reports/ReportTable.rb +2 -1
  508. data/lib/reports/ReportTableCell.rb +63 -28
  509. data/lib/reports/ReportTableColumn.rb +2 -1
  510. data/lib/reports/ReportTableLegend.rb +5 -5
  511. data/lib/reports/ReportTableLine.rb +2 -1
  512. data/lib/reports/ResourceListRE.rb +2 -1
  513. data/lib/reports/StatusSheetReport.rb +4 -2
  514. data/lib/reports/TableReport.rb +42 -38
  515. data/lib/reports/TaskListRE.rb +4 -2
  516. data/lib/reports/TextReport.rb +2 -1
  517. data/lib/reports/TimeSheetReport.rb +4 -2
  518. data/lib/reports/TjpExportRE.rb +4 -2
  519. data/lib/{taskjuggler3.rb → tj3.rb} +6 -5
  520. data/lib/tj3client.rb +19 -36
  521. data/lib/tj3d.rb +6 -2
  522. data/lib/tj3man.rb +4 -3
  523. data/lib/tj3ss_receiver.rb +2 -1
  524. data/lib/tj3ss_sender.rb +2 -1
  525. data/lib/tj3ts_receiver.rb +2 -1
  526. data/lib/tj3ts_sender.rb +2 -1
  527. data/lib/tj3ts_summary.rb +2 -1
  528. data/manual/Day_To_Day_Juggling +36 -0
  529. data/manual/How_To_Contribute +9 -4
  530. data/manual/Installation +10 -3
  531. data/manual/TaskJuggler_Internals +0 -2
  532. data/manual/Tutorial +25 -3
  533. data/prj_cfg.rb +4 -2
  534. data/spec/IntervalList_spec.rb +138 -0
  535. data/spec/ProjectBroker_spec.rb +133 -0
  536. data/tasks/changelog.rake +41 -24
  537. data/tasks/csts.rake +1 -0
  538. data/tasks/gem.rake +1 -0
  539. data/tasks/rcov.rake +1 -1
  540. data/tasks/spec.rake +7 -0
  541. data/tasks/test.rake +1 -0
  542. data/test/MessageChecker.rb +2 -1
  543. data/test/TestSuite/CSV-Reports/niku.tjp +70 -0
  544. data/test/TestSuite/CSV-Reports/{celltext-Reference.csv → refs/celltext.csv} +0 -0
  545. data/test/TestSuite/CSV-Reports/refs/niku.csv +5 -0
  546. data/test/TestSuite/CSV-Reports/{resourcereport-Reference.csv → refs/resourcereport.csv} +0 -0
  547. data/test/TestSuite/CSV-Reports/{resourcereport_with_tasks-Reference.csv → refs/resourcereport_with_tasks.csv} +0 -0
  548. data/test/TestSuite/CSV-Reports/{sortByTree-Reference.csv → refs/sortByTree.csv} +0 -0
  549. data/test/TestSuite/CSV-Reports/{sortBy_duration.down-Reference.csv → refs/sortBy_duration.down.csv} +0 -0
  550. data/test/TestSuite/CSV-Reports/{sortBy_effort.up-Reference.csv → refs/sortBy_effort.up.csv} +0 -0
  551. data/test/TestSuite/CSV-Reports/{sortBy_plan.start.down-Reference.csv → refs/sortBy_plan.start.down.csv} +0 -0
  552. data/test/TestSuite/CSV-Reports/{taskreport-Reference.csv → refs/taskreport.csv} +0 -0
  553. data/test/TestSuite/CSV-Reports/{taskreport_with_resources-Reference.csv → refs/taskreport_with_resources.csv} +0 -0
  554. data/test/TestSuite/CSV-Reports/{weekly-Reference.csv → refs/weekly.csv} +0 -0
  555. data/test/TestSuite/HTML-Reports/Alerts.tjp +12 -0
  556. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +2 -2
  557. data/test/TestSuite/Scheduler/Correct/Container-2.tjp +1 -2
  558. data/test/TestSuite/Scheduler/Correct/InheritedAttributes.tjp +77 -0
  559. data/test/TestSuite/Scheduler/Correct/WeakDeps.tjp +40 -0
  560. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +2 -2
  561. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +3 -4
  562. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +2 -2
  563. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +8 -7
  564. data/test/TestSuite/Scheduler/Errors/onend_wrong_direction.tjp +19 -0
  565. data/test/TestSuite/Scheduler/Errors/onstart_wrong_direction.tjp +18 -0
  566. data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +1 -2
  567. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/boss_2002-03-02.tji +46 -0
  568. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/dev2_2002-03-02.tji +22 -0
  569. data/test/TestSuite/StatusSheets/StatusSheetTemplates/2002-03-02/resources.yml +11 -0
  570. data/test/TestSuite/StatusSheets/StatusSheetTemplates/acceptable_intervals +1 -0
  571. data/test/TestSuite/StatusSheets/sender.log +256 -0
  572. data/test/TestSuite/StatusSheets/statussheets.log +9 -0
  573. data/test/TestSuite/StatusSheets/tj3d.log +395 -0
  574. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +2 -0
  575. data/test/TestSuite/Syntax/Correct/Niku.tjp +6 -1
  576. data/test/TestSuite/Syntax/Correct/Scenario.tjp +4 -1
  577. data/test/TestSuite/Syntax/Correct/Supplement.tjp +12 -5
  578. data/test/TestSuite/Syntax/Correct/TaskPrefix.tji +3 -0
  579. data/test/TestSuite/Syntax/Correct/TaskPrefix.tjp +24 -0
  580. data/test/TestSuite/Syntax/Correct/css/tjreport.css +7 -2
  581. data/test/TestSuite/Syntax/Correct/tutorial.tjp +15 -5
  582. data/test/all.rb +2 -4
  583. data/test/test_BatchProcessor.rb +2 -1
  584. data/test/test_CSV-Reports.rb +34 -23
  585. data/test/test_CSVFile.rb +2 -1
  586. data/test/test_CollisionDetector.rb +3 -2
  587. data/test/test_Journal.rb +2 -1
  588. data/test/test_Limits.rb +2 -1
  589. data/test/test_LogicalExpression.rb +2 -1
  590. data/test/test_MacroTable.rb +2 -1
  591. data/test/test_Project.rb +3 -2
  592. data/test/test_ProjectFileScanner.rb +2 -1
  593. data/test/test_PropertySet.rb +2 -1
  594. data/test/test_Query.rb +2 -1
  595. data/test/test_RealFormat.rb +2 -1
  596. data/test/test_ReportGenerator.rb +2 -1
  597. data/test/test_RichText.rb +2 -1
  598. data/test/test_Scheduler.rb +2 -1
  599. data/test/test_ShiftAssignments.rb +2 -1
  600. data/test/test_SimpleQueryExpander.rb +2 -1
  601. data/test/test_Syntax.rb +2 -1
  602. data/test/test_TextFormatter.rb +3 -2
  603. data/test/test_TjTime.rb +2 -1
  604. data/test/test_TjpExample.rb +2 -1
  605. data/test/test_URLParameter.rb +2 -1
  606. data/test/test_UTF8String.rb +2 -1
  607. data/test/test_WorkingHours.rb +2 -1
  608. data/test/test_deep_copy.rb +2 -1
  609. metadata +74 -20
  610. data/doc/StringIO.html +0 -595
  611. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +0 -46
  612. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +0 -51
  613. data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +0 -11
@@ -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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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
  # = RichTextParser.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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
  # = RichTextScanner.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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
  # = RichTextSyntaxRules.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 Array of [
110
- # start, end ] TjTime values.
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
- startIdx = dateToIdx(iv.start, true)
114
- endIdx = dateToIdx(iv.end, true)
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 << [ idxToDate(start), idxToDate(idx) ]
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
@@ -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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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
  # = ShiftAssignments.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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
  # = SimpleQueryExpander.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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
  # = SourceFileInfo.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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
  # = StatusSheetReceiver.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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
  # = StatusSheetSender.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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
  # = SyntaxReference.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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, :width, :content, :column
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'
@@ -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 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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
  # = TaskDependency.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
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 by Chris Schlaeger <cs@kde.org>
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. _dynamicAtributes_ is a String that may
170
- # contain attributes to supplement the report definition. The String must be
171
- # in TJP format and may be nil if no additional attributes are provided.
172
- def generateReport(reportId, regExpMode, dynamicAttributes = nil)
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 by Chris Schlaeger <cs@kde.org>
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 allocations.")
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
- if a('fail') && a('fail').eval(query)
537
- error('task_fail_check',
538
- "User defined check failed for task #{@property.fullId} \n" +
539
- "Condition: #{a('fail').to_s}\n" +
540
- "Result: #{a('fail').to_s(query)}")
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
- if a('warn') && a('warn').eval(query)
543
- warning('task_warn_check',
544
- "User defined warning triggered for task " +
545
- "#{@property.fullId} \n" +
546
- "Condition: #{a('warn').to_s}\n" +
547
- "Result: #{a('warn').to_s(query)}")
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
- def checkForLoops(path, atEnd, fromOutside)
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
- checkForLoops(path, true, false) # if a('forward')
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
- checkForLoops(path, false, false) # unless a('forward')
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
- @property[thisEnd, @scenarioIdx] = date if @property.leaf?
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
- a(thisEnd + 'preds').each do |task, onEnd|
916
- propagateDateToDep(task, onEnd)
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(thisEnd + 'succs').each do |task, onEnd|
919
- propagateDateToDep(task, onEnd)
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
- # - --> - inherit start and end when no bookings but allocations
943
- # present
944
- # - <-- - dito
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
- # - x-> - inhS
947
- # - x-> | inhS
948
- # - x-> -D inhS
949
- # - x-> |D inhS
950
- # - --> | inhS
951
- # - --> -D inhS
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
- thatEnd = atEnd ? 'start' : 'end'
973
- hasThatDeps = !a(thatEnd + 'preds').empty? || !a(thatEnd + 'succs').empty?
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? && !a('allocate').empty?
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? || !a('booking').empty?
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
- str = ''
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
- taskEnd = task['end', query.scenarioIdx].to_s(query.timeFormat)
1241
- str += "<nowiki>[->]</nowiki> #{taskEnd}"
1276
+ date = task['end', query.scenarioIdx].to_s(query.timeFormat)
1277
+ dep "[->]"
1242
1278
  else
1243
- taskStart = task['start', query.scenarioIdx].to_s(query.timeFormat)
1244
- str += "<nowiki>[->[</nowiki> #{taskStart}"
1279
+ date = task['start', query.scenarioIdx].to_s(query.timeFormat)
1280
+ dep "[->["
1245
1281
  end
1246
- str += "\n"
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
- taskEnd = task['end', query.scenarioIdx].to_s(query.timeFormat)
1253
- str += "<nowiki>]->]</nowiki> #{taskEnd}"
1287
+ date = task['end', query.scenarioIdx].to_s(query.timeFormat)
1288
+ dep = "]->]"
1254
1289
  else
1255
- taskStart = task['start', query.scenarioIdx].to_s(query.timeFormat)
1256
- str += "<nowiki>]->[</nowiki> #{taskStart}"
1290
+ date = task['start', query.scenarioIdx].to_s(query.timeFormat)
1291
+ dep = "]->["
1257
1292
  end
1258
- str += "\n"
1293
+ list << generateDepencyListItem(query.listMode, task, dep, date)
1259
1294
  end
1260
1295
 
1261
- rText = RichText.new(str, [], @property.project.messageHandler)
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
- str = ''
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
- taskEnd = task['end', query.scenarioIdx].to_s(query.timeFormat)
1276
- str += "<nowiki>]->]</nowiki> #{taskEnd}"
1305
+ date = task['end', query.scenarioIdx].to_s(query.timeFormat)
1306
+ dep = "]->["
1277
1307
  else
1278
- taskStart = task['start', query.scenarioIdx].to_s(query.timeFormat)
1279
- str += "<nowiki>[->[</nowiki> #{taskStart}"
1308
+ date = task['start', query.scenarioIdx].to_s(query.timeFormat)
1309
+ dep = "[->["
1280
1310
  end
1281
- str += "\n"
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
- taskEnd = task['end', query.scenarioIdx].to_s(query.timeFormat)
1288
- str += "<nowiki>[->]</nowiki> #{taskEnd}"
1316
+ date = task['end', query.scenarioIdx].to_s(query.timeFormat)
1317
+ dep = "]->]"
1289
1318
  else
1290
- taskStart = task['start', query.scenarioIdx].to_s(query.timeFormat)
1291
- str += "<nowiki>]->[</nowiki> #{taskStart}"
1319
+ date = task['start', query.scenarioIdx].to_s(query.timeFormat)
1320
+ dep = "[->]"
1292
1321
  end
1293
- str += "\n"
1322
+ list << generateDepencyListItem(query.listMode, task, dep, date)
1294
1323
  end
1295
1324
 
1296
- rText = RichText.new(str)
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
- list = ''
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
- list += ', ' unless list.empty?
1310
- list += "#{resource.name} (#{resource.fullId})"
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.sortable = query.string = list
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
- res = ''
1388
+ list = []
1351
1389
  targetList.each do |task|
1352
1390
  date = task['start', @scenarioIdx].to_s(@property.project['timeFormat'])
1353
- res += "# #{task.name} (#{task.fullId}) #{date}\n"
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
- rText = RichText.new(res)
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
- allocatedTime = @dCache.load(key)
1368
- return allocatedTime if allocatedTime
1369
-
1370
- allocatedTime = 0.0
1371
- if @property.container?
1372
- @property.children.each do |task|
1373
- allocatedTime += task.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
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
- a('assignedresources').each do |r|
1383
- allocatedTime += r.getAllocatedTime(@scenarioIdx, startIdx, endIdx,
1384
- @property)
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
- workLoad = @dCache.load(key)
1400
- return workLoad if workLoad
1401
-
1402
- workLoad = 0.0
1403
- if @property.container?
1404
- @property.children.each do |task|
1405
- workLoad += task.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
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
- a('assignedresources').each do |r|
1414
- workLoad += r.getEffectiveWork(@scenarioIdx, startIdx, endIdx,
1415
- @property)
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
- if a('shifts')
1426
- a('shifts').collectTimeOffIntervals(iv, minDuration)
1427
- else
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 scheduled
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
- tList << [ task, onEnd ] unless tList.include?([ task, onEnd ])
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 |task, onEnd|
1956
- if (criticalness = task.calcPathCriticalness(@scenarioIdx, onEnd)) >
1957
- maxCriticalness
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