taskjuggler 3.6.0 → 3.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (434) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +69 -0
  3. data/Rakefile +4 -1
  4. data/data/css/tjreport.css +4 -0
  5. data/data/tjp.vim +9 -3
  6. data/examples/ProjectTemplate/template.tjp +10 -10
  7. data/examples/Tutorial/tutorial.tjp +4 -4
  8. data/lib/taskjuggler/Allocation.rb +1 -1
  9. data/lib/taskjuggler/AppConfig.rb +1 -1
  10. data/lib/taskjuggler/AttributeBase.rb +10 -4
  11. data/lib/taskjuggler/Attributes.rb +2 -2
  12. data/lib/taskjuggler/BatchProcessor.rb +69 -58
  13. data/lib/taskjuggler/FileList.rb +1 -1
  14. data/lib/taskjuggler/Interval.rb +10 -12
  15. data/lib/taskjuggler/Journal.rb +2 -2
  16. data/lib/taskjuggler/LogicalFunction.rb +1 -1
  17. data/lib/taskjuggler/LogicalOperation.rb +7 -4
  18. data/lib/taskjuggler/MessageHandler.rb +1 -2
  19. data/lib/taskjuggler/PTNProxy.rb +1 -1
  20. data/lib/taskjuggler/Project.rb +27 -22
  21. data/lib/taskjuggler/PropertyList.rb +7 -1
  22. data/lib/taskjuggler/PropertySet.rb +1 -1
  23. data/lib/taskjuggler/PropertyTreeNode.rb +5 -3
  24. data/lib/taskjuggler/Query.rb +3 -3
  25. data/lib/taskjuggler/RealFormat.rb +1 -1
  26. data/lib/taskjuggler/Resource.rb +2 -2
  27. data/lib/taskjuggler/ResourceScenario.rb +66 -6
  28. data/lib/taskjuggler/RichText/Snip.rb +1 -1
  29. data/lib/taskjuggler/RuntimeConfig.rb +2 -2
  30. data/lib/taskjuggler/Scoreboard.rb +5 -2
  31. data/lib/taskjuggler/SheetHandlerBase.rb +5 -4
  32. data/lib/taskjuggler/Shift.rb +2 -2
  33. data/lib/taskjuggler/ShiftAssignments.rb +1 -1
  34. data/lib/taskjuggler/StatusSheetReceiver.rb +2 -2
  35. data/lib/taskjuggler/StatusSheetSender.rb +1 -1
  36. data/lib/taskjuggler/TaskJuggler.rb +4 -4
  37. data/lib/taskjuggler/TaskScenario.rb +7 -2
  38. data/lib/taskjuggler/TextParser/Scanner.rb +4 -4
  39. data/lib/taskjuggler/TextParser.rb +1 -1
  40. data/lib/taskjuggler/TimeSheetReceiver.rb +2 -2
  41. data/lib/taskjuggler/TimeSheetSender.rb +1 -1
  42. data/lib/taskjuggler/TimeSheets.rb +5 -4
  43. data/lib/taskjuggler/Tj3AppBase.rb +23 -9
  44. data/lib/taskjuggler/Tj3Config.rb +5 -3
  45. data/lib/taskjuggler/TjpExample.rb +3 -1
  46. data/lib/taskjuggler/TjpSyntaxRules.rb +166 -133
  47. data/lib/taskjuggler/UTF8String.rb +3 -3
  48. data/lib/taskjuggler/WorkingHours.rb +3 -3
  49. data/lib/taskjuggler/XMLDocument.rb +1 -1
  50. data/lib/taskjuggler/XMLElement.rb +12 -1
  51. data/lib/taskjuggler/apps/Tj3.rb +3 -1
  52. data/lib/taskjuggler/apps/Tj3Client.rb +3 -2
  53. data/lib/taskjuggler/apps/Tj3Daemon.rb +5 -3
  54. data/lib/taskjuggler/apps/Tj3Man.rb +4 -2
  55. data/lib/taskjuggler/apps/Tj3SsReceiver.rb +3 -1
  56. data/lib/taskjuggler/apps/Tj3SsSender.rb +3 -1
  57. data/lib/taskjuggler/apps/Tj3TsReceiver.rb +3 -1
  58. data/lib/taskjuggler/apps/Tj3TsSender.rb +3 -1
  59. data/lib/taskjuggler/apps/Tj3TsSummary.rb +3 -1
  60. data/lib/taskjuggler/apps/Tj3WebD.rb +4 -2
  61. data/lib/taskjuggler/daemon/ProjectServer.rb +2 -2
  62. data/lib/taskjuggler/deep_copy.rb +1 -1
  63. data/lib/taskjuggler/reports/CSVFile.rb +4 -4
  64. data/lib/taskjuggler/reports/ChartPlotter.rb +1 -1
  65. data/lib/taskjuggler/reports/GanttChart.rb +8 -2
  66. data/lib/taskjuggler/reports/GanttHeader.rb +11 -1
  67. data/lib/taskjuggler/reports/GanttLine.rb +6 -0
  68. data/lib/taskjuggler/reports/ICalReport.rb +1 -1
  69. data/lib/taskjuggler/reports/MspXmlRE.rb +5 -3
  70. data/lib/taskjuggler/reports/Report.rb +6 -6
  71. data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
  72. data/lib/taskjuggler/reports/TableReport.rb +7 -12
  73. data/lib/taskjuggler/reports/TjpExportRE.rb +1 -5
  74. data/lib/taskjuggler/reports/TraceReport.rb +2 -2
  75. data/lib/taskjuggler/version.rb +1 -0
  76. data/man/tj3.1 +130 -0
  77. data/man/tj3client.1 +145 -0
  78. data/man/tj3d.1 +93 -0
  79. data/man/tj3man.1 +76 -0
  80. data/man/tj3ss_receiver.1 +86 -0
  81. data/man/tj3ss_sender.1 +100 -0
  82. data/man/tj3ts_receiver.1 +86 -0
  83. data/man/tj3ts_sender.1 +92 -0
  84. data/man/tj3ts_summary.1 +104 -0
  85. data/man/tj3webd.1 +86 -0
  86. data/manual/Day_To_Day_Juggling +8 -8
  87. data/manual/Installation +6 -6
  88. data/manual/List_Attributes +1 -1
  89. data/manual/Rich_Text_Attributes +6 -5
  90. data/manual/Software +6 -6
  91. data/manual/TaskJuggler_Internals +4 -4
  92. data/manual/The_TaskJuggler_Syntax +5 -5
  93. data/manual/Tutorial +13 -11
  94. data/manual/html/Day_To_Day_Juggling.html +9 -9
  95. data/manual/html/Getting_Started.html +2 -2
  96. data/manual/html/How_To_Contribute.html +2 -2
  97. data/manual/html/Installation.html +8 -8
  98. data/manual/html/Intro.html +2 -2
  99. data/manual/html/List_Attributes.html +3 -3
  100. data/manual/html/Reporting_Bugs.html +2 -2
  101. data/manual/html/Rich_Text_Attributes.html +5 -5
  102. data/manual/html/Software.html +7 -7
  103. data/manual/html/TaskJuggler_2x_Migration.html +2 -2
  104. data/manual/html/TaskJuggler_Internals.html +6 -6
  105. data/manual/html/The_TaskJuggler_Syntax.html +6 -6
  106. data/manual/html/Tutorial.html +17 -14
  107. data/manual/html/account.html +3 -3
  108. data/manual/html/account.task.html +2 -2
  109. data/manual/html/accountprefix.html +2 -2
  110. data/manual/html/accountreport.html +3 -3
  111. data/manual/html/accountroot.html +2 -2
  112. data/manual/html/active.html +3 -3
  113. data/manual/html/adopt.task.html +2 -2
  114. data/manual/html/aggregate.html +2 -2
  115. data/manual/html/alert.html +3 -3
  116. data/manual/html/alertlevels.html +2 -2
  117. data/manual/html/allocate.html +3 -3
  118. data/manual/html/alphabet.html +1 -1
  119. data/manual/html/alternative.html +2 -2
  120. data/manual/html/author.html +2 -2
  121. data/manual/html/auxdir.html +2 -2
  122. data/manual/html/auxdir.report.html +2 -2
  123. data/manual/html/balance.html +2 -2
  124. data/manual/html/booking.resource.html +4 -4
  125. data/manual/html/booking.task.html +4 -4
  126. data/manual/html/caption.html +2 -2
  127. data/manual/html/cellcolor.column.html +3 -3
  128. data/manual/html/celltext.column.html +3 -3
  129. data/manual/html/center.html +2 -2
  130. data/manual/html/charge.html +2 -2
  131. data/manual/html/chargeset.html +2 -2
  132. data/manual/html/columnid.html +21 -14
  133. data/manual/html/columns.html +2 -2
  134. data/manual/html/complete.html +2 -2
  135. data/manual/html/copyright.html +2 -2
  136. data/manual/html/credits.html +2 -2
  137. data/manual/html/css/tjreport.css +4 -0
  138. data/manual/html/currency.html +2 -2
  139. data/manual/html/currencyformat.html +3 -3
  140. data/manual/html/dailymax.html +2 -2
  141. data/manual/html/dailymin.html +3 -3
  142. data/manual/html/dailyworkinghours.html +2 -2
  143. data/manual/html/date.extend.html +2 -2
  144. data/manual/html/date.html +5 -5
  145. data/manual/html/definitions.html +4 -4
  146. data/manual/html/depends.html +4 -4
  147. data/manual/html/details.html +2 -2
  148. data/manual/html/disabled.html +2 -2
  149. data/manual/html/duration.html +2 -2
  150. data/manual/html/efficiency.html +3 -3
  151. data/manual/html/effort.html +2 -2
  152. data/manual/html/effortdone.html +2 -2
  153. data/manual/html/effortleft.html +2 -2
  154. data/manual/html/email.html +2 -2
  155. data/manual/html/enabled.html +2 -2
  156. data/manual/html/end.column.html +3 -3
  157. data/manual/html/end.html +4 -4
  158. data/manual/html/end.limit.html +2 -2
  159. data/manual/html/end.report.html +2 -2
  160. data/manual/html/end.timesheet.html +3 -3
  161. data/manual/html/endcredit.html +3 -3
  162. data/manual/html/epilog.html +2 -2
  163. data/manual/html/export.html +3 -3
  164. data/manual/html/extend.html +3 -3
  165. data/manual/html/fail.html +3 -3
  166. data/manual/html/fdl.html +2 -2
  167. data/manual/html/flags.account.html +2 -2
  168. data/manual/html/flags.html +2 -2
  169. data/manual/html/flags.journalentry.html +2 -2
  170. data/manual/html/flags.report.html +2 -2
  171. data/manual/html/flags.resource.html +2 -2
  172. data/manual/html/flags.statussheet.html +2 -2
  173. data/manual/html/flags.task.html +2 -2
  174. data/manual/html/flags.timesheet.html +2 -2
  175. data/manual/html/fontcolor.column.html +3 -3
  176. data/manual/html/footer.html +2 -2
  177. data/manual/html/formats.export.html +3 -3
  178. data/manual/html/formats.html +3 -3
  179. data/manual/html/functions.html +5 -5
  180. data/manual/html/gapduration.html +2 -2
  181. data/manual/html/gaplength.html +2 -2
  182. data/manual/html/halign.center.html +2 -2
  183. data/manual/html/halign.column.html +3 -3
  184. data/manual/html/halign.left.html +2 -2
  185. data/manual/html/halign.right.html +2 -2
  186. data/manual/html/hasalert.html +2 -2
  187. data/manual/html/header.html +2 -2
  188. data/manual/html/headline.html +2 -2
  189. data/manual/html/height.html +3 -3
  190. data/manual/html/hideaccount.html +3 -3
  191. data/manual/html/hidejournalentry.html +2 -2
  192. data/manual/html/hidereport.html +3 -3
  193. data/manual/html/hideresource.html +3 -3
  194. data/manual/html/hidetask.html +3 -3
  195. data/manual/html/icalreport.html +9 -3
  196. data/manual/html/include.macro.html +3 -3
  197. data/manual/html/include.project.html +3 -3
  198. data/manual/html/include.properties.html +3 -3
  199. data/manual/html/index.html +1 -1
  200. data/manual/html/inherit.extend.html +3 -3
  201. data/manual/html/interval1.html +3 -3
  202. data/manual/html/interval2.html +3 -3
  203. data/manual/html/interval3.html +2 -2
  204. data/manual/html/interval4.html +2 -2
  205. data/manual/html/isactive.html +2 -2
  206. data/manual/html/ischildof.html +2 -2
  207. data/manual/html/isdependencyof.html +2 -2
  208. data/manual/html/isdutyof.html +2 -2
  209. data/manual/html/isfeatureof.html +2 -2
  210. data/manual/html/isleaf.html +2 -2
  211. data/manual/html/ismilestone.html +2 -2
  212. data/manual/html/isongoing.html +3 -3
  213. data/manual/html/isresource.html +2 -2
  214. data/manual/html/isresponsibilityof.html +2 -2
  215. data/manual/html/istask.html +2 -2
  216. data/manual/html/isvalid.html +2 -2
  217. data/manual/html/journalattributes.html +2 -2
  218. data/manual/html/journalentry.html +3 -3
  219. data/manual/html/journalmode.html +3 -3
  220. data/manual/html/leaveallowance.html +3 -3
  221. data/manual/html/leaves.html +3 -3
  222. data/manual/html/left.html +2 -2
  223. data/manual/html/length.html +3 -3
  224. data/manual/html/limits.allocate.html +2 -2
  225. data/manual/html/limits.html +2 -2
  226. data/manual/html/limits.resource.html +2 -2
  227. data/manual/html/limits.task.html +2 -2
  228. data/manual/html/listitem.column.html +3 -3
  229. data/manual/html/listtype.column.html +2 -2
  230. data/manual/html/loadunit.html +2 -2
  231. data/manual/html/logicalexpression.html +4 -4
  232. data/manual/html/logicalflagexpression.html +4 -4
  233. data/manual/html/macro.html +4 -4
  234. data/manual/html/managers.html +2 -2
  235. data/manual/html/mandatory.html +4 -4
  236. data/manual/html/markdate.html +69 -0
  237. data/manual/html/maxend.html +4 -4
  238. data/manual/html/maximum.html +2 -2
  239. data/manual/html/maxstart.html +2 -2
  240. data/manual/html/milestone.html +3 -3
  241. data/manual/html/minend.html +2 -2
  242. data/manual/html/minimum.html +2 -2
  243. data/manual/html/minstart.html +2 -2
  244. data/manual/html/monthlymax.html +2 -2
  245. data/manual/html/monthlymin.html +3 -3
  246. data/manual/html/navbar.html +5 -1
  247. data/manual/html/navigator.html +2 -2
  248. data/manual/html/newtask.html +3 -3
  249. data/manual/html/nikureport.html +2 -2
  250. data/manual/html/note.task.html +4 -4
  251. data/manual/html/novevents.html +68 -0
  252. data/manual/html/now.html +4 -4
  253. data/manual/html/number.extend.html +2 -2
  254. data/manual/html/numberformat.html +2 -2
  255. data/manual/html/onend.html +2 -2
  256. data/manual/html/onstart.html +2 -2
  257. data/manual/html/opennodes.html +2 -2
  258. data/manual/html/outputdir.html +3 -3
  259. data/manual/html/overtime.booking.html +2 -2
  260. data/manual/html/period.column.html +2 -2
  261. data/manual/html/period.limit.html +2 -2
  262. data/manual/html/period.report.html +2 -2
  263. data/manual/html/period.task.html +2 -2
  264. data/manual/html/persistent.html +3 -3
  265. data/manual/html/precedes.html +5 -5
  266. data/manual/html/priority.html +4 -4
  267. data/manual/html/priority.timesheet.html +3 -3
  268. data/manual/html/project.html +4 -4
  269. data/manual/html/projectid.html +2 -2
  270. data/manual/html/projectid.task.html +3 -3
  271. data/manual/html/projectids.html +2 -2
  272. data/manual/html/projection.html +2 -2
  273. data/manual/html/prolog.html +2 -2
  274. data/manual/html/properties.html +3 -3
  275. data/manual/html/purge.html +2 -2
  276. data/manual/html/rate.html +2 -2
  277. data/manual/html/rate.resource.html +2 -2
  278. data/manual/html/rawhtmlhead.html +3 -3
  279. data/manual/html/reference.extend.html +2 -2
  280. data/manual/html/remaining.html +3 -3
  281. data/manual/html/replace.html +2 -2
  282. data/manual/html/reportprefix.html +2 -2
  283. data/manual/html/resource.html +3 -3
  284. data/manual/html/resourceattributes.html +2 -2
  285. data/manual/html/resourceprefix.html +2 -2
  286. data/manual/html/resourcereport.html +4 -4
  287. data/manual/html/resourceroot.html +3 -3
  288. data/manual/html/resources.limit.html +2 -2
  289. data/manual/html/responsible.html +2 -2
  290. data/manual/html/richtext.extend.html +2 -2
  291. data/manual/html/right.html +2 -2
  292. data/manual/html/rollupaccount.html +3 -3
  293. data/manual/html/rollupresource.html +3 -3
  294. data/manual/html/rolluptask.html +3 -3
  295. data/manual/html/scale.column.html +2 -2
  296. data/manual/html/scenario.html +3 -3
  297. data/manual/html/scenario.ical.html +3 -3
  298. data/manual/html/scenarios.export.html +2 -2
  299. data/manual/html/scenarios.html +2 -2
  300. data/manual/html/scenariospecific.extend.html +2 -2
  301. data/manual/html/scheduled.html +2 -2
  302. data/manual/html/scheduling.html +6 -6
  303. data/manual/html/schedulingmode.html +2 -2
  304. data/manual/html/select.html +4 -4
  305. data/manual/html/selfcontained.html +2 -2
  306. data/manual/html/shift.allocate.html +2 -2
  307. data/manual/html/shift.html +3 -3
  308. data/manual/html/shift.resource.html +4 -4
  309. data/manual/html/shift.task.html +2 -2
  310. data/manual/html/shift.timesheet.html +2 -2
  311. data/manual/html/shifts.allocate.html +2 -2
  312. data/manual/html/shifts.resource.html +2 -2
  313. data/manual/html/shifts.task.html +3 -3
  314. data/manual/html/shorttimeformat.html +3 -3
  315. data/manual/html/sloppy.booking.html +2 -2
  316. data/manual/html/sloppy.projection.html +2 -2
  317. data/manual/html/sortaccounts.html +2 -2
  318. data/manual/html/sortjournalentries.html +2 -2
  319. data/manual/html/sortresources.html +2 -2
  320. data/manual/html/sorttasks.html +2 -2
  321. data/manual/html/start.column.html +3 -3
  322. data/manual/html/start.html +4 -4
  323. data/manual/html/start.limit.html +2 -2
  324. data/manual/html/start.report.html +2 -2
  325. data/manual/html/startcredit.html +3 -3
  326. data/manual/html/status.statussheet.html +2 -2
  327. data/manual/html/status.timesheet.html +2 -2
  328. data/manual/html/statussheet.html +2 -2
  329. data/manual/html/statussheetreport.html +3 -3
  330. data/manual/html/strict.projection.html +2 -2
  331. data/manual/html/summary.html +2 -2
  332. data/manual/html/supplement.html +2 -2
  333. data/manual/html/supplement.resource.html +2 -2
  334. data/manual/html/supplement.task.html +2 -2
  335. data/manual/html/tagfile.html +3 -3
  336. data/manual/html/task.html +3 -3
  337. data/manual/html/task.statussheet.html +3 -3
  338. data/manual/html/task.timesheet.html +2 -2
  339. data/manual/html/taskattributes.html +2 -2
  340. data/manual/html/taskprefix.html +2 -2
  341. data/manual/html/taskreport.html +4 -4
  342. data/manual/html/taskroot.export.html +2 -2
  343. data/manual/html/taskroot.html +2 -2
  344. data/manual/html/text.extend.html +2 -2
  345. data/manual/html/textreport.html +4 -4
  346. data/manual/html/timeformat.html +3 -3
  347. data/manual/html/timeformat1.html +2 -2
  348. data/manual/html/timeformat2.html +2 -2
  349. data/manual/html/timeoff.nikureport.html +2 -2
  350. data/manual/html/timesheet.html +3 -3
  351. data/manual/html/timesheetreport.html +3 -3
  352. data/manual/html/timezone.export.html +2 -2
  353. data/manual/html/timezone.html +2 -2
  354. data/manual/html/timezone.report.html +2 -2
  355. data/manual/html/timezone.shift.html +2 -2
  356. data/manual/html/timingresolution.html +2 -2
  357. data/manual/html/title.column.html +2 -2
  358. data/manual/html/title.html +2 -2
  359. data/manual/html/toc.html +157 -143
  360. data/manual/html/tooltip.column.html +3 -3
  361. data/manual/html/tracereport.html +7 -7
  362. data/manual/html/trackingscenario.html +3 -3
  363. data/manual/html/treelevel.html +2 -2
  364. data/manual/html/vacation.html +2 -2
  365. data/manual/html/vacation.resource.html +2 -2
  366. data/manual/html/vacation.shift.html +2 -2
  367. data/manual/html/warn.html +4 -4
  368. data/manual/html/weeklymax.html +2 -2
  369. data/manual/html/weeklymin.html +3 -3
  370. data/manual/html/weekstartsmonday.html +2 -2
  371. data/manual/html/weekstartssunday.html +2 -2
  372. data/manual/html/width.column.html +2 -2
  373. data/manual/html/width.html +3 -3
  374. data/manual/html/work.html +3 -3
  375. data/manual/html/workinghours.project.html +3 -3
  376. data/manual/html/workinghours.resource.html +2 -2
  377. data/manual/html/workinghours.shift.html +2 -2
  378. data/manual/html/yearlyworkingdays.html +2 -2
  379. data/spec/ProjectBroker_spec.rb +6 -6
  380. data/spec/StatusSheets_spec.rb +1 -1
  381. data/spec/TimeSheets_spec.rb +1 -1
  382. data/spec/TraceReport_spec.rb +1 -1
  383. data/spec/support/DaemonControl.rb +2 -3
  384. data/taskjuggler.gemspec +7 -10
  385. data/tasks/changelog.rake +2 -0
  386. data/tasks/gem.rake +3 -1
  387. data/tasks/help2man.rake +18 -0
  388. data/tasks/kate.rake +2 -0
  389. data/tasks/manual.rake +3 -1
  390. data/tasks/test.rake +5 -0
  391. data/tasks/vim.rake +2 -0
  392. data/test/TestSuite/CSV-Reports/quotes.tjp +20 -0
  393. data/test/TestSuite/CSV-Reports/refs/quotes.csv +5 -0
  394. data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +0 -1
  395. data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +0 -2
  396. data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +0 -1
  397. data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +0 -1
  398. data/test/TestSuite/Export-Reports/refs/AutoID.tjp +0 -1
  399. data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +0 -1
  400. data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +0 -1
  401. data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +0 -2
  402. data/test/TestSuite/Export-Reports/refs/Depends1.tjp +0 -1
  403. data/test/TestSuite/Export-Reports/refs/Durations.tjp +0 -1
  404. data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +0 -1
  405. data/test/TestSuite/Export-Reports/refs/Gap.tjp +0 -3
  406. data/test/TestSuite/Export-Reports/refs/Include.tjp +0 -1
  407. data/test/TestSuite/Export-Reports/refs/Journal.tjp +0 -1
  408. data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +0 -1
  409. data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +0 -2
  410. data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +0 -1
  411. data/test/TestSuite/Export-Reports/refs/Manager.tjp +0 -1
  412. data/test/TestSuite/Export-Reports/refs/Milestone.tjp +0 -2
  413. data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +0 -1
  414. data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +0 -1
  415. data/test/TestSuite/Export-Reports/refs/Project.tjp +0 -1
  416. data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +0 -3
  417. data/test/TestSuite/Export-Reports/refs/Reports.tjp +0 -1
  418. data/test/TestSuite/Export-Reports/refs/Resource.tjp +0 -1
  419. data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +0 -1
  420. data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +0 -1
  421. data/test/TestSuite/Export-Reports/refs/Scenario.tjp +0 -2
  422. data/test/TestSuite/Export-Reports/refs/Timezone.tjp +0 -1
  423. data/test/TestSuite/Export-Reports/refs/Vacation.tjp +0 -1
  424. data/test/TestSuite/Export-Reports/refs/navigator.tjp +0 -4
  425. data/test/TestSuite/Export-Reports/refs/template.tjp +0 -6
  426. data/test/TestSuite/Export-Reports/refs/textreport.tjp +0 -1
  427. data/test/TestSuite/Export-Reports/refs/tutorial.tjp +0 -8
  428. data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -1
  429. data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +1 -1
  430. data/test/TestSuite/Syntax/Correct/template.tjp +3 -3
  431. data/test/TestSuite/Syntax/Correct/tutorial.tjp +8 -3
  432. data/test/test_BatchProcessor.rb +6 -3
  433. data/test/test_ProjectFileScanner.rb +8 -8
  434. metadata +47 -11
