taskjuggler 0.0.3 → 0.0.4

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 (495) hide show
  1. data/benchmarks/UTF-8-Strings.rb +58 -0
  2. data/data/css/tjmanual.css +52 -0
  3. data/data/css/tjreport.css +195 -0
  4. data/data/icons/details.png +0 -0
  5. data/data/icons/flag-green.png +0 -0
  6. data/data/icons/flag-red.png +0 -0
  7. data/data/icons/flag-yellow.png +0 -0
  8. data/data/icons/resource.png +0 -0
  9. data/data/icons/resourcegroup.png +0 -0
  10. data/data/icons/task.png +0 -0
  11. data/data/icons/taskgroup.png +0 -0
  12. data/data/icons/trend-down.png +0 -0
  13. data/data/icons/trend-flat.png +0 -0
  14. data/data/icons/trend-up.png +0 -0
  15. data/data/scripts/wz_tooltip.js +1301 -0
  16. data/doc/classes/AppConfig.html +298 -230
  17. data/doc/classes/Arguments.html +8 -8
  18. data/doc/classes/Object.html +7 -7
  19. data/doc/classes/String.html +89 -89
  20. data/doc/classes/TaskJuggler.html +396 -264
  21. data/doc/classes/TaskJuggler/Account.html +18 -18
  22. data/doc/classes/TaskJuggler/AccountAttribute.html +26 -26
  23. data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
  24. data/doc/classes/TaskJuggler/Allocation.html +30 -30
  25. data/doc/classes/TaskJuggler/AllocationAttribute.html +26 -26
  26. data/doc/classes/TaskJuggler/AttributeBase.html +227 -115
  27. data/doc/classes/TaskJuggler/AttributeDefinition.html +6 -6
  28. data/doc/classes/TaskJuggler/BatchProcessor.html +117 -83
  29. data/doc/classes/TaskJuggler/Booking.html +18 -18
  30. data/doc/classes/TaskJuggler/BookingListAttribute.html +26 -26
  31. data/doc/classes/TaskJuggler/BooleanAttribute.html +26 -26
  32. data/doc/classes/TaskJuggler/CSVFile.html +24 -24
  33. data/doc/classes/TaskJuggler/CellSettingPattern.html +201 -0
  34. data/doc/classes/TaskJuggler/CellSettingPatternList.html +253 -0
  35. data/doc/classes/TaskJuggler/Charge.html +18 -18
  36. data/doc/classes/TaskJuggler/ChargeListAttribute.html +20 -20
  37. data/doc/classes/TaskJuggler/ChargeSet.html +37 -37
  38. data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +26 -26
  39. data/doc/classes/TaskJuggler/ColumnListAttribute.html +20 -20
  40. data/doc/classes/TaskJuggler/ColumnTable.html +40 -40
  41. data/doc/classes/TaskJuggler/DateAttribute.html +54 -15
  42. data/doc/classes/TaskJuggler/DefinitionListAttribute.html +10 -10
  43. data/doc/classes/TaskJuggler/DependencyListAttribute.html +47 -47
  44. data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
  45. data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
  46. data/doc/classes/TaskJuggler/FlagListAttribute.html +43 -43
  47. data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
  48. data/doc/classes/TaskJuggler/FormatListAttribute.html +21 -21
  49. data/doc/classes/TaskJuggler/GanttChart.html +48 -48
  50. data/doc/classes/TaskJuggler/GanttContainer.html +42 -42
  51. data/doc/classes/TaskJuggler/GanttHeader.html +12 -12
  52. data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +12 -12
  53. data/doc/classes/TaskJuggler/GanttLine.html +24 -24
  54. data/doc/classes/TaskJuggler/GanttLoadStack.html +18 -18
  55. data/doc/classes/TaskJuggler/GanttMilestone.html +42 -42
  56. data/doc/classes/TaskJuggler/GanttRouter.html +24 -24
  57. data/doc/classes/TaskJuggler/GanttTaskBar.html +42 -42
  58. data/doc/classes/TaskJuggler/HTMLDocument.html +13 -13
  59. data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
  60. data/doc/classes/TaskJuggler/Interval.html +57 -57
  61. data/doc/classes/TaskJuggler/IntervalListAttribute.html +47 -47
  62. data/doc/classes/TaskJuggler/JobInfo.html +68 -12
  63. data/doc/classes/TaskJuggler/Journal.html +266 -20
  64. data/doc/classes/TaskJuggler/JournalEntry.html +79 -23
  65. data/doc/classes/TaskJuggler/JournalEntryList.html +454 -0
  66. data/doc/classes/TaskJuggler/KeywordArray.html +10 -10
  67. data/doc/classes/TaskJuggler/KeywordDocumentation.html +171 -170
  68. data/doc/classes/TaskJuggler/Limits.html +36 -36
  69. data/doc/classes/TaskJuggler/Limits/Limit.html +30 -30
  70. data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
  71. data/doc/classes/TaskJuggler/ListAttributeBase.html +20 -20
  72. data/doc/classes/TaskJuggler/Log.html +145 -107
  73. data/doc/classes/TaskJuggler/LogicalAttribute.html +65 -36
  74. data/doc/classes/TaskJuggler/LogicalExpression.html +61 -24
  75. data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +20 -20
  76. data/doc/classes/TaskJuggler/LogicalFlag.html +31 -51
  77. data/doc/classes/TaskJuggler/LogicalFunction.html +64 -53
  78. data/doc/classes/TaskJuggler/LogicalOperation.html +103 -55
  79. data/doc/classes/TaskJuggler/Macro.html +6 -6
  80. data/doc/classes/TaskJuggler/MacroParser.html +36 -36
  81. data/doc/classes/TaskJuggler/MacroTable.html +37 -37
  82. data/doc/classes/TaskJuggler/Message.html +12 -12
  83. data/doc/classes/TaskJuggler/MessageHandler.html +32 -20
  84. data/doc/classes/TaskJuggler/Navigator.html +110 -46
  85. data/doc/classes/TaskJuggler/NavigatorElement.html +449 -0
  86. data/doc/classes/TaskJuggler/OnShiftCache.html +24 -24
  87. data/doc/classes/TaskJuggler/Project.html +1158 -893
  88. data/doc/classes/TaskJuggler/ProjectFileParser.html +94 -91
  89. data/doc/classes/TaskJuggler/PropertyAttribute.html +20 -20
  90. data/doc/classes/TaskJuggler/PropertyList.html +225 -155
  91. data/doc/classes/TaskJuggler/PropertySet.html +375 -332
  92. data/doc/classes/TaskJuggler/PropertyTreeNode.html +750 -510
  93. data/doc/classes/TaskJuggler/Query.html +404 -139
  94. data/doc/classes/TaskJuggler/{RTPNavigator.html → RTFNavigator.html} +57 -56
  95. data/doc/classes/TaskJuggler/RTFQuery.html +343 -0
  96. data/doc/classes/TaskJuggler/{RTPReport.html → RTFReport.html} +70 -67
  97. data/doc/classes/TaskJuggler/RealFormat.html +18 -18
  98. data/doc/classes/TaskJuggler/RealFormatAttribute.html +10 -10
  99. data/doc/classes/TaskJuggler/ReferenceAttribute.html +107 -40
  100. data/doc/classes/TaskJuggler/RemoteServiceManager.html +335 -0
  101. data/doc/classes/TaskJuggler/Report.html +66 -64
  102. data/doc/classes/TaskJuggler/ReportBase.html +112 -123
  103. data/doc/classes/TaskJuggler/ReportContext.html +43 -38
  104. data/doc/classes/TaskJuggler/ReportServer.html +320 -0
  105. data/doc/classes/TaskJuggler/ReportTable.html +42 -42
  106. data/doc/classes/TaskJuggler/ReportTableCell.html +221 -129
  107. data/doc/classes/TaskJuggler/ReportTableColumn.html +27 -27
  108. data/doc/classes/TaskJuggler/ReportTableLegend.html +24 -24
  109. data/doc/classes/TaskJuggler/ReportTableLine.html +126 -80
  110. data/doc/classes/TaskJuggler/Resource.html +12 -12
  111. data/doc/classes/TaskJuggler/ResourceListAttribute.html +82 -47
  112. data/doc/classes/TaskJuggler/ResourceListRE.html +43 -39
  113. data/doc/classes/TaskJuggler/ResourceScenario.html +413 -321
  114. data/doc/classes/TaskJuggler/RichText.html +64 -248
  115. data/doc/classes/TaskJuggler/RichTextAttribute.html +94 -30
  116. data/doc/classes/TaskJuggler/RichTextDocument.html +87 -85
  117. data/doc/classes/TaskJuggler/RichTextElement.html +456 -363
  118. data/doc/classes/TaskJuggler/RichTextException.html +13 -13
  119. data/doc/classes/TaskJuggler/{RichTextProtocolExample.html → RichTextFunctionExample.html} +64 -63
  120. data/doc/classes/TaskJuggler/{RichTextProtocolHandler.html → RichTextFunctionHandler.html} +42 -36
  121. data/doc/classes/TaskJuggler/RichTextIntermediate.html +563 -0
  122. data/doc/classes/TaskJuggler/RichTextParser.html +54 -51
  123. data/doc/classes/TaskJuggler/RichTextScanner.html +94 -92
  124. data/doc/classes/TaskJuggler/RichTextSnip.html +96 -60
  125. data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +369 -227
  126. data/doc/classes/TaskJuggler/Scenario.html +6 -6
  127. data/doc/classes/TaskJuggler/ScenarioData.html +37 -37
  128. data/doc/classes/TaskJuggler/ScenarioListAttribute.html +31 -31
  129. data/doc/classes/TaskJuggler/Scoreboard.html +66 -66
  130. data/doc/classes/TaskJuggler/Shift.html +18 -18
  131. data/doc/classes/TaskJuggler/ShiftAssignment.html +54 -54
  132. data/doc/classes/TaskJuggler/ShiftAssignments.html +78 -78
  133. data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
  134. data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
  135. data/doc/classes/TaskJuggler/SortListAttribute.html +22 -22
  136. data/doc/classes/TaskJuggler/SourceFileInfo.html +12 -12
  137. data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
  138. data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
  139. data/doc/classes/TaskJuggler/SyntaxReference.html +42 -42
  140. data/doc/classes/TaskJuggler/TOCEntry.html +12 -12
  141. data/doc/classes/TaskJuggler/TSResourceRecord.html +197 -0
  142. data/doc/classes/TaskJuggler/TSTaskRecord.html +215 -0
  143. data/doc/classes/TaskJuggler/TableColumnDefinition.html +64 -43
  144. data/doc/classes/TaskJuggler/TableOfContents.html +18 -18
  145. data/doc/classes/TaskJuggler/TableReport.html +447 -468
  146. data/doc/classes/TaskJuggler/Task.html +12 -12
  147. data/doc/classes/TaskJuggler/TaskDependency.html +12 -12
  148. data/doc/classes/TaskJuggler/TaskListAttribute.html +47 -47
  149. data/doc/classes/TaskJuggler/TaskListRE.html +43 -39
  150. data/doc/classes/TaskJuggler/TaskScenario.html +529 -282
  151. data/doc/classes/TaskJuggler/TextParser.html +215 -194
  152. data/doc/classes/TaskJuggler/TextParser/Pattern.html +97 -97
  153. data/doc/classes/TaskJuggler/TextParser/Rule.html +84 -84
  154. data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -15
  155. data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
  156. data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +6 -6
  157. data/doc/classes/TaskJuggler/TextReport.html +77 -74
  158. data/doc/classes/TaskJuggler/TextScanner.html +294 -281
  159. data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
  160. data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +59 -60
  161. data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +12 -12
  162. data/doc/classes/TaskJuggler/TimeSheetReport.html +406 -0
  163. data/doc/classes/TaskJuggler/TjException.html +6 -6
  164. data/doc/classes/TaskJuggler/TjTime.html +522 -513
  165. data/doc/classes/TaskJuggler/TjpExample.html +25 -25
  166. data/doc/classes/TaskJuggler/TjpExportRE.html +21 -24
  167. data/doc/classes/TaskJuggler/TjpSyntaxRules.html +6177 -4318
  168. data/doc/classes/TaskJuggler/UserManual.html +212 -213
  169. data/doc/classes/TaskJuggler/WorkingHours.html +49 -49
  170. data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -53
  171. data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
  172. data/doc/classes/TaskJuggler/XMLComment.html +21 -21
  173. data/doc/classes/TaskJuggler/XMLDocument.html +27 -26
  174. data/doc/classes/TaskJuggler/XMLElement.html +86 -50
  175. data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
  176. data/doc/classes/TaskJuggler/XMLText.html +36 -36
  177. data/doc/files/COPYING.html +1 -1
  178. data/doc/files/README.html +1 -1
  179. data/doc/files/lib/AccountScenario_rb.html +3 -2
  180. data/doc/files/lib/Account_rb.html +3 -2
  181. data/doc/files/lib/Allocation_rb.html +3 -2
  182. data/doc/files/lib/AppConfig_rb.html +5 -2
  183. data/doc/files/lib/AttributeBase_rb.html +3 -2
  184. data/doc/files/lib/AttributeDefinition_rb.html +3 -2
  185. data/doc/files/lib/Attributes_rb.html +3 -2
  186. data/doc/files/lib/BatchProcessor_rb.html +4 -3
  187. data/doc/files/lib/Booking_rb.html +3 -2
  188. data/doc/files/lib/ChargeSet_rb.html +3 -2
  189. data/doc/files/lib/Charge_rb.html +3 -2
  190. data/doc/files/lib/HTMLDocument_rb.html +3 -2
  191. data/doc/files/lib/Interval_rb.html +3 -2
  192. data/doc/files/lib/Journal_rb.html +4 -3
  193. data/doc/files/lib/KeywordArray_rb.html +3 -2
  194. data/doc/files/lib/KeywordDocumentation_rb.html +3 -2
  195. data/doc/files/lib/Limits_rb.html +3 -2
  196. data/doc/files/lib/Log_rb.html +3 -2
  197. data/doc/files/lib/LogicalExpression_rb.html +3 -2
  198. data/doc/files/lib/LogicalFunction_rb.html +3 -2
  199. data/doc/files/lib/LogicalOperation_rb.html +3 -2
  200. data/doc/files/lib/MacroParser_rb.html +3 -2
  201. data/doc/files/lib/MacroTable_rb.html +3 -2
  202. data/doc/files/lib/MessageHandler_rb.html +3 -2
  203. data/doc/files/lib/Message_rb.html +3 -2
  204. data/doc/files/lib/ProjectFileParser_rb.html +7 -4
  205. data/doc/files/lib/Project_rb.html +3 -2
  206. data/doc/files/lib/PropertyList_rb.html +3 -2
  207. data/doc/files/lib/PropertySet_rb.html +3 -2
  208. data/doc/files/lib/PropertyTreeNode_rb.html +3 -2
  209. data/doc/files/lib/Query_rb.html +3 -2
  210. data/doc/files/lib/{RTPNavigator_rb.html → RTFNavigator_rb.html} +8 -7
  211. data/doc/files/lib/RTFQuery_rb.html +121 -0
  212. data/doc/files/lib/{RTPReport_rb.html → RTFReport_rb.html} +8 -7
  213. data/doc/files/lib/RealFormat_rb.html +3 -2
  214. data/doc/files/lib/RemoteServiceManager_rb.html +117 -0
  215. data/doc/files/lib/ReportServer_rb.html +107 -0
  216. data/doc/files/lib/ResourceScenario_rb.html +3 -2
  217. data/doc/files/lib/Resource_rb.html +3 -2
  218. data/doc/files/lib/RichTextDocument_rb.html +4 -3
  219. data/doc/files/lib/RichTextElement_rb.html +3 -2
  220. data/doc/files/lib/{RichTextProtocolExample_rb.html → RichTextFunctionExample_rb.html} +8 -7
  221. data/doc/files/lib/{RichTextProtocolHandler_rb.html → RichTextFunctionHandler_rb.html} +7 -6
  222. data/doc/files/lib/RichTextParser_rb.html +3 -2
  223. data/doc/files/lib/RichTextScanner_rb.html +3 -2
  224. data/doc/files/lib/RichTextSnip_rb.html +3 -2
  225. data/doc/files/lib/RichTextSyntaxRules_rb.html +3 -2
  226. data/doc/files/lib/RichText_rb.html +3 -2
  227. data/doc/files/lib/ScenarioData_rb.html +3 -2
  228. data/doc/files/lib/Scenario_rb.html +3 -2
  229. data/doc/files/lib/Scoreboard_rb.html +3 -2
  230. data/doc/files/lib/ShiftAssignments_rb.html +3 -2
  231. data/doc/files/lib/ShiftScenario_rb.html +3 -2
  232. data/doc/files/lib/Shift_rb.html +3 -2
  233. data/doc/files/lib/SourceFileInfo_rb.html +3 -2
  234. data/doc/files/lib/SyntaxReference_rb.html +3 -2
  235. data/doc/files/lib/TOCEntry_rb.html +3 -2
  236. data/doc/files/lib/TableColumnDefinition_rb.html +3 -2
  237. data/doc/files/lib/TableOfContents_rb.html +3 -2
  238. data/doc/files/lib/TaskDependency_rb.html +3 -2
  239. data/doc/files/lib/TaskJuggler_rb.html +7 -2
  240. data/doc/files/lib/TaskScenario_rb.html +3 -2
  241. data/doc/files/lib/Task_rb.html +3 -2
  242. data/doc/files/lib/TextParser/Pattern_rb.html +4 -3
  243. data/doc/files/lib/TextParser/Rule_rb.html +4 -3
  244. data/doc/files/lib/TextParser/StackElement_rb.html +4 -3
  245. data/doc/files/lib/TextParser/TokenDoc_rb.html +4 -3
  246. data/doc/files/lib/TextParser_rb.html +3 -2
  247. data/doc/files/lib/TextScanner_rb.html +3 -2
  248. data/doc/files/lib/Tj3Config_rb.html +3 -2
  249. data/doc/files/lib/TjException_rb.html +3 -2
  250. data/doc/files/lib/TjTime_rb.html +3 -2
  251. data/doc/files/lib/TjpExample_rb.html +3 -2
  252. data/doc/files/lib/TjpSyntaxRules_rb.html +3 -2
  253. data/doc/files/lib/UTF8String_rb.html +14 -6
  254. data/doc/files/lib/UserManual_rb.html +6 -3
  255. data/doc/files/lib/WorkingHours_rb.html +3 -2
  256. data/doc/files/lib/XMLDocument_rb.html +3 -2
  257. data/doc/files/lib/XMLElement_rb.html +3 -2
  258. data/doc/files/lib/deep_copy_rb.html +3 -2
  259. data/doc/files/lib/reports/CSVFile_rb.html +3 -2
  260. data/doc/files/lib/reports/ColumnTable_rb.html +3 -2
  261. data/doc/files/lib/reports/GanttChart_rb.html +3 -2
  262. data/doc/files/lib/reports/GanttContainer_rb.html +3 -2
  263. data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +3 -2
  264. data/doc/files/lib/reports/GanttHeader_rb.html +3 -2
  265. data/doc/files/lib/reports/GanttLine_rb.html +3 -2
  266. data/doc/files/lib/reports/GanttLoadStack_rb.html +3 -2
  267. data/doc/files/lib/reports/GanttMilestone_rb.html +3 -2
  268. data/doc/files/lib/reports/GanttRouter_rb.html +3 -2
  269. data/doc/files/lib/reports/GanttTaskBar_rb.html +3 -2
  270. data/doc/files/lib/reports/HTMLGraphics_rb.html +3 -2
  271. data/doc/files/lib/reports/Navigator_rb.html +3 -2
  272. data/doc/files/lib/reports/ReportBase_rb.html +3 -2
  273. data/doc/files/lib/reports/ReportContext_rb.html +3 -2
  274. data/doc/files/lib/reports/ReportTableCell_rb.html +3 -2
  275. data/doc/files/lib/reports/ReportTableColumn_rb.html +3 -2
  276. data/doc/files/lib/reports/ReportTableLegend_rb.html +3 -2
  277. data/doc/files/lib/reports/ReportTableLine_rb.html +3 -2
  278. data/doc/files/lib/reports/ReportTable_rb.html +3 -2
  279. data/doc/files/lib/reports/Report_rb.html +7 -2
  280. data/doc/files/lib/reports/ResourceListRE_rb.html +3 -2
  281. data/doc/files/lib/reports/TableReport_rb.html +3 -2
  282. data/doc/files/lib/reports/TaskListRE_rb.html +3 -2
  283. data/doc/files/lib/reports/TextReport_rb.html +4 -3
  284. data/doc/files/lib/reports/TimeSheetReport_rb.html +117 -0
  285. data/doc/files/lib/reports/TjpExportRE_rb.html +3 -2
  286. data/doc/files/lib/taskjuggler3_rb.html +94 -77
  287. data/doc/files/lib/tj3client_rb.html +280 -0
  288. data/doc/files/lib/tj3man_rb.html +10 -9
  289. data/doc/fr_class_index.html +27 -5
  290. data/doc/fr_file_index.html +15 -7
  291. data/doc/fr_method_index.html +1312 -1020
  292. data/examples/tutorial.tjp +113 -14
  293. data/gem_spec.rb +2 -1
  294. data/lib/Account.rb +1 -1
  295. data/lib/AccountScenario.rb +1 -1
  296. data/lib/Allocation.rb +1 -1
  297. data/lib/AppConfig.rb +23 -10
  298. data/lib/AttributeBase.rb +34 -6
  299. data/lib/AttributeDefinition.rb +1 -1
  300. data/lib/Attributes.rb +51 -16
  301. data/lib/BatchProcessor.rb +204 -77
  302. data/lib/Booking.rb +1 -1
  303. data/lib/Charge.rb +1 -1
  304. data/lib/ChargeSet.rb +1 -1
  305. data/lib/HTMLDocument.rb +2 -2
  306. data/lib/Interval.rb +1 -1
  307. data/lib/Journal.rb +231 -9
  308. data/lib/KeywordArray.rb +1 -1
  309. data/lib/KeywordDocumentation.rb +6 -4
  310. data/lib/Limits.rb +1 -1
  311. data/lib/Log.rb +8 -1
  312. data/lib/LogicalExpression.rb +14 -13
  313. data/lib/LogicalFunction.rb +88 -14
  314. data/lib/LogicalOperation.rb +124 -53
  315. data/lib/MacroParser.rb +1 -1
  316. data/lib/MacroTable.rb +2 -2
  317. data/lib/Message.rb +1 -1
  318. data/lib/MessageHandler.rb +7 -3
  319. data/lib/Project.rb +93 -14
  320. data/lib/ProjectFileParser.rb +30 -15
  321. data/lib/PropertyList.rb +103 -36
  322. data/lib/PropertySet.rb +22 -10
  323. data/lib/PropertyTreeNode.rb +120 -15
  324. data/lib/Query.rb +119 -48
  325. data/lib/{RTPNavigator.rb → RTFNavigator.rb} +11 -10
  326. data/lib/RTFQuery.rb +166 -0
  327. data/lib/{RTPReport.rb → RTFReport.rb} +11 -8
  328. data/lib/RealFormat.rb +1 -1
  329. data/lib/RemoteServiceManager.rb +80 -0
  330. data/lib/ReportServer.rb +66 -0
  331. data/lib/Resource.rb +1 -1
  332. data/lib/ResourceScenario.rb +48 -19
  333. data/lib/RichText.rb +98 -41
  334. data/lib/RichTextDocument.rb +10 -8
  335. data/lib/RichTextElement.rb +72 -28
  336. data/lib/{RichTextProtocolExample.rb → RichTextFunctionExample.rb} +8 -7
  337. data/lib/{RichTextProtocolHandler.rb → RichTextFunctionHandler.rb} +12 -14
  338. data/lib/RichTextParser.rb +6 -3
  339. data/lib/RichTextScanner.rb +91 -19
  340. data/lib/RichTextSnip.rb +8 -3
  341. data/lib/RichTextSyntaxRules.rb +103 -45
  342. data/lib/Scenario.rb +1 -1
  343. data/lib/ScenarioData.rb +2 -2
  344. data/lib/Scoreboard.rb +1 -1
  345. data/lib/Shift.rb +1 -1
  346. data/lib/ShiftAssignments.rb +1 -1
  347. data/lib/ShiftScenario.rb +1 -1
  348. data/lib/SourceFileInfo.rb +1 -1
  349. data/lib/SyntaxReference.rb +2 -2
  350. data/lib/TOCEntry.rb +1 -1
  351. data/lib/TableColumnDefinition.rb +59 -16
  352. data/lib/TableOfContents.rb +1 -1
  353. data/lib/Task.rb +1 -1
  354. data/lib/TaskDependency.rb +1 -1
  355. data/lib/TaskJuggler.rb +31 -8
  356. data/lib/TaskScenario.rb +165 -16
  357. data/lib/TextParser.rb +36 -22
  358. data/lib/TextParser/Pattern.rb +3 -3
  359. data/lib/TextParser/Rule.rb +2 -2
  360. data/lib/TextParser/StackElement.rb +4 -3
  361. data/lib/TextParser/TokenDoc.rb +2 -2
  362. data/lib/TextScanner.rb +52 -37
  363. data/lib/Tj3Config.rb +6 -5
  364. data/lib/TjException.rb +1 -1
  365. data/lib/TjTime.rb +12 -3
  366. data/lib/TjpExample.rb +1 -1
  367. data/lib/TjpSyntaxRules.rb +1044 -150
  368. data/lib/UTF8String.rb +2 -1
  369. data/lib/UserManual.rb +18 -70
  370. data/lib/WorkingHours.rb +3 -3
  371. data/lib/XMLDocument.rb +3 -2
  372. data/lib/XMLElement.rb +6 -1
  373. data/lib/deep_copy.rb +1 -1
  374. data/lib/reports/CSVFile.rb +1 -1
  375. data/lib/reports/ColumnTable.rb +9 -9
  376. data/lib/reports/GanttChart.rb +1 -1
  377. data/lib/reports/GanttContainer.rb +1 -1
  378. data/lib/reports/GanttHeader.rb +1 -1
  379. data/lib/reports/GanttHeaderScaleItem.rb +1 -1
  380. data/lib/reports/GanttLine.rb +40 -40
  381. data/lib/reports/GanttLoadStack.rb +1 -1
  382. data/lib/reports/GanttMilestone.rb +1 -1
  383. data/lib/reports/GanttRouter.rb +1 -1
  384. data/lib/reports/GanttTaskBar.rb +1 -1
  385. data/lib/reports/HTMLGraphics.rb +1 -1
  386. data/lib/reports/Navigator.rb +149 -22
  387. data/lib/reports/Report.rb +115 -172
  388. data/lib/reports/ReportBase.rb +22 -27
  389. data/lib/reports/ReportContext.rb +29 -15
  390. data/lib/reports/ReportTable.rb +1 -1
  391. data/lib/reports/ReportTableCell.rb +120 -27
  392. data/lib/reports/ReportTableColumn.rb +3 -3
  393. data/lib/reports/ReportTableLegend.rb +1 -1
  394. data/lib/reports/ReportTableLine.rb +10 -2
  395. data/lib/reports/ResourceListRE.rb +5 -1
  396. data/lib/reports/TableReport.rb +237 -287
  397. data/lib/reports/TaskListRE.rb +5 -1
  398. data/lib/reports/TextReport.rb +7 -4
  399. data/lib/reports/TimeSheetReport.rb +233 -0
  400. data/lib/reports/TjpExportRE.rb +2 -2
  401. data/lib/taskjuggler3.rb +27 -11
  402. data/lib/tj3client.rb +110 -0
  403. data/lib/tj3man.rb +4 -4
  404. data/manual/Getting_Started +0 -50
  405. data/manual/How_To_Contribute +6 -13
  406. data/manual/Installation +102 -28
  407. data/manual/Intro +11 -1
  408. data/manual/Reporting_Bugs +23 -7
  409. data/manual/Rich_Text_Attributes +59 -6
  410. data/manual/TaskJuggler_2x_Migration +27 -0
  411. data/manual/The_TaskJuggler_Syntax +104 -0
  412. data/manual/Tutorial +10 -9
  413. data/prj_cfg.rb +8 -2
  414. data/tasks/csts.rake +1 -1
  415. data/tasks/manual.rake +5 -3
  416. data/test/MessageChecker.rb +1 -1
  417. data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
  418. data/test/TestSuite/HTML-Reports/Alerts.tjp +77 -0
  419. data/test/TestSuite/HTML-Reports/CellText.html +758 -0
  420. data/test/TestSuite/HTML-Reports/CellText.tjp +75 -0
  421. data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
  422. data/test/TestSuite/HTML-Reports/ColumnPeriods.tjp +44 -0
  423. data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
  424. data/test/TestSuite/HTML-Reports/IsOngoing.tjp +34 -0
  425. data/test/TestSuite/HTML-Reports/LogicalFunctions.html +80 -0
  426. data/test/TestSuite/HTML-Reports/LogicalFunctions.tjp +20 -0
  427. data/test/TestSuite/HTML-Reports/Query.html +31 -0
  428. data/test/TestSuite/HTML-Reports/Query.tjp +28 -0
  429. data/test/TestSuite/HTML-Reports/Sorting.tjp +68 -0
  430. data/test/TestSuite/HTML-Reports/TimeSheet.tjp +69 -0
  431. data/test/TestSuite/HTML-Reports/UDAQuery.tjp +27 -0
  432. data/test/TestSuite/HTML-Reports/css/tjmanual.css +52 -0
  433. data/test/TestSuite/HTML-Reports/css/tjreport.css +195 -0
  434. data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
  435. data/test/TestSuite/HTML-Reports/icons/details.png +0 -0
  436. data/test/TestSuite/HTML-Reports/icons/flag-green.png +0 -0
  437. data/test/TestSuite/HTML-Reports/icons/flag-red.png +0 -0
  438. data/test/TestSuite/HTML-Reports/icons/flag-yellow.png +0 -0
  439. data/test/TestSuite/HTML-Reports/icons/resource.png +0 -0
  440. data/test/TestSuite/HTML-Reports/icons/resourcegroup.png +0 -0
  441. data/test/TestSuite/HTML-Reports/icons/task.png +0 -0
  442. data/test/TestSuite/HTML-Reports/icons/taskgroup.png +0 -0
  443. data/test/TestSuite/HTML-Reports/reference.tjp +7 -8
  444. data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
  445. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +1301 -0
  446. data/test/TestSuite/Scheduler/Correct/Mandatory.tjp +34 -0
  447. data/test/TestSuite/Syntax/Correct/Celltext.tjp +2 -1
  448. data/test/TestSuite/Syntax/Correct/Journal.tjp +2 -2
  449. data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +2 -1
  450. data/test/TestSuite/Syntax/Correct/LogicalFunction.tjp +20 -0
  451. data/test/TestSuite/Syntax/Correct/Query.tjp +18 -0
  452. data/test/TestSuite/Syntax/Correct/StatusSheet.tjp +45 -0
  453. data/test/TestSuite/Syntax/Correct/TimeSheet.tjp +49 -0
  454. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  455. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  456. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  457. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  458. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  459. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  460. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  461. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  462. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
  463. data/test/TestSuite/Syntax/Correct/tutorial.tjp +113 -14
  464. data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +28 -0
  465. data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +12 -0
  466. data/test/all.rb +2 -2
  467. data/test/test_BatchProcessor.rb +42 -13
  468. data/test/test_CSV-Reports.rb +1 -1
  469. data/test/test_Journal.rb +176 -0
  470. data/test/test_Limits.rb +1 -1
  471. data/test/test_LogicalExpression.rb +14 -5
  472. data/test/test_MacroTable.rb +1 -1
  473. data/test/test_Project.rb +1 -1
  474. data/test/test_PropertySet.rb +1 -1
  475. data/test/test_Query.rb +1 -1
  476. data/test/test_RealFormat.rb +1 -1
  477. data/test/test_RichText.rb +30 -20
  478. data/test/test_Scheduler.rb +1 -1
  479. data/test/test_ShiftAssignments.rb +2 -2
  480. data/test/test_Syntax.rb +1 -1
  481. data/test/test_TextScanner.rb +1 -1
  482. data/test/test_TjTime.rb +1 -1
  483. data/test/test_TjpExample.rb +1 -1
  484. data/test/test_UTF8String.rb +1 -1
  485. data/test/test_WorkingHours.rb +1 -1
  486. data/test/test_deep_copy.rb +2 -2
  487. metadata +610 -532
  488. data/doc/files/lib/ms_test_rb.html +0 -90
  489. data/examples/ContactList.html +0 -1467
  490. data/examples/Deliveries.html +0 -485
  491. data/examples/Development.html +0 -2525
  492. data/examples/Overview.html +0 -747
  493. data/examples/Resource Graph.html +0 -616
  494. data/lib/ms_test.rb +0 -27
  495. data/test/TestSuite/HTML-Reports/reference-export.html +0 -187
