taskjuggler 0.0.5 → 0.0.6

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 (544) hide show
  1. data/CHANGELOG +2086 -0
  2. data/benchmarks/666tasks.tjp +3183 -0
  3. data/benchmarks/booking.tjp +14 -10
  4. data/doc/AppConfig.html +95 -73
  5. data/doc/Arguments.html +22 -2
  6. data/doc/CHANGELOG.html +2587 -0
  7. data/doc/COPYING.html +21 -1
  8. data/doc/Object.html +161 -122
  9. data/doc/README.html +21 -1
  10. data/doc/RuntimeConfig.html +26 -6
  11. data/doc/String.html +38 -18
  12. data/doc/StringIO.html +579 -0
  13. data/doc/TaskJuggler.html +251 -143
  14. data/doc/TaskJuggler/Account.html +26 -6
  15. data/doc/TaskJuggler/AccountAttribute.html +28 -8
  16. data/doc/TaskJuggler/AccountScenario.html +24 -4
  17. data/doc/TaskJuggler/Allocation.html +30 -10
  18. data/doc/TaskJuggler/AllocationAttribute.html +28 -8
  19. data/doc/TaskJuggler/AttributeBase.html +46 -26
  20. data/doc/TaskJuggler/AttributeDefinition.html +22 -2
  21. data/doc/TaskJuggler/BatchProcessor.html +40 -20
  22. data/doc/TaskJuggler/Booking.html +26 -6
  23. data/doc/TaskJuggler/BookingListAttribute.html +28 -8
  24. data/doc/TaskJuggler/BooleanAttribute.html +28 -8
  25. data/doc/TaskJuggler/CSVFile.html +308 -146
  26. data/doc/TaskJuggler/CellSettingPattern.html +22 -2
  27. data/doc/TaskJuggler/CellSettingPatternList.html +26 -6
  28. data/doc/TaskJuggler/Charge.html +26 -6
  29. data/doc/TaskJuggler/ChargeListAttribute.html +26 -6
  30. data/doc/TaskJuggler/ChargeSet.html +33 -13
  31. data/doc/TaskJuggler/ChargeSetListAttribute.html +28 -8
  32. data/doc/TaskJuggler/ColumnListAttribute.html +26 -6
  33. data/doc/TaskJuggler/ColumnTable.html +24 -4
  34. data/doc/TaskJuggler/Daemon.html +26 -6
  35. data/doc/TaskJuggler/DateAttribute.html +26 -6
  36. data/doc/TaskJuggler/DefinitionListAttribute.html +22 -2
  37. data/doc/TaskJuggler/DependencyListAttribute.html +28 -8
  38. data/doc/TaskJuggler/DurationAttribute.html +28 -8
  39. data/doc/TaskJuggler/FixnumAttribute.html +24 -4
  40. data/doc/TaskJuggler/FlagListAttribute.html +28 -8
  41. data/doc/TaskJuggler/FloatAttribute.html +26 -6
  42. data/doc/TaskJuggler/FormatListAttribute.html +24 -4
  43. data/doc/TaskJuggler/GanttChart.html +147 -126
  44. data/doc/TaskJuggler/GanttContainer.html +34 -14
  45. data/doc/TaskJuggler/GanttHeader.html +28 -8
  46. data/doc/TaskJuggler/GanttHeaderScaleItem.html +24 -4
  47. data/doc/TaskJuggler/GanttLine.html +38 -18
  48. data/doc/TaskJuggler/GanttLoadStack.html +26 -6
  49. data/doc/TaskJuggler/GanttMilestone.html +34 -14
  50. data/doc/TaskJuggler/GanttRouter.html +50 -30
  51. data/doc/TaskJuggler/GanttTaskBar.html +34 -14
  52. data/doc/TaskJuggler/HTMLDocument.html +26 -6
  53. data/doc/TaskJuggler/HTMLGraphics.html +30 -10
  54. data/doc/TaskJuggler/Interval.html +40 -22
  55. data/doc/TaskJuggler/IntervalListAttribute.html +28 -8
  56. data/doc/TaskJuggler/JobInfo.html +24 -4
  57. data/doc/TaskJuggler/Journal.html +226 -147
  58. data/doc/TaskJuggler/JournalEntry.html +22 -2
  59. data/doc/TaskJuggler/JournalEntryList.html +129 -112
  60. data/doc/TaskJuggler/KeywordArray.html +26 -6
  61. data/doc/TaskJuggler/KeywordDocumentation.html +46 -26
  62. data/doc/TaskJuggler/Limits.html +152 -123
  63. data/doc/TaskJuggler/Limits/Limit.html +149 -70
  64. data/doc/TaskJuggler/LimitsAttribute.html +36 -51
  65. data/doc/TaskJuggler/ListAttributeBase.html +24 -4
  66. data/doc/TaskJuggler/Log.html +50 -32
  67. data/doc/TaskJuggler/LogFile.html +37 -17
  68. data/doc/TaskJuggler/LogicalAttribute.html +53 -33
  69. data/doc/TaskJuggler/LogicalExpression.html +26 -6
  70. data/doc/TaskJuggler/LogicalExpressionAttribute.html +32 -12
  71. data/doc/TaskJuggler/LogicalFlag.html +42 -22
  72. data/doc/TaskJuggler/LogicalFunction.html +204 -140
  73. data/doc/TaskJuggler/LogicalOperation.html +135 -111
  74. data/doc/TaskJuggler/Macro.html +22 -2
  75. data/doc/TaskJuggler/MacroParser.html +32 -12
  76. data/doc/TaskJuggler/MacroTable.html +32 -12
  77. data/doc/TaskJuggler/ManagerResponsibilities.html +24 -4
  78. data/doc/TaskJuggler/ManagerStatusRecord.html +24 -4
  79. data/doc/TaskJuggler/Message.html +24 -4
  80. data/doc/TaskJuggler/MessageHandler.html +24 -4
  81. data/doc/TaskJuggler/Navigator.html +104 -71
  82. data/doc/TaskJuggler/NavigatorElement.html +32 -12
  83. data/doc/TaskJuggler/NikuProject.html +22 -2
  84. data/doc/TaskJuggler/NikuReport.html +310 -228
  85. data/doc/TaskJuggler/NikuResource.html +22 -2
  86. data/doc/TaskJuggler/NodeListAttribute.html +615 -0
  87. data/doc/TaskJuggler/OnShiftCache.html +32 -12
  88. data/doc/TaskJuggler/ProcessIntercom.html +205 -78
  89. data/doc/TaskJuggler/ProcessIntercomIface.html +26 -6
  90. data/doc/TaskJuggler/Project.html +708 -660
  91. data/doc/TaskJuggler/ProjectBroker.html +506 -304
  92. data/doc/TaskJuggler/ProjectBrokerIface.html +61 -41
  93. data/doc/TaskJuggler/ProjectFileParser.html +429 -373
  94. data/doc/TaskJuggler/ProjectFileScanner.html +1790 -0
  95. data/doc/TaskJuggler/ProjectRecord.html +80 -60
  96. data/doc/TaskJuggler/ProjectServer.html +312 -237
  97. data/doc/TaskJuggler/ProjectServerIface.html +101 -43
  98. data/doc/TaskJuggler/PropertyAttribute.html +32 -12
  99. data/doc/TaskJuggler/PropertyList.html +166 -145
  100. data/doc/TaskJuggler/PropertySet.html +254 -224
  101. data/doc/TaskJuggler/PropertyTreeNode.html +670 -536
  102. data/doc/TaskJuggler/Query.html +169 -148
  103. data/doc/TaskJuggler/RTFHandlers.html +622 -0
  104. data/doc/TaskJuggler/RTFNavigator.html +28 -8
  105. data/doc/TaskJuggler/RTFQuery.html +40 -20
  106. data/doc/TaskJuggler/RTFReport.html +62 -25
  107. data/doc/TaskJuggler/RTFReportLink.html +765 -0
  108. data/doc/TaskJuggler/RealFormat.html +26 -6
  109. data/doc/TaskJuggler/RealFormatAttribute.html +26 -6
  110. data/doc/TaskJuggler/ReferenceAttribute.html +59 -39
  111. data/doc/TaskJuggler/Report.html +402 -251
  112. data/doc/TaskJuggler/ReportBase.html +162 -137
  113. data/doc/TaskJuggler/ReportContext.html +112 -29
  114. data/doc/TaskJuggler/ReportServer.html +89 -64
  115. data/doc/TaskJuggler/ReportServerIface.html +75 -55
  116. data/doc/TaskJuggler/ReportServerRecord.html +54 -31
  117. data/doc/TaskJuggler/ReportServlet.html +980 -0
  118. data/doc/TaskJuggler/ReportTable.html +41 -21
  119. data/doc/TaskJuggler/ReportTableCell.html +214 -170
  120. data/doc/TaskJuggler/ReportTableColumn.html +30 -10
  121. data/doc/TaskJuggler/ReportTableLegend.html +36 -16
  122. data/doc/TaskJuggler/ReportTableLine.html +32 -12
  123. data/doc/TaskJuggler/Resource.html +99 -87
  124. data/doc/TaskJuggler/ResourceListAttribute.html +59 -39
  125. data/doc/TaskJuggler/ResourceListRE.html +47 -26
  126. data/doc/TaskJuggler/ResourceScenario.html +403 -437
  127. data/doc/TaskJuggler/RichText.html +26 -6
  128. data/doc/TaskJuggler/RichTextAttribute.html +50 -30
  129. data/doc/TaskJuggler/RichTextDocument.html +37 -17
  130. data/doc/TaskJuggler/RichTextElement.html +475 -413
  131. data/doc/TaskJuggler/RichTextException.html +22 -2
  132. data/doc/TaskJuggler/RichTextFunctionExample.html +28 -8
  133. data/doc/TaskJuggler/RichTextFunctionHandler.html +24 -4
  134. data/doc/TaskJuggler/RichTextImage.html +22 -2
  135. data/doc/TaskJuggler/RichTextIntermediate.html +38 -18
  136. data/doc/TaskJuggler/RichTextParser.html +56 -34
  137. data/doc/TaskJuggler/RichTextScanner.html +82 -61
  138. data/doc/TaskJuggler/RichTextSnip.html +34 -14
  139. data/doc/TaskJuggler/RichTextSyntaxRules.html +507 -353
  140. data/doc/TaskJuggler/Scenario.html +22 -2
  141. data/doc/TaskJuggler/ScenarioData.html +30 -46
  142. data/doc/TaskJuggler/ScenarioListAttribute.html +38 -18
  143. data/doc/TaskJuggler/Scoreboard.html +42 -22
  144. data/doc/TaskJuggler/SheetHandlerBase.html +40 -20
  145. data/doc/TaskJuggler/SheetReceiver.html +333 -295
  146. data/doc/TaskJuggler/SheetSender.html +253 -230
  147. data/doc/TaskJuggler/Shift.html +26 -6
  148. data/doc/TaskJuggler/ShiftAssignment.html +89 -73
  149. data/doc/TaskJuggler/ShiftAssignments.html +226 -234
  150. data/doc/TaskJuggler/ShiftAssignmentsAttribute.html +39 -54
  151. data/doc/TaskJuggler/ShiftScenario.html +28 -8
  152. data/doc/TaskJuggler/SortListAttribute.html +34 -14
  153. data/doc/TaskJuggler/SourceFileInfo.html +24 -4
  154. data/doc/TaskJuggler/StatusSheetReceiver.html +24 -3
  155. data/doc/TaskJuggler/StatusSheetReport.html +168 -153
  156. data/doc/TaskJuggler/StatusSheetSender.html +24 -3
  157. data/doc/TaskJuggler/StringAttribute.html +38 -18
  158. data/doc/TaskJuggler/SymbolAttribute.html +32 -12
  159. data/doc/TaskJuggler/SyntaxReference.html +40 -20
  160. data/doc/TaskJuggler/TOCEntry.html +26 -6
  161. data/doc/TaskJuggler/TSResourceRecord.html +22 -2
  162. data/doc/TaskJuggler/TSTaskRecord.html +22 -2
  163. data/doc/TaskJuggler/TableColumnDefinition.html +59 -22
  164. data/doc/TaskJuggler/TableOfContents.html +26 -6
  165. data/doc/TaskJuggler/TableReport.html +937 -904
  166. data/doc/TaskJuggler/Task.html +55 -36
  167. data/doc/TaskJuggler/TaskDependency.html +24 -4
  168. data/doc/TaskJuggler/TaskListAttribute.html +50 -30
  169. data/doc/TaskJuggler/TaskListRE.html +27 -7
  170. data/doc/TaskJuggler/TaskScenario.html +1273 -1153
  171. data/doc/TaskJuggler/TextFormatter.html +28 -8
  172. data/doc/TaskJuggler/TextParser.html +585 -338
  173. data/doc/TaskJuggler/TextParser/Pattern.html +54 -34
  174. data/doc/TaskJuggler/TextParser/Rule.html +95 -73
  175. data/doc/TaskJuggler/TextParser/StackElement.html +39 -17
  176. data/doc/TaskJuggler/TextParser/TextParserResultArray.html +24 -4
  177. data/doc/TaskJuggler/TextParser/TokenDoc.html +22 -2
  178. data/doc/TaskJuggler/TextReport.html +28 -8
  179. data/doc/TaskJuggler/TextScanner.html +400 -1404
  180. data/doc/TaskJuggler/TextScanner/BufferStreamHandle.html +28 -240
  181. data/doc/TaskJuggler/TextScanner/FileStreamHandle.html +37 -184
  182. data/doc/TaskJuggler/TextScanner/MacroStackEntry.html +682 -0
  183. data/doc/TaskJuggler/TextScanner/StreamHandle.html +342 -67
  184. data/doc/TaskJuggler/TimeSheet.html +48 -28
  185. data/doc/TaskJuggler/TimeSheetReceiver.html +24 -3
  186. data/doc/TaskJuggler/TimeSheetRecord.html +47 -27
  187. data/doc/TaskJuggler/TimeSheetReport.html +154 -133
  188. data/doc/TaskJuggler/TimeSheetSender.html +24 -3
  189. data/doc/TaskJuggler/TimeSheetSummary.html +137 -91
  190. data/doc/TaskJuggler/TimeSheets.html +26 -6
  191. data/doc/TaskJuggler/Tj3AppBase.html +85 -58
  192. data/doc/TaskJuggler/Tj3Client.html +292 -238
  193. data/doc/TaskJuggler/Tj3Daemon.html +159 -74
  194. data/doc/TaskJuggler/Tj3SheetAppBase.html +26 -6
  195. data/doc/TaskJuggler/Tj3SsReceiver.html +26 -6
  196. data/doc/TaskJuggler/Tj3SsSender.html +53 -26
  197. data/doc/TaskJuggler/Tj3TsReceiver.html +28 -7
  198. data/doc/TaskJuggler/Tj3TsSender.html +26 -6
  199. data/doc/TaskJuggler/Tj3TsSummary.html +26 -6
  200. data/doc/TaskJuggler/TjException.html +22 -2
  201. data/doc/TaskJuggler/TjTime.html +216 -160
  202. data/doc/TaskJuggler/TjpExample.html +34 -14
  203. data/doc/TaskJuggler/TjpExportRE.html +403 -407
  204. data/doc/TaskJuggler/TjpSyntaxRules.html +4805 -4408
  205. data/doc/TaskJuggler/URLParameter.html +649 -0
  206. data/doc/TaskJuggler/UserManual.html +42 -22
  207. data/doc/TaskJuggler/WebServer.html +702 -0
  208. data/doc/TaskJuggler/WorkingHours.html +38 -18
  209. data/doc/TaskJuggler/WorkingHoursAttribute.html +61 -41
  210. data/doc/TaskJuggler/XMLBlob.html +24 -4
  211. data/doc/TaskJuggler/XMLComment.html +24 -4
  212. data/doc/TaskJuggler/XMLDocument.html +30 -10
  213. data/doc/TaskJuggler/XMLElement.html +34 -14
  214. data/doc/TaskJuggler/XMLNamedText.html +22 -2
  215. data/doc/TaskJuggler/XMLText.html +24 -4
  216. data/doc/index.html +1841 -1666
  217. data/doc/lib/AccountScenario_rb.html +1 -1
  218. data/doc/lib/Account_rb.html +1 -1
  219. data/doc/lib/Allocation_rb.html +1 -1
  220. data/doc/lib/AppConfig_rb.html +2 -2
  221. data/doc/lib/AttributeBase_rb.html +1 -1
  222. data/doc/lib/AttributeDefinition_rb.html +1 -1
  223. data/doc/lib/Attributes_rb.html +2 -2
  224. data/doc/lib/BatchProcessor_rb.html +1 -1
  225. data/doc/lib/Booking_rb.html +1 -1
  226. data/doc/lib/ChargeSet_rb.html +1 -1
  227. data/doc/lib/Charge_rb.html +1 -1
  228. data/doc/lib/HTMLDocument_rb.html +1 -1
  229. data/doc/lib/Interval_rb.html +1 -1
  230. data/doc/lib/Journal_rb.html +2 -2
  231. data/doc/lib/KeywordArray_rb.html +1 -1
  232. data/doc/lib/KeywordDocumentation_rb.html +1 -1
  233. data/doc/lib/Limits_rb.html +2 -2
  234. data/doc/lib/LogFile_rb.html +2 -2
  235. data/doc/lib/Log_rb.html +1 -1
  236. data/doc/lib/LogicalExpression_rb.html +1 -1
  237. data/doc/lib/LogicalFunction_rb.html +2 -2
  238. data/doc/lib/LogicalOperation_rb.html +2 -2
  239. data/doc/lib/MacroParser_rb.html +1 -1
  240. data/doc/lib/MacroTable_rb.html +1 -1
  241. data/doc/lib/MessageHandler_rb.html +1 -1
  242. data/doc/lib/Message_rb.html +1 -1
  243. data/doc/lib/ProjectFileParser_rb.html +4 -8
  244. data/doc/lib/ProjectFileScanner_rb.html +67 -0
  245. data/doc/lib/Project_rb.html +2 -2
  246. data/doc/lib/PropertyList_rb.html +2 -2
  247. data/doc/lib/PropertySet_rb.html +2 -2
  248. data/doc/lib/PropertyTreeNode_rb.html +2 -2
  249. data/doc/lib/Query_rb.html +2 -2
  250. data/doc/lib/RTFHandlers_rb.html +73 -0
  251. data/doc/lib/RTFNavigator_rb.html +1 -1
  252. data/doc/lib/RTFQuery_rb.html +1 -1
  253. data/doc/lib/RTFReportLink_rb.html +71 -0
  254. data/doc/lib/RTFReport_rb.html +2 -2
  255. data/doc/lib/RealFormat_rb.html +1 -1
  256. data/doc/lib/ResourceScenario_rb.html +2 -2
  257. data/doc/lib/Resource_rb.html +2 -2
  258. data/doc/lib/RichTextDocument_rb.html +1 -1
  259. data/doc/lib/RichTextElement_rb.html +2 -2
  260. data/doc/lib/RichTextFunctionExample_rb.html +1 -1
  261. data/doc/lib/RichTextFunctionHandler_rb.html +1 -1
  262. data/doc/lib/RichTextParser_rb.html +2 -2
  263. data/doc/lib/RichTextScanner_rb.html +2 -2
  264. data/doc/lib/RichTextSnip_rb.html +1 -1
  265. data/doc/lib/RichTextSyntaxRules_rb.html +2 -2
  266. data/doc/lib/RichText_rb.html +1 -1
  267. data/doc/lib/RuntimeConfig_rb.html +1 -1
  268. data/doc/lib/ScenarioData_rb.html +2 -2
  269. data/doc/lib/Scenario_rb.html +1 -1
  270. data/doc/lib/Scoreboard_rb.html +1 -1
  271. data/doc/lib/SheetHandlerBase_rb.html +1 -1
  272. data/doc/lib/SheetReceiver_rb.html +2 -2
  273. data/doc/lib/SheetSender_rb.html +4 -2
  274. data/doc/lib/ShiftAssignments_rb.html +4 -2
  275. data/doc/lib/ShiftScenario_rb.html +1 -1
  276. data/doc/lib/Shift_rb.html +1 -1
  277. data/doc/lib/SourceFileInfo_rb.html +1 -1
  278. data/doc/lib/StatusSheetReceiver_rb.html +2 -2
  279. data/doc/lib/StatusSheetSender_rb.html +2 -2
  280. data/doc/lib/SyntaxReference_rb.html +1 -1
  281. data/doc/lib/TOCEntry_rb.html +1 -1
  282. data/doc/lib/TableColumnDefinition_rb.html +2 -2
  283. data/doc/lib/TableOfContents_rb.html +1 -1
  284. data/doc/lib/TaskDependency_rb.html +1 -1
  285. data/doc/lib/TaskJuggler_rb.html +2 -2
  286. data/doc/lib/TaskScenario_rb.html +2 -2
  287. data/doc/lib/Task_rb.html +2 -2
  288. data/doc/lib/TextFormatter_rb.html +1 -1
  289. data/doc/lib/TextParser/Pattern_rb.html +1 -1
  290. data/doc/lib/TextParser/Rule_rb.html +2 -2
  291. data/doc/lib/TextParser/StackElement_rb.html +2 -2
  292. data/doc/lib/TextParser/TokenDoc_rb.html +1 -1
  293. data/doc/lib/TextParser_rb.html +2 -2
  294. data/doc/lib/TextScanner_rb.html +6 -2
  295. data/doc/lib/TimeSheetReceiver_rb.html +2 -2
  296. data/doc/lib/TimeSheetSender_rb.html +2 -2
  297. data/doc/lib/TimeSheetSummary_rb.html +2 -2
  298. data/doc/lib/TimeSheets_rb.html +2 -2
  299. data/doc/lib/Tj3AppBase_rb.html +2 -2
  300. data/doc/lib/Tj3Config_rb.html +2 -2
  301. data/doc/lib/Tj3SheetAppBase_rb.html +2 -2
  302. data/doc/lib/TjException_rb.html +1 -1
  303. data/doc/lib/TjTime_rb.html +2 -2
  304. data/doc/lib/TjpExample_rb.html +1 -1
  305. data/doc/lib/TjpSyntaxRules_rb.html +2 -2
  306. data/doc/lib/URLParameter_rb.html +67 -0
  307. data/doc/lib/UTF8String_rb.html +1 -1
  308. data/doc/lib/UserManual_rb.html +1 -1
  309. data/doc/lib/WorkingHours_rb.html +1 -1
  310. data/doc/lib/XMLDocument_rb.html +2 -2
  311. data/doc/lib/XMLElement_rb.html +1 -1
  312. data/doc/lib/daemon/Daemon_rb.html +1 -1
  313. data/doc/lib/daemon/ProcessIntercom_rb.html +2 -2
  314. data/doc/lib/daemon/ProjectBroker_rb.html +4 -2
  315. data/doc/lib/daemon/ProjectServer_rb.html +2 -2
  316. data/doc/lib/daemon/ReportServer_rb.html +2 -2
  317. data/doc/lib/daemon/WebServer_rb.html +75 -0
  318. data/doc/lib/deep_copy_rb.html +2 -2
  319. data/doc/lib/reports/CSVFile_rb.html +2 -2
  320. data/doc/lib/reports/ColumnTable_rb.html +1 -1
  321. data/doc/lib/reports/GanttChart_rb.html +2 -2
  322. data/doc/lib/reports/GanttContainer_rb.html +1 -1
  323. data/doc/lib/reports/GanttHeaderScaleItem_rb.html +1 -1
  324. data/doc/lib/reports/GanttHeader_rb.html +1 -1
  325. data/doc/lib/reports/GanttLine_rb.html +1 -1
  326. data/doc/lib/reports/GanttLoadStack_rb.html +1 -1
  327. data/doc/lib/reports/GanttMilestone_rb.html +1 -1
  328. data/doc/lib/reports/GanttRouter_rb.html +1 -1
  329. data/doc/lib/reports/GanttTaskBar_rb.html +1 -1
  330. data/doc/lib/reports/HTMLGraphics_rb.html +1 -1
  331. data/doc/lib/reports/Navigator_rb.html +2 -2
  332. data/doc/lib/reports/NikuReport_rb.html +2 -2
  333. data/doc/lib/reports/ReportBase_rb.html +2 -2
  334. data/doc/lib/reports/ReportContext_rb.html +2 -2
  335. data/doc/lib/reports/ReportTableCell_rb.html +2 -2
  336. data/doc/lib/reports/ReportTableColumn_rb.html +1 -1
  337. data/doc/lib/reports/ReportTableLegend_rb.html +1 -1
  338. data/doc/lib/reports/ReportTableLine_rb.html +1 -1
  339. data/doc/lib/reports/ReportTable_rb.html +2 -2
  340. data/doc/lib/reports/Report_rb.html +2 -2
  341. data/doc/lib/reports/ResourceListRE_rb.html +2 -2
  342. data/doc/lib/reports/StatusSheetReport_rb.html +2 -2
  343. data/doc/lib/reports/TableReport_rb.html +2 -2
  344. data/doc/lib/reports/TaskListRE_rb.html +2 -2
  345. data/doc/lib/reports/TextReport_rb.html +1 -1
  346. data/doc/lib/reports/TimeSheetReport_rb.html +2 -2
  347. data/doc/lib/reports/TjpExportRE_rb.html +2 -2
  348. data/doc/lib/ruby-signal-bug_rb.html +1 -1
  349. data/doc/lib/taskjuggler3_rb.html +2 -2
  350. data/doc/lib/tj3client_rb.html +2 -2
  351. data/doc/lib/tj3d_rb.html +2 -2
  352. data/doc/lib/tj3man_rb.html +1 -1
  353. data/doc/lib/tj3ss_receiver_rb.html +1 -1
  354. data/doc/lib/tj3ss_sender_rb.html +2 -2
  355. data/doc/lib/tj3ts_receiver_rb.html +2 -2
  356. data/doc/lib/tj3ts_sender_rb.html +1 -1
  357. data/doc/lib/tj3ts_summary_rb.html +1 -1
  358. data/doc/rdoc.css +9 -4
  359. data/examples/tutorial.tjp +17 -15
  360. data/gem_spec.rb +3 -0
  361. data/lib/AppConfig.rb +3 -1
  362. data/lib/Attributes.rb +10 -8
  363. data/lib/Journal.rb +55 -20
  364. data/lib/Limits.rb +72 -46
  365. data/lib/LogFile.rb +3 -3
  366. data/lib/LogicalFunction.rb +19 -6
  367. data/lib/LogicalOperation.rb +5 -1
  368. data/lib/Project.rb +37 -9
  369. data/lib/ProjectFileParser.rb +25 -22
  370. data/lib/ProjectFileScanner.rb +365 -0
  371. data/lib/PropertyList.rb +2 -1
  372. data/lib/PropertySet.rb +14 -4
  373. data/lib/PropertyTreeNode.rb +42 -29
  374. data/lib/Query.rb +3 -1
  375. data/lib/RTFHandlers.rb +35 -0
  376. data/lib/RTFReport.rb +23 -6
  377. data/lib/RTFReportLink.rb +72 -0
  378. data/lib/Resource.rb +8 -16
  379. data/lib/ResourceScenario.rb +1 -22
  380. data/lib/RichTextElement.rb +42 -0
  381. data/lib/RichTextParser.rb +6 -4
  382. data/lib/RichTextScanner.rb +5 -5
  383. data/lib/RichTextSyntaxRules.rb +48 -10
  384. data/lib/ScenarioData.rb +5 -3
  385. data/lib/SheetReceiver.rb +24 -6
  386. data/lib/SheetSender.rb +17 -13
  387. data/lib/ShiftAssignments.rb +56 -52
  388. data/lib/StatusSheetReceiver.rb +1 -0
  389. data/lib/StatusSheetSender.rb +1 -0
  390. data/lib/TableColumnDefinition.rb +4 -2
  391. data/lib/Task.rb +8 -9
  392. data/lib/TaskJuggler.rb +21 -11
  393. data/lib/TaskScenario.rb +61 -26
  394. data/lib/TextParser.rb +268 -106
  395. data/lib/TextParser/Rule.rb +4 -2
  396. data/lib/TextParser/StackElement.rb +6 -4
  397. data/lib/TextScanner.rb +283 -700
  398. data/lib/TimeSheetReceiver.rb +1 -0
  399. data/lib/TimeSheetSender.rb +1 -0
  400. data/lib/TimeSheetSummary.rb +51 -26
  401. data/lib/TimeSheets.rb +1 -1
  402. data/lib/Tj3AppBase.rb +8 -1
  403. data/lib/Tj3Config.rb +1 -1
  404. data/lib/TjTime.rb +5 -0
  405. data/lib/TjpSyntaxRules.rb +360 -144
  406. data/lib/URLParameter.rb +30 -0
  407. data/lib/XMLDocument.rb +2 -2
  408. data/lib/daemon/ProcessIntercom.rb +50 -9
  409. data/lib/daemon/ProjectBroker.rb +63 -10
  410. data/lib/daemon/ProjectServer.rb +47 -16
  411. data/lib/daemon/ReportServer.rb +9 -4
  412. data/lib/daemon/WebServer.rb +204 -0
  413. data/lib/deep_copy.rb +4 -1
  414. data/lib/reports/CSVFile.rb +150 -66
  415. data/lib/reports/GanttChart.rb +2 -1
  416. data/lib/reports/Navigator.rb +18 -5
  417. data/lib/reports/NikuReport.rb +32 -2
  418. data/lib/reports/Report.rb +65 -37
  419. data/lib/reports/ReportBase.rb +14 -9
  420. data/lib/reports/ReportContext.rb +19 -4
  421. data/lib/reports/ReportTable.rb +2 -2
  422. data/lib/reports/ReportTableCell.rb +54 -30
  423. data/lib/reports/ResourceListRE.rb +4 -3
  424. data/lib/reports/StatusSheetReport.rb +8 -13
  425. data/lib/reports/TableReport.rb +47 -32
  426. data/lib/reports/TaskListRE.rb +3 -3
  427. data/lib/reports/TimeSheetReport.rb +14 -5
  428. data/lib/reports/TjpExportRE.rb +14 -19
  429. data/lib/taskjuggler3.rb +15 -0
  430. data/lib/tj3client.rb +9 -7
  431. data/lib/tj3d.rb +38 -10
  432. data/lib/tj3ss_sender.rb +7 -0
  433. data/lib/tj3ts_receiver.rb +1 -0
  434. data/manual/Day_To_Day_Juggling +1 -1
  435. data/manual/Rich_Text_Attributes +8 -0
  436. data/manual/TaskJuggler_2x_Migration +7 -0
  437. data/manual/The_TaskJuggler_Syntax +20 -6
  438. data/prj_cfg.rb +3 -2
  439. data/tasks/changelog.rake +36 -0
  440. data/tasks/csts.rake +2 -3
  441. data/tasks/gem.rake +10 -0
  442. data/tasks/missing.rake +0 -17
  443. data/test/TestSuite/ReportGenerator/Correct/Journal.html +63 -0
  444. data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +14 -0
  445. data/test/TestSuite/{HTML-Reports/LogicalFunctions.tjp → ReportGenerator/Correct/LogicalFunctions1.tjp} +2 -2
  446. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.csv +3 -0
  447. data/test/TestSuite/ReportGenerator/Correct/LogicalFunctions2.tjp +19 -0
  448. data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +66 -0
  449. data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +407 -0
  450. data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
  451. data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
  452. data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
  453. data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
  454. data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
  455. data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
  456. data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
  457. data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
  458. data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
  459. data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
  460. data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
  461. data/test/TestSuite/ReportGenerator/Correct/opennodes.csv +2 -0
  462. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +26 -0
  463. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +6 -0
  464. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions1-1.csv +7 -0
  465. data/test/TestSuite/ReportGenerator/Correct/refs/LogicalFunctions2-1.csv +2 -0
  466. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +2 -0
  467. data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +1301 -0
  468. data/test/TestSuite/ReportGenerator/Errors/rtp_report_recursion.tjp +20 -0
  469. data/test/TestSuite/Scheduler/Correct/Container.html +349 -0
  470. data/test/TestSuite/Scheduler/Correct/Limits.tjp +11 -4
  471. data/test/TestSuite/Scheduler/Correct/Shift2.html +464 -150
  472. data/test/TestSuite/Scheduler/Correct/TimeSheet2.html +108 -0
  473. data/test/TestSuite/Scheduler/Correct/TimeSheet2.tjp +7 -0
  474. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +14 -0
  475. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +233 -21
  476. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +20 -20
  477. data/test/TestSuite/StatusSheetTemplates/project.tji +35 -0
  478. data/test/TestSuite/StatusSheetTemplates/project.tjp +56 -0
  479. data/test/TestSuite/StatusSheets/run +3 -2
  480. data/test/TestSuite/Syntax/Correct/Include.tjp +1 -1
  481. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +1 -1
  482. data/test/TestSuite/Syntax/Correct/Macro-2.tjp +6 -0
  483. data/test/TestSuite/Syntax/Correct/Macro-3.tjp +14 -0
  484. data/test/TestSuite/Syntax/Correct/ResourcePrefix.html +32 -0
  485. data/test/TestSuite/Syntax/Correct/css/tjmanual.css +66 -0
  486. data/test/TestSuite/Syntax/Correct/css/tjreport.css +407 -0
  487. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  488. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  489. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  490. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  491. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  492. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  493. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  494. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  495. data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
  496. data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
  497. data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
  498. data/test/TestSuite/Syntax/Correct/include/dir1/file2.tji +3 -0
  499. data/test/TestSuite/Syntax/Correct/include/dir1/file5.tji +2 -0
  500. data/test/TestSuite/Syntax/Correct/include/dir3/all.tji +3 -0
  501. data/test/TestSuite/Syntax/Correct/include/dir3/file1.tji +2 -0
  502. data/test/TestSuite/Syntax/Correct/include/dir3/file2.tji +1 -0
  503. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
  504. data/test/TestSuite/Syntax/Correct/tutorial.tjp +13 -13
  505. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -1
  506. data/test/TestSuite/Syntax/Errors/include_recursion.tjp +1 -0
  507. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +2 -1
  508. data/test/TestSuite/Syntax/Errors/{eof_in_istring1.tjp → no_token_match1.tjp} +2 -2
  509. data/test/TestSuite/Syntax/Errors/{eof_in_istring2.tjp → no_token_match2.tjp} +2 -2
  510. data/test/TestSuite/Syntax/Errors/{eof_in_istring3.tjp → no_token_match3.tjp} +1 -1
  511. data/test/TestSuite/Syntax/Errors/{eof_in_istring4.tjp → no_token_match4.tjp} +1 -1
  512. data/test/TestSuite/Syntax/Errors/{eof_in_istring5.tjp → no_token_match5.tjp} +1 -1
  513. data/test/TestSuite/Syntax/Errors/not_scheduled.tjp +13 -0
  514. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +1 -1
  515. data/test/TestSuite/TimeSheets/run +5 -5
  516. data/test/test_CSVFile.rb +75 -0
  517. data/test/test_Limits.rb +63 -5
  518. data/test/test_ProjectFileScanner.rb +163 -0
  519. data/test/test_ReportGenerator.rb +81 -0
  520. data/test/test_RichText.rb +21 -3
  521. data/test/test_Scheduler.rb +1 -1
  522. data/test/test_ShiftAssignments.rb +4 -4
  523. data/test/test_Syntax.rb +1 -1
  524. data/test/test_URLParameter.rb +30 -0
  525. metadata +126 -32
  526. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +0 -8
  527. data/test/TestSuite/Syntax/Errors/bad_comment.tjp +0 -7
  528. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/boss_2002-03-01.tji +0 -36
  529. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev1_2002-03-01.tji +0 -48
  530. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev2_2002-03-01.tji +0 -67
  531. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/dev3_2002-03-01.tji +0 -67
  532. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/doc_2002-03-01.tji +0 -48
  533. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/resources.yml +0 -31
  534. data/test/TestSuite/TimeSheets/TimeSheetTemplates/2002-03-01/test_2002-03-01.tji +0 -36
  535. data/test/TestSuite/TimeSheets/TimeSheetTemplates/acceptable_intervals +0 -1
  536. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/all.tji +0 -1
  537. data/test/TestSuite/TimeSheets/TimeSheets/2002-03-01/dev2_2002-03-01.tji +0 -54
  538. data/test/TestSuite/TimeSheets/TimeSheets/all.tji +0 -2
  539. data/test/TestSuite/TimeSheets/receiver.log +0 -102
  540. data/test/TestSuite/TimeSheets/sender.log +0 -794
  541. data/test/TestSuite/TimeSheets/summary.log +0 -884
  542. data/test/TestSuite/TimeSheets/timesheets.log +0 -45
  543. data/test/TestSuite/TimeSheets/tj3d.log +0 -292
  544. data/test/test_TextScanner.rb +0 -95