@@ -18,7 +18,7 @@ require 'base64'
18
18
  # This is an extension and modification of the standard String class. We do a
19
19
  # lot of UTF-8 character processing in the parser. Ruby 1.8 does not have good
20
20
  # enough UTF-8 support and Ruby 1.9 only handles UTF-8 characters as Strings.
21
- # This is very inefficient compared to representing them as Fixnum objects.
21
+ # This is very inefficient compared to representing them as Integer objects.
22
22
  # Some of these hacks can be removed once we have switched to 1.9 support
23
23
  # only.
24
24
  class String
@@ -58,8 +58,8 @@ class String
58
58
  alias old_double_left_angle <<
59
59
 
60
60
  # Replacement for the existing << operator that also works for characters
61
- # above Fixnum 255 (UTF-8 characters).
62
- def << (obj)
61
+ # above Integer 255 (UTF-8 characters).
62
+ def <<(obj)
63
63
  if obj.is_a?(String) || (obj < 256)
64
64
  # In this case we can use the built-in concat.
65
65
  concat(obj)
@@ -17,7 +17,7 @@ require 'taskjuggler/Scoreboard'
17
17
  class TaskJuggler
18
18
 
19
19
  # Class to store the working hours for each day of the week. The working hours
20
- # are stored as Arrays of Fixnum intervals for each day of the week. A day off
20
+ # are stored as Arrays of Integer intervals for each day of the week. A day off
21
21
  # is modelled as empty Array for that week day. The start end end times of