data/lib/MacroParser.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = MacroParser.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
data/lib/MacroTable.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = MacroTable.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -62,7 +62,7 @@ class TaskJuggler
62
62
  # unchanged. No error is generated.
63
63
  def resolve(args, sourceFileInfo)
64
64
  name = args[0]
65
- resolved = @macros[name].value.clone
65
+ resolved = @macros[name].value.dup
66
66
  i = 0
67
67
  args.each do |arg|
68
68
  resolved.gsub!("${#{i}}", arg)
data/lib/Message.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Message.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = MessageHandler.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -14,17 +14,21 @@ class TaskJuggler
14
14
 
15
15
  class MessageHandler
16
16
 
17
- attr_reader :messages
17
+ attr_reader :messages, :errors
18
18
 
19
19
  def initialize(console = false)
20
20
  @messages = []
21
21
  @console = console
22
+
23
+ @errors = 0
22
24
  end
23
25
 
24
26
  def send(message)
27
+ @errors += 1 if message.level == 'error' || message.level == 'fatal'
25
28
  @messages << message
26
29
  if @console
27
- $stderr.puts message
30
+ # The to_s call is necessary to support remote prints via DRb.
31
+ $stderr.puts message.to_s
28
32
  end
29
33
  end
30
34
 
data/lib/Project.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = Project.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -56,12 +56,17 @@ class TaskJuggler
56
56
  def initialize(id, name, version, messageHandler)