@@ -198,8 +198,9 @@ class TaskJuggler
198
198
  end
199
199
 
200
200
  # This is a noop function.
201
- def to_csv(csv)
201
+ def to_csv
202
202
  # Can't put a Gantt chart into a CSV file.
203
+ ''
203
204
  end
204
205
 
205
206
  # Utility function that convers a date to the corresponding X-position in
@@ -127,23 +127,36 @@ class TaskJuggler
127
127
  # Generate an output format independant version of the navigator. This is
128
128
  # a tree of NavigatorElement objects.
129
129
  def generate(reports, reportRoot, parentElement)
130
- raise "Report context missing" unless @project.reportContext.report
130
+ reportDef = @project.reportContexts.last.report
131
+ raise "Report context missing" unless reportDef
131
132
 
133
+ interactive = false
132
134
  reports.each do |report|
135
+ # The outermost (top-level) report determines whether the report
136
+ # should be rendered interactive or not.
137
+ interactive = report.interactive? unless interactive
138
+
133
139
  hasURL = report.get('formats').include?(:html)
140
+ # Only generate menu entries for reports that are not the reportRoot,
141
+ # that are leaf reports and have an HTML output format.
134
142
  next if (report.parent != reportRoot) ||
135
143
  (report.leaf? && !hasURL)
