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,167 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ReportTableLegend.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
+ class TaskJuggler
14
+
15
+ # The ReportTableLegend models an output format independent legend for the
16
+ # ReportTable. It lists the graphical symbols used in the table together with
17
+ # a short textual description.
18
+ class ReportTableLegend
19
+
20
+ attr_accessor :showGanttItems
21
+
22
+ # Create a new ReportTableLegend object.
23
+ def initialize
24
+ @showGanttItems = false
25
+ @ganttItems = []
26
+ @calendarItems = []
27
+ end
28
+
29
+ # Add another Gantt item to the legend. Make sure we don't have any
30
+ # duplicates.
31
+ def addGanttItem(text, color)
32
+ @ganttItems << [ text, color ] unless @ganttItems.include?([ text, color ])
33
+ end
34
+
35
+ # Add another chart item to the legend. Make sure we don't have any
36
+ # duplicates.
37
+ def addCalendarItem(text, color)
38
+ unless @calendarItems.include?([ text, color ])
39
+ @calendarItems << [ text, color ]
40
+ end
41
+ end
42
+
43
+ # Convert the abstract description into HTML elements.
44
+ def to_html
45
+ return nil if !@showGanttItems && @ganttItems.empty? &&
46
+ @calendarItems.empty?
47
+
48
+ table = XMLElement.new('table', 'class' => 'legendback',
49
+ 'style' => 'width:100%', 'border' => '0',
50
+ 'cellspacing' => '1', 'align' => 'center')
51
+ table << (tbody = XMLElement.new('tbody'))
52
+ tbody << (tr = XMLElement.new('tr'))
53
+
54
+ # Empty line to create a bit of a vertical gap.
55
+ tr << XMLElement.new('td', 'colspan' => '8', 'style' => 'height:5px')
56
+
57
+ tbody << headlineToHTML('Gantt Chart Symbols:')
58
+ # Generate the Gantt chart symbols
59
+ if @showGanttItems
60
+ tbody << (tr = XMLElement.new('tr'))
61
+
62
+ tr << ganttItemToHTML(GanttContainer.new(nil, 0, 15, 10, 35, 0),
63
+ 'Container Task', 40)
64
+ tr << spacerToHTML(8)
65
+ tr << ganttItemToHTML(GanttTaskBar.new(nil, 0, 15, 5, 35, 0),
66
+ 'Normal Task', 40)
67
+ tr << spacerToHTML
68
+ tr << ganttItemToHTML(GanttMilestone.new(nil, 15, 10, 0),
69
+ 'Milestone', 20)
70
+ end
71
+
72
+ tbody << itemsToHTML(@ganttItems)
73
+
74
+ tbody << headlineToHTML('Calendar Symbols:')
75
+ tbody << itemsToHTML(@calendarItems)
76
+
77
+ # Empty line to create a bit of a vertical gap.
78
+ tbody << (tr = XMLElement.new('tr'))
79
+ tr << XMLElement.new('td', 'colspan' => '8', 'style' => 'height:5px')
80
+
81
+ table
82
+ end
83
+
84
+ private
85
+
86
+ # In case we have both the calendar and the Gantt chart in the report
87
+ # element, we have to add description lines before the symbols. The two
88
+ # charts use the same colors for different meanings. This function generates
89
+ # the HTML version of the headlines.
90
+ def headlineToHTML(text)
91
+ tbody = []
92
+ unless @calendarItems.empty? || @ganttItems.empty?
93
+ tbody << (tr = XMLElement.new('tr'))
94
+ tr << (td = XMLElement.new('td', 'colspan' => '8',
95
+ 'style' => 'font-weight:bold; ' +
96
+ 'padding-left:10px'))
97
+ td << XMLText.new(text)
98
+ else
99
+ nil
100
+ end
101
+ tbody
102
+ end
103
+
104
+ # Turn the Gantt symbold descriptions into HTML elements.
105
+ def ganttItemToHTML(item, name, width)
106
+ tr = []
107
+ tr << (td = XMLElement.new('td', 'style' => 'width:19%; ' +
108
+ 'padding-left:10px; '))
109
+ td << XMLText.new(name)
110
+ tr << (td = XMLElement.new('td', 'style' => 'width:8%'))
111
+ td << (div = XMLElement.new('div',
112
+ 'style' => "position:relative; width:#{width}px; height:15px;"))
113
+ div << item.to_html
114
+ tr
115
+ end
116
+
117
+ # Turn the color items into HTML elements.
118
+ def itemsToHTML(items)
119
+ tbody = []
120
+
121
+ gridCells = ((items.length / 3) + (items.length % 3 != 0 ? 1 : 0)) * 3
122
+ tr = nil
123
+ gridCells.times do |i|
124
+ # We show no more than 3 items in a row.
125
+ tbody << (tr = XMLElement.new('tr')) if i % 3 == 0
126
+
127
+ # If we run out of items before the line is filled, we just insert
128
+ # spacers to fill the line.
129
+ if i < items.length
130
+ tr << itemToHTML(items[i])
131
+ else
132
+ tr << spacerToHTML(19)
133
+ tr << spacerToHTML(8)
134
+ end
135
+ tr << spacerToHTML() if i % 3 != 2
136
+ end
137
+
138
+ tbody
139
+ end
140
+
141
+ # Turn a single color item into HTML elements.
142
+ def itemToHTML(item)
143
+ tr = []
144
+ tr << (td = XMLElement.new('td', 'style' => 'width:19%; ' +
145
+ 'padding-left:10px; '))
146
+ td << XMLText.new(item[0])
147
+ tr << (td = XMLElement.new('td', 'style' => 'width:8%'))
148
+ td << (div = XMLElement.new('div', 'style' => 'position:relative; ' +
149
+ 'width:20px; height:15px')
150
+ div << XMLElement.new('div', 'class' => 'loadstackframe',
151
+ 'style' => 'position:absolute; ' +
152
+ 'left:5px; width:16px; height:15px;')
153
+ div << XMLElement.new('div', 'class' => "#{item[1]}",
154
+ 'style' => 'position:absolute; left:1px; top:1px; ' +
155
+ 'width:14px; height:13px;'))
156
+ tr
157
+ end
158
+
159
+ # Generate an empty HTML cell. _width_ is the requested width in pixels.
160
+ def spacerToHTML(width = 9)
161
+ XMLElement.new('td', 'style' => "width:#{width}%")
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ReportTableLine.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/ReportTableCell'
14
+
15
+ class TaskJuggler
16
+
17
+ class ReportTableLine
18
+
19
+ attr_reader :table, :property, :scopeLine
20
+ attr_accessor :height, :indentation, :fontSize, :no, :lineNo, :subLineNo
21
+
22
+ # Create a ReportTableCell object and initialize the variables with default
23
+ # values. _table_ is a reference to the ReportTable object this line belongs
24
+ # to. _property_ is a reference to the Task or Resource that is displayed in
25
+ # this line. _scopeLine_ is the line that sets the scope for this line. The
26
+ # value is nil if this is a primary line.
27
+ def initialize(table, property, scopeLine)
28
+ @table = table
29
+ @property = property
30
+ @scopeLine = scopeLine
31
+
32
+ # Register the new line with the table it belongs to.
33
+ @table.addLine(self)
34
+ # The cells of this line. Should be references to ReportTableCell objects.
35
+ @cells = []
36
+ # Heigh of the line in screen pixels
37
+ @height = 21
38
+ # Indentation for hierachiecal columns in screen pixels.
39
+ @indentation = 0
40
+ # The factor used to enlarge or shrink the font size for this line.
41
+ @fontSize = 12
42
+ # Counter that counts primary and nested lines separately. It restarts
43
+ # with 0 for each new nested line set. Scenario lines don't count.
44
+ @no = nil
45
+ # Counter that counts the primary lines. Scenario lines don't count.
46
+ @lineNo = nil
47
+ # Counter that counts all lines.
48
+ @subLineNo = nil
49
+ end
50
+
51
+ # Return the last non-hidden cell of the line. Start to look for the cell at
52
+ # the first cell after _count_ cells.
53
+ def last(count = 0)
54
+ (1 + count).upto(@cells.length) do |i|
55
+ return @cells[-i] unless @cells[-i].hidden
56
+ end
57
+ nil
58
+ end
59
+
60
+ # Add the new cell to the line. _cell_ must reference a ReportTableCell
61
+ # object.
62
+ def addCell(cell)
63
+ @cells << cell
64
+ end
65
+
66
+ # Return this line as a set of XMLElement that represent the line in HTML.
67
+ def to_html
68
+ style = ""
69
+ style += "height:#{@height}px; " if @table.equiLines
70
+ style += "font-size:#{@fontSize}px; " if @fontSize
71
+ tr = XMLElement.new('tr', 'class' => 'tabline', 'style' => style)
72
+ @cells.each { |cell| tr << cell.to_html }
73
+ tr
74
+ end
75
+
76
+ # Convert the intermediate format into an Array of values. One entry for
77
+ # every column cell of this line.
78
+ def to_csv(csv)
79
+ @cells.each do |cell|
80
+ cell.to_csv(csv)
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = ResourceListRE.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/ReportTableElement'
14
+ require 'reports/ReportTable'
15
+ require 'TableColumnDefinition'
16
+ require 'LogicalExpression'
17
+
18
+ class TaskJuggler
19
+
20
+ # This specialization of ReportTableElement implements a resource listing. It
21
+ # generates a list of resources that can optionally have the assigned tasks
22
+ # nested underneath each resource line.
23
+ class ResourceListRE < ReportTableElement
24
+
25
+ # Create a new object and set some default values.
26
+ def initialize(report)
27
+ super
28
+ # Set the default columns for this report.
29
+ %w( no name ).each do |col|
30
+ @columns << TableColumnDefinition.new(col, defaultColumnTitle(col))
31
+ end
32
+ # Show all resources, sorted by tree and id-up.
33
+ @hideResource = LogicalExpression.new(LogicalOperation.new(0))
34
+ @sortResources = [ [ 'tree', true, -1 ],
35
+ [ 'id', true, -1 ] ]
36
+ # Hide all resources, but set sorting to tree, start-up, seqno-up.
37
+ @hideTask = LogicalExpression.new(LogicalOperation.new(1))
38
+ @sortTasks = [ [ 'tree', true, -1 ],
39
+ [ 'start', true, 0 ],
40
+ [ 'seqno', true, -1 ] ]
41
+
42
+ @table = ReportTable.new
43
+ end
44
+
45
+ # Generate the table in the intermediate format.
46
+ def generateIntermediateFormat
47
+ # Generate the table header.
48
+ @columns.each do |columnDescr|
49
+ generateHeaderCell(columnDescr)
50
+ end
51
+
52
+ # Prepare the resource list.
53
+ resourceList = PropertyList.new(@project.resources)
54
+ resourceList.setSorting(@sortResources)
55
+ resourceList = filterResourceList(resourceList, nil, @hideResource,
56
+ @rollupResource)
57
+ resourceList.sort!
58
+
59
+ # Prepare the task list.
60
+ taskList = PropertyList.new(@project.tasks)
61
+ taskList.setSorting(@sortTasks)
62
+ taskList = filterTaskList(taskList, nil, @hideTask, @rollupTask)
63
+ taskList.sort!
64
+
65
+ # Generate the list.
66
+ generateResourceList(resourceList, taskList, nil)
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = TaskListRE.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/ReportTableElement'
14
+ require 'reports/ReportTable'
15
+ require 'TableColumnDefinition'
16
+ require 'LogicalExpression'
17
+
18
+ class TaskJuggler
19
+
20
+ # This specialization of ReportTableElement implements a task listing. It
21
+ # generates a list of tasks that can optionally have the allocated resources
22
+ # nested underneath each task line.
23
+ class TaskListRE < ReportTableElement
24
+
25
+ # Create a new object and set some default values.
26
+ def initialize(report)
27
+ super
28
+ # Set the default columns for this report.
29
+ %w( wbs name start end effort chart ).each do |col|
30
+ @columns << TableColumnDefinition.new(col, defaultColumnTitle(col))
31
+ end
32
+ # Show all tasks, sorted by tree, start-up, seqno-up.
33
+ @hideTask = LogicalExpression.new(LogicalOperation.new(0))
34
+ @sortTasks = [ [ 'tree', true, -1 ],
35
+ [ 'start', true, 0 ],
36
+ [ 'seqno', true, -1 ] ]
37
+ # Show no resources, but set sorting to id-up.
38
+ @hideResource = LogicalExpression.new(LogicalOperation.new(1))
39
+ @sortResources = [ [ 'id', true, -1 ] ]
40
+
41
+ @table = ReportTable.new
42
+ end
43
+
44
+ # Generate the table in the intermediate format.
45
+ def generateIntermediateFormat
46
+ # Prepare the task list.
47
+ taskList = PropertyList.new(@project.tasks)
48
+ taskList.setSorting(@sortTasks)
49
+ taskList = filterTaskList(taskList, nil, @hideTask, @rollupTask)
50
+ taskList.sort!
51
+
52
+ adjustReportPeriod(taskList, @scenarios) unless @userDefinedPeriod
53
+
54
+ # Prepare the resource list.
55
+ resourceList = PropertyList.new(@project.resources)
56
+ resourceList.setSorting(@sortResources)
57
+ resourceList = filterResourceList(resourceList, nil, @hideResource,
58
+ @rollupResource)
59
+ resourceList.sort!
60
+
61
+ # Generate the table header.
62
+ @columns.each do |columnDescr|
63
+ generateHeaderCell(columnDescr)
64
+ end
65
+
66
+ # Generate the list.
67
+ generateTaskList(taskList, resourceList, nil)
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+
@@ -0,0 +1,394 @@
1
+ #!/usr/bin/env ruby -w
2
+ # encoding: UTF-8
3
+ #
4
+ # = TjpExportRE.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/ReportElement'
14
+
15
+ class TaskJuggler
16
+
17
+ # This specialization of ReportTableElement implements an export of the
18
+ # project data in the TJP syntax format.
19
+ class TjpExportRE < ReportElement
20
+
21
+ attr_writer :resourceAttrs, :taskAttrs
22
+ attr_reader :mainFile
23
+
24
+ # Create a new object and set some default values.
25
+ def initialize(report, mainFile)
26
+ super(report)
27
+
28
+ # Indicates whether this is a full .tjp file or just an .tji include file.
29
+ @mainFile = mainFile
30
+
31
+ @supportedTaskAttrs = %w( booking complete depends flags maxend
32
+ maxstart minend minstart note priority
33
+ responsible )
34
+ @supportedResourceAttrs = %w( vacation workinghours )
35
+ @taskAttrs = %w( all )
36
+ @resourceAttrs = %w( all )
37
+ @scenarios = [ 0 ]
38
+
39
+ # Show all tasks, sorted by seqno-up.
40
+ @hideTask =
41
+ LogicalExpression.new(LogicalOperation.new(0))
42
+ @sortTasks = [ [ 'seqno', true, -1 ] ]
43
+ # Show all resources, sorted by seqno-up.
44
+ @hideResource =
45
+ LogicalExpression.new(LogicalOperation.new(0))
46
+ @sortResources = [ [ 'seqno', true, -1 ] ]
47
+ end
48
+
49
+ # There is nothing to do here.
50
+ def generateIntermediateFormat
51
+ end
52
+
53
+ # Return the project data in TJP syntax format.
54
+ def to_tjp
55
+ # Prepare the resource list.
56
+ @resourceList = PropertyList.new(@project.resources)
57
+ @resourceList.setSorting(@sortResources)
58
+ @resourceList = filterResourceList(@resourceList, nil, @hideResource,
59
+ @rollupResource)
60
+ @resourceList.sort!
61
+
62
+ # Prepare the task list.
63
+ @taskList = PropertyList.new(@project.tasks)
64
+ @taskList.setSorting(@sortTasks)
65
+ @taskList = filterTaskList(@taskList, nil, @hideTask, @rollupTask)
66
+ @taskList.sort!
67
+
68
+ getBookings
69
+
70
+ @file = ''
71
+
72
+ if @mainFile
73
+ generateProjectProperty
74
+ generateFlagDeclaration
75
+ generateResourceList
76
+ generateTaskList
77
+ end
78
+ generateTaskAttributes unless @taskAttrs.empty?
79
+ generateResourceAttributes unless @resourceAttrs.empty?
80
+
81
+ @file
82
+ end
83
+
84
+ private
85
+
86
+ def generateProjectProperty
87
+ @file << "project #{@project['projectid']} \"#{@project['name']}\" " +
88
+ "\"#{@project['version']}\" #{@project['start']} - " +
89
+ "#{@project['end']} {\n"
90
+ generateCustomAttributeDeclarations('resource', @project.resources,
91
+ @resourceAttrs)
92
+ generateCustomAttributeDeclarations('task', @project.tasks, @taskAttrs)
93
+ @file << "}\n\n"
94
+ end
95
+
96
+ def generateCustomAttributeDeclarations(tag, propertySet, attributes)
97
+ # First we search the attribute definitions for any user defined
98
+ # attributes and count them.
99
+ customAttributes = 0
100
+ propertySet.eachAttributeDefinition do |ad|
101
+ customAttributes += 1 if ad.userDefined
102
+ end
103
+ # Return if there are no user defined attributes.
104
+ return if customAttributes == 0
105
+
106
+ # Generate definitions for each user defined attribute that is in the
107
+ # taskAttributes list.
108
+ @file << ' extend ' + tag + "{\n"
109
+ propertySet.eachAttributeDefinition do |ad|
110
+ next unless ad.userDefined &&
111
+ (attributes.include?(ad.id) || attributes.include?('all'))
112
+
113
+ @file << " #{ad.objClass.tjpId} #{ad.id} \"#{ad.name}\"\n"
114
+ end
115
+ @file << " }\n"
116
+ end
117
+
118
+ def generateFlagDeclaration
119
+ flags = []
120
+
121
+ properties = @resourceList + @taskList
122
+
123
+ properties.each do |property|
124
+ @scenarios.each do |scenarioIdx|
125
+ property['flags', scenarioIdx].each do |flag|
126
+ flags << flag unless flags.include?(flag)
127
+ end
128
+ end
129
+ end
130
+ flags.sort
131
+ unless flags.empty?
132
+ @file << "flags #{flags.join(', ')}\n\n"
133
+ end
134
+ end
135
+
136
+ def generateResourceList
137
+ # The resource definitions are generated recursively. So we only need to
138
+ # start it for the top-level resources.
139
+ @resourceList.each do |resource|
140
+ if resource.parent.nil?
141
+ generateResource(resource, 0)
142
+ end
143
+ end
144
+ @file << "\n"
145
+ end
146
+
147
+ def generateResource(resource, indent)
148
+ Log.activity if resource.sequenceNo % 100 == 0
149
+
150
+ @file << ' ' * indent + "resource #{resource.id} \"#{resource.name}\""
151
+ @file << ' {' unless resource.children.empty?
152
+ @file << "\n"
153
+
154
+ # Call this function recursively for all children that are included in the
155
+ # resource list as well.
156
+ resource.children.each do |subresource|
157
+ if @resourceList.include?(subresource)
158
+ generateResource(subresource, indent + 2)
159
+ end
160
+ end
161
+
162
+ @file << ' ' * indent + "}\n" unless resource.children.empty?
163
+ end
164
+
165
+ def generateTaskList
166
+ # The task definitions are generated recursively. So we only need to start
167
+ # it for the top-level tasks.
168
+ @taskList.each do |task|
169
+ if task.parent.nil?
170
+ generateTask(task, 0)
171
+ end
172
+ end
173
+ end
174
+
175
+ # Generate a task definition. It only contains a very small set of
176
+ # attributes that have to be passed on the the nested tasks at creation
177
+ # time. All other attributes are declared in subsequent supplement
178
+ # statements.
179
+ def generateTask(task, indent)
180
+ Log.activity if task.sequenceNo % 100 == 0
181
+
182
+ @file << ' ' * indent + "task #{task.id} \"#{task.name}\" {\n"
183
+
184
+ if @taskAttrs.include?('depends') || @taskAttrs.include?('all')
185
+ @scenarios.each do |scenarioIdx|
186
+ generateTaskDependency(scenarioIdx, task, 'depends', indent + 2)
187
+ generateTaskDependency(scenarioIdx, task, 'precedes', indent + 2)
188
+ end
189
+ end
190
+
191
+ # Call this function recursively for all children that are included in the
192
+ # task list as well.
193
+ task.children.each do |subtask|
194
+ if @taskList.include?(subtask)
195
+ generateTask(subtask, indent + 2)
196
+ end
197
+ end
198
+
199
+ # Determine whether this task has subtasks that are included in the
200
+ # report or whether this is a leaf task for the report.
201
+ isLeafTask = true
202
+ task.children.each do |subtask|
203
+ if @taskList.include?(subtask)
204
+ isLeafTask = false
205
+ break
206
+ end
207
+ end
208
+
209
+ # For leaf tasks we put some attributes right here.
210
+ if isLeafTask
211
+ @scenarios.each do |scenarioIdx|
212
+ generateAttribute(task, 'start', indent + 2, scenarioIdx)
213
+ unless task['milestone', scenarioIdx]
214
+ generateAttribute(task, 'end', indent + 2, scenarioIdx)
215
+ end
216
+ if task['scheduled', scenarioIdx]
217
+ generateAttributeText('scheduled', indent + 2, scenarioIdx)
218
+ end
219
+ generateAttributeText('scheduling ' +
220
+ (task['forward', scenarioIdx] ?
221
+ 'asap' : 'alap'),
222
+ indent + 2, scenarioIdx)
223
+ if task['milestone', scenarioIdx]
224
+ generateAttributeText('milestone', indent + 2, scenarioIdx)
225
+ end
226
+ end
227
+ end
228
+
229
+ @file << ' ' * indent + "}\n"
230
+ end
231
+
232
+ # Generate 'depends' or 'precedes' attributes for a task.
233
+ def generateTaskDependency(scenarioIdx, task, tag, indent)
234
+ return unless @taskAttrs.include?('depends') || !@taskAttrs.include?('all')
235
+
236
+ taskDeps = task[tag, scenarioIdx]
237
+ unless taskDeps.empty?
238
+ @file << ' ' * indent + tag + ' '
239
+ first = true
240
+ taskDeps.each do |dep|
241
+ if first
242
+ first = false
243
+ else
244
+ @file << ', '
245
+ end
246
+ @file << dep.task.fullId
247
+ end
248
+ @file << "\n"
249
+ end
250
+ end
251
+
252
+ # Generate a list of resource supplement statements that include the rest of
253
+ # the attributes.
254
+ def generateResourceAttributes
255
+ @resourceList.each do |resource|
256
+ Log.activity if resource.sequenceNo % 100 == 0
257
+
258
+ @file << "supplement resource #{resource.fullId} {\n"
259
+ @project.resources.eachAttributeDefinition do |attrDef|
260
+ id = attrDef.id
261
+ attr = resource.getAttr(id)
262
+ next if (!@supportedResourceAttrs.include?(id) &&
263
+ ! attrDef.userDefined) ||
264
+ (!@resourceAttrs.include?('all') &&
265
+ !@resourceAttrs.include?(id))
266
+
267
+ if attrDef.scenarioSpecific
268
+ @scenarios.each do |scenarioIdx|
269
+ generateAttribute(resource, id, 2, scenarioIdx)
270
+ end
271
+ else
272
+ generateAttribute(resource, id, 2)
273
+ end
274
+ end
275
+
276
+ @file << "}\n"
277
+ end
278
+ end
279
+
280
+ # Generate a list of task supplement statements that include the rest of the
281
+ # attributes.
282
+ def generateTaskAttributes
283
+ @taskList.each do |task|
284
+ Log.activity if task.sequenceNo % 100 == 0
285
+
286
+ @file << "supplement task #{task.fullId} {\n"
287
+ @project.tasks.eachAttributeDefinition do |attrDef|
288
+ id = attrDef.id
289
+ attr = task.getAttr(id)
290
+ next if (!@supportedTaskAttrs.include?(id) &&
291
+ ! attrDef.userDefined) ||
292
+ (!@taskAttrs.include?('all') && !@taskAttrs.include?(id))
293
+
294
+ if attrDef.scenarioSpecific
295
+ @scenarios.each do |scenarioIdx|
296
+ # Some attributes need special treatment.
297
+ case id
298
+ when 'depends'
299
+ next # already taken care of
300
+ when 'booking'
301
+ generateBooking(task, 2, scenarioIdx)
302
+ else
303
+ generateAttribute(task, id, 2, scenarioIdx)
304
+ end
305
+ end
306
+ else
307
+ generateAttribute(task, id, 2)
308
+ end
309
+ end
310
+
311
+ @file << "}\n"
312
+ end
313
+ end
314
+
315
+ def generateAttribute(property, attrId, indent, scenarioIdx = nil)
316
+ if scenarioIdx.nil?
317
+ return if property.getAttr(attrId).nil?
318
+ else
319
+ return if property[attrId, scenarioIdx].nil?
320
+ end
321
+
322
+ generateAttributeText(property.getAttr(attrId, scenarioIdx).to_tjp,
323
+ indent, scenarioIdx)
324
+ end
325
+
326
+ def generateAttributeText(text, indent, scenarioIdx)
327
+ @file << ' ' * indent
328
+ tag = ''
329
+ unless scenarioIdx.nil?
330
+ tag = @project.scenario(scenarioIdx).id
331
+ @file << "#{tag}:"
332
+ end
333
+ @file << "#{indentBlock(text, indent + tag.length + 2)}\n"
334
+ end
335
+
336
+ # Get the booking data for all resources that should be included in the
337
+ # report.
338
+ def getBookings
339
+ @bookings = {}
340
+ if @taskAttrs.include?('booking') ||
341
+ @taskAttrs.include?('all')
342
+ @scenarios.each do |scenarioIdx|
343
+ @bookings[scenarioIdx] = {}
344
+ @resourceList.each do |resource|
345
+ # Get the bookings for this resource hashed by task.
346
+ bookings = resource.getBookings(scenarioIdx)
347
+ next if bookings.nil?
348
+
349
+ # Now convert/add them to a tripple-stage hash by scenarioIdx, task
350
+ # and then resource.
351
+ bookings.each do |task, booking|
352
+ if !@bookings[scenarioIdx].include?(task)
353
+ @bookings[scenarioIdx][task] = {}
354
+ end
355
+ @bookings[scenarioIdx][task][resource] = booking
356
+ end
357
+ end
358
+ end
359
+ end
360
+ end
361
+
362
+ def generateBooking(task, indent, scenarioIdx)
363
+ return unless @bookings[scenarioIdx].include?(task)
364
+
365
+ @bookings[scenarioIdx][task].each_value do |booking|
366
+ generateAttributeText('booking ' + booking.to_tjp, indent, scenarioIdx)
367
+ end
368
+ end
369
+
370
+ # This utility function is used to indent multi-line attributes. All
371
+ # attributes should be filtered through this function. Attributes that
372
+ # contain line breaks will be indented properly. In addition to the
373
+ # indentation specified by _indent_ all but the first line will be indented
374
+ # after the first word of the first line. The text may not end with a line
375
+ # break.
376
+ def indentBlock(text, indent)
377
+ out = ''
378
+ firstSpace = 0
379
+ text.length.times do |i|
380
+ if firstSpace == 0 && text[i] == ?\ # There must be a space after ?
381
+ firstSpace = i
382
+ end
383
+ out << text[i]
384
+ if text[i] == ?\n
385
+ out += ' ' * (indent + firstSpace)
386
+ end
387
+ end
388
+ out
389
+ end
390
+
391
+ end
392
+
393
+ end
394
+