57
57
  @messageHandler = messageHandler
58
58
  @attributes = {
59
- 'projectid' => id || "prj",
60
- 'projectids' => [ id ],
61
- 'name' => name,
62
- 'version' => version || "1.0",
63
- 'costAccount' => nil,
59
+ # This nested Array defines the supported alert levels. The lowest
60
+ # level comes first at index 0 and the level rises from there on.
61
+ # Currently, these levels are hardcoded. Each level entry has 3
62
+ # members: the tjp syntax token, the user visible name and the
63
+ # associated color as RGB byte array.
64
+ 'alertLevels' => [
65
+ [ 'green', 'Green', '#008000' ],
66
+ [ 'yellow', 'Yellow', '#BEA800' ],
67
+ [ 'red', 'Red', '#C00000' ] ],
64
68
  'copyright' => nil,
69
+ 'costAccount' => nil,
65
70
  'currency' => "EUR",
66
71
  'currencyFormat' => RealFormat.new([ '-', '', '', ',', 2 ]),
67
72
  'dailyworkinghours' => 8.0,
@@ -70,10 +75,13 @@ class TaskJuggler
70
75
  'journal' => Journal.new,
71
76
  'limits' => nil,
72
77
  'loadUnit' => :shortauto,
78
+ 'name' => name,
73
79
  'navigators' => {},
74
80
  'now' => TjTime.now.align(3600),
75
81
  'numberFormat' => RealFormat.new([ '-', '', '', '.', 1]),
76
82
  'priority' => 500,
83
+ 'projectid' => id || "prj",
84
+ 'projectids' => [ id ],
77
85
  'rate' => 0.0,
78
86
  'revenueAccount' => nil,
79
87
  'scheduleGranularity' => Project.maxScheduleGranularity,
@@ -81,7 +89,9 @@ class TaskJuggler
81
89
  'start' => nil,
82
90
  'timeFormat' => "%Y-%m-%d",
83
91
  'timezone' => nil,
92
+ 'trackingScenarioIdx' => 0,
84
93
  'vacations' => [],
94
+ 'version' => version || "1.0",
85
95
  'weekStartsMonday' => true,
86
96
  'workinghours' => WorkingHours.new,
87
97
  'yearlyworkingdays' => 260.714
@@ -137,6 +147,8 @@ class TaskJuggler
137
147
  # Inh. Inh.Prj Scen. Default
138
148
  [ 'index', 'Index', FixnumAttribute,
139
149
  false, false, false, -1 ],
150
+ [ 'flags', 'Flags', FlagListAttribute,
151
+ true, false, true, [] ],
140
152
  [ 'tree', 'Tree Index', StringAttribute,
141
153
  false, false, false, "" ],
142
154
  [ 'wbs', 'WBS', StringAttribute,
@@ -259,6 +271,8 @@ class TaskJuggler
259
271
  false, false, true, [] ],
260
272
  [ 'startsuccs', 'Start Succs.', TaskListAttribute,
261
273
  false, false, true, [] ],
274
+ [ 'status', 'Task Status', StringAttribute,
275
+ false, false, true, "" ],
262
276
  [ 'tree', 'Tree Index', StringAttribute,
263
277
  false, false, false, "" ],
264
278
  [ 'wbs', 'WBS', StringAttribute,
@@ -286,6 +300,8 @@ class TaskJuggler
286
300
  true, true, false, nil ],
287
301
  [ 'epilog', 'Epilog', RichTextAttribute,
288
302
  false, false, false, nil ],
303
+ [ 'flags', 'Flags', FlagListAttribute,
304
+ true, false, true, [] ],
289
305
  [ 'footer', 'Footer', RichTextAttribute,
290
306
  true, false, false, nil ],
291
307
  [ 'formats', 'Formats', FormatListAttribute,
@@ -294,8 +310,8 @@ class TaskJuggler
294
310
  true, false, false, true ],
295
311
  [ 'header', 'Header', RichTextAttribute,
296
312
  true, false, false, nil ],
297
- [ 'headline', 'Headline', StringAttribute,
298
- false, false, false, '' ],
313
+ [ 'headline', 'Headline', RichTextAttribute,
314
+ false, false, false, nil ],
299
315
  [ 'hideResource', 'Hide Resource', LogicalExpressionAttribute,
300
316
  true, false, false, nil ],
301
317
  [ 'hideTask', 'Hide Task', LogicalExpressionAttribute,
@@ -326,6 +342,8 @@ class TaskJuggler
326
342
  true, false, false, nil ],
327
343
  [ 'scenarios', 'Scenarios', ScenarioListAttribute,
328
344
  true, false, false, [ 0 ] ],
345
+ [ 'selfcontained', 'Selfcontained', BooleanAttribute,
346
+ true, false, false, false ],
329
347
  [ 'shortTimeFormat', 'Short Time Format', StringAttribute,
330
348
  true, true, false, nil ],
331
349
  [ 'sortResources', 'Sort Resources', SortListAttribute,
@@ -342,6 +360,8 @@ class TaskJuggler
342
360
  true, true, false, nil ],
343
361
  [ 'timezone', 'Time Zone', StringAttribute,
344
362
  true, true, false, nil ],
363
+ [ 'title', 'Title', StringAttribute,
364
+ false, false, false, nil ],
345
365
  [ 'tree', 'Tree Index', StringAttribute,
346
366
  false, false, false, "" ],
347
367
  [ 'wbs', 'WBS', StringAttribute,
@@ -353,6 +373,7 @@ class TaskJuggler
353
373
 
354
374
  Scenario.new(self, 'plan', 'Plan Scenario', nil)
355
375
 
376
+ # This holds a reference to the ReportContext for each Thread.
356
377
  @reportContext = nil
357
378
  @outputDir = ''
358
379
  end
@@ -390,6 +411,39 @@ class TaskJuggler
390
411
  @scenarios.items
391
412
  end
392
413
 
414
+ # Try to match _levelName_ to a defined alert level name and return the
415
+ # index of it. If no level is found, nil is returned.
416
+ def alertLevelIndex(levelName)
417
+ 0.upto(@attributes['alertLevels'].length - 1) do |i|
418
+ if @attributes['alertLevels'][i][0] == levelName
419
+ return i
420
+ end
421
+ end
422
+ nil
423
+ end
424
+
425
+ # Return the ID or keyword of the alert level with the given _levelIndex_.
426
+ # Or nil if the level does not exist.
427
+ def alertLevelId(levelIndex)
428
+ return 'unknown' unless @attributes['alertLevels'][levelIndex]
429
+ @attributes['alertLevels'][levelIndex][0]
430
+ end
431
+
432
+ # Return the user readable name of the alert level with the given
433
+ # _levelIndex_. Or nil if the level does not exist.
434
+ def alertLevelName(levelIndex)
435
+ return 'unknown' unless @attributes['alertLevels'][levelIndex]
436
+ @attributes['alertLevels'][levelIndex][1]
437
+ end
438
+
439
+ # Return the color of the alert level with the given _levelIndex_. Or nil
440
+ # if the level does not exist. The color is an RGB encoded byte array,
441
+ # stored as hexadecimal String, prefixed with a pound sign.
442
+ def alertLevelColor(levelIndex)
443
+ return 'unknown' unless @attributes['alertLevels'][levelIndex]
444
+ @attributes['alertLevels'][levelIndex][2]
445
+ end
446
+
393
447
  # Return the average number of working hours per day. This defaults to 8 but
394
448
  # can be set to other values by the user.
395
449
  def dailyWorkingHours
@@ -537,14 +591,23 @@ class TaskJuggler
537
591
  end
538
592
  else
539
593
  bp = BatchProcessor.new(maxCpuCores)
540
- @reports.each_value do |report|
594
+ @reports.each do |report|
541
595
  next if report.get('formats').empty?
542
- bp.queue(report) { report.generate }
596
+ bp.queue(report) {
597
+ @reportContext = ReportContext.new(self, report)
598
+ report.generate
599
+ }
543
600
  end
544
601
  bp.wait do |report|
602
+ Log.startProgressMeter("Report #{report.tag.name}")
545
603
  $stdout.print(report.stdout)
546
604
  $stderr.print(report.stderr)
547
- Log.startProgressMeter("Report #{report.tag.name}")
605
+ if report.retVal.signaled?
606
+ raise TjException.new, "Signal raised"
607
+ end
608
+ unless report.retVal.success?
609
+ raise TjException.new, "Process aborted"
610
+ end
548
611
  Log.stopProgressMeter
549
612
  end
550
613
  end
@@ -556,6 +619,17 @@ class TaskJuggler
556
619
  true
557
620
  end
558
621
 
622
+ def generateReport(reportId)
623
+ unless (report = @reports[reportId])
624
+ error('unknown_report_id',
625
+ "Request to generate unknown report #{reportId}")
626
+ end
627
+ Log.startProgressMeter("Report #{report.name}")
628
+ @reportContext = ReportContext.new(self, report)
629
+ report.generate
630
+ Log.stopProgressMeter
631
+ end
632
+
559
633
  ####################################################################
560
634
  # The following functions are not intended to be called from outside
561
635
  # the TaskJuggler library. There is no guarantee that these
@@ -695,10 +769,9 @@ class TaskJuggler
695
769
  name
696
770
  end
697
771
 
698
-
699
-
700
772
  # Print the attribute values. It's used for debugging only.
701
773
  def to_s
774
+ raise "STOP!"
702
775
  @attributes.each do |attribute, value|
703
776
  if value
704
777
  puts "#{attribute}: " +
@@ -707,6 +780,12 @@ class TaskJuggler
707
780
  end
708
781
  end
709
782
 
783
+ # This function sends an error message to the message handler.
784
+ def error(id, text)
785
+ message = Message.new(id, 'error', text)
786
+ @messageHandler.send(message)
787
+ end
788
+
710
789
  protected
711
790
 
712
791
  def prepareScenario(scIdx)
@@ -814,7 +893,7 @@ class TaskJuggler
814
893
  loop do
815
894
  # The main scheduler loop only needs to look at the first task that is
816
895
  # ready to be scheduled.
817
- workItems = Array.new(tasks)
896
+ workItems = tasks.to_ary
818
897
 
819
898
  # Count the already completed tasks.
820
899
  completedTasks = 0
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = ProjectFileParser.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -14,8 +14,9 @@ require 'TextParser'
14
14
  require 'TextScanner'
15
15
  require 'TjpSyntaxRules'
16
16
  require 'RichText'
17
- require 'RTPNavigator'
18
- require 'RTPReport'
17
+ require 'RTFNavigator'
18
+ require 'RTFQuery'
19
+ require 'RTFReport'
19
20
 
20
21
  class TaskJuggler
21
22
 
@@ -49,20 +50,20 @@ class TaskJuggler
49
50
 
50
51
  # Call this function with the master file to start processing a TJP file or
51
52
  # a set of TJP files.
52
- def open(file, master)
53
+ def open(file, master, fileNameIsBuffer = false)
53
54
  begin
54
55
  @scanner = TextScanner.new(file, @messageHandler)
55
56
  # We need the TextScanner object for error reporting.
56
- if master && file != '.' && file[-4, 4] != '.tjp'
57
+ if master && !fileNameIsBuffer && file != '.' && file[-4, 4] != '.tjp'
57
58
  error('illegal_extension', "Project file name must end with " +
58
59
  '\'.tjp\' extension')
59
60
  end
60
- @scanner.open
61
+ @scanner.open(fileNameIsBuffer)
61
62
  rescue StandardError
62
63
  error('file_open', $!.message)
63
64
  end
64
65
 
65
- @property = @report = nil
66
+ @property = nil
66
67
  @scenarioIdx = 0
67
68
  initFileStack
68
69
  end
@@ -99,6 +100,9 @@ class TaskJuggler
99
100
  @scanner.sourceFileInfo))