136
144
 
137
145
  label = report.get('title') || report.name
138
146
  # Determine the URL for this element.
139
147
  if hasURL
140
- url = report.name + '.html'
141
- url = normalizeURL(url, @project.reportContext.report.name)
148
+ if interactive
149
+ url = "/taskjuggler?project=#{report.project['projectid']};" +
150
+ "report=#{report.fullId}"
151
+ else
152
+ url = report.name + '.html'
153
+ url = normalizeURL(url, reportDef.name)
154
+ end
142
155
  end
143
156
  parentElement.elements <<
144
157
  (element = NavigatorElement.new(parentElement, label, url))
145
158
 
146
- if report == @project.reportContext.report
159
+ if report == reportDef
147
160
  element.currentUrl = url
148
161
  # Mark this element and all its parents as current.
149
162
  nEl = element
@@ -172,7 +185,7 @@ class TaskJuggler
172
185
  list.setSorting([[ 'seqno', true, -1 ]])
173
186
  list.sort!
174
187
  # Remove all reports that the user doesn't want to have include.
175
- query = @project.reportContext.query.dup
188
+ query = @project.reportContexts.last.query.dup
176
189
  query.scopeProperty = nil
177
190
  list.delete_if do |property|
178
191
  query.property = property
@@ -193,6 +193,35 @@ EOT
193
193
  xml.to_s