22
22
  # each working period are stored as seconds after midnight.
23
23
  class WorkingHours
@@ -100,7 +100,7 @@ class TaskJuggler
100
100
 
101
101
  # Set the working hours for a given week day. +dayOfWeek+ must be 0 for
102
102
  # Sunday, 1 for Monday and so on. +intervals+ must be an Array that
103
- # contains an Array with 2 Fixnums for each working period. Each value
103
+ # contains an Array with 2 Integers for each working period. Each value
104
104
  # specifies the time of day as minutes after midnight. The first value is
105
105
  # the start time of the interval, the second the end time.
106
106
  def setWorkingHours(dayOfWeek, intervals)
@@ -133,7 +133,7 @@ class TaskJuggler
133
133
 
134
134
  # Return the working hour intervals for a given day of the week.
135
135
  # +dayOfWeek+ must 0 for Sunday, 1 for Monday and so on. The result is an
136
- # Array that contains Arrays of 2 Fixnums.
136
+ # Array that contains Arrays of 2 Integers.
137
137
  def getWorkingHours(dayOfWeek)
138
138
  @days[dayOfWeek]
139
139
  end
@@ -52,7 +52,7 @@ class TaskJuggler
52
52
 
53
53
  # Write the XMLDocument to the specified file.
54
54
  def write(filename)