100
101
  @scanner.addMacro(Macro.new('now', @project['now'].to_s,
101
102
  @scanner.sourceFileInfo))
103
+ @scanner.addMacro(Macro.new('today', @project['now'].
104
+ to_s(@project['timeFormat']),
105
+ @scanner.sourceFileInfo))
102
106
  end
103
107
 
104
108
  private
@@ -130,11 +134,13 @@ class TaskJuggler
130
134
  # Make sure the interval is within the project time frame.
131
135
  if iv.start < @project['start'] || iv.start >= @project['end']
132
136
  error('interval_start_in_range',
133
- "Start date #{iv.start} must be within the project time frame")
137
+ "Start date #{iv.start} must be within the project time frame " +
138
+ "(#{@project['start']} - #{@project['end']})")
134
139
  end
135
140
  if iv.end <= @project['start'] || iv.end > @project['end']
136
141
  error('interval_end_in_range',
137
- "End date #{iv.end} must be within the project time frame")
142
+ "End date #{iv.end} must be within the project time frame " +
143
+ "(#{@project['start']} - #{@project['end']})")
138
144
  end
139
145
  end
140
146
 
@@ -194,20 +200,29 @@ class TaskJuggler
194
200
  # This is necessary, because the RichText parser knows nothing about the
195
201
  # actual input file. So we have to map the error location in the RichText
