taskjuggler 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. data/COPYING +280 -0
  2. data/README +31 -0
  3. data/Rakefile +20 -0
  4. data/benchmarks/UTF-8-Strings.rb +58 -0
  5. data/benchmarks/allocate.tjp +30 -0
  6. data/benchmarks/booking.tjp +62 -0
  7. data/benchmarks/depends.tjp +112 -0
  8. data/benchmarks/htmltaskreport.tjp +45 -0
  9. data/benchmarks/runbench.rb +24 -0
  10. data/bin/tj3 +3 -0
  11. data/bin/tj3man +3 -0
  12. data/doc/classes/AppConfig.html +808 -0
  13. data/doc/classes/Arguments.html +226 -0
  14. data/doc/classes/String.html +395 -0
  15. data/doc/classes/TaskJuggler.html +1358 -0
  16. data/doc/classes/TaskJuggler/Account.html +257 -0
  17. data/doc/classes/TaskJuggler/AccountScenario.html +218 -0
  18. data/doc/classes/TaskJuggler/Allocation.html +419 -0
  19. data/doc/classes/TaskJuggler/AllocationAttribute.html +291 -0
  20. data/doc/classes/TaskJuggler/AttributeBase.html +608 -0
  21. data/doc/classes/TaskJuggler/AttributeDefinition.html +259 -0
  22. data/doc/classes/TaskJuggler/Booking.html +307 -0
  23. data/doc/classes/TaskJuggler/BookingListAttribute.html +263 -0
  24. data/doc/classes/TaskJuggler/BooleanAttribute.html +261 -0
  25. data/doc/classes/TaskJuggler/CSVFile.html +325 -0
  26. data/doc/classes/TaskJuggler/Charge.html +279 -0
  27. data/doc/classes/TaskJuggler/ChargeListAttribute.html +229 -0
  28. data/doc/classes/TaskJuggler/ChargeSet.html +440 -0
  29. data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +276 -0
  30. data/doc/classes/TaskJuggler/ColumnTable.html +260 -0
  31. data/doc/classes/TaskJuggler/DateAttribute.html +194 -0
  32. data/doc/classes/TaskJuggler/DependencyListAttribute.html +267 -0
  33. data/doc/classes/TaskJuggler/DurationAttribute.html +229 -0
  34. data/doc/classes/TaskJuggler/FixnumAttribute.html +194 -0
  35. data/doc/classes/TaskJuggler/FlagListAttribute.html +263 -0
  36. data/doc/classes/TaskJuggler/FloatAttribute.html +229 -0
  37. data/doc/classes/TaskJuggler/GanttChart.html +667 -0
  38. data/doc/classes/TaskJuggler/GanttContainer.html +441 -0
  39. data/doc/classes/TaskJuggler/GanttHeader.html +280 -0
  40. data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +245 -0
  41. data/doc/classes/TaskJuggler/GanttLine.html +398 -0
  42. data/doc/classes/TaskJuggler/GanttLoadStack.html +327 -0
  43. data/doc/classes/TaskJuggler/GanttMilestone.html +415 -0
  44. data/doc/classes/TaskJuggler/GanttRouter.html +425 -0
  45. data/doc/classes/TaskJuggler/GanttTaskBar.html +429 -0
  46. data/doc/classes/TaskJuggler/HTMLDocument.html +240 -0
  47. data/doc/classes/TaskJuggler/HTMLGraphics.html +231 -0
  48. data/doc/classes/TaskJuggler/Interval.html +552 -0
  49. data/doc/classes/TaskJuggler/IntervalListAttribute.html +267 -0
  50. data/doc/classes/TaskJuggler/KeywordDocumentation.html +796 -0
  51. data/doc/classes/TaskJuggler/Limits.html +416 -0
  52. data/doc/classes/TaskJuggler/Limits/Limit.html +381 -0
  53. data/doc/classes/TaskJuggler/LimitsAttribute.html +261 -0
  54. data/doc/classes/TaskJuggler/Log.html +613 -0
  55. data/doc/classes/TaskJuggler/LogicalAttribute.html +226 -0
  56. data/doc/classes/TaskJuggler/LogicalExpression.html +251 -0
  57. data/doc/classes/TaskJuggler/LogicalFlag.html +229 -0
  58. data/doc/classes/TaskJuggler/LogicalFunction.html +324 -0
  59. data/doc/classes/TaskJuggler/LogicalOperation.html +299 -0
  60. data/doc/classes/TaskJuggler/Macro.html +194 -0
  61. data/doc/classes/TaskJuggler/MacroParser.html +360 -0
  62. data/doc/classes/TaskJuggler/MacroTable.html +366 -0
  63. data/doc/classes/TaskJuggler/Message.html +281 -0
  64. data/doc/classes/TaskJuggler/MessageHandler.html +215 -0
  65. data/doc/classes/TaskJuggler/Project.html +1606 -0
  66. data/doc/classes/TaskJuggler/ProjectFileParser.html +412 -0
  67. data/doc/classes/TaskJuggler/PropertyList.html +597 -0
  68. data/doc/classes/TaskJuggler/PropertySet.html +1200 -0
  69. data/doc/classes/TaskJuggler/PropertyTreeNode.html +1449 -0
  70. data/doc/classes/TaskJuggler/Query.html +600 -0
  71. data/doc/classes/TaskJuggler/RealFormat.html +252 -0
  72. data/doc/classes/TaskJuggler/ReferenceAttribute.html +194 -0
  73. data/doc/classes/TaskJuggler/Report.html +528 -0
  74. data/doc/classes/TaskJuggler/ReportElement.html +1070 -0
  75. data/doc/classes/TaskJuggler/ReportTable.html +497 -0
  76. data/doc/classes/TaskJuggler/ReportTableCell.html +518 -0
  77. data/doc/classes/TaskJuggler/ReportTableColumn.html +364 -0
  78. data/doc/classes/TaskJuggler/ReportTableElement.html +644 -0
  79. data/doc/classes/TaskJuggler/ReportTableLegend.html +343 -0
  80. data/doc/classes/TaskJuggler/ReportTableLine.html +431 -0
  81. data/doc/classes/TaskJuggler/Resource.html +211 -0
  82. data/doc/classes/TaskJuggler/ResourceListAttribute.html +267 -0
  83. data/doc/classes/TaskJuggler/ResourceListRE.html +249 -0
  84. data/doc/classes/TaskJuggler/ResourceScenario.html +1137 -0
  85. data/doc/classes/TaskJuggler/RichText.html +537 -0
  86. data/doc/classes/TaskJuggler/RichTextAttribute.html +229 -0
  87. data/doc/classes/TaskJuggler/RichTextDocument.html +418 -0
  88. data/doc/classes/TaskJuggler/RichTextElement.html +829 -0
  89. data/doc/classes/TaskJuggler/RichTextException.html +212 -0
  90. data/doc/classes/TaskJuggler/RichTextParser.html +317 -0
  91. data/doc/classes/TaskJuggler/RichTextProtocolExample.html +303 -0
  92. data/doc/classes/TaskJuggler/RichTextProtocolHandler.html +194 -0
  93. data/doc/classes/TaskJuggler/RichTextScanner.html +561 -0
  94. data/doc/classes/TaskJuggler/RichTextSnip.html +364 -0
  95. data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +883 -0
  96. data/doc/classes/TaskJuggler/Scenario.html +163 -0
  97. data/doc/classes/TaskJuggler/ScenarioData.html +354 -0
  98. data/doc/classes/TaskJuggler/Scoreboard.html +638 -0
  99. data/doc/classes/TaskJuggler/Shift.html +255 -0
  100. data/doc/classes/TaskJuggler/ShiftAssignment.html +488 -0
  101. data/doc/classes/TaskJuggler/ShiftAssignments.html +715 -0
  102. data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +261 -0
  103. data/doc/classes/TaskJuggler/ShiftScenario.html +282 -0
  104. data/doc/classes/TaskJuggler/SourceFileInfo.html +247 -0
  105. data/doc/classes/TaskJuggler/StringAttribute.html +229 -0
  106. data/doc/classes/TaskJuggler/SymbolAttribute.html +194 -0
  107. data/doc/classes/TaskJuggler/SyntaxReference.html +516 -0
  108. data/doc/classes/TaskJuggler/TOCEntry.html +242 -0
  109. data/doc/classes/TaskJuggler/TableColumnDefinition.html +273 -0
  110. data/doc/classes/TaskJuggler/TableOfContents.html +256 -0
  111. data/doc/classes/TaskJuggler/Task.html +203 -0
  112. data/doc/classes/TaskJuggler/TaskDependency.html +251 -0
  113. data/doc/classes/TaskJuggler/TaskListAttribute.html +267 -0
  114. data/doc/classes/TaskJuggler/TaskListRE.html +250 -0
  115. data/doc/classes/TaskJuggler/TaskScenario.html +2206 -0
  116. data/doc/classes/TaskJuggler/TextParser.html +670 -0
  117. data/doc/classes/TaskJuggler/TextParser/Pattern.html +923 -0
  118. data/doc/classes/TaskJuggler/TextParser/Rule.html +779 -0
  119. data/doc/classes/TaskJuggler/TextParser/StackElement.html +267 -0
  120. data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +212 -0
  121. data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +221 -0
  122. data/doc/classes/TaskJuggler/TextScanner.html +708 -0
  123. data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +355 -0
  124. data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +341 -0
  125. data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +260 -0
  126. data/doc/classes/TaskJuggler/TjException.html +185 -0
  127. data/doc/classes/TaskJuggler/TjTime.html +1845 -0
  128. data/doc/classes/TaskJuggler/TjpExample.html +310 -0
  129. data/doc/classes/TaskJuggler/TjpExportRE.html +329 -0
  130. data/doc/classes/TaskJuggler/TjpSyntaxRules.html +8928 -0
  131. data/doc/classes/TaskJuggler/UserManual.html +606 -0
  132. data/doc/classes/TaskJuggler/WorkingHours.html +582 -0
  133. data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +284 -0
  134. data/doc/classes/TaskJuggler/XMLBlob.html +207 -0
  135. data/doc/classes/TaskJuggler/XMLComment.html +206 -0
  136. data/doc/classes/TaskJuggler/XMLDocument.html +293 -0
  137. data/doc/classes/TaskJuggler/XMLElement.html +341 -0
  138. data/doc/classes/TaskJuggler/XMLNamedText.html +174 -0
  139. data/doc/classes/TaskJuggler/XMLText.html +221 -0
  140. data/doc/files/COPYING.html +448 -0
  141. data/doc/files/README.html +134 -0
  142. data/doc/files/lib/AccountScenario_rb.html +116 -0
  143. data/doc/files/lib/Account_rb.html +118 -0
  144. data/doc/files/lib/Allocation_rb.html +118 -0
  145. data/doc/files/lib/AppConfig_rb.html +116 -0
  146. data/doc/files/lib/AttributeBase_rb.html +106 -0
  147. data/doc/files/lib/AttributeDefinition_rb.html +106 -0
  148. data/doc/files/lib/Attributes_rb.html +130 -0
  149. data/doc/files/lib/Booking_rb.html +106 -0
  150. data/doc/files/lib/ChargeSet_rb.html +116 -0
  151. data/doc/files/lib/Charge_rb.html +116 -0
  152. data/doc/files/lib/HTMLDocument_rb.html +116 -0
  153. data/doc/files/lib/Interval_rb.html +116 -0
  154. data/doc/files/lib/KeywordDocumentation_rb.html +122 -0
  155. data/doc/files/lib/Limits_rb.html +116 -0
  156. data/doc/files/lib/Log_rb.html +116 -0
  157. data/doc/files/lib/LogicalExpression_rb.html +122 -0
  158. data/doc/files/lib/LogicalFlag_rb.html +116 -0
  159. data/doc/files/lib/LogicalFunction_rb.html +116 -0
  160. data/doc/files/lib/LogicalOperation_rb.html +116 -0
  161. data/doc/files/lib/MacroParser_rb.html +118 -0
  162. data/doc/files/lib/MacroTable_rb.html +122 -0
  163. data/doc/files/lib/MessageHandler_rb.html +106 -0
  164. data/doc/files/lib/Message_rb.html +116 -0
  165. data/doc/files/lib/ProjectFileParser_rb.html +122 -0
  166. data/doc/files/lib/Project_rb.html +148 -0
  167. data/doc/files/lib/PropertyList_rb.html +106 -0
  168. data/doc/files/lib/PropertySet_rb.html +118 -0
  169. data/doc/files/lib/PropertyTreeNode_rb.html +106 -0
  170. data/doc/files/lib/Query_rb.html +116 -0
  171. data/doc/files/lib/RealFormat_rb.html +106 -0
  172. data/doc/files/lib/ResourceScenario_rb.html +116 -0
  173. data/doc/files/lib/Resource_rb.html +118 -0
  174. data/doc/files/lib/RichTextDocument_rb.html +120 -0
  175. data/doc/files/lib/RichTextElement_rb.html +120 -0
  176. data/doc/files/lib/RichTextParser_rb.html +120 -0
  177. data/doc/files/lib/RichTextProtocolExample_rb.html +120 -0
  178. data/doc/files/lib/RichTextProtocolHandler_rb.html +106 -0
  179. data/doc/files/lib/RichTextScanner_rb.html +116 -0
  180. data/doc/files/lib/RichTextSnip_rb.html +118 -0
  181. data/doc/files/lib/RichTextSyntaxRules_rb.html +106 -0
  182. data/doc/files/lib/RichText_rb.html +118 -0
  183. data/doc/files/lib/ScenarioData_rb.html +118 -0
  184. data/doc/files/lib/Scenario_rb.html +116 -0
  185. data/doc/files/lib/Scoreboard_rb.html +106 -0
  186. data/doc/files/lib/ShiftAssignments_rb.html +116 -0
  187. data/doc/files/lib/ShiftScenario_rb.html +116 -0
  188. data/doc/files/lib/Shift_rb.html +118 -0
  189. data/doc/files/lib/SourceFileInfo_rb.html +106 -0
  190. data/doc/files/lib/SyntaxReference_rb.html +122 -0
  191. data/doc/files/lib/TOCEntry_rb.html +118 -0
  192. data/doc/files/lib/TableColumnDefinition_rb.html +106 -0
  193. data/doc/files/lib/TableOfContents_rb.html +118 -0
  194. data/doc/files/lib/TaskDependency_rb.html +106 -0
  195. data/doc/files/lib/TaskJuggler_rb.html +120 -0
  196. data/doc/files/lib/TaskScenario_rb.html +116 -0
  197. data/doc/files/lib/Task_rb.html +118 -0
  198. data/doc/files/lib/TextParser/Pattern_rb.html +116 -0
  199. data/doc/files/lib/TextParser/Rule_rb.html +106 -0
  200. data/doc/files/lib/TextParser/StackElement_rb.html +106 -0
  201. data/doc/files/lib/TextParser/TokenDoc_rb.html +106 -0
  202. data/doc/files/lib/TextParser_rb.html +124 -0
  203. data/doc/files/lib/TextScanner_rb.html +128 -0
  204. data/doc/files/lib/Tj3Config_rb.html +118 -0
  205. data/doc/files/lib/TjException_rb.html +106 -0
  206. data/doc/files/lib/TjTime_rb.html +118 -0
  207. data/doc/files/lib/TjpExample_rb.html +116 -0
  208. data/doc/files/lib/TjpSyntaxRules_rb.html +106 -0
  209. data/doc/files/lib/UTF8String_rb.html +132 -0
  210. data/doc/files/lib/UserManual_rb.html +124 -0
  211. data/doc/files/lib/WorkingHours_rb.html +116 -0
  212. data/doc/files/lib/XMLDocument_rb.html +116 -0
  213. data/doc/files/lib/XMLElement_rb.html +116 -0
  214. data/doc/files/lib/reports/CSVFile_rb.html +116 -0
  215. data/doc/files/lib/reports/ColumnTable_rb.html +116 -0
  216. data/doc/files/lib/reports/GanttChart_rb.html +122 -0
  217. data/doc/files/lib/reports/GanttContainer_rb.html +116 -0
  218. data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +106 -0
  219. data/doc/files/lib/reports/GanttHeader_rb.html +116 -0
  220. data/doc/files/lib/reports/GanttLine_rb.html +126 -0
  221. data/doc/files/lib/reports/GanttLoadStack_rb.html +116 -0
  222. data/doc/files/lib/reports/GanttMilestone_rb.html +116 -0
  223. data/doc/files/lib/reports/GanttRouter_rb.html +106 -0
  224. data/doc/files/lib/reports/GanttTaskBar_rb.html +116 -0
  225. data/doc/files/lib/reports/HTMLGraphics_rb.html +106 -0
  226. data/doc/files/lib/reports/ReportElement_rb.html +118 -0
  227. data/doc/files/lib/reports/ReportTableCell_rb.html +106 -0
  228. data/doc/files/lib/reports/ReportTableColumn_rb.html +106 -0
  229. data/doc/files/lib/reports/ReportTableElement_rb.html +122 -0
  230. data/doc/files/lib/reports/ReportTableLegend_rb.html +106 -0
  231. data/doc/files/lib/reports/ReportTableLine_rb.html +116 -0
  232. data/doc/files/lib/reports/ReportTable_rb.html +118 -0
  233. data/doc/files/lib/reports/Report_rb.html +126 -0
  234. data/doc/files/lib/reports/ResourceListRE_rb.html +122 -0
  235. data/doc/files/lib/reports/TaskListRE_rb.html +122 -0
  236. data/doc/files/lib/reports/TjpExportRE_rb.html +116 -0
  237. data/doc/files/lib/taskjuggler3_rb.html +276 -0
  238. data/doc/files/lib/tj3man_rb.html +189 -0
  239. data/doc/fr_class_index.html +285 -0
  240. data/doc/fr_file_index.html +223 -0
  241. data/doc/fr_method_index.html +1953 -0
  242. data/doc/index.html +21 -0
  243. data/doc/rdoc-style.css +299 -0
  244. data/examples/tutorial.tjp +361 -0
  245. data/gem_spec.rb +30 -0
  246. data/lib/Account.rb +50 -0
  247. data/lib/AccountScenario.rb +39 -0
  248. data/lib/Allocation.rb +102 -0
  249. data/lib/AppConfig.rb +134 -0
  250. data/lib/AttributeBase.rb +131 -0
  251. data/lib/AttributeDefinition.rb +47 -0
  252. data/lib/Attributes.rb +478 -0
  253. data/lib/BatchProcessor.rb +209 -0
  254. data/lib/Booking.rb +59 -0
  255. data/lib/Charge.rb +71 -0
  256. data/lib/ChargeSet.rb +126 -0
  257. data/lib/HTMLDocument.rb +59 -0
  258. data/lib/Interval.rb +127 -0
  259. data/lib/KeywordDocumentation.rb +560 -0
  260. data/lib/Limits.rb +219 -0
  261. data/lib/Log.rb +160 -0
  262. data/lib/LogicalExpression.rb +71 -0
  263. data/lib/LogicalFlag.rb +34 -0
  264. data/lib/LogicalFunction.rb +102 -0
  265. data/lib/LogicalOperation.rb +118 -0
  266. data/lib/MacroParser.rb +77 -0
  267. data/lib/MacroTable.rb +84 -0
  268. data/lib/Message.rb +56 -0
  269. data/lib/MessageHandler.rb +34 -0
  270. data/lib/Project.rb +662 -0
  271. data/lib/ProjectFileParser.rb +333 -0
  272. data/lib/PropertyList.rb +181 -0
  273. data/lib/PropertySet.rb +304 -0
  274. data/lib/PropertyTreeNode.rb +461 -0
  275. data/lib/Query.rb +227 -0
  276. data/lib/RealFormat.rb +73 -0
  277. data/lib/Resource.rb +42 -0
  278. data/lib/ResourceScenario.rb +511 -0
  279. data/lib/RichText.rb +147 -0
  280. data/lib/RichTextDocument.rb +139 -0
  281. data/lib/RichTextElement.rb +391 -0
  282. data/lib/RichTextParser.rb +66 -0
  283. data/lib/RichTextProtocolExample.rb +65 -0
  284. data/lib/RichTextProtocolHandler.rb +35 -0
  285. data/lib/RichTextScanner.rb +390 -0
  286. data/lib/RichTextSnip.rb +104 -0
  287. data/lib/RichTextSyntaxRules.rb +265 -0
  288. data/lib/Scenario.rb +27 -0
  289. data/lib/ScenarioData.rb +65 -0
  290. data/lib/Scoreboard.rb +141 -0
  291. data/lib/Shift.rb +48 -0
  292. data/lib/ShiftAssignments.rb +291 -0
  293. data/lib/ShiftScenario.rb +46 -0
  294. data/lib/SourceFileInfo.rb +37 -0
  295. data/lib/SyntaxReference.rb +284 -0
  296. data/lib/TOCEntry.rb +76 -0
  297. data/lib/TableColumnDefinition.rb +54 -0
  298. data/lib/TableOfContents.rb +46 -0
  299. data/lib/Task.rb +37 -0
  300. data/lib/TaskDependency.rb +39 -0
  301. data/lib/TaskJuggler.rb +84 -0
  302. data/lib/TaskScenario.rb +1622 -0
  303. data/lib/TextParser.rb +416 -0
  304. data/lib/TextParser/Pattern.rb +263 -0
  305. data/lib/TextParser/Rule.rb +171 -0
  306. data/lib/TextParser/StackElement.rb +45 -0
  307. data/lib/TextParser/TokenDoc.rb +38 -0
  308. data/lib/TextScanner.rb +682 -0
  309. data/lib/Tj3Config.rb +27 -0
  310. data/lib/TjException.rb +27 -0
  311. data/lib/TjTime.rb +395 -0
  312. data/lib/TjpExample.rb +119 -0
  313. data/lib/TjpSyntaxRules.rb +4022 -0
  314. data/lib/UTF8String.rb +100 -0
  315. data/lib/UserManual.rb +282 -0
  316. data/lib/WorkingHours.rb +323 -0
  317. data/lib/XMLDocument.rb +54 -0
  318. data/lib/XMLElement.rb +175 -0
  319. data/lib/reports/CSVFile.rb +146 -0
  320. data/lib/reports/ColumnTable.rb +66 -0
  321. data/lib/reports/GanttChart.rb +308 -0
  322. data/lib/reports/GanttContainer.rb +107 -0
  323. data/lib/reports/GanttHeader.rb +141 -0
  324. data/lib/reports/GanttHeaderScaleItem.rb +42 -0
  325. data/lib/reports/GanttLine.rb +329 -0
  326. data/lib/reports/GanttLoadStack.rb +113 -0
  327. data/lib/reports/GanttMilestone.rb +80 -0
  328. data/lib/reports/GanttRouter.rb +375 -0
  329. data/lib/reports/GanttTaskBar.rb +95 -0
  330. data/lib/reports/HTMLGraphics.rb +65 -0
  331. data/lib/reports/Report.rb +344 -0
  332. data/lib/reports/ReportElement.rb +427 -0
  333. data/lib/reports/ReportTable.rb +144 -0
  334. data/lib/reports/ReportTableCell.rb +142 -0
  335. data/lib/reports/ReportTableColumn.rb +82 -0
  336. data/lib/reports/ReportTableElement.rb +852 -0
  337. data/lib/reports/ReportTableLegend.rb +167 -0
  338. data/lib/reports/ReportTableLine.rb +87 -0
  339. data/lib/reports/ResourceListRE.rb +72 -0
  340. data/lib/reports/TaskListRE.rb +73 -0
  341. data/lib/reports/TjpExportRE.rb +394 -0
  342. data/lib/taskjuggler3.rb +106 -0
  343. data/lib/tj3man.rb +88 -0
  344. data/manual/Day_To_Day_Juggling +168 -0
  345. data/manual/Getting_Started +61 -0
  346. data/manual/How_To_Contribute +185 -0
  347. data/manual/Installation +68 -0
  348. data/manual/Intro +102 -0
  349. data/manual/Reporting_Bugs +26 -0
  350. data/manual/Rich_Text_Attributes +90 -0
  351. data/manual/TaskJuggler_2x_Migration +40 -0
  352. data/manual/Tutorial +579 -0
  353. data/manual/fdl +450 -0
  354. data/prj_cfg.rb +43 -0
  355. data/setup.rb +1585 -0
  356. data/tasks/csts.rake +72 -0
  357. data/tasks/gem.rake +14 -0
  358. data/tasks/manual.rake +10 -0
  359. data/tasks/missing.rake +21 -0
  360. data/tasks/rcov.rake +14 -0
  361. data/tasks/rdoc.rake +17 -0
  362. data/tasks/rexml_fix.rb +16 -0
  363. data/tasks/rexml_fix_19.rb +49 -0
  364. data/tasks/show.rake +21 -0
  365. data/tasks/stats.rake +25 -0
  366. data/tasks/test.rake +11 -0
  367. data/test/MessageChecker.rb +53 -0
  368. data/test/TestSuite/CSV-Reports/celltext-Reference.csv +14 -0
  369. data/test/TestSuite/CSV-Reports/celltext.tjp +7 -0
  370. data/test/TestSuite/CSV-Reports/genrefs +6 -0
  371. data/test/TestSuite/CSV-Reports/project-1.tji +57 -0
  372. data/test/TestSuite/CSV-Reports/resourcereport-Reference.csv +4 -0
  373. data/test/TestSuite/CSV-Reports/resourcereport.tjp +10 -0
  374. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks-Reference.csv +22 -0
  375. data/test/TestSuite/CSV-Reports/resourcereport_with_tasks.tjp +11 -0
  376. data/test/TestSuite/CSV-Reports/sortByTree-Reference.csv +14 -0
  377. data/test/TestSuite/CSV-Reports/sortByTree.tjp +8 -0
  378. data/test/TestSuite/CSV-Reports/sortBy_duration.down-Reference.csv +14 -0
  379. data/test/TestSuite/CSV-Reports/sortBy_duration.down.tjp +10 -0
  380. data/test/TestSuite/CSV-Reports/sortBy_effort.up-Reference.csv +14 -0
  381. data/test/TestSuite/CSV-Reports/sortBy_effort.up.tjp +10 -0
  382. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down-Reference.csv +14 -0
  383. data/test/TestSuite/CSV-Reports/sortBy_plan.start.down.tjp +10 -0
  384. data/test/TestSuite/CSV-Reports/taskreport-Reference.csv +14 -0
  385. data/test/TestSuite/CSV-Reports/taskreport.tjp +10 -0
  386. data/test/TestSuite/CSV-Reports/taskreport_with_resources-Reference.csv +24 -0
  387. data/test/TestSuite/CSV-Reports/taskreport_with_resources.tjp +11 -0
  388. data/test/TestSuite/Scheduler/Correct/Allocate.tjp +86 -0
  389. data/test/TestSuite/Scheduler/Correct/AutomaticMilestones.tjp +63 -0
  390. data/test/TestSuite/Scheduler/Correct/Booking.tjp +161 -0
  391. data/test/TestSuite/Scheduler/Correct/Depends.tjp +50 -0
  392. data/test/TestSuite/Scheduler/Correct/Duration.tjp +34 -0
  393. data/test/TestSuite/Scheduler/Correct/InheritStartEnd.tjp +129 -0
  394. data/test/TestSuite/Scheduler/Correct/Limits.tjp +81 -0
  395. data/test/TestSuite/Scheduler/Correct/MultipleMandatories.tjp +43 -0
  396. data/test/TestSuite/Scheduler/Correct/Optimize-1.tjp +28 -0
  397. data/test/TestSuite/Scheduler/Correct/Optimize-2.tjp +33 -0
  398. data/test/TestSuite/Scheduler/Correct/Optimize-3.tjp +33 -0
  399. data/test/TestSuite/Scheduler/Correct/Optimize-4.tjp +34 -0
  400. data/test/TestSuite/Scheduler/Correct/Optimize-5.tjp +62 -0
  401. data/test/TestSuite/Scheduler/Correct/Precedes.tjp +50 -0
  402. data/test/TestSuite/Scheduler/Correct/Shift.tjp +102 -0
  403. data/test/TestSuite/Scheduler/Errors/account_no_leaf.tjp +13 -0
  404. data/test/TestSuite/Scheduler/Errors/booking_conflict.tjp +10 -0
  405. data/test/TestSuite/Scheduler/Errors/booking_no_duty.tjp +9 -0
  406. data/test/TestSuite/Scheduler/Errors/booking_on_vacation.tjp +9 -0
  407. data/test/TestSuite/Scheduler/Errors/container_booking.tjp +14 -0
  408. data/test/TestSuite/Scheduler/Errors/container_duration.tjp +11 -0
  409. data/test/TestSuite/Scheduler/Errors/effort_no_allocations.tjp +7 -0
  410. data/test/TestSuite/Scheduler/Errors/loop_detected_1.tjp +19 -0
  411. data/test/TestSuite/Scheduler/Errors/loop_detected_10.tjp +36 -0
  412. data/test/TestSuite/Scheduler/Errors/loop_detected_11.tjp +27 -0
  413. data/test/TestSuite/Scheduler/Errors/loop_detected_12.tjp +20 -0
  414. data/test/TestSuite/Scheduler/Errors/loop_detected_13.tjp +27 -0
  415. data/test/TestSuite/Scheduler/Errors/loop_detected_14.tjp +26 -0
  416. data/test/TestSuite/Scheduler/Errors/loop_detected_2.tjp +24 -0
  417. data/test/TestSuite/Scheduler/Errors/loop_detected_3.tjp +18 -0
  418. data/test/TestSuite/Scheduler/Errors/loop_detected_4.tjp +36 -0
  419. data/test/TestSuite/Scheduler/Errors/loop_detected_5.tjp +37 -0
  420. data/test/TestSuite/Scheduler/Errors/loop_detected_6.tjp +35 -0
  421. data/test/TestSuite/Scheduler/Errors/loop_detected_7.tjp +46 -0
  422. data/test/TestSuite/Scheduler/Errors/loop_detected_8.tjp +51 -0
  423. data/test/TestSuite/Scheduler/Errors/loop_detected_9.tjp +20 -0
  424. data/test/TestSuite/Scheduler/Errors/maxend.tjp +8 -0
  425. data/test/TestSuite/Scheduler/Errors/maxstart.tjp +8 -0
  426. data/test/TestSuite/Scheduler/Errors/milestone_booking.tjp +10 -0
  427. data/test/TestSuite/Scheduler/Errors/milestone_duration.tjp +8 -0
  428. data/test/TestSuite/Scheduler/Errors/milestone_start_end.tjp +8 -0
  429. data/test/TestSuite/Scheduler/Errors/minend.tjp +8 -0
  430. data/test/TestSuite/Scheduler/Errors/minstart.tjp +8 -0
  431. data/test/TestSuite/Scheduler/Errors/multiple_durations.tjp +11 -0
  432. data/test/TestSuite/Scheduler/Errors/no_tasks.tjp +6 -0
  433. data/test/TestSuite/Scheduler/Errors/not_scheduled.tjp +8 -0
  434. data/test/TestSuite/Scheduler/Errors/task_depend_child.tjp +10 -0
  435. data/test/TestSuite/Scheduler/Errors/task_depend_multi.tjp +13 -0
  436. data/test/TestSuite/Scheduler/Errors/task_depend_parent.tjp +11 -0
  437. data/test/TestSuite/Scheduler/Errors/task_depend_self.tjp +10 -0
  438. data/test/TestSuite/Scheduler/Errors/task_depend_unknown.tjp +10 -0
  439. data/test/TestSuite/Scheduler/Errors/task_overspecified_1.tjp +9 -0
  440. data/test/TestSuite/Scheduler/Errors/task_overspecified_2.tjp +14 -0
  441. data/test/TestSuite/Scheduler/Errors/task_overspecified_3.tjp +14 -0
  442. data/test/TestSuite/Scheduler/Errors/task_underspecified_1.tjp +8 -0
  443. data/test/TestSuite/Scheduler/Errors/task_underspecified_2.tjp +8 -0
  444. data/test/TestSuite/Scheduler/Errors/task_underspecified_3.tjp +9 -0
  445. data/test/TestSuite/Syntax/Correct/Account.tjp +53 -0
  446. data/test/TestSuite/Syntax/Correct/Allocate-1.tjp +24 -0
  447. data/test/TestSuite/Syntax/Correct/Alternative.tjp +13 -0
  448. data/test/TestSuite/Syntax/Correct/AutoMacros.tjp +14 -0
  449. data/test/TestSuite/Syntax/Correct/Booking.tjp +26 -0
  450. data/test/TestSuite/Syntax/Correct/Caption.tjp +33 -0
  451. data/test/TestSuite/Syntax/Correct/Celltext.tjp +28 -0
  452. data/test/TestSuite/Syntax/Correct/Comments.tjp +29 -0
  453. data/test/TestSuite/Syntax/Correct/Complete.tjp +16 -0
  454. data/test/TestSuite/Syntax/Correct/CompletedWork.tji +20 -0
  455. data/test/TestSuite/Syntax/Correct/CriticalPath.tjp +31 -0
  456. data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +12 -0
  457. data/test/TestSuite/Syntax/Correct/CustomAttributes.tjp +14 -0
  458. data/test/TestSuite/Syntax/Correct/Depends1.tjp +22 -0
  459. data/test/TestSuite/Syntax/Correct/Durations.tjp +29 -0
  460. data/test/TestSuite/Syntax/Correct/Efficiency.tjp +19 -0
  461. data/test/TestSuite/Syntax/Correct/Export.tjp +40 -0
  462. data/test/TestSuite/Syntax/Correct/Flags.tjp +32 -0
  463. data/test/TestSuite/Syntax/Correct/Freeze.tjp +28 -0
  464. data/test/TestSuite/Syntax/Correct/Gap.tjp +15 -0
  465. data/test/TestSuite/Syntax/Correct/HtmlTaskReport.tjp +33 -0
  466. data/test/TestSuite/Syntax/Correct/Limits-1.tjp +71 -0
  467. data/test/TestSuite/Syntax/Correct/LoadUnits.tjp +31 -0
  468. data/test/TestSuite/Syntax/Correct/Macro-1.tjp +19 -0
  469. data/test/TestSuite/Syntax/Correct/Mandatory.tjp +17 -0
  470. data/test/TestSuite/Syntax/Correct/Milestone.tjp +12 -0
  471. data/test/TestSuite/Syntax/Correct/MinMax.tjp +17 -0
  472. data/test/TestSuite/Syntax/Correct/Numberformat.tjp +12 -0
  473. data/test/TestSuite/Syntax/Correct/Period.tjp +16 -0
  474. data/test/TestSuite/Syntax/Correct/Persistent.tjp +11 -0
  475. data/test/TestSuite/Syntax/Correct/Precedes1.tjp +17 -0
  476. data/test/TestSuite/Syntax/Correct/Priority.tjp +30 -0
  477. data/test/TestSuite/Syntax/Correct/Project.tjp +21 -0
  478. data/test/TestSuite/Syntax/Correct/ProjectIDs.tjp +23 -0
  479. data/test/TestSuite/Syntax/Correct/RawHTML.tjp +29 -0
  480. data/test/TestSuite/Syntax/Correct/Reports.tjp +54 -0
  481. data/test/TestSuite/Syntax/Correct/Resource.tjp +20 -0
  482. data/test/TestSuite/Syntax/Correct/Responsible.tjp +16 -0
  483. data/test/TestSuite/Syntax/Correct/Scenario.tjp +15 -0
  484. data/test/TestSuite/Syntax/Correct/Scheduling.tjp +26 -0
  485. data/test/TestSuite/Syntax/Correct/Select.tjp +27 -0
  486. data/test/TestSuite/Syntax/Correct/Shift.tjp +55 -0
  487. data/test/TestSuite/Syntax/Correct/Simple.tjp +25 -0
  488. data/test/TestSuite/Syntax/Correct/String.tjp +12 -0
  489. data/test/TestSuite/Syntax/Correct/Supplement.tjp +24 -0
  490. data/test/TestSuite/Syntax/Correct/TaskRoot.tjp +34 -0
  491. data/test/TestSuite/Syntax/Correct/TimeFrame.tjp +19 -0
  492. data/test/TestSuite/Syntax/Correct/Timezone.tjp +8 -0
  493. data/test/TestSuite/Syntax/Correct/Vacation.tjp +33 -0
  494. data/test/TestSuite/Syntax/Correct/csvtest +16 -0
  495. data/test/TestSuite/Syntax/Correct/manual2example.rb +24 -0
  496. data/test/TestSuite/Syntax/Correct/tutorial.tjp +485 -0
  497. data/test/TestSuite/Syntax/Errors/bad_include.tjp +11 -0
  498. data/test/TestSuite/Syntax/Errors/booking_group.tjp +14 -0
  499. data/test/TestSuite/Syntax/Errors/booking_milestone.tjp +13 -0
  500. data/test/TestSuite/Syntax/Errors/booking_no_leaf.tjp +13 -0
  501. data/test/TestSuite/Syntax/Errors/chargeset.tjp +14 -0
  502. data/test/TestSuite/Syntax/Errors/chargeset_master.tjp +15 -0
  503. data/test/TestSuite/Syntax/Errors/container_attribute.tjp +13 -0
  504. data/test/TestSuite/Syntax/Errors/cost_acct_no_top.tjp +24 -0
  505. data/test/TestSuite/Syntax/Errors/cost_rev_same.tjp +24 -0
  506. data/test/TestSuite/Syntax/Errors/date_in_range.tjp +7 -0
  507. data/test/TestSuite/Syntax/Errors/effort_zero.tjp +8 -0
  508. data/test/TestSuite/Syntax/Errors/empty.tjp +1 -0
  509. data/test/TestSuite/Syntax/Errors/export_bad_extn.tjp +9 -0
  510. data/test/TestSuite/Syntax/Errors/extend_id_cap.tjp +7 -0
  511. data/test/TestSuite/Syntax/Errors/interval_end_in_range.tjp +7 -0
  512. data/test/TestSuite/Syntax/Errors/interval_start_in_range.tjp +7 -0
  513. data/test/TestSuite/Syntax/Errors/leaf_resource_id_expected.tjp +12 -0
  514. data/test/TestSuite/Syntax/Errors/misaligned_date.tjp +7 -0
  515. data/test/TestSuite/Syntax/Errors/no_csv_suffix.tjp +10 -0
  516. data/test/TestSuite/Syntax/Errors/no_html_suffix.tjp +10 -0
  517. data/test/TestSuite/Syntax/Errors/operand_attribute.tjp +11 -0
  518. data/test/TestSuite/Syntax/Errors/operand_unkn_flag.tjp +11 -0
  519. data/test/TestSuite/Syntax/Errors/operand_unkn_scen.tjp +11 -0
  520. data/test/TestSuite/Syntax/Errors/overtime_range.tjp +13 -0
  521. data/test/TestSuite/Syntax/Errors/purge_no_list.tjp +8 -0
  522. data/test/TestSuite/Syntax/Errors/purge_unknown_id.tjp +8 -0
  523. data/test/TestSuite/Syntax/Errors/report_end.tjp +10 -0
  524. data/test/TestSuite/Syntax/Errors/report_redifinition.tjp +10 -0
  525. data/test/TestSuite/Syntax/Errors/report_start.tjp +10 -0
  526. data/test/TestSuite/Syntax/Errors/resource_exists.tjp +7 -0
  527. data/test/TestSuite/Syntax/Errors/resource_id_expected.tjp +8 -0
  528. data/test/TestSuite/Syntax/Errors/rev_acct_no_top.tjp +24 -0
  529. data/test/TestSuite/Syntax/Errors/scenario_exists.tjp +7 -0
  530. data/test/TestSuite/Syntax/Errors/shift_assignment_overlap.tjp +15 -0
  531. data/test/TestSuite/Syntax/Errors/shift_exists.tjp +7 -0
  532. data/test/TestSuite/Syntax/Errors/shift_id_expected.tjp +7 -0
  533. data/test/TestSuite/Syntax/Errors/sloppy_range.tjp +13 -0
  534. data/test/TestSuite/Syntax/Errors/sort_direction.tjp +11 -0
  535. data/test/TestSuite/Syntax/Errors/sort_unknown_scen.tjp +11 -0
  536. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd1.tjp +11 -0
  537. data/test/TestSuite/Syntax/Errors/sorting_crit_exptd2.tjp +11 -0
  538. data/test/TestSuite/Syntax/Errors/sorting_wbs.tjp +11 -0
  539. data/test/TestSuite/Syntax/Errors/start_before_end1.tjp +7 -0
  540. data/test/TestSuite/Syntax/Errors/start_before_end2.tjp +6 -0
  541. data/test/TestSuite/Syntax/Errors/task_complete.tjp +8 -0
  542. data/test/TestSuite/Syntax/Errors/task_exists.tjp +7 -0
  543. data/test/TestSuite/Syntax/Errors/task_priority.tjp +8 -0
  544. data/test/TestSuite/Syntax/Errors/task_without_chargeset.tjp +9 -0
  545. data/test/TestSuite/Syntax/Errors/time_interval.tjp +12 -0
  546. data/test/TestSuite/Syntax/Errors/too_many_bangs.tjp +10 -0
  547. data/test/TestSuite/Syntax/Errors/undecl_flag.tjp +6 -0
  548. data/test/TestSuite/Syntax/Errors/unknown_projectid.tjp +7 -0
  549. data/test/TestSuite/Syntax/Errors/unknown_scenario_id.tjp +6 -0
  550. data/test/TestSuite/Syntax/Errors/unknown_scenario_idx.tjp +11 -0
  551. data/test/TestSuite/Syntax/Errors/unknown_task.tjp +10 -0
  552. data/test/all.rb +31 -0
  553. data/test/test_BatchProcessor.rb +54 -0
  554. data/test/test_CSV-Reports.rb +101 -0
  555. data/test/test_Limits.rb +104 -0
  556. data/test/test_LogicalExpression.rb +110 -0
  557. data/test/test_MacroTable.rb +51 -0
  558. data/test/test_Project.rb +57 -0
  559. data/test/test_PropertySet.rb +71 -0
  560. data/test/test_Query.rb +83 -0
  561. data/test/test_RealFormat.rb +83 -0
  562. data/test/test_RichText.rb +869 -0
  563. data/test/test_Scheduler.rb +42 -0
  564. data/test/test_ShiftAssignments.rb +77 -0
  565. data/test/test_Syntax.rb +41 -0
  566. data/test/test_TextScanner.rb +95 -0
  567. data/test/test_TjTime.rb +114 -0
  568. data/test/test_TjpExample.rb +169 -0
  569. data/test/test_UTF8String.rb +84 -0
  570. data/test/test_WorkingHours.rb +56 -0
  571. metadata +649 -0