55
- f = filename == '.' ? $stdout : File.new(filename.untaint, 'w')
55
+ f = filename == '.' ? $stdout : File.new(filename, 'w')
56
56
  @elements.each do |element|
57
57
  f.puts element.to_s(0)
58
58
  end
@@ -204,7 +204,18 @@ class TaskJuggler
204
204
  end
205
205
 
206
206
  def to_s(indent)
207
- '<!-- ' + @text + " -->\n#{' ' * indent}"
207
+ '<!-- ' + canonicalize_comment(@text) + " -->\n#{' ' * indent}"
208
+ end
209
+
210
+ private
211
+
212
+ # It is crucial to canonicalize xml comment text because xml
213
+ # comment syntax forbids having a -- in the comment body. I
214
+ # picked emacs's "M-x comment-region" approach of putting a
215
+ # backslash between the two.
216
+ def canonicalize_comment(text)
217
+ new_text = text.gsub("--", "-\\-")
218
+ new_text
208
219
  end
209
220
 
210
221
  end
@@ -68,10 +68,12 @@ class TaskJuggler
68
68
 
69
69
  def processArguments(argv)
70
70
  super do
71
- @opts.banner += <<'EOT'
71
+ @opts.banner.prepend(<<'EOT'
72
72
  This is the main application. It reads in your project files, schedules the
73
73
  project and generates the reports.
74
+
74
75
  EOT
76
+ )
75
77
  @opts.on('--debuglevel N', Integer,
76
78
  format("Verbosity of debug output")) do |arg|