196
202
  # input stream back to the position in the project file.
197
- def newRichText(text)
203
+ # To limit the supported set of variable tokens, a subset can be provided
204
+ # by _tokenSet_.
205
+ def newRichText(text, tokenSet = nil)
198
206
  sfi = sourceFileInfo
199
207
  begin
200
- rText = RichText.new(text)
201
- rText.registerProtocol(RTPNavigator.new(@project, sfi))
202
- rText.registerProtocol(RTPReport.new(@project, sfi))
208
+ handlers = [
209
+ RTFNavigator.new(@project, sfi),
210
+ RTFQuery.new(@project, sfi),
211
+ RTFReport.new(@project, sfi)
212
+ ]
213
+ rText = RichText.new(text, handlers)
214
+ rti = rText.generateIntermediateFormat( [ 0, 0, 0], tokenSet)
215
+ rti.sectionNumbers = false
203
216
  rescue RichTextException => msg
204
217
  sfi = SourceFileInfo.new(sfi.fileName, sfi.lineNo + msg.lineNo - 1, 0)
205
218
  message = Message.new(msg.id, 'error', msg.text + "\n" + msg.line,
206
219
  @property, nil, sfi)
207
220
  @messageHandler.send(message)
208
221
 
222
+ # An empty strings signals an already reported error
223
+ raise TjException.new, ''
209
224
  end