194
194
  end
195
195
 
196
+ def to_csv
197
+ table = []
198
+ # Header line with project names
199
+ table << (row = [])
200
+ # First column is the resource name and ID.
201
+ row << ""
202
+ @projects.each_key do |projectId|
203
+ row << @projects[projectId].name
204
+ end
205
+
206
+ # Header line with project IDs
207
+ table << (row = [])
208
+ row << "Resource"
209
+ @projects.each_key do |projectId|
210
+ row << projectId
211
+ end
212
+
213
+ @resourcesTotalEffort.each_key do |resourceId|
214
+ # Add one line per resource.
215
+ table << (row = [])
216
+ row << "#{@resources[resourceId].name} (#{resourceId})"
217
+ @projects.each_key do |projectId|
218
+ row << sum(projectId, resourceId)
219
+ end
220
+ end
221
+
222
+ table
223
+ end
224
+
196
225
  private
197
226
 
198
227
  def sum(projectId, resourceId)
@@ -250,7 +279,8 @@ EOT
250
279
  resourceList.setSorting(@report.get('sortResources'))
251
280
  resourceList = filterResourceList(resourceList, nil,
252
281
  @report.get('hideResource'),
253
- @report.get('rollupResource'))
282
+ @report.get('rollupResource'),
283
+ @report.get('openNodes'))
254
284
 