77
79
  TaskJuggler::Log.level = arg
@@ -100,7 +100,7 @@ class TaskJuggler
100
100
 
101
101
  def processArguments(argv)
102
102
  super do
103
- @opts.banner += <<'EOT'
103
+ prebanner = <<'EOT'
104
104
  The TaskJuggler client is used to send commands and data to the TaskJuggler
105
105
  daemon. The communication is done via TCP/IP.
106
106
 
@@ -125,9 +125,10 @@ EOT
125
125
  end
126
126
  end
127
127
  args = args.join(' ')
128
- @opts.banner += " #{cmd[:label] + ' ' + args + tail}" +
128
+ prebanner += " #{cmd[:label] + ' ' + args + tail}" +
129
129
  "\n\n#{' ' * 10 + format(cmd[:descr], 10)}\n"
130
130
  end
131
+ @opts.banner.prepend(prebanner)
131
132
  @opts.on('-p', '--port <NUMBER>', Integer,
132
133
  format('Use the specified TCP/IP port')) do |arg|
133
134
  @port = arg
@@ -37,16 +37,18 @@ class TaskJuggler
37
37
  @port = nil
38
38
  @webServer = false
39
39
  @webServerPort = 8080
40
- @webdPidFile = File.join(Dir.getwd, ".tj3webd-#{$$}.pid").untaint
40
+ @webdPidFile = File.join(Dir.getwd, ".tj3webd-#{$$}.pid")
41
41
  end
42
42
 
43
43
  def processArguments(argv)
44
44
  super do
45
- @opts.banner += <<'EOT'
45
+ @opts.banner.prepend(<<'EOT'
46
46
  The TaskJuggler daemon can be used to quickly generate reports for a number
47
47
  of scheduled projects that are resident in memory. Once the daemon has been
48
48
  started tj3client can be used to control it.
49
+
49
50
  EOT
51
+ )
50
52
  @opts.on('-d', '--dont-daemonize',
51
53
  format("Don't put program into daemon mode. Keep it " +
52
54
  'connected to the terminal and show debug output.')) do
@@ -90,7 +92,7 @@ EOT
90
92
  # Set some config variables if corresponding data was provided via the
91
93
  # command line.
92
94
  broker.port = @port if @port
93
- broker.uriFile = @uriFile.untaint
95
+ broker.uriFile = @uriFile
94
96
  broker.projectFiles = sortInputFiles(files) unless files.empty?
95
97
  broker.daemonize = @daemonize
96
98
  # Create log files for standard IO for each child process if the daemon
@@ -36,17 +36,19 @@ class TaskJuggler
36
36
 
37
37
  def processArguments(argv)
38
38
  super do
39
- @opts.banner += <<'EOT'
39
+ @opts.banner.prepend(<<'EOT'
40
40
  This program can be used to generate the user manual in HTML format or to get
41
41
  a textual help for individual keywords.
42
+
42
43
  EOT
44
+ )
43
45
  @opts.on('-d', '--dir <directory>', String,
44
46
  format('directory to put the manual')) do |dir|
45
47
  @directory = dir
46
48
  end
47
49
  @opts.on('--html',
48
50
  format('Show the user manual in your local web browser. ' +
49
- 'By default, Firefox is used or the brower specified ' +
51
+ 'By default, Firefox is used or the browser specified ' +
50
52
  'with the $BROWSER environment variable.')) do
51
53
  @showHtml = true
52
54
  end
@@ -27,13 +27,15 @@ class TaskJuggler
27
27
 
28
28
  def processArguments(argv)
29
29
  super do
30
- @opts.banner += <<'EOT'
30
+ @opts.banner.prepend(<<'EOT'
31
31
  This program can be used to receive filled-out status sheets via email.
32
32
  It reads the emails from STDIN and extracts the status sheet from the
33
33
  attached files. The status sheet is checked for correctness. Good status
34
34
  sheets are filed away. The sender be informed by email that the status
35
35
  sheets was accepted or rejected.
36
+
36
37
  EOT
38
+ )
37
39
  end