210
- rText
225
+ rti
211
226
  end
212
227
 
213
228
  # This method is a convenience wrapper around Project.new. It checks if
@@ -224,7 +239,7 @@ class TaskJuggler
224
239
  name, nil)
225
240
  @property.typeSpec = type
226
241
  @property.sourceFileInfo = sourceFileInfo
227
- @property.set('formats', [ type ])
242
+ @property.set('formats', [ :tjp ])
228
243
  @property.inheritAttributes
229
244
  @property
230
245
  end
data/lib/PropertyList.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # = PropertyList.rb -- The TaskJuggler III Project Management Software
5
5
  #
6
- # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
6
+ # Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
7
7
  #
8
8
  # This program is free software; you can redistribute it and/or modify
9
9
  # it under the terms of version 2 of the GNU General Public License as
@@ -19,7 +19,7 @@ class TaskJuggler
19
19
  # be used for sorting, a scenario index if necessary and the sorting
20
20
  # direction (up/down). All nodes in the PropertyList must belong to the same
21
21
  # PropertySet.
22
- class PropertyList < Array
22
+ class PropertyList
23
23
 
24
24
  attr_writer :query
25
25
  attr_reader :propertySet, :query, :sortingLevels, :sortingCriteria,
@@ -27,8 +27,8 @@ class TaskJuggler
27
27
 