@@ -0,0 +1,427 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ReportElement.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'TableColumnDefinition'
14
+ require 'LogicalExpression'
15
+
16
+ class TaskJuggler
17
+
18
+ # A report can be composed of multiple report elements. The ReportElement
19
+ # class is the base class for all types of report elements. It holds a number
20
+ # of attributes that may or may not be used by the derived classes to modify
21
+ # the output or filter the displayed data. The class also provides functions
22
+ # that are used by many reports.
23
+ class ReportElement
24
+
25
+ attr_reader :start, :end, :userDefinedPeriod
26
+ attr_accessor :caption, :costAccount, :currencyFormat,
27
+ :epilog, :headline, :columns,
28
+ :scenarios, :taskRoot, :resourceRoot,
29
+ :timeFormat, :loadUnit, :now, :numberFormat, :weekStartsMonday,
30
+ :hideTask, :prolog, :revenueAccount,
31
+ :rollupTask, :hideResource, :rollupResource,
32
+ :sortTasks, :sortResources,
33
+ :ganttBars,
34
+ :rawHead, :rawTail,
35
+ :propertiesById, :propertiesByType
36
+
37
+ def initialize(report)
38
+ @report = report
39
+ @report.addElement(self)
40
+ @project = report.project
41
+
42
+ # The following attributes affect the report content and look.
43
+ @caption = nil
44
+ @columns = []
45
+ @costAccount = @report.costAccount
46
+ @currencyFormat = @report.currencyformat
47
+ @end = @report.end
48
+ @epilog = nil
49
+ @ganttBars = true
50
+ @headline = nil
51
+ @hideResource = nil
52
+ @hideTask = nil
53
+ @loadUnit = @report.loadUnit
54
+ @now = @report.now
55
+ @numberFormat = @report.numberformat
56
+ @prolog = nil
57
+ @rawHead = nil
58
+ @rawTail = nil
59
+ @resourceRoot = @report.resourceRoot
60
+ @revenueAccount = @report.revenueAccount
61
+ @rollupResource = nil
62
+ @rollupTask = nil
63
+ @scenarios = [ 0 ]
64
+ @shorttimeformat = @report.shorttimeformat
65
+ @sortResources = [[ 'seqno', true, -1 ]]
66
+ @sortTasks = [[ 'seqno', true, -1 ]]
67
+ @start = @report.start
68
+ @taskRoot = @report.taskRoot
69
+ @timeFormat = @report.timeformat
70
+ @timezone = @report.timezone
71
+ @userDefinedPeriod = @report.userDefinedPeriod
72
+ @weekStartsMonday = @report.weekstartsmonday
73
+
74
+ @propertiesById = {
75
+ # ID Header Indent Align Calced. Scen Spec.
76
+ 'complete' => [ 'Completion', false, :right, true, true ],
77
+ 'cost' => [ 'Cost', true, :right, true, true ],
78
+ 'duration' => [ 'Duration', true, :right, true, true ],
79
+ 'effort' => [ 'Effort', true, :right, true, true ],
80
+ 'id' => [ 'Id', false, :left, true, false ],
81
+ 'line' => [ 'Line No.', false, :right, true, false ],
82
+ 'name' => [ 'Name', true, :left, false, false ],
83
+ 'no' => [ 'No.', false, :right, true, false ],
84
+ 'rate' => [ 'Rate', true, :right, true, true ],
85
+ 'revenue' => [ 'Revenue', true, :right, true, true ],
86
+ 'wbs' => [ 'WBS', false, :left, true, false ]
87
+ }
88
+ @propertiesByType = {
89
+ # Type Indent Align
90
+ DateAttribute => [ false, :left ],
91
+ FixnumAttribute => [ false, :right ],
92
+ FloatAttribute => [ false, :right ],
93
+ RichTextAttribute => [ false, :left ],
94
+ StringAttribute => [ false, :left ]
95
+ }
96
+ end
97
+
98
+ # Set the start _date_ of the report period and mark it as user defined.
99
+ def start=(date)
100
+ @start = date
101
+ @userDefinedPeriod = true
102
+ end
103
+
104
+ # Set the end _date_ of the report period and mark it as user defined.
105
+ def end=(date)
106
+ @end = date
107
+ @userDefinedPeriod = true
108
+ end
109
+
110
+ # Take the complete task list and remove all tasks that are matching the
111
+ # hide expression, the rollup Expression or are not a descendent of
112
+ # @taskRoot. In case resource is not nil, a task is only included if
113
+ # the resource is allocated to it in any of the reported scenarios.
114
+ def filterTaskList(list_, resource, hideExpr, rollupExpr)
115
+ list = TaskJuggler::PropertyList.new(list_)
116
+ if @taskRoot
117
+ # Remove all tasks that are not descendents of the @taskRoot.
118
+ list.delete_if { |task| !task.isChildOf?(@taskRoot) }
119
+ end
120
+
121
+ if resource
122
+ # If we have a resource we need to check that the resource is allocated
123
+ # to the tasks in any of the reported scenarios.
124
+ list.delete_if do |task|
125
+ delete = true
126
+ scenarios.each do |scenarioIdx|
127
+ if task['assignedresources', scenarioIdx].include?(resource)
128
+ delete = false
129
+ break;
130
+ end
131
+ end
132
+ delete
133
+ end
134
+ end
135
+
136
+ # Remove all tasks that don't overlap with the reported interval.
137
+ list.delete_if do |task|
138
+ delete = true
139
+ scenarios.each do |scenarioIdx|
140
+ iv = Interval.new(task['start', scenarioIdx].nil? ?
141
+ @project['start'] : task['start', scenarioIdx],
142
+ task['end', scenarioIdx].nil? ?
143
+ @project['end'] : task['end', scenarioIdx])
144
+ # Special case to include milestones at the report end.
145
+ if iv.start == iv.end && iv.end == @end
146
+ iv.start = iv.end = iv.start - 1
147
+ end
148
+ if iv.overlaps?(Interval.new(@start, @end))
149
+ delete = false
150
+ break;
151
+ end
152
+ end
153
+ delete
154
+ end
155
+
156
+ standardFilterOps(list, hideExpr, rollupExpr, resource, taskRoot)
157
+ end
158
+
159
+ # Take the complete resource list and remove all resources that are matching
160
+ # the hide expression, the rollup Expression or are not a descendent of
161
+ # @resourceRoot. In case task is not nil, a resource is only included if
162
+ # it is assigned to the task in any of the reported scenarios.
163
+ def filterResourceList(list_, task, hideExpr, rollupExpr)
164
+ list = TaskJuggler::PropertyList.new(list_)
165
+ if @resourceRoot
166
+ # Remove all resources that are not descendents of the @resourceRoot.
167
+ list.delete_if { |resource| !resource.isChildOf?(@resourceRoot) }
168
+ end
169
+
170
+ if task
171
+ # If we have a task we need to check that the resources are assigned
172
+ # to the task in any of the reported scenarios.
173
+ iv = Interval.new(@start, @end)
174
+ list.delete_if do |resource|
175
+ delete = true
176
+ scenarios.each do |scenarioIdx|
177
+ if resource.allocated?(scenarioIdx, iv, task)
178
+ delete = false
179
+ break;
180
+ end
181
+ end
182
+ delete
183
+ end
184
+ end
185
+
186
+ standardFilterOps(list, hideExpr, rollupExpr, task, resourceRoot)
187
+ end
188
+
189
+ # This is the default attribute value to text converter. It is used
190
+ # whenever we need no special treatment.
191
+ def cellText(property, scenarioIdx, colId)
192
+ if property.is_a?(Resource)
193
+ propertyList = @project.resources
194
+ elsif property.is_a?(Task)
195
+ propertyList = @project.tasks
196
+ else
197
+ raise "Fatal Error: Unknown property #{property.class}"
198
+ end
199
+
200
+ begin
201
+ # Get the value no matter if it's scenario specific or not.
202
+ if propertyList.scenarioSpecific?(colId)
203
+ value = property[colId, scenarioIdx]
204
+ else
205
+ value = property.get(colId)
206
+ end
207
+
208
+ type = propertyList.attributeType(colId)
209
+ if value.nil?
210
+ if type == TaskJuggler::DateAttribute
211
+ nil
212
+ else
213
+ ''
214
+ end
215
+ else
216
+ # Certain attribute types need special treatment.
217
+ if type == TaskJuggler::DateAttribute
218
+ value.to_s(timeFormat)
219
+ elsif type == TaskJuggler::RichTextAttribute
220
+ value
221
+ else
222
+ value.to_s
223
+ end
224
+ end
225
+ rescue TjException
226
+ ''
227
+ end
228
+ end
229
+
230
+ # This function returns true if the values for the _colId_ column need to be
231
+ # calculated.
232
+ def calculated?(colId)
233
+ if @propertiesById.has_key?(colId)
234
+ return @propertiesById[colId][3]
235
+ end
236
+ return false
237
+ end
238
+
239
+ # This functions returns true if the values for the _col_id_ column are
240
+ # scenario specific.
241
+ def scenarioSpecific?(colId)
242
+ if @propertiesById.has_key?(colId)
243
+ return @propertiesById[colId][4]
244
+ end
245
+ return false
246
+ end
247
+
248
+ # Return if the column values should be indented based on the _colId_ or the
249
+ # _propertyType_.
250
+ def indent(colId, propertyType)
251
+ if @propertiesById.has_key?(colId)
252
+ return @propertiesById[colId][1]
253
+ elsif @propertiesByType.has_key?(propertyType)
254
+ return @propertiesByType[propertyType][0]
255
+ else
256
+ false
257
+ end
258
+ end
259
+
260
+ # Return the alignment of the column based on the _colId_ or the
261
+ # _propertyType_.
262
+ def alignment(colId, propertyType)
263
+ if @propertiesById.has_key?(colId)
264
+ return @propertiesById[colId][2]
265
+ elsif @propertiesByType.has_key?(propertyType)
266
+ return @propertiesByType[propertyType][1]
267
+ else
268
+ :center
269
+ end
270
+ end
271
+
272
+ # Returns the default column title for the columns _id_.
273
+ def defaultColumnTitle(id)
274
+ # Return an empty string for some special columns that don't have a fixed
275
+ # title.
276
+ specials = %w( chart hourly daily weekly monthly quarterly yearly)
277
+ return '' if specials.include?(id)
278
+
279
+ # Return the title for build-in hardwired columns.
280
+ return @propertiesById[id][0] if @propertiesById.include?(id)
281
+
282
+ # Otherwise we have to see if the column id is a task or resource
283
+ # attribute and return it's value.
284
+ (name = @project.tasks.attributeName(id)).nil? &&
285
+ (name = @project.resources.attributeName(id)).nil?
286
+ name
287
+ end
288
+
289
+ def supportedColumns
290
+ @propertiesById.keys
291
+ end
292
+
293
+ protected
294
+
295
+ # In case the user has not specified the report period, we try to fit all
296
+ # the _tasks_ in and add an extra 5% time at both ends. _scenarios_ is a
297
+ # list of scenario indexes.
298
+ def adjustReportPeriod(tasks, scenarios)
299
+ return if tasks.empty?
300
+
301
+ @start = @end = nil
302
+ scenarios.each do |scenarioIdx|
303
+ tasks.each do |task|
304
+ date = task['start', scenarioIdx] || @project['start']
305
+ @start = date if @start.nil? || date < @start
306
+ date = task['end', scenarioIdx] || @project['end']
307
+ @end = date if @end.nil? || date > @end
308
+ end
309
+ end
310
+ # Make sure we have a minimum width of 1 day
311
+ @end = @start + 60 * 60 * 24 if @end < @start + 60 * 60 * 24
312
+ padding = ((@end - @start) * 0.10).to_i
313
+ @start -= padding
314
+ @end += padding
315
+ end
316
+
317
+ private
318
+
319
+ # This function implements the generic filtering functionality for all kinds
320
+ # of lists.
321
+ def standardFilterOps(list, hideExpr, rollupExpr, scopeProperty, root)
322
+ # Remove all properties that the user wants to have hidden.
323
+ if hideExpr
324
+ list.delete_if do |property|
325
+ hideExpr.eval(property, scopeProperty)
326
+ end
327
+ end
328
+
329
+ # Remove all children of properties that the user has rolled-up.
330
+ if rollupExpr
331
+ list.delete_if do |property|
332
+ parent = property.parent
333
+ delete = false
334
+ while (parent)
335
+ if rollupExpr.eval(parent, scopeProperty)
336
+ delete = true
337
+ break
338
+ end
339
+ parent = parent.parent
340
+ end
341
+ delete
342
+ end
343
+ end
344
+
345
+ # Re-add parents in tree mode
346
+ if list.treeMode?
347
+ parents = []
348
+ list.each do |property|
349
+ parent = property
350
+ while (parent = parent.parent)
351
+ parents << parent unless list.include?(parent) ||
352
+ parents.include?(parent)
353
+ break if parent == root
354
+ end
355
+ end
356
+ list.append(parents)
357
+ end
358
+
359
+ list
360
+ end
361
+
362
+ # This function converts number to strings that may include a unit. The
363
+ # unit is determined by @loadUnit. In the automatic modes, the shortest
364
+ # possible result is shown and the unit is always appended. _value_ is the
365
+ # value to convert. _factors_ determines the conversion factors for the
366
+ # different units.
367
+ # TODO: Delete when all users have been migrated to use Query!
368
+ def scaleValue(value, factors)
369
+ if @loadUnit == :shortauto || @loadUnit == :longauto
370
+ # We try all possible units and store the resulting strings here.
371
+ options = []
372
+ # For each of the units we can define a maximum value that the value
373
+ # should not exceed. A maximum of 0 means no limit.
374
+ max = [ 60, 48, 0, 8, 24, 0 ]
375
+
376
+ i = 0
377
+ shortest = nil
378
+ factors.each do |factor|
379
+ scaledValue = value * factor
380
+ str = @numberFormat.format(scaledValue)
381
+ # We ignore results that are 0 or exceed the maximum. To ensure that
382
+ # we have at least one result the unscaled value is always taken.
383
+ if (factor != 1.0 && scaledValue == 0) ||
384
+ (max[i] != 0 && scaledValue > max[i])
385
+ options << nil
386
+ else
387
+ options << str
388
+ end
389
+ i += 1
390
+ end
391
+
392
+ # Default to days in case they are all the same.
393
+ shortest = 2
394
+ # Find the shortest option.
395
+ 6.times do |j|
396
+ shortest = j if options[j] &&
397
+ options[j].length < options[shortest].length
398
+ end
399
+
400
+ str = options[shortest]
401
+ if @loadUnit == :longauto
402
+ # For the long units we handle singular and plural properly. For
403
+ # English we just need to append an 's', but this code will work for
404
+ # other languages as well.
405
+ units = []
406
+ if str == "1"
407
+ units = %w( minute hour day week month year )
408
+ else
409
+ units = %w( minutes hours days weeks months years )
410
+ end
411
+ str += ' ' + units[shortest]
412
+ else
413
+ str += %w( min h d w m y )[shortest]
414
+ end
415
+ else
416
+ # For fixed units we just need to do the conversion. No unit is
417
+ # included.
418
+ units = [ :minutes, :hours, :days, :weeks, :months, :years ]
419
+ str = @numberFormat.format(value * factors[units.index(@loadUnit)])
420
+ end
421
+ str
422
+ end
423
+
424
+ end
425
+
426
+ end
427
+
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ReportTable.rb -- The TaskJuggler III Project Management Software
5
+ #
6
+ # Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
7
+ #
8
+ # This program is free software; you can redistribute it and/or modify
9
+ # it under the terms of version 2 of the GNU General Public License as
10
+ # published by the Free Software Foundation.
11
+ #
12
+
13
+ require 'reports/ReportTableColumn'
14
+ require 'reports/ReportTableLine'
15
+
16
+ class TaskJuggler
17
+
18
+ # This class models the intermediate format of all report tables. The
19
+ # generators for all the table reports create the report in this intermediate
20
+ # format. The to_* member functions can then output the table in the
21
+ # appropriate format.
22
+ class ReportTable
23
+
24
+ attr_reader :maxIndent, :headerLineHeight, :headerFontSize
25
+ attr_accessor :equiLines
26
+
27
+ # Create a new ReportTable object.
28
+ def initialize
29
+ # The height if the header lines in screen pixels.
30
+ @headerLineHeight = 19
31
+ # Size of the font used in the header
32
+ @headerFontSize = 15
33
+ # Array of ReportTableColumn objects.
34
+ @columns = []
35
+ # Array of ReportTableLine objects.
36
+ @lines = []
37
+ @maxIndent = 0
38
+ # Whether or not all table lines must have same height.
39
+ @equiLines = false
40
+ end
41
+
42
+ # This function should only be called by the ReportTableColumn constructor.
43
+ def addColumn(col)
44
+ @columns << col
45
+ end
46
+
47
+ # This function should only be called by the ReportTableLine constructor.
48
+ def addLine(line)
49
+ @lines << line
50
+ end
51
+
52
+ # Return the number of registered lines for this table.
53
+ def lines
54
+ @lines.length
55
+ end
56
+
57
+ # Return the minimum required width for the table. If we don't have a
58
+ # mininum with, nil is returned.
59
+ def minWidth
60
+ width = 1
61
+ @columns.each do |column|
62
+ cw = column.minWidth
63
+ width += cw + 1 if cw
64
+ end
65
+ width
66
+ end
67
+
68
+ # Output the table as HTML.
69
+ def to_html
70
+ determineMaxIndents
71
+
72
+ table = XMLElement.new('table', 'align' => 'center', 'cellspacing' => '1',
73
+ 'cellpadding' => '2', 'width' => '100%',
74
+ 'class' => 'tabback')
75
+ table << (tbody = XMLElement.new('tbody'))
76
+
77
+ # Generate the 1st table header line.
78
+ tbody << (tr =
79
+ XMLElement.new('tr', 'class' => 'tabhead',
80
+ 'style' => "height:#{@headerLineHeight}px; " +
81
+ "font-size:#{@headerFontSize}px;"))
82
+ @columns.each { |col| tr << col.to_html(1) }
83
+
84
+ # Generate the 2nd table header line.
85
+ tbody << (tr =
86
+ XMLElement.new('tr', 'class' => 'tabhead',
87
+ 'style' => "height:#{@headerLineHeight}px; " +
88
+ "font-size:#{@headerFontSize}px;"))
89
+ @columns.each { |col| tr << col.to_html(2) }
90
+
91
+ # Generate the rest of the table.
92
+ @lines.each { |line| tbody << line.to_html }
93
+
94
+ # In case we have columns with scrollbars, we generate an extra line with
95
+ # cells for all columns that don't have a scrollbar. The scrollbar must
96
+ # have a height of 18 pixels or less.
97
+ if hasScrollbar?
98
+ tbody << (tr = XMLElement.new('tr', 'style' => 'height:18px'))
99
+ @columns.each do |column|
100
+ unless column.scrollbar
101
+ tr << XMLElement.new('td')
102
+ end
103
+ end
104
+ end
105
+
106
+ table
107
+ end
108
+
109
+ # Convert the intermediate representation into an Array of Arrays. _csv_ is
110
+ # the destination Array of Arrays. It may contain columns already.
111
+ def to_csv()
112
+ csv = [ [ ] ]
113
+ @columns.each { |col| col.to_csv(csv) }
114
+
115
+ @lines.each do |line|
116
+ # Insert a new Array for each line.
117
+ csv << []
118
+ line.to_csv(csv)
119
+ end
120
+ csv
121
+ end
122
+
123
+ private
124
+
125
+ # Some columns need to be indented when the data is sorted in tree mode.
126
+ # This function determines the largest needed indentation of all lines. The
127
+ # result is stored in the _@maxIndent_ variable.
128
+ def determineMaxIndents
129
+ @maxIndent = 0
130
+ @lines.each do |line|
131
+ @maxIndent = line.indentation if line.indentation > @maxIndent
132
+ end
133
+ end
134
+
135
+ # Returns true if any of the columns has a scrollbar.
136
+ def hasScrollbar?
137
+ @columns.each { |col| return true if col.scrollbar }
138
+ false
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+