38
40
  end
39
41
 
@@ -38,11 +38,13 @@ class TaskJuggler
38
38
 
39
39
  def processArguments(argv)
40
40
  super do
41
- @opts.banner += <<'EOT'
41
+ @opts.banner.prepend(<<'EOT'
42
42
  This program can be used to out status sheets templates via email. It will
43
43
  generate status sheet templates for managers of the project. The project data
44
44
  will be accesses via tj3client from a running TaskJuggler server process.
45
+
45
46
  EOT
47
+ )
46
48
  @opts.on('-r', '--resource <ID>', String,
47
49
  format('Only generate template for given resource')) do |arg|
48
50
  @resourceList << arg
@@ -30,13 +30,15 @@ class TaskJuggler
30
30
 
31
31
  def processArguments(argv)
32
32
  super do
33
- @opts.banner += <<'EOT'
33
+ @opts.banner.prepend(<<'EOT'
34
34
  This program can be used to receive filled-out time sheets via email. It
35
35
  reads the emails from STDIN and extracts the time sheet from the attached
36
36
  files. The time sheet is checked for correctness. Good time sheets are filed
37
37
  away. The sender will be informed by email that the time sheets was accepted
38
38
  or rejected.
39
+
39
40
  EOT
41
+ )
40
42
  end
41
43
  end
42
44
 
@@ -37,11 +37,13 @@ class TaskJuggler
37
37
 
38
38
  def processArguments(argv)
39
39
  super do
40
- @opts.banner += <<'EOT'
40
+ @opts.banner.prepend(<<'EOT'
41
41
  This program can be used to send out time sheets templates via email. It will
42
42
  generate time sheet templates for all resources of the project. The project
43
43
  data will be accesses via tj3client from a running TaskJuggler server process.
44
+
44
45
  EOT
46
+ )
45
47
  @opts.on('-r', '--resource <ID>', String,
46
48
  format('Only generate template for given resource')) do |arg|
47
49
  @resourceList << arg
@@ -36,12 +36,14 @@ class TaskJuggler
36
36
 
37
37
  def processArguments(argv)
38
38
  super do
39
- @opts.banner += <<'EOT'
39
+ @opts.banner.prepend(<<'EOT'
40
40
  This program can be used to send out individual copies and a summary of all
41
41
  accepted time sheets a list of email addresses. The directory structures for
42
42
  templates and submitted time sheets must be present. The project data will be
43
43
  accesses via tj3client from a running TaskJuggler server process.
44
+
44
45
  EOT
46
+ )
45
47
  @opts.on('-r', '--resource <ID>', String,
46
48
  format('Only generate summary for given resource')) do |arg|
47
49
  @resourceList << arg
@@ -40,11 +40,13 @@ class TaskJuggler
40
40
 
41
41
  def processArguments(argv)
42
42
  super do
43
- @opts.banner += <<'EOT'
43
+ @opts.banner.prepend(<<'EOT'
44
44
  The TaskJuggler web server can be used to serve the HTTP reports of
45
45
  TaskJuggler projects to be viewed by any HTML5 compliant web browser. It uses
46
46
  the TaskJuggler daemon (tj3d) for data hosting and report generation.
47
+
47
48
  EOT
49
+ )
48
50
  @opts.on('-d', '--dont-daemonize',
49
51
  format("Don't put program into daemon mode. Keep it " +
50
52
  'connected to the terminal and show debug output.')) do
@@ -87,7 +89,7 @@ EOT
87
89
  # Set some config variables if corresponding data was provided via the
88
90
  # command line.
89
91
  webServer.port = @port if @port
90
- webServer.uriFile = @uriFile.untaint
92
+ webServer.uriFile = @uriFile
91
93
  webServer.webServerPort = @webServerPort if @webServerPort
92
94
  webServer.daemonize = @daemonize
93
95
  webServer.pidFile = @pidFile
@@ -137,9 +137,9 @@ class TaskJuggler
137
137
  # directory. The second one is the master project file (.tjp file).
138
138
  # Additionally a list of optional .tji files can be provided.
139
139
  def loadProject(args)
140
- dirAndFiles = args.dup.untaint
140
+ dirAndFiles = args.dup
141
141
  # The first argument is the working directory
142
- Dir.chdir(args.shift.untaint)
142
+ Dir.chdir(args.shift)
143
143
 
144
144
  # Save a time stamp of when the project file loading started.
145
145
  @modifiedCheck = TjTime.new
@@ -37,7 +37,7 @@ class Object
37
37
  # We can't clone frozen objects. So just return a reference to them.
38
38
  # Built-in classed can't be cloned either. The check below is probably
39
39
  # cheaper than the frequent (hiddent) exceptions from those objects.
40
- return self if frozen? || nil? || is_a?(Fixnum) || is_a?(Float) ||
40
+ return self if frozen? || nil? || is_a?(Integer) || is_a?(Float) ||
41
41
  is_a?(TrueClass) || is_a?(FalseClass) || is_a?(Symbol)
42
42
 
43
43
  # In case we have loops in our graph, we return references, not
@@ -157,7 +157,7 @@ class TaskJuggler
157
157
  end
158
158
  when :fieldEnd
159
159
  # We've completed processing a field. Add the field to the list of
160
- # fields. Convert Fixnums and Floats in native types.
160
+ # fields. Convert Integers and Floats in native types.
161
161
  fields << unMarshal(field, quoted)
162
162
 
163
163
  if c == "\n"
@@ -198,7 +198,7 @@ class TaskJuggler
198
198
  if str.nil?
199
199
  nil
200
200
  elsif /^[-+]?\d+$/ =~ str
201
- # field is a Fixnum
201
+ # field is an Integer
202
202
  str.to_i
203
203
  elsif /^[-+]?\d*\.?\d+([eE][-+]?\d+)?$/ =~ str
204
204
  # field is a Float
@@ -216,12 +216,12 @@ class TaskJuggler
216
216
  def marshal(field)
217
217
  if field.nil?
218
218
  ''
219
- elsif field.is_a?(Fixnum) || field.is_a?(Float) || field.is_a?(Bignum)
219
+ elsif field.is_a?(Integer) || field.is_a?(Float)
220
220
  # Numbers don't have to be quoted.
221
221
  field.to_s
222
222
  else
223
223
  # Duplicate quote characters.
224
- f = field.gsub(/@quote/, "#{@quote * 2}")
224
+ f = field.gsub(Regexp.new(@quote), "#{@quote * 2}")
225
225
  # Enclose the field in quote characters
226
226
  @quote + f.to_s + @quote
227
227
  end
@@ -163,7 +163,7 @@ class TaskJuggler
163
163
 
164
164
  @yMinDate = cell if @yMinDate.nil? || cell < @yMinDate