28
28
  # A PropertyList is always bound to a certain PropertySet. All properties
29
29
  # in the list must be of that set.
30
- def initialize(arg)
31
- super(arg.to_ary)
30
+ def initialize(arg, copyItems = true)
31
+ @items = copyItems ? arg.to_ary : []
32
32
  if arg.is_a?(PropertySet)
33
33
  # Create a PropertyList from the given PropertySet.
34
34
  @propertySet = arg
@@ -40,7 +40,7 @@ class TaskJuggler
40
40
  @query = nil
41
41
  resetSorting
42
42
  addSortingCriteria('seqno', true, -1)
43
- self.sort!
43
+ sort!
44
44
  else
45
45
  # Create a PropertyList from a given other PropertyList.
46
46
  @propertySet = arg.propertySet
@@ -52,6 +52,17 @@ class TaskJuggler
52
52
  end
53
53
  end
54
54
 
55
+ # This class should be a derived class of Array. But since it re-defines
56
+ # sort!() and still needs to call Array::sort!() I took a different route.
57
+ # All missing methods will be propagated to the @items Array.
58
+ def method_missing(func, *args, &block)
59
+ @items.method(func).call(*args, &block)
60
+ end
61
+
62
+ def to_ary
63
+ @items.dup
64
+ end
65
+
55
66
  # Set all sorting levels as Array of triplets.