255
285
  resourceList.each do |resource|
256
286
  # We only care about leaf resources that have the custom attribute
@@ -307,7 +337,7 @@ EOT
307
337
  taskList = PropertyList.new(@project.tasks)
308
338
  taskList.setSorting(@report.get('sortTasks'))
309
339
  taskList = filterTaskList(taskList, nil, @report.get('hideTask'),
310
- @report.get('rollupTask'))
340
+ @report.get('rollupTask'), @report.get('openNodes'))
311
341
 
312
342
 
313
343
  taskList.each do |task|
@@ -47,6 +47,34 @@ class TaskJuggler
47
47
  # report defined by all the class attributes and report elements is
48
48
  # generated according the the requested output format(s).
49
49
  def generate
50
+ begin
51
+ generateIntermediateFormat
52
+
53
+ # Then generate the actual output format.
54
+ get('formats').each do |format|
55
+ case format
56
+ when :html
57
+ generateHTML
58
+ copyAuxiliaryFiles
59
+ when :csv
60
+ generateCSV
61
+ when :niku
62
+ generateNiku
63
+ when :tjp
64
+ generateTJP
65
+ else
66
+ raise 'Unknown report output format #{format}.'
67
+ end
68
+ end
69
+ rescue TjException
70
+ error('reporting_failed', $!.message)
71
+ end
72
+ 0
73
+ end
74
+
75
+ # Generate an output format agnostic version that can later be turned into
76
+ # the respective output formats.
77
+ def generateIntermediateFormat
50
78
  begin