165
165
  @yMaxDate = cell if @yMaxDate.nil? || cell > @yMaxDate
166
- elsif cell.is_a?(Fixnum) || cell.is_a?(Float)
166
+ elsif cell.is_a?(Integer) || cell.is_a?(Float)
167
167
  if @dataType && @dataType != :number
168
168
  error("Column #{colIdx} contains non-number (#{cell}). " +
169
169
  "The columns will be ignored.")
@@ -35,7 +35,7 @@ class TaskJuggler
35
35
  include HTMLGraphics
36
36
 
37
37
  attr_reader :start, :end, :now, :weekStartsMonday, :header, :width,
38
- :scale, :scales, :table
38
+ :scale, :scales, :table, :markdate
39
39
  attr_writer :viewWidth
40
40
 
41
41
  # Create the GanttChart object, but don't do much right now. We still need
@@ -43,13 +43,14 @@ class TaskJuggler
43
43
  # is the date that should be used as current date. _weekStartsMonday_ is
44
44
  # true if the weeks should start on Mondays instead of Sundays. _table_ is a
45
45
  # reference to the TableReport that the chart is part of.
46
- def initialize(now, weekStartsMonday, columnDef, table = nil)
46
+ def initialize(now, weekStartsMonday, columnDef, table = nil, markdate = nil)
47
47
  # The start and end dates of the reported interval.
48
48
  @start = nil
49
49
  @end = nil
50
50
  @now = now
51
51
  @columnDef = columnDef
52
52
  @table = table
53
+ @markdate = markdate
53
54
 
54
55
  # This defines the possible horizontal scales that the Gantt chart can
55
56
  # have. The scales differ in their resolution and the amount of detail
@@ -256,6 +257,11 @@ class TaskJuggler
256
257
  # Also protect the current date line from other vertical lines.
257
258
  @router.addZone(@header.nowLineX - 1, 0, 3, @height - 1, false, true)
258
259
 
260
+ # Protect the date set in custom reference line from other vertical lines.
261
+ if @header.markdateLineX
262
+ @router.addZone(@header.markdateLineX - 1, 0, 3, @height - 1, false, true)
263
+ end
264
+
259
265
  # Generate the dependency arrows for all visible tasks.
260
266
  @tasks.each do |task, lines|
261
267
  generateDepLines(task, lines)
@@ -21,7 +21,7 @@ class TaskJuggler
21
21
  # holds the small scale (e. g. week or day).
22
22
  class GanttHeader
23
23
 
24
- attr_reader :gridLines, :nowLineX, :cellStartDates
24
+ attr_reader :gridLines, :nowLineX, :cellStartDates, :markdateLineX
25
25
  attr_accessor :height
26
26
 
27
27
  # Create a GanttHeader object and generate the scales for the header.
@@ -39,6 +39,10 @@ class TaskJuggler
39
39
  # X coordinate of the "now" line. nil if "now" is off-chart.
40
40
  @nowLineX = nil
41
41
 
42
+ # X coordinate of the custom "markdate" line with date specified by user.
43
+ # nil if "markdate" is off-chart.
44
+ @markdateLineX = nil
45
+
42
46
  # The x coordinates and width of the cells created by the small scale. The
43
47
  # values are stored as [ x, w ].
44
48
  @cellStartDates = []
@@ -103,6 +107,12 @@ class TaskJuggler
103
107
 
104
108
  nlx = @chart.dateToX(@chart.now)
105
109
  @nowLineX = nlx if nlx
110
+
111
+ if @chart.markdate
112
+ flx = @chart.dateToX(@chart.markdate)
113
+ @markdateLineX = flx if flx
114
+ end
115
+
106
116
  end
107
117
 
108
118
  # Generate the actual scale cells.
@@ -49,6 +49,7 @@ class TaskJuggler
49
49
  @y = y + chart.header.height + 1
50
50
  # The height of the line in screen pixels.
51
51
  @height = height
52
+
52
53
  # The index of the line in the chart. It starts with 0 and is
53
54
  # incremented for each line by one.
54
55
  @lineIndex = lineIndex
@@ -95,6 +96,11 @@ class TaskJuggler
95
96
  div << rectToHTML(@chart.header.nowLineX, 0, 1, @height, 'nowline')
96
97
  end
97
98
 
99
+ # Render the 'markdate' line
100
+ if @chart.header.markdateLineX
101
+ div << rectToHTML(@chart.header.markdateLineX, 0, 1, @height, 'markdateline')
102
+ end
103
+
98
104
  div
99
105
  end
100
106
 
@@ -96,7 +96,7 @@ class TaskJuggler
96
96
 
97
97
  # Generate an additional VEVENT entry for all leaf tasks that aren't
98
98
  # milestones.
99
- if task.leaf? && !task['milestone', scenarioIdx]
99
+ if task.leaf? && !task['milestone', scenarioIdx] && @report.get('novevents') == [false]
100
100
  event = ICalendar::Event.new(
101
101
  @ical, "#{task['projectid', scenarioIdx]}-#{task.fullId}",
102
102
  task.name, task['start', scenarioIdx], task['end', scenarioIdx])
@@ -249,11 +249,15 @@ EOT
249
249
  t << XMLNamedText.new('1', 'Manual')
250
250
  t << XMLNamedText.new('0', 'Summary')
251
251
  t << XMLNamedText.new('0', 'Estimated')
252
- t << XMLNamedText.new('5', 'DurationFormat')
252
+ t << XMLNamedText.new('7', 'DurationFormat')
253
253
  if task['milestone', @scenarioIdx]
254
254
  t << XMLNamedText.new('1', 'Milestone')
255
255
  else
256
+ duration = task['end', @scenarioIdx] - task['start', @scenarioIdx]
257
+ t << XMLNamedText.new(durationToMsp(duration), 'Duration')
258
+ t << XMLNamedText.new(durationToMsp(duration), 'Work')
256
259
  t << XMLNamedText.new('0', 'Milestone')
260
+ t << XMLNamedText.new('1', 'EffortDriven')
257
261
  t << XMLNamedText.new(percentComplete.to_i.to_s,
258
262
  'PercentComplete')