56
67
  def setSorting(modes)
57
68
  resetSorting
@@ -68,8 +79,8 @@ class TaskJuggler
68
79
  @scenarioIdx = []
69
80
  end
70
81
 
71
- # Append another Array of Tasks or a PropertyList to this. The list will be
72
- # sorted again.
82
+ # Append another Array of PropertyTreeNodes or a PropertyList to this. The
83
+ # list will be sorted again.
73
84
  def append(list)
74
85
  if $DEBUG
75
86
  list.each do |node|
@@ -79,13 +90,14 @@ class TaskJuggler
79
90
  end
80
91
  end
81
92
 
82
- concat(list)
83
- self.sort!
93
+ @items.concat(list)
94
+ sort!
84
95
  end
85
96
 
86
97
  # Append a new sorting level to the existing levels.
87
98
  def addSortingCriteria(criteria, up, scIdx)
88
- unless @propertySet.knownAttribute?(criteria)
99
+ unless @propertySet.knownAttribute?(criteria) ||
100
+ @propertySet.hasQuery?(criteria, scIdx)
89
101
  raise TjException.new, "Unknown attribute #{criteria} used for " +
90
102
  'sorting criterium'
91
103
  end
@@ -95,6 +107,9 @@ class TaskJuggler
95
107
  "You must specify a scenario id."
96
108
  end
97
109
  else
110
+ if @propertySet.project.scenario(scIdx).nil?
111
+ raise TjException.new, "Unknown scenario index #{scIdx} used."
112
+ end
98
113
  if !@propertySet.scenarioSpecific?(criteria)
99
114
  raise TjException.new, "Attribute #{criteria} is not scenario specific"
100
115
  end
@@ -114,7 +129,82 @@ class TaskJuggler
114
129
 
115
130
  # Sort the properties according to the currently defined sorting criteria.
116
131
  def sort!
117
- super do |a, b|
132
+ if treeMode?
133
+ # Tree sorting is somewhat complex. It will be based on the 'tree'
134
+ # attribute of the PropertyTreeNodes but we have to update them first
135
+ # based on the other sorting criteria.
136
+
137
+ # Remove the tree sorting mode first.
138
+ sc = @sortingCriteria.delete_at(0)
139
+ su = @sortingUp.delete_at(0)
140
+ si = @scenarioIdx.delete_at(0)
141
+ @sortingLevels -= 1
142
+
143
+ # Sort the list based on the rest of the modes.
144
+ sortInternal
145
+ # The update the 'index' attributes of the PropertyTreeNodes.
146
+ index
147
+ # An then the 'tree' attributes.
148
+ indexTree
149
+
150
+ # Restore the 'tree' sorting mode again.
151
+ @sortingCriteria.insert(0, sc)
152
+ @sortingUp.insert(0, su)
153
+ @scenarioIdx.insert(0, si)
154
+ @sortingLevels += 1
155
+
156
+ # Sort again, now based on the updated 'tree' attributes.
157
+ sortInternal
158
+ else
159
+ sortInternal
160
+ end
161
+ # Update indexes.
162
+ index
163
+ end
164
+
165
+ # This function sets the index attribute of all the properties in the list.
166
+ # The index starts with 0 and increases for each property.
167
+ def index
168
+ i = 0
169
+ @items.each do |p|
170
+ p.set('index', i += 1)
171
+ end
172
+ end
173
+
174
+ # Turn the list into a String. This is only used for debugging.
175
+ def to_s # :nodoc:
176
+ res = "Sorting: "
177
+ @sortingLevels.times do |i|
178
+ res += "#{@sortingCriteria[i]}/#{@sortingUp[i] ? 'up' : 'down'}/" +
179
+ "#{@scenarioIdx[i]}, "
180
+ end
181
+ res += "\n#{@items.length} properties:"
182
+ @items.each { |i| res += "#{i.get('id')}: #{i.get('name')}\n" }
183
+ res
184
+ end
185
+
186
+ private
187
+
188
+ # Update the 'tree' indicies that are needed for the 'tree' sorting mode.
189
+ def indexTree
190
+ @items.each do |property|
191
+ # The indicies are an Array if the 'index' attributes for this
192
+ # property and all its parents.
193
+ treeIdcs = property.getIndicies
194
+ # Now convert them to a String.
195
+ tree = ''
196
+ treeIdcs.each do |idx|
197
+ # Prefix the level index with zeros so that we always have a 6
198
+ # digit long String. 6 digits should be large enough for all
199
+ # real-world projects.
200
+ tree += idx.to_s.rjust(6, '0')
201
+ end
202
+ property.set('tree', tree)
203
+ end
204
+ end
205
+
206
+ def sortInternal
207
+ @items.sort! do |a, b|
118
208
  res = 0
119
209
  @sortingLevels.times do |i|
120
210
  if @query
@@ -125,11 +215,11 @@ class TaskJuggler
125
215
 
126
216
  @query.property = a
127
217
  @query.process
128
- aVal = @query.sortableResult
218
+ aVal = @query.to_sort
129
219
 
130
220
  @query.property = b
131
221
  @query.process
132
- bVal = @query.sortableResult
222
+ bVal = @query.to_sort
133
223
  else
134
224
  # In case we don't have a query, we use the static mechanism.
135
225
  # If the scenario index is negative we have a non-scenario-specific
@@ -151,29 +241,6 @@ class TaskJuggler
151
241
  end
152
242
  res
153
243
  end
154
- # Update indexes.
155
- index
156
- end
157
-
158
- # This function sets the index attribute of all the properties in the list.
159
- # The index starts with 0 and increases for each property.
160
- def index
161
- i = 0
162
- each do |p|
163
- p.set('index', i += 1)
164
- end
165
- end
166
-
167
- # Turn the list into a String. This is only used for debugging.
168
- def to_s # :nodoc:
169
- res = "Sorting: "
170
- @sortingLevels.times do |i|
171
- res += "#{@sortingCriteria[i]}/#{@sortingUp[i] ? 'up' : 'down'}/" +
172
- "#{@scenarioIdx[i]}, "
173
- end
174
- res += "\n"
175
- each { |i| res += "#{i.get('id')}: #{i.get('name')}\n" }
176
- res
177
244
  end
178
245
 
179
246
  end