51
79
  @content = nil
52
80
  case @typeSpec
@@ -71,27 +99,9 @@ class TaskJuggler
71
99
  # Most output format can be generated from a common intermediate
72
100
  # representation of the elements. We generate that IR first.
73
101
  @content.generateIntermediateFormat if @content
74
-
75
- # Then generate the actual output format.
76
- get('formats').each do |format|
77
- case format
78
- when :html
79
- generateHTML
80
- copyAuxiliaryFiles
81
- when :csv
82
- generateCSV
83
- when :niku
84
- generateNiku
85
- when :tjp
86
- generateTJP
87
- else
88
- raise 'Unknown report output format #{format}.'
89
- end
90
- end
91
102
  rescue TjException
92
- error('reporting_failed', $!.message)
103
+ error('report_IR_generattion_failed', $!.message)
93
104
  end
94
- 0
95
105
  end
96
106
 
97
107
  # Render the content of the report as HTML (without the framing).
@@ -99,6 +109,12 @@ class TaskJuggler
99
109
  @content ? @content.to_html : nil
100
110
  end
101
111
 
112
+ # Return true if the report should be rendered in the interactive version,
113
+ # false if not. The top-level report defines the output format and the
114
+ # interactive setting.
115
+ def interactive?
116
+ @project.reportContexts.first.report.get('interactive')
117
+ end
102
118
 
103
119
  private
104
120
  # Convenience function to access a report attribute
@@ -114,14 +130,10 @@ class TaskJuggler
114
130
  'keywords' => 'taskjuggler, project, management')