259
263
  t << XMLNamedText.new(percentComplete.to_i.to_s,
@@ -394,8 +398,6 @@ EOT
394
398
  end
395
399
 
396
400
  def durationToMsp(duration)
397
- return '' if duration == 0
398
-
399
401
  hours = (duration / (60 * 60)).to_i
400
402
  minutes = ((duration - (hours * 60 * 60)) / 60).to_i
401
403
  seconds = (duration % 60).to_i
@@ -297,7 +297,7 @@ EOT
297
297
  if @name == '.'
298
298
  $stdout.write(@content.to_tjp)
299
299
  else
300
- fileName = absoluteFileName(@name)
300
+ fileName = @name
301
301
  fileName += a('definitions').include?('project') ? '.tjp' : '.tji'
302
302
  File.open(fileName, 'w') { |f| f.write(@content.to_tjp) }
303
303
  end
@@ -401,7 +401,7 @@ EOT
401
401
  # The directory needs to be in the same directory as the HTML report.
402
402
  auxDstDir = File.dirname(absoluteFileName(@name)) + '/'
403
403
  # Find the data directory that came with the TaskJuggler installation.
404
- auxSrcDir = AppConfig.dataDirs("data/#{dirName}")[0].untaint
404
+ auxSrcDir = AppConfig.dataDirs("data/#{dirName}")[0]
405
405
  # Raise an error if we haven't found the data directory
406
406
  if auxSrcDir.nil? || !File.exist?(auxSrcDir)
407
407
  dataDirError(dirName, AppConfig.dataSearchDirs("data/#{dirName}"))
@@ -419,13 +419,13 @@ EOT
419
419
  end
420
420
 
421
421
  def directoryUpToDate?(auxSrcDir, auxDstDir)
422
- return false unless File.exist?(auxDstDir.untaint)
422
+ return false unless File.exist?(auxDstDir)
423
423
 
424
424
  Dir.entries(auxSrcDir).each do |file|
425
425
  next if file == '.' || file == '..'
426
426
 
427
- srcFile = (auxSrcDir + '/' + file).untaint
428
- dstFile = (auxDstDir + '/' + file).untaint
427
+ srcFile = (auxSrcDir + '/' + file)
428
+ dstFile = (auxDstDir + '/' + file)
429
429
  return false if !File.exist?(dstFile) ||
430
430
  File.mtime(srcFile) > File.mtime(dstFile)
431
431
  end
@@ -473,7 +473,7 @@ EOT
473
473
  end
474
474
 
475
475
  def absoluteFileName(name)
476
- ((absoluteFileName?(name) ? '' : @project.outputDir) + name).untaint
476
+ (absoluteFileName?(name) ? '' : @project.outputDir) + name
477
477
  end
478
478
 
479
479
  end
@@ -60,7 +60,7 @@ class TaskJuggler
60
60
  @alignment = :center
61
61
  # Horizontal padding between frame and cell content
62
62
  @padding = 3
63
- # Whether or not to indent the cell. If not nil, it is a Fixnum
63
+ # Whether or not to indent the cell. If not nil, it is an Integer
64
64
  # indicating the indentation level.
65
65
  @indent = nil
66
66
  # The basename of the icon file
@@ -32,6 +32,7 @@ class TaskJuggler
32
32
  'activetasks' => [ 'Active Tasks', true, :right, true ],
33
33
  'annualleave' => [ 'Annual Leave', true, :right, true ],
34
34
  'annualleavebalance'=> [ 'Annual Leave Balance', false, :right, true ],
35
+ 'annualleavelist' => [ 'Annual Leave List', false, :left, true ],
35
36
  'alert' => [ 'Alert', true, :left, false ],
36
37
  'alertmessages' => [ 'Alert Messages', false, :left, false ],
37
38
  'alertsummaries' => [ 'Alert Summaries', false, :left, false ],
@@ -79,7 +80,7 @@ class TaskJuggler
79
80
  @@propertiesByType = {
80
81
  # Type Indent Align
81
82
  DateAttribute => [ false, :left ],
82
- FixnumAttribute => [ false, :right ],
83
+ IntegerAttribute => [ false, :right ],
83
84
  FloatAttribute => [ false, :right ],
84
85
  ResourceListAttribute => [ false, :left ],
85
86
  RichTextAttribute => [ false, :left ],
@@ -338,9 +339,9 @@ class TaskJuggler
338
339
  when 'chart'
339
340
  # For the 'chart' column we generate a GanttChart object. The sizes are
340
341
  # set so that the lines of the Gantt chart line up with the lines of the
341
- # table.
342
+ # table
342
343
  gantt = GanttChart.new(a('now'),
343
- a('weekStartsMonday'), columnDef, self)
344
+ a('weekStartsMonday'), columnDef, self, a('markdate'))
344
345
 
345
346
  gantt.generateByScale(rStart, rEnd, columnDef.scale)
346
347
  # The header consists of 2 lines separated by a 1 pixel boundary.
@@ -867,12 +868,6 @@ class TaskJuggler
867
868
  # the next cell.
868
869
  def genCalChartTaskCell(query, line, columnDef, t, sameTimeNextFunc)
869
870
  task = line.property
870
- # Find out if we have an enclosing resource scope.
871
- if line.scopeLine && line.scopeLine.property.is_a?(Resource)
872
- resource = line.scopeLine.property
873
- else
874
- resource = nil
875
- end
876
871
 
877
872
  # Get the interval of the task. In case a date is invalid due to a
878
873
  # scheduling problem, we use the full project interval.
@@ -1048,11 +1043,11 @@ class TaskJuggler
1048
1043
  'busy'
1049
1044
  elsif workLoad > 0.0 && freeLoad > 0.0
1050
1045
  'loaded'
1051
- elsif workLoad == 0.0 && freeLoad > 0.0
1052
- 'free'
1053
- else
1046
+ elsif workLoad == 0.0 && freeLoad == 0.0
1054
1047
  cell.tooltip = nil
1055
1048
  'offduty'
1049
+ else
1050
+ 'free'
1056
1051
  end
1057
1052
  end
1058
1053
  cell.category += line.subLineNo % 2 == 1 ? '1' : '2'
@@ -265,11 +265,7 @@ class TaskJuggler
265
265
  if isLeafTask
266
266
  a('scenarios').each do |scenarioIdx|
267
267
  generateAttribute(task, 'start', indent + 2, scenarioIdx)
268
- if task['milestone', scenarioIdx]
269
- if task['scheduled', scenarioIdx]
270
- generateAttributeText('milestone', indent + 2, scenarioIdx)
271
- end
272
- else
268
+ if !task['milestone', scenarioIdx]
273
269
  generateAttribute(task, 'end', indent + 2, scenarioIdx)
274
270
  generateAttributeText('scheduling ' +
275
271
  (task['forward', scenarioIdx] ?
@@ -76,8 +76,8 @@ class TaskJuggler
76
76
  a('openNodes'))
77
77
  taskList.sort!
78
78
 
79
- @fileName = ((@report.name[0] == '/' ? '' : @project.outputDir) +
80
- @report.name + '.csv').untaint
79
+ @fileName = (@report.name[0] == '/' ? '' : @project.outputDir) +
80
+ @report.name + '.csv'
81
81
 
82
82
  # Generate the table header.
83
83
  headers = [ 'Date' ] +
@@ -0,0 +1 @@
1
+ VERSION = '3.7.2'