115
131
  if a('selfcontained')
116
132
  auxSrcDir = AppConfig.dataDirs('data/css')[0]
117
- cssFileName = auxSrcDir + '/tjreport.css'
133
+ cssFileName = (auxSrcDir ? auxSrcDir + '/tjreport.css' : '')
134
+ # Raise an error if we haven't found the data directory
118
135
  if auxSrcDir.nil? || !File.exists?(cssFileName)
119
- raise TjException.new, <<"EOT"
120
- Cannot find '#{cssFileName}'. This is usually the result of an improper
121
- TaskJuggler installation. If you know where to find the data directory, you
122
- can use the TASKJUGGLER_DATA_PATH environment variable to specify the
123
- location. The variable should be set to the path without the /data at the end.
124
- EOT
136
+ dataDirError(cssFileName)
125
137
  end
126
138
  cssFile = IO.read(cssFileName)
127
139
  if cssFile.empty?
@@ -139,6 +151,8 @@ EOT
139
151
  'type' => 'text/css',
140
152
  'href' => 'css/tjreport.css')
141
153
  end
154
+ html << XMLComment.new("Dynamic Report ID: " +
155
+ "#{@project.reportContexts.last.dynamicReportId}")
142
156
  html << (body = XMLElement.new('body'))
143
157
 
144
158
  unless a('selfcontained')
@@ -172,8 +186,17 @@ EOT
172
186
  'href' => "#{AppConfig.contact}")
173
187
  div << XMLText.new(" v#{AppConfig.version}")
174
188
 
175
- html.write(((@name[0] == '/' ? '' : @project.outputDir) +
176
- @name + (@name == '.' ? '' : '.html')).untaint)
189
+ fileName =
190
+ if a('interactive') || @name == '.'
191
+ # Interactive HTML reports are always sent to stdout.
192
+ '.'
193
+ else
194
+ # Prepend the specified output directory unless the provided file
195
+ # name is an absolute file name.
196
+ ((@name[0] == '/' ? '' : @project.outputDir) +
197
+ @name + '.html').untaint
198
+ end
199
+ html.write(fileName)
177
200
  end
178
201
 
179
202
  # Generate a CSV version of the report.
@@ -253,7 +276,8 @@ EOT
253
276
  end
254
277
 
255
278
  def copyAuxiliaryFiles
256
- return if @name == '.' # Don't copy files if output is stdout.
279
+ # Don't copy files if output is stdout.
280
+ return if @name == '.' || a('interactive')
257
281
 
258
282
  copyDirectory('css')
259
283
  copyDirectory('icons')
@@ -266,14 +290,8 @@ EOT
266
290
  @name) + '/'
267
291
  # Find the data directory that came with the TaskJuggler installation.
268
292
  auxSrcDir = AppConfig.dataDirs("data/#{dirName}")[0]
269
- if auxSrcDir.nil? || !File.exists?(auxSrcDir)
270
- raise TjException.new, <<"EOT"
271
- Cannot find the #{dirName} directory. This is usually
272
- the result of an improper TaskJuggler installation. If you know the directory,
273
- you can use the TASKJUGGLER_DATA_PATH environment variable to specify the
274
- location.
275
- EOT
276
- end
293
+ # Raise an error if we haven't found the data directory
294
+ dataDirError(dirName) if auxSrcDir.nil? || !File.exists?(auxSrcDir)
277
295
  # Don't copy directory if all files are up-to-date.
278
296
  return if directoryUpToDate?(auxSrcDir, auxDstDir + dirName)
279
297
 
@@ -295,6 +313,16 @@ EOT
295
313
  true
296
314
  end
297
315
 
316
+ def dataDirError(dirName)
317
+ raise TjException.new, <<"EOT"
318
+ Cannot find the #{dirName} directory. This is usually the result of an
319
+ improper TaskJuggler installation. If you know the directory, you can use the
320
+ TASKJUGGLER_DATA_PATH environment variable to specify the location. The
321
+ variable should be set to the path without the /data at the end. Multiple
322
+ directories must be separated by colons.
323
+ EOT
324
+ end
325
+
298
326
  def error(id, message)
299
327
  @project.messageHandler.send(Message.new(id, 'error', message, nil, nil,
300
328
  @sourceFileInfo))
@@ -28,7 +28,7 @@ class TaskJuggler
28
28
  end
29
29
 
30
30
  def generateIntermediateFormat
31
- query = @report.project.reportContext.query
31
+ query = @report.project.reportContexts.last.query
32
32
  %w( header left center right footer
33
33
  prolog headline caption epilog ).each do |name|
34
34
  next unless text = a(name)
@@ -49,7 +49,7 @@ class TaskJuggler
49
49
  # hide expression, the rollup Expression or are not a descendent of
50
50
  # taskRoot. In case resource is not nil, a task is only included if
51
51
  # the resource is allocated to it in any of the reported scenarios.
52
- def filterTaskList(list_, resource, hideExpr, rollupExpr)
52
+ def filterTaskList(list_, resource, hideExpr, rollupExpr, openNodes)
53
53
  list = PropertyList.new(list_)
54
54
  if (taskRoot = a('taskRoot'))
55
55
  # Remove all tasks that are not descendents of the taskRoot.
@@ -73,14 +73,14 @@ class TaskJuggler
73
73
  end
74
74
  end
75
75
 
76
- standardFilterOps(list, hideExpr, rollupExpr, resource, taskRoot)
76
+ standardFilterOps(list, hideExpr, rollupExpr, openNodes, resource, taskRoot)
77
77
  end
78
78
 
79
79
  # Take the complete resource list and remove all resources that are matching
80
80
  # the hide expression, the rollup Expression or are not a descendent of
81
81
  # resourceRoot. In case task is not nil, a resource is only included if
82
82
  # it is assigned to the task in any of the reported scenarios.
83
- def filterResourceList(list_, task, hideExpr, rollupExpr)
83
+ def filterResourceList(list_, task, hideExpr, rollupExpr, openNodes)
84
84
  list = PropertyList.new(list_)
85
85
  if (resourceRoot = a('resourceRoot'))
86
86
  # Remove all resources that are not descendents of the resourceRoot.
@@ -104,7 +104,7 @@ class TaskJuggler
104
104
  end
105
105
  end
106
106
 
107
- standardFilterOps(list, hideExpr, rollupExpr, task, resourceRoot)
107
+ standardFilterOps(list, hideExpr, rollupExpr, openNodes, task, resourceRoot)
108
108
  end
109
109
 
110
110
  private
@@ -140,9 +140,10 @@ class TaskJuggler
140
140
 
141
141
  # This function implements the generic filtering functionality for all kinds
142
142
  # of lists.
143
- def standardFilterOps(list, hideExpr, rollupExpr, scopeProperty, root)
143
+ def standardFilterOps(list, hideExpr, rollupExpr, openNodes, scopeProperty,
144
+ root)
144
145
  # Make a copy of the current Query.
145
- query = @project.reportContext.query.dup
146
+ query = @project.reportContexts.last.query.dup
146
147
  query.scopeProperty = scopeProperty
147
148
 
148
149
  # Remove all properties that the user wants to have hidden.
@@ -154,13 +155,17 @@ class TaskJuggler
154
155
  end
155
156
 
156
157
  # Remove all children of properties that the user has rolled-up.
157
- if rollupExpr
158
+ if rollupExpr || openNodes
158
159
  list.delete_if do |property|
159
160
  parent = property.parent
160
161
  delete = false
161
162
  while (parent)
162
163
  query.property = parent
163
- if rollupExpr.eval(query)
164
+ # If openNodes is not nil, only the listed nodes will be unrolled.
165
+ # If openNodes is nil, only the nodes that match rollupExpr will
166
+ # not be unrolled.
167
+ if (openNodes && !openNodes.include?([ parent, scopeProperty ])) ||
168
+ (!openNodes && rollupExpr.eval(query))
164
169
  delete = true
165
170
  break
166
171
  end
@@ -15,15 +15,17 @@ class TaskJuggler
15
15
  # The ReportContext objects provide some settings that are used during the
16
16
  # generation of a report. Reports can be nested, so multiple objects can
17
17
  # exist at a time. But there is only one current ReportContext that is
18
- # always accessable via Project.reportContext.
18
+ # always accessable via Project.reportContexts.last().
19
19
  class ReportContext
20
20
 
21
- attr_reader :project, :report, :query
22
- attr_accessor :tasks, :resources
21
+ attr_reader :dynamicReportId, :project, :report, :query
22
+ attr_accessor :childReportCounter, :tasks, :resources, :attributeBackup
23
23
 
24
24
  def initialize(project, report)
25
25
  @project = project
26
26
  @report = report
27
+ @childReportCounter = 0
28
+ @attributeBackup = nil
27
29
  queryAttrs = {
28
30
  'project' => @project,
29
31
  'loadUnit' => @report.get('loadUnit'),
@@ -36,13 +38,26 @@ class TaskJuggler
36
38
  'revenueAccount' => @report.get('revenueAccount')
37
39
  }
38
40
  @query = Query.new(queryAttrs)
39
- if (@parent = @project.reportContext)
41
+ if (@parent = @project.reportContexts.last)
42
+ # For interactive reports we need some ID that uniquely identifies the
43
+ # report within the composed report. Since a project report can be
44
+ # included multiple times in the same report, we need to generate
45
+ # another ID for each instantiated report. We create this report by
46
+ # using a counter for the number of child reports that each report
47
+ # has. The unique ID is then the concatenated list of counters from
48
+ # parent to leaf, separating each value by a '.'.
49
+ @dynamicReportId = @parent.dynamicReportId +
50
+ ".#{@parent.childReportCounter}"
51
+ @parent.childReportCounter += 1
40
52
  # If the new ReportContext is created from within an existing context,
41
53
  # this is used as parent context and the settings are copied as
42
54
  # default initial values.
43
55
  @tasks = @parent.tasks.dup
44
56
  @resources = @parent.resources.dup
45
57
  else
58
+ # The ID of the root report is always "0". The first child will then
59
+ # be "0.0", the seconds "0.1" and so on.
60
+ @dynamicReportId = "0"
46
61
  # There is no existing ReportContext yet, so we create one based on
47
62
  # the settings of the report.
48
63
  @tasks = @project.tasks.dup
@@ -131,8 +131,8 @@ class TaskJuggler
131
131
 
132
132
  # Convert the intermediate representation into an Array of Arrays. _csv_ is
133
133
  # the destination Array of Arrays. It may contain columns already.
134
- def to_csv()
135
- csv = [ [ ] ]
134
+ def to_csv(csv = nil)
135
+ csv = [ [ ] ] unless csv
136
136
  @columns.each { |col| col.to_csv(csv) }
137
137
 
138
138
  @lines.each do |line|
@@ -141,16 +141,32 @@ class TaskJuggler
141
141
  # We only support left indentation in CSV files as the spaces for right
142
142
  # indentation will be disregarded by most applications.
143
143
  indent = @indent && @alignment == :left ? ' ' * @indent : ''
144
- if @special
145
- csv[-1] << @special.to_csv
146
- elsif @data && @data.is_a?(String)
147
- csv[-1] << indent + @data
148
- elsif @text
149
- if @text.respond_to?('functionHandler')
150
- @text.functionHandler('query').setQuery(@query)
144
+ cell =
145
+ if @special
146
+ @special.to_csv
147
+ indent = nil
148
+ elsif @data && @data.is_a?(String)
149
+ @data
150
+ elsif @text
151
+ if @text.respond_to?('functionHandler') &&
152
+ @text.functionHandler('query')
153
+ @text.functionHandler('query').setQuery(@query)
154
+ end
155
+ str = @text.to_s
156
+ # Remove any trailing line breaks. These don't really make much
157
+ # sense in CSV files.
158
+ while str[-1] == ?\n
159
+ str.chomp!
160
+ end
161
+ str
151
162
  end
152
- csv[-1] << indent + shortVersion(@text)[0]
153
- end
163
+
164
+ # Try to convert numbers and other types to their native Ruby type if
165
+ # they are supported by CSVFile.
166
+ native = CSVFile.strToNative(cell)
167
+
168
+ # Only for String objects, we add the indentation.
169
+ csv[-1] << (native.is_a?(String) ? indent + native : native)
154
170
  end
155
171
 
156
172
  private
@@ -218,33 +234,41 @@ class TaskJuggler
218
234
  if @fontColor
219
235
  style += "color:#{@fontColor}; "
220
236
  end
237
+
238
+ return nil, nil if @text.nil? || @text.empty?
239
+
221
240
  td = XMLElement.new('td', 'class' => 'tj_table_cell_label',
222
241
  'style' => style)
223
-
224
242
  tooltip = nil
225
- unless @text.nil? || @text.empty?
226
- if @text.respond_to?('functionHandler') &&
227
- @text.functionHandler('query')
228
- @text.functionHandler('query').setQuery(@query)
229
- end
230
243
 
231
- shortText, singleLine = shortVersion(@text)
232
- if (@line && @line.table.equiLines && (!singleLine || @width )) ||
233
- !@category
234
- # The cell is size-limited. We only put a shortened plain-text version
235
- # in the cell and provide the full content via a tooltip.
236
- td << XMLText.new(shortText)
237
- tooltip = @text if @text != shortText
238
- else
239
- # The cell will adjust to the size of the content.
240
- if @text.is_a?(RichTextIntermediate)
241
- # Don't put the @text into a <div> but a <span>.
242
- # @text.blockMode = false # if singleLine
243
- td << @text.to_html
244
- else
245
- td << XMLText.new(@text)
244
+ # @text can be a String or a RichText (with or without embedded
245
+ # queries). To find out if @text has multiple lines, we need to expand
246
+ # it and convert it to a plain text again.
247
+ textAsString =
248
+ if @text.is_a?(RichTextIntermediate)
249
+ # @text is a RichText.
250
+ if @text.respond_to?('functionHandler') &&
251
+ @text.functionHandler('query')
252
+ @text.functionHandler('query').setQuery(@query)
246
253
  end
254
+ @text.to_s
255
+ else
256
+ @text
247
257
  end
258
+
259
+ return nil, nil if textAsString.empty?
260
+
261
+ shortText, singleLine = shortVersion(textAsString)
262
+
263
+ if (@line && @line.table.equiLines && (!singleLine || @width )) ||
264
+ !@category
265
+ # The cell is size-limited. We only put a shortened plain-text version
266
+ # in the cell and provide the full content via a tooltip.
267
+ tooltip = @text if shortText != textAsString
268
+ td << XMLText.new(shortText)
269
+ else
270
+ td << (@text.is_a?(RichTextIntermediate) ? @text.to_html :
271
+ XMLText.new(@text))
248
272
  end
249
273
 
250
274
  return td, tooltip