taskjuggler 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/benchmarks/UTF-8-Strings.rb +58 -0
- data/data/css/tjmanual.css +52 -0
- data/data/css/tjreport.css +195 -0
- data/data/icons/details.png +0 -0
- data/data/icons/flag-green.png +0 -0
- data/data/icons/flag-red.png +0 -0
- data/data/icons/flag-yellow.png +0 -0
- data/data/icons/resource.png +0 -0
- data/data/icons/resourcegroup.png +0 -0
- data/data/icons/task.png +0 -0
- data/data/icons/taskgroup.png +0 -0
- data/data/icons/trend-down.png +0 -0
- data/data/icons/trend-flat.png +0 -0
- data/data/icons/trend-up.png +0 -0
- data/data/scripts/wz_tooltip.js +1301 -0
- data/doc/classes/AppConfig.html +298 -230
- data/doc/classes/Arguments.html +8 -8
- data/doc/classes/Object.html +7 -7
- data/doc/classes/String.html +89 -89
- data/doc/classes/TaskJuggler.html +396 -264
- data/doc/classes/TaskJuggler/Account.html +18 -18
- data/doc/classes/TaskJuggler/AccountAttribute.html +26 -26
- data/doc/classes/TaskJuggler/AccountScenario.html +12 -12
- data/doc/classes/TaskJuggler/Allocation.html +30 -30
- data/doc/classes/TaskJuggler/AllocationAttribute.html +26 -26
- data/doc/classes/TaskJuggler/AttributeBase.html +227 -115
- data/doc/classes/TaskJuggler/AttributeDefinition.html +6 -6
- data/doc/classes/TaskJuggler/BatchProcessor.html +117 -83
- data/doc/classes/TaskJuggler/Booking.html +18 -18
- data/doc/classes/TaskJuggler/BookingListAttribute.html +26 -26
- data/doc/classes/TaskJuggler/BooleanAttribute.html +26 -26
- data/doc/classes/TaskJuggler/CSVFile.html +24 -24
- data/doc/classes/TaskJuggler/CellSettingPattern.html +201 -0
- data/doc/classes/TaskJuggler/CellSettingPatternList.html +253 -0
- data/doc/classes/TaskJuggler/Charge.html +18 -18
- data/doc/classes/TaskJuggler/ChargeListAttribute.html +20 -20
- data/doc/classes/TaskJuggler/ChargeSet.html +37 -37
- data/doc/classes/TaskJuggler/ChargeSetListAttribute.html +26 -26
- data/doc/classes/TaskJuggler/ColumnListAttribute.html +20 -20
- data/doc/classes/TaskJuggler/ColumnTable.html +40 -40
- data/doc/classes/TaskJuggler/DateAttribute.html +54 -15
- data/doc/classes/TaskJuggler/DefinitionListAttribute.html +10 -10
- data/doc/classes/TaskJuggler/DependencyListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/DurationAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FixnumAttribute.html +20 -20
- data/doc/classes/TaskJuggler/FlagListAttribute.html +43 -43
- data/doc/classes/TaskJuggler/FloatAttribute.html +30 -30
- data/doc/classes/TaskJuggler/FormatListAttribute.html +21 -21
- data/doc/classes/TaskJuggler/GanttChart.html +48 -48
- data/doc/classes/TaskJuggler/GanttContainer.html +42 -42
- data/doc/classes/TaskJuggler/GanttHeader.html +12 -12
- data/doc/classes/TaskJuggler/GanttHeaderScaleItem.html +12 -12
- data/doc/classes/TaskJuggler/GanttLine.html +24 -24
- data/doc/classes/TaskJuggler/GanttLoadStack.html +18 -18
- data/doc/classes/TaskJuggler/GanttMilestone.html +42 -42
- data/doc/classes/TaskJuggler/GanttRouter.html +24 -24
- data/doc/classes/TaskJuggler/GanttTaskBar.html +42 -42
- data/doc/classes/TaskJuggler/HTMLDocument.html +13 -13
- data/doc/classes/TaskJuggler/HTMLGraphics.html +12 -12
- data/doc/classes/TaskJuggler/Interval.html +57 -57
- data/doc/classes/TaskJuggler/IntervalListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/JobInfo.html +68 -12
- data/doc/classes/TaskJuggler/Journal.html +266 -20
- data/doc/classes/TaskJuggler/JournalEntry.html +79 -23
- data/doc/classes/TaskJuggler/JournalEntryList.html +454 -0
- data/doc/classes/TaskJuggler/KeywordArray.html +10 -10
- data/doc/classes/TaskJuggler/KeywordDocumentation.html +171 -170
- data/doc/classes/TaskJuggler/Limits.html +36 -36
- data/doc/classes/TaskJuggler/Limits/Limit.html +30 -30
- data/doc/classes/TaskJuggler/LimitsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ListAttributeBase.html +20 -20
- data/doc/classes/TaskJuggler/Log.html +145 -107
- data/doc/classes/TaskJuggler/LogicalAttribute.html +65 -36
- data/doc/classes/TaskJuggler/LogicalExpression.html +61 -24
- data/doc/classes/TaskJuggler/LogicalExpressionAttribute.html +20 -20
- data/doc/classes/TaskJuggler/LogicalFlag.html +31 -51
- data/doc/classes/TaskJuggler/LogicalFunction.html +64 -53
- data/doc/classes/TaskJuggler/LogicalOperation.html +103 -55
- data/doc/classes/TaskJuggler/Macro.html +6 -6
- data/doc/classes/TaskJuggler/MacroParser.html +36 -36
- data/doc/classes/TaskJuggler/MacroTable.html +37 -37
- data/doc/classes/TaskJuggler/Message.html +12 -12
- data/doc/classes/TaskJuggler/MessageHandler.html +32 -20
- data/doc/classes/TaskJuggler/Navigator.html +110 -46
- data/doc/classes/TaskJuggler/NavigatorElement.html +449 -0
- data/doc/classes/TaskJuggler/OnShiftCache.html +24 -24
- data/doc/classes/TaskJuggler/Project.html +1158 -893
- data/doc/classes/TaskJuggler/ProjectFileParser.html +94 -91
- data/doc/classes/TaskJuggler/PropertyAttribute.html +20 -20
- data/doc/classes/TaskJuggler/PropertyList.html +225 -155
- data/doc/classes/TaskJuggler/PropertySet.html +375 -332
- data/doc/classes/TaskJuggler/PropertyTreeNode.html +750 -510
- data/doc/classes/TaskJuggler/Query.html +404 -139
- data/doc/classes/TaskJuggler/{RTPNavigator.html → RTFNavigator.html} +57 -56
- data/doc/classes/TaskJuggler/RTFQuery.html +343 -0
- data/doc/classes/TaskJuggler/{RTPReport.html → RTFReport.html} +70 -67
- data/doc/classes/TaskJuggler/RealFormat.html +18 -18
- data/doc/classes/TaskJuggler/RealFormatAttribute.html +10 -10
- data/doc/classes/TaskJuggler/ReferenceAttribute.html +107 -40
- data/doc/classes/TaskJuggler/RemoteServiceManager.html +335 -0
- data/doc/classes/TaskJuggler/Report.html +66 -64
- data/doc/classes/TaskJuggler/ReportBase.html +112 -123
- data/doc/classes/TaskJuggler/ReportContext.html +43 -38
- data/doc/classes/TaskJuggler/ReportServer.html +320 -0
- data/doc/classes/TaskJuggler/ReportTable.html +42 -42
- data/doc/classes/TaskJuggler/ReportTableCell.html +221 -129
- data/doc/classes/TaskJuggler/ReportTableColumn.html +27 -27
- data/doc/classes/TaskJuggler/ReportTableLegend.html +24 -24
- data/doc/classes/TaskJuggler/ReportTableLine.html +126 -80
- data/doc/classes/TaskJuggler/Resource.html +12 -12
- data/doc/classes/TaskJuggler/ResourceListAttribute.html +82 -47
- data/doc/classes/TaskJuggler/ResourceListRE.html +43 -39
- data/doc/classes/TaskJuggler/ResourceScenario.html +413 -321
- data/doc/classes/TaskJuggler/RichText.html +64 -248
- data/doc/classes/TaskJuggler/RichTextAttribute.html +94 -30
- data/doc/classes/TaskJuggler/RichTextDocument.html +87 -85
- data/doc/classes/TaskJuggler/RichTextElement.html +456 -363
- data/doc/classes/TaskJuggler/RichTextException.html +13 -13
- data/doc/classes/TaskJuggler/{RichTextProtocolExample.html → RichTextFunctionExample.html} +64 -63
- data/doc/classes/TaskJuggler/{RichTextProtocolHandler.html → RichTextFunctionHandler.html} +42 -36
- data/doc/classes/TaskJuggler/RichTextIntermediate.html +563 -0
- data/doc/classes/TaskJuggler/RichTextParser.html +54 -51
- data/doc/classes/TaskJuggler/RichTextScanner.html +94 -92
- data/doc/classes/TaskJuggler/RichTextSnip.html +96 -60
- data/doc/classes/TaskJuggler/RichTextSyntaxRules.html +369 -227
- data/doc/classes/TaskJuggler/Scenario.html +6 -6
- data/doc/classes/TaskJuggler/ScenarioData.html +37 -37
- data/doc/classes/TaskJuggler/ScenarioListAttribute.html +31 -31
- data/doc/classes/TaskJuggler/Scoreboard.html +66 -66
- data/doc/classes/TaskJuggler/Shift.html +18 -18
- data/doc/classes/TaskJuggler/ShiftAssignment.html +54 -54
- data/doc/classes/TaskJuggler/ShiftAssignments.html +78 -78
- data/doc/classes/TaskJuggler/ShiftAssignmentsAttribute.html +40 -40
- data/doc/classes/TaskJuggler/ShiftScenario.html +24 -24
- data/doc/classes/TaskJuggler/SortListAttribute.html +22 -22
- data/doc/classes/TaskJuggler/SourceFileInfo.html +12 -12
- data/doc/classes/TaskJuggler/StringAttribute.html +30 -30
- data/doc/classes/TaskJuggler/SymbolAttribute.html +20 -20
- data/doc/classes/TaskJuggler/SyntaxReference.html +42 -42
- data/doc/classes/TaskJuggler/TOCEntry.html +12 -12
- data/doc/classes/TaskJuggler/TSResourceRecord.html +197 -0
- data/doc/classes/TaskJuggler/TSTaskRecord.html +215 -0
- data/doc/classes/TaskJuggler/TableColumnDefinition.html +64 -43
- data/doc/classes/TaskJuggler/TableOfContents.html +18 -18
- data/doc/classes/TaskJuggler/TableReport.html +447 -468
- data/doc/classes/TaskJuggler/Task.html +12 -12
- data/doc/classes/TaskJuggler/TaskDependency.html +12 -12
- data/doc/classes/TaskJuggler/TaskListAttribute.html +47 -47
- data/doc/classes/TaskJuggler/TaskListRE.html +43 -39
- data/doc/classes/TaskJuggler/TaskScenario.html +529 -282
- data/doc/classes/TaskJuggler/TextParser.html +215 -194
- data/doc/classes/TaskJuggler/TextParser/Pattern.html +97 -97
- data/doc/classes/TaskJuggler/TextParser/Rule.html +84 -84
- data/doc/classes/TaskJuggler/TextParser/StackElement.html +16 -15
- data/doc/classes/TaskJuggler/TextParser/TextParserResultArray.html +12 -12
- data/doc/classes/TaskJuggler/TextParser/TokenDoc.html +6 -6
- data/doc/classes/TaskJuggler/TextReport.html +77 -74
- data/doc/classes/TaskJuggler/TextScanner.html +294 -281
- data/doc/classes/TaskJuggler/TextScanner/BufferStreamHandle.html +70 -70
- data/doc/classes/TaskJuggler/TextScanner/FileStreamHandle.html +59 -60
- data/doc/classes/TaskJuggler/TextScanner/StreamHandle.html +12 -12
- data/doc/classes/TaskJuggler/TimeSheetReport.html +406 -0
- data/doc/classes/TaskJuggler/TjException.html +6 -6
- data/doc/classes/TaskJuggler/TjTime.html +522 -513
- data/doc/classes/TaskJuggler/TjpExample.html +25 -25
- data/doc/classes/TaskJuggler/TjpExportRE.html +21 -24
- data/doc/classes/TaskJuggler/TjpSyntaxRules.html +6177 -4318
- data/doc/classes/TaskJuggler/UserManual.html +212 -213
- data/doc/classes/TaskJuggler/WorkingHours.html +49 -49
- data/doc/classes/TaskJuggler/WorkingHoursAttribute.html +53 -53
- data/doc/classes/TaskJuggler/XMLBlob.html +21 -21
- data/doc/classes/TaskJuggler/XMLComment.html +21 -21
- data/doc/classes/TaskJuggler/XMLDocument.html +27 -26
- data/doc/classes/TaskJuggler/XMLElement.html +86 -50
- data/doc/classes/TaskJuggler/XMLNamedText.html +11 -11
- data/doc/classes/TaskJuggler/XMLText.html +36 -36
- data/doc/files/COPYING.html +1 -1
- data/doc/files/README.html +1 -1
- data/doc/files/lib/AccountScenario_rb.html +3 -2
- data/doc/files/lib/Account_rb.html +3 -2
- data/doc/files/lib/Allocation_rb.html +3 -2
- data/doc/files/lib/AppConfig_rb.html +5 -2
- data/doc/files/lib/AttributeBase_rb.html +3 -2
- data/doc/files/lib/AttributeDefinition_rb.html +3 -2
- data/doc/files/lib/Attributes_rb.html +3 -2
- data/doc/files/lib/BatchProcessor_rb.html +4 -3
- data/doc/files/lib/Booking_rb.html +3 -2
- data/doc/files/lib/ChargeSet_rb.html +3 -2
- data/doc/files/lib/Charge_rb.html +3 -2
- data/doc/files/lib/HTMLDocument_rb.html +3 -2
- data/doc/files/lib/Interval_rb.html +3 -2
- data/doc/files/lib/Journal_rb.html +4 -3
- data/doc/files/lib/KeywordArray_rb.html +3 -2
- data/doc/files/lib/KeywordDocumentation_rb.html +3 -2
- data/doc/files/lib/Limits_rb.html +3 -2
- data/doc/files/lib/Log_rb.html +3 -2
- data/doc/files/lib/LogicalExpression_rb.html +3 -2
- data/doc/files/lib/LogicalFunction_rb.html +3 -2
- data/doc/files/lib/LogicalOperation_rb.html +3 -2
- data/doc/files/lib/MacroParser_rb.html +3 -2
- data/doc/files/lib/MacroTable_rb.html +3 -2
- data/doc/files/lib/MessageHandler_rb.html +3 -2
- data/doc/files/lib/Message_rb.html +3 -2
- data/doc/files/lib/ProjectFileParser_rb.html +7 -4
- data/doc/files/lib/Project_rb.html +3 -2
- data/doc/files/lib/PropertyList_rb.html +3 -2
- data/doc/files/lib/PropertySet_rb.html +3 -2
- data/doc/files/lib/PropertyTreeNode_rb.html +3 -2
- data/doc/files/lib/Query_rb.html +3 -2
- data/doc/files/lib/{RTPNavigator_rb.html → RTFNavigator_rb.html} +8 -7
- data/doc/files/lib/RTFQuery_rb.html +121 -0
- data/doc/files/lib/{RTPReport_rb.html → RTFReport_rb.html} +8 -7
- data/doc/files/lib/RealFormat_rb.html +3 -2
- data/doc/files/lib/RemoteServiceManager_rb.html +117 -0
- data/doc/files/lib/ReportServer_rb.html +107 -0
- data/doc/files/lib/ResourceScenario_rb.html +3 -2
- data/doc/files/lib/Resource_rb.html +3 -2
- data/doc/files/lib/RichTextDocument_rb.html +4 -3
- data/doc/files/lib/RichTextElement_rb.html +3 -2
- data/doc/files/lib/{RichTextProtocolExample_rb.html → RichTextFunctionExample_rb.html} +8 -7
- data/doc/files/lib/{RichTextProtocolHandler_rb.html → RichTextFunctionHandler_rb.html} +7 -6
- data/doc/files/lib/RichTextParser_rb.html +3 -2
- data/doc/files/lib/RichTextScanner_rb.html +3 -2
- data/doc/files/lib/RichTextSnip_rb.html +3 -2
- data/doc/files/lib/RichTextSyntaxRules_rb.html +3 -2
- data/doc/files/lib/RichText_rb.html +3 -2
- data/doc/files/lib/ScenarioData_rb.html +3 -2
- data/doc/files/lib/Scenario_rb.html +3 -2
- data/doc/files/lib/Scoreboard_rb.html +3 -2
- data/doc/files/lib/ShiftAssignments_rb.html +3 -2
- data/doc/files/lib/ShiftScenario_rb.html +3 -2
- data/doc/files/lib/Shift_rb.html +3 -2
- data/doc/files/lib/SourceFileInfo_rb.html +3 -2
- data/doc/files/lib/SyntaxReference_rb.html +3 -2
- data/doc/files/lib/TOCEntry_rb.html +3 -2
- data/doc/files/lib/TableColumnDefinition_rb.html +3 -2
- data/doc/files/lib/TableOfContents_rb.html +3 -2
- data/doc/files/lib/TaskDependency_rb.html +3 -2
- data/doc/files/lib/TaskJuggler_rb.html +7 -2
- data/doc/files/lib/TaskScenario_rb.html +3 -2
- data/doc/files/lib/Task_rb.html +3 -2
- data/doc/files/lib/TextParser/Pattern_rb.html +4 -3
- data/doc/files/lib/TextParser/Rule_rb.html +4 -3
- data/doc/files/lib/TextParser/StackElement_rb.html +4 -3
- data/doc/files/lib/TextParser/TokenDoc_rb.html +4 -3
- data/doc/files/lib/TextParser_rb.html +3 -2
- data/doc/files/lib/TextScanner_rb.html +3 -2
- data/doc/files/lib/Tj3Config_rb.html +3 -2
- data/doc/files/lib/TjException_rb.html +3 -2
- data/doc/files/lib/TjTime_rb.html +3 -2
- data/doc/files/lib/TjpExample_rb.html +3 -2
- data/doc/files/lib/TjpSyntaxRules_rb.html +3 -2
- data/doc/files/lib/UTF8String_rb.html +14 -6
- data/doc/files/lib/UserManual_rb.html +6 -3
- data/doc/files/lib/WorkingHours_rb.html +3 -2
- data/doc/files/lib/XMLDocument_rb.html +3 -2
- data/doc/files/lib/XMLElement_rb.html +3 -2
- data/doc/files/lib/deep_copy_rb.html +3 -2
- data/doc/files/lib/reports/CSVFile_rb.html +3 -2
- data/doc/files/lib/reports/ColumnTable_rb.html +3 -2
- data/doc/files/lib/reports/GanttChart_rb.html +3 -2
- data/doc/files/lib/reports/GanttContainer_rb.html +3 -2
- data/doc/files/lib/reports/GanttHeaderScaleItem_rb.html +3 -2
- data/doc/files/lib/reports/GanttHeader_rb.html +3 -2
- data/doc/files/lib/reports/GanttLine_rb.html +3 -2
- data/doc/files/lib/reports/GanttLoadStack_rb.html +3 -2
- data/doc/files/lib/reports/GanttMilestone_rb.html +3 -2
- data/doc/files/lib/reports/GanttRouter_rb.html +3 -2
- data/doc/files/lib/reports/GanttTaskBar_rb.html +3 -2
- data/doc/files/lib/reports/HTMLGraphics_rb.html +3 -2
- data/doc/files/lib/reports/Navigator_rb.html +3 -2
- data/doc/files/lib/reports/ReportBase_rb.html +3 -2
- data/doc/files/lib/reports/ReportContext_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableCell_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableColumn_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableLegend_rb.html +3 -2
- data/doc/files/lib/reports/ReportTableLine_rb.html +3 -2
- data/doc/files/lib/reports/ReportTable_rb.html +3 -2
- data/doc/files/lib/reports/Report_rb.html +7 -2
- data/doc/files/lib/reports/ResourceListRE_rb.html +3 -2
- data/doc/files/lib/reports/TableReport_rb.html +3 -2
- data/doc/files/lib/reports/TaskListRE_rb.html +3 -2
- data/doc/files/lib/reports/TextReport_rb.html +4 -3
- data/doc/files/lib/reports/TimeSheetReport_rb.html +117 -0
- data/doc/files/lib/reports/TjpExportRE_rb.html +3 -2
- data/doc/files/lib/taskjuggler3_rb.html +94 -77
- data/doc/files/lib/tj3client_rb.html +280 -0
- data/doc/files/lib/tj3man_rb.html +10 -9
- data/doc/fr_class_index.html +27 -5
- data/doc/fr_file_index.html +15 -7
- data/doc/fr_method_index.html +1312 -1020
- data/examples/tutorial.tjp +113 -14
- data/gem_spec.rb +2 -1
- data/lib/Account.rb +1 -1
- data/lib/AccountScenario.rb +1 -1
- data/lib/Allocation.rb +1 -1
- data/lib/AppConfig.rb +23 -10
- data/lib/AttributeBase.rb +34 -6
- data/lib/AttributeDefinition.rb +1 -1
- data/lib/Attributes.rb +51 -16
- data/lib/BatchProcessor.rb +204 -77
- data/lib/Booking.rb +1 -1
- data/lib/Charge.rb +1 -1
- data/lib/ChargeSet.rb +1 -1
- data/lib/HTMLDocument.rb +2 -2
- data/lib/Interval.rb +1 -1
- data/lib/Journal.rb +231 -9
- data/lib/KeywordArray.rb +1 -1
- data/lib/KeywordDocumentation.rb +6 -4
- data/lib/Limits.rb +1 -1
- data/lib/Log.rb +8 -1
- data/lib/LogicalExpression.rb +14 -13
- data/lib/LogicalFunction.rb +88 -14
- data/lib/LogicalOperation.rb +124 -53
- data/lib/MacroParser.rb +1 -1
- data/lib/MacroTable.rb +2 -2
- data/lib/Message.rb +1 -1
- data/lib/MessageHandler.rb +7 -3
- data/lib/Project.rb +93 -14
- data/lib/ProjectFileParser.rb +30 -15
- data/lib/PropertyList.rb +103 -36
- data/lib/PropertySet.rb +22 -10
- data/lib/PropertyTreeNode.rb +120 -15
- data/lib/Query.rb +119 -48
- data/lib/{RTPNavigator.rb → RTFNavigator.rb} +11 -10
- data/lib/RTFQuery.rb +166 -0
- data/lib/{RTPReport.rb → RTFReport.rb} +11 -8
- data/lib/RealFormat.rb +1 -1
- data/lib/RemoteServiceManager.rb +80 -0
- data/lib/ReportServer.rb +66 -0
- data/lib/Resource.rb +1 -1
- data/lib/ResourceScenario.rb +48 -19
- data/lib/RichText.rb +98 -41
- data/lib/RichTextDocument.rb +10 -8
- data/lib/RichTextElement.rb +72 -28
- data/lib/{RichTextProtocolExample.rb → RichTextFunctionExample.rb} +8 -7
- data/lib/{RichTextProtocolHandler.rb → RichTextFunctionHandler.rb} +12 -14
- data/lib/RichTextParser.rb +6 -3
- data/lib/RichTextScanner.rb +91 -19
- data/lib/RichTextSnip.rb +8 -3
- data/lib/RichTextSyntaxRules.rb +103 -45
- data/lib/Scenario.rb +1 -1
- data/lib/ScenarioData.rb +2 -2
- data/lib/Scoreboard.rb +1 -1
- data/lib/Shift.rb +1 -1
- data/lib/ShiftAssignments.rb +1 -1
- data/lib/ShiftScenario.rb +1 -1
- data/lib/SourceFileInfo.rb +1 -1
- data/lib/SyntaxReference.rb +2 -2
- data/lib/TOCEntry.rb +1 -1
- data/lib/TableColumnDefinition.rb +59 -16
- data/lib/TableOfContents.rb +1 -1
- data/lib/Task.rb +1 -1
- data/lib/TaskDependency.rb +1 -1
- data/lib/TaskJuggler.rb +31 -8
- data/lib/TaskScenario.rb +165 -16
- data/lib/TextParser.rb +36 -22
- data/lib/TextParser/Pattern.rb +3 -3
- data/lib/TextParser/Rule.rb +2 -2
- data/lib/TextParser/StackElement.rb +4 -3
- data/lib/TextParser/TokenDoc.rb +2 -2
- data/lib/TextScanner.rb +52 -37
- data/lib/Tj3Config.rb +6 -5
- data/lib/TjException.rb +1 -1
- data/lib/TjTime.rb +12 -3
- data/lib/TjpExample.rb +1 -1
- data/lib/TjpSyntaxRules.rb +1044 -150
- data/lib/UTF8String.rb +2 -1
- data/lib/UserManual.rb +18 -70
- data/lib/WorkingHours.rb +3 -3
- data/lib/XMLDocument.rb +3 -2
- data/lib/XMLElement.rb +6 -1
- data/lib/deep_copy.rb +1 -1
- data/lib/reports/CSVFile.rb +1 -1
- data/lib/reports/ColumnTable.rb +9 -9
- data/lib/reports/GanttChart.rb +1 -1
- data/lib/reports/GanttContainer.rb +1 -1
- data/lib/reports/GanttHeader.rb +1 -1
- data/lib/reports/GanttHeaderScaleItem.rb +1 -1
- data/lib/reports/GanttLine.rb +40 -40
- data/lib/reports/GanttLoadStack.rb +1 -1
- data/lib/reports/GanttMilestone.rb +1 -1
- data/lib/reports/GanttRouter.rb +1 -1
- data/lib/reports/GanttTaskBar.rb +1 -1
- data/lib/reports/HTMLGraphics.rb +1 -1
- data/lib/reports/Navigator.rb +149 -22
- data/lib/reports/Report.rb +115 -172
- data/lib/reports/ReportBase.rb +22 -27
- data/lib/reports/ReportContext.rb +29 -15
- data/lib/reports/ReportTable.rb +1 -1
- data/lib/reports/ReportTableCell.rb +120 -27
- data/lib/reports/ReportTableColumn.rb +3 -3
- data/lib/reports/ReportTableLegend.rb +1 -1
- data/lib/reports/ReportTableLine.rb +10 -2
- data/lib/reports/ResourceListRE.rb +5 -1
- data/lib/reports/TableReport.rb +237 -287
- data/lib/reports/TaskListRE.rb +5 -1
- data/lib/reports/TextReport.rb +7 -4
- data/lib/reports/TimeSheetReport.rb +233 -0
- data/lib/reports/TjpExportRE.rb +2 -2
- data/lib/taskjuggler3.rb +27 -11
- data/lib/tj3client.rb +110 -0
- data/lib/tj3man.rb +4 -4
- data/manual/Getting_Started +0 -50
- data/manual/How_To_Contribute +6 -13
- data/manual/Installation +102 -28
- data/manual/Intro +11 -1
- data/manual/Reporting_Bugs +23 -7
- data/manual/Rich_Text_Attributes +59 -6
- data/manual/TaskJuggler_2x_Migration +27 -0
- data/manual/The_TaskJuggler_Syntax +104 -0
- data/manual/Tutorial +10 -9
- data/prj_cfg.rb +8 -2
- data/tasks/csts.rake +1 -1
- data/tasks/manual.rake +5 -3
- data/test/MessageChecker.rb +1 -1
- data/test/TestSuite/HTML-Reports/Alerts.html +172 -0
- data/test/TestSuite/HTML-Reports/Alerts.tjp +77 -0
- data/test/TestSuite/HTML-Reports/CellText.html +758 -0
- data/test/TestSuite/HTML-Reports/CellText.tjp +75 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.html +156 -0
- data/test/TestSuite/HTML-Reports/ColumnPeriods.tjp +44 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.html +172 -0
- data/test/TestSuite/HTML-Reports/IsOngoing.tjp +34 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.html +80 -0
- data/test/TestSuite/HTML-Reports/LogicalFunctions.tjp +20 -0
- data/test/TestSuite/HTML-Reports/Query.html +31 -0
- data/test/TestSuite/HTML-Reports/Query.tjp +28 -0
- data/test/TestSuite/HTML-Reports/Sorting.tjp +68 -0
- data/test/TestSuite/HTML-Reports/TimeSheet.tjp +69 -0
- data/test/TestSuite/HTML-Reports/UDAQuery.tjp +27 -0
- data/test/TestSuite/HTML-Reports/css/tjmanual.css +52 -0
- data/test/TestSuite/HTML-Reports/css/tjreport.css +195 -0
- data/test/TestSuite/HTML-Reports/depArrows.html +842 -0
- data/test/TestSuite/HTML-Reports/icons/details.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-green.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-red.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/flag-yellow.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resource.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/resourcegroup.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/task.png +0 -0
- data/test/TestSuite/HTML-Reports/icons/taskgroup.png +0 -0
- data/test/TestSuite/HTML-Reports/reference.tjp +7 -8
- data/test/TestSuite/HTML-Reports/scripts/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Scheduler/Correct/Mandatory.tjp +34 -0
- data/test/TestSuite/Syntax/Correct/Celltext.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/Journal.tjp +2 -2
- data/test/TestSuite/Syntax/Correct/LogicalExpression.tjp +2 -1
- data/test/TestSuite/Syntax/Correct/LogicalFunction.tjp +20 -0
- data/test/TestSuite/Syntax/Correct/Query.tjp +18 -0
- data/test/TestSuite/Syntax/Correct/StatusSheet.tjp +45 -0
- data/test/TestSuite/Syntax/Correct/TimeSheet.tjp +49 -0
- data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
- data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
- data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +1301 -0
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +113 -14
- data/test/TestSuite/Syntax/Errors/macro_stack_overflow.tjp +28 -0
- data/test/TestSuite/Syntax/Errors/unsupported_token.tjp +12 -0
- data/test/all.rb +2 -2
- data/test/test_BatchProcessor.rb +42 -13
- data/test/test_CSV-Reports.rb +1 -1
- data/test/test_Journal.rb +176 -0
- data/test/test_Limits.rb +1 -1
- data/test/test_LogicalExpression.rb +14 -5
- data/test/test_MacroTable.rb +1 -1
- data/test/test_Project.rb +1 -1
- data/test/test_PropertySet.rb +1 -1
- data/test/test_Query.rb +1 -1
- data/test/test_RealFormat.rb +1 -1
- data/test/test_RichText.rb +30 -20
- data/test/test_Scheduler.rb +1 -1
- data/test/test_ShiftAssignments.rb +2 -2
- data/test/test_Syntax.rb +1 -1
- data/test/test_TextScanner.rb +1 -1
- data/test/test_TjTime.rb +1 -1
- data/test/test_TjpExample.rb +1 -1
- data/test/test_UTF8String.rb +1 -1
- data/test/test_WorkingHours.rb +1 -1
- data/test/test_deep_copy.rb +2 -2
- metadata +610 -532
- data/doc/files/lib/ms_test_rb.html +0 -90
- data/examples/ContactList.html +0 -1467
- data/examples/Deliveries.html +0 -485
- data/examples/Development.html +0 -2525
- data/examples/Overview.html +0 -747
- data/examples/Resource Graph.html +0 -616
- data/lib/ms_test.rb +0 -27
- data/test/TestSuite/HTML-Reports/reference-export.html +0 -187
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = ResourceListRE.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
7
7
|
#
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
@@ -30,6 +30,8 @@ class TaskJuggler
|
|
30
30
|
|
31
31
|
# Generate the table in the intermediate format.
|
32
32
|
def generateIntermediateFormat
|
33
|
+
super
|
34
|
+
|
33
35
|
setReportPeriod
|
34
36
|
|
35
37
|
# Prepare the resource list.
|
@@ -38,6 +40,7 @@ class TaskJuggler
|
|
38
40
|
resourceList = filterResourceList(resourceList, nil,
|
39
41
|
@report.get('hideResource'),
|
40
42
|
@report.get('rollupResource'))
|
43
|
+
resourceList.query = @report.project.reportContext.query
|
41
44
|
resourceList.sort!
|
42
45
|
|
43
46
|
# Prepare the task list.
|
@@ -45,6 +48,7 @@ class TaskJuggler
|
|
45
48
|
taskList.setSorting(@report.get('sortTasks'))
|
46
49
|
taskList = filterTaskList(taskList, nil, @report.get('hideTask'),
|
47
50
|
@report.get('rollupTask'))
|
51
|
+
taskList.query = @report.project.reportContext.query
|
48
52
|
taskList.sort!
|
49
53
|
|
50
54
|
adjustReportPeriod(taskList, @report.get('scenarios'),
|
data/lib/reports/TableReport.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# = TableReport.rb -- The TaskJuggler III Project Management Software
|
5
5
|
#
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009 by Chris Schlaeger <cs@kde.org>
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010 by Chris Schlaeger <cs@kde.org>
|
7
7
|
#
|
8
8
|
# This program is free software; you can redistribute it and/or modify
|
9
9
|
# it under the terms of version 2 of the GNU General Public License as
|
@@ -26,20 +26,30 @@ class TaskJuggler
|
|
26
26
|
attr_reader :legend
|
27
27
|
|
28
28
|
@@propertiesById = {
|
29
|
-
# ID
|
30
|
-
'
|
31
|
-
'
|
32
|
-
'
|
33
|
-
'
|
34
|
-
'
|
35
|
-
'
|
36
|
-
'
|
37
|
-
'
|
38
|
-
'
|
39
|
-
'
|
40
|
-
'
|
41
|
-
'
|
42
|
-
'
|
29
|
+
# ID Header Indent Align Scen Spec.
|
30
|
+
'alert' => [ 'Alert', true, :left, false ],
|
31
|
+
'alertmessage' => [ 'Alert Message', false, :left, false ],
|
32
|
+
'alertsummary' => [ 'Alert Summary', false, :left, false ],
|
33
|
+
'alerttrend' => [ 'Alert Trend', false, :left, false ],
|
34
|
+
'complete' => [ 'Completion', false, :right, true ],
|
35
|
+
'cost' => [ 'Cost', true, :right, true ],
|
36
|
+
'duration' => [ 'Duration', true, :right, true ],
|
37
|
+
'effort' => [ 'Effort', true, :right, true ],
|
38
|
+
'effortdone' => [ 'Effort Done', true, :right, true ],
|
39
|
+
'effortleft' => [ 'Effort Left', true, :right, true ],
|
40
|
+
'freetime' => [ 'Free Time', true, :right, true ],
|
41
|
+
'id' => [ 'Id', false, :left, false ],
|
42
|
+
'line' => [ 'Line No.', false, :right, false ],
|
43
|
+
'name' => [ 'Name', true, :left, false ],
|
44
|
+
'no' => [ 'No.', false, :right, false ],
|
45
|
+
'rate' => [ 'Rate', true, :right, true ],
|
46
|
+
'resources' => [ 'Resources', false, :left, true ],
|
47
|
+
'responsible' => [ 'Responsible', false, :left, true ],
|
48
|
+
'revenue' => [ 'Revenue', true, :right, true ],
|
49
|
+
'scenario' => [ 'Scenario', false, :left, true ],
|
50
|
+
'status' => [ 'Status', false, :left, true ],
|
51
|
+
'targets' => [ 'Targets', false, :left, true ],
|
52
|
+
'wbs' => [ 'WBS', false, :left, false ]
|
43
53
|
}
|
44
54
|
@@propertiesByType = {
|
45
55
|
# Type Indent Align
|
@@ -62,6 +72,11 @@ class TaskJuggler
|
|
62
72
|
|
63
73
|
end
|
64
74
|
|
75
|
+
def generateIntermediateFormat
|
76
|
+
super
|
77
|
+
end
|
78
|
+
|
79
|
+
|
65
80
|
|
66
81
|
# Turn the TableReport into an equivalent HTML element tree.
|
67
82
|
def to_html
|
@@ -71,7 +86,7 @@ class TaskJuggler
|
|
71
86
|
html << (table = XMLElement.new('table', 'summary' => 'Report Table',
|
72
87
|
'cellspacing' => '2', 'border' => '0',
|
73
88
|
'cellpadding' => '0', 'align' => 'center',
|
74
|
-
'class' => '
|
89
|
+
'class' => 'tjtable'))
|
75
90
|
|
76
91
|
# The headline is put in a sub-table to appear bigger.
|
77
92
|
if a('headline')
|
@@ -85,9 +100,10 @@ class TaskJuggler
|
|
85
100
|
table1 << (tr1 = XMLElement.new('tr'))
|
86
101
|
tr1 << (td1 = XMLElement.new('td', 'align' => 'center',
|
87
102
|
'style' => 'font-size:16px; ' +
|
88
|
-
'font-weight:bold'
|
103
|
+
'font-weight:bold; ' +
|
104
|
+
'padding:5px',
|
89
105
|
'class' => 'tabfront'))
|
90
|
-
td1 <<
|
106
|
+
td1 << a('headline').to_html
|
91
107
|
end
|
92
108
|
|
93
109
|
# Now generate the actual table with the data.
|
@@ -112,18 +128,6 @@ class TaskJuggler
|
|
112
128
|
'padding-left:1px; padding-right:1px;'))
|
113
129
|
td << @legend.to_html
|
114
130
|
|
115
|
-
# The footer with some administrative information.
|
116
|
-
tbody << (tr = XMLElement.new('tr', 'style' => 'font-size:9px'))
|
117
|
-
tr << (td = XMLElement.new('td', 'class' => 'tabfooter'))
|
118
|
-
td << XMLText.new(@project['copyright'] + " - ") if @project['copyright']
|
119
|
-
td << XMLText.new("Project: #{@project['name']} " +
|
120
|
-
"Version: #{@project['version']} - " +
|
121
|
-
"Created on #{TjTime.now.to_s("%Y-%m-%d %H:%M:%S")} " +
|
122
|
-
"with ")
|
123
|
-
td << XMLNamedText.new("#{AppConfig.packageName}", 'a',
|
124
|
-
'href' => "#{AppConfig.contact}")
|
125
|
-
td << XMLText.new(" v#{AppConfig.version}")
|
126
|
-
|
127
131
|
html << rt_to_html('footer')
|
128
132
|
html
|
129
133
|
end
|
@@ -134,49 +138,15 @@ class TaskJuggler
|
|
134
138
|
@table.to_csv
|
135
139
|
end
|
136
140
|
|
137
|
-
#
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
nil
|
144
|
-
else
|
145
|
-
''
|
146
|
-
end
|
147
|
-
else
|
148
|
-
# Certain attribute types need special treatment.
|
149
|
-
if type == DateAttribute
|
150
|
-
value.value.to_s(a('timeFormat'))
|
151
|
-
elsif type == RichTextAttribute
|
152
|
-
value.value
|
153
|
-
elsif type == ReferenceAttribute
|
154
|
-
value.label
|
155
|
-
else
|
156
|
-
value.to_s
|
157
|
-
end
|
158
|
-
end
|
159
|
-
rescue TjException
|
160
|
-
''
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
# This function returns true if the values for the _colId_ column need to be
|
165
|
-
# calculated.
|
166
|
-
def calculated?(colId)
|
167
|
-
if @@propertiesById.has_key?(colId)
|
168
|
-
return @@propertiesById[colId][3]
|
169
|
-
end
|
170
|
-
return false
|
171
|
-
end
|
141
|
+
# Returns the default column title for the columns _id_.
|
142
|
+
def TableReport::defaultColumnTitle(id)
|
143
|
+
# Return an empty string for some special columns that don't have a fixed
|
144
|
+
# title.
|
145
|
+
specials = %w( chart hourly daily weekly monthly quarterly yearly)
|
146
|
+
return '' if specials.include?(id)
|
172
147
|
|
173
|
-
|
174
|
-
|
175
|
-
def scenarioSpecific?(colId)
|
176
|
-
if @@propertiesById.has_key?(colId)
|
177
|
-
return @@propertiesById[colId][4]
|
178
|
-
end
|
179
|
-
return false
|
148
|
+
# Return the title for build-in hardwired columns.
|
149
|
+
@@propertiesById.include?(id) ? @@propertiesById[id][0] : nil
|
180
150
|
end
|
181
151
|
|
182
152
|
# Return if the column values should be indented based on the _colId_ or the
|
@@ -203,15 +173,19 @@ class TaskJuggler
|
|
203
173
|
end
|
204
174
|
end
|
205
175
|
|
206
|
-
#
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
return '' if specials.include?(id)
|
176
|
+
# This function returns true if the values for the _colId_ column need to be
|
177
|
+
# calculated.
|
178
|
+
def calculated?(colId)
|
179
|
+
return @@propertiesById.has_key?(colId)
|
180
|
+
end
|
212
181
|
|
213
|
-
|
214
|
-
|
182
|
+
# This functions returns true if the values for the _col_id_ column are
|
183
|
+
# scenario specific.
|
184
|
+
def scenarioSpecific?(colId)
|
185
|
+
if @@propertiesById.has_key?(colId)
|
186
|
+
return @@propertiesById[colId][3]
|
187
|
+
end
|
188
|
+
return false
|
215
189
|
end
|
216
190
|
|
217
191
|
def supportedColumns
|
@@ -250,7 +224,6 @@ class TaskJuggler
|
|
250
224
|
case column.id
|
251
225
|
when 'chart'
|
252
226
|
# In case we have a 'chart' column, we enforce certain minimum width
|
253
|
-
# of the chart. The width depends on the selected scale.
|
254
227
|
# The following table contains an entry for each scale. The entry
|
255
228
|
# consists of the triple 'seconds per unit', 'minimum width units'
|
256
229
|
# and 'margin units'. The minimum with does not include the margins
|
@@ -314,7 +287,7 @@ class TaskJuggler
|
|
314
287
|
# The maximum width of the chart. In case it needs more space, a
|
315
288
|
# scrollbar is shown or the chart gets truncated depending on the output
|
316
289
|
# format.
|
317
|
-
gantt.viewWidth = columnDef.width
|
290
|
+
gantt.viewWidth = columnDef.width ? columnDef.width : 450
|
318
291
|
column = ReportTableColumn.new(@table, columnDef, '')
|
319
292
|
column.cell1.special = gantt
|
320
293
|
column.cell2.hidden = true
|
@@ -355,9 +328,11 @@ class TaskJuggler
|
|
355
328
|
# is defined, the generated task lines will be within the scope this resource
|
356
329
|
# line.
|
357
330
|
def generateTaskList(taskList, resourceList, scopeLine)
|
358
|
-
queryAttrs = { '
|
331
|
+
queryAttrs = { 'project' => @project,
|
332
|
+
'scopeProperty' => scopeLine ? scopeLine.property : nil,
|
359
333
|
'loadUnit' => a('loadUnit'),
|
360
334
|
'numberFormat' => a('numberFormat'),
|
335
|
+
'timeFormat' => a('timeFormat'),
|
361
336
|
'currencyFormat' => a('currencyFormat'),
|
362
337
|
'start' => @start, 'end' => @end,
|
363
338
|
'costAccount' => a('costAccount'),
|
@@ -372,10 +347,17 @@ class TaskJuggler
|
|
372
347
|
# Init the variable to get a larger scope
|
373
348
|
line = nil
|
374
349
|
taskList.each do |task|
|
350
|
+
# Get the current Query from the report context and create a copy. We
|
351
|
+
# are going to modify it.
|
352
|
+
query = @project.reportContext.query.dup
|
353
|
+
query.property = task
|
354
|
+
query.scopeProperty = scopeLine ? scopeLine.property : nil
|
355
|
+
|
375
356
|
no += 1
|
376
357
|
Log.activity if lineNo % 10 == 0
|
377
358
|
lineNo += 1
|
378
359
|
a('scenarios').each do |scenarioIdx|
|
360
|
+
query.scenarioIdx = scenarioIdx
|
379
361
|
# Generate line for each task.
|
380
362
|
line = ReportTableLine.new(@table, task, scopeLine)
|
381
363
|
|
@@ -386,7 +368,8 @@ class TaskJuggler
|
|
386
368
|
|
387
369
|
# Generate a cell for each column in this line.
|
388
370
|
a('columns').each do |columnDef|
|
389
|
-
|
371
|
+
query.attributeId = columnDef.id
|
372
|
+
next unless generateTableCell(line, task, columnDef, query)
|
390
373
|
end
|
391
374
|
end
|
392
375
|
|
@@ -409,9 +392,11 @@ class TaskJuggler
|
|
409
392
|
# each task that the resource is assigned to. If _scopeLine_ is defined, the
|
410
393
|
# generated resource lines will be within the scope this task line.
|
411
394
|
def generateResourceList(resourceList, taskList, scopeLine)
|
412
|
-
queryAttrs = { '
|
395
|
+
queryAttrs = { 'project' => @project,
|
396
|
+
'scopeProperty' => scopeLine ? scopeLine.property : nil,
|
413
397
|
'loadUnit' => a('loadUnit'),
|
414
398
|
'numberFormat' => a('numberFormat'),
|
399
|
+
'timeFormat' => a('timeFormat'),
|
415
400
|
'currencyFormat' => a('currencyFormat'),
|
416
401
|
'start' => @start, 'end' => @end,
|
417
402
|
'costAccount' => a('costAccount'),
|
@@ -426,10 +411,17 @@ class TaskJuggler
|
|
426
411
|
# Init the variable to get a larger scope
|
427
412
|
line = nil
|
428
413
|
resourceList.each do |resource|
|
414
|
+
# Get the current Query from the report context and create a copy. We
|
415
|
+
# are going to modify it.
|
416
|
+
query = @project.reportContext.query.dup
|
417
|
+
query.property = resource
|
418
|
+
query.scopeProperty = scopeLine ? scopeLine.property : nil
|
419
|
+
|
429
420
|
no += 1
|
430
421
|
Log.activity if lineNo % 10 == 0
|
431
422
|
lineNo += 1
|
432
423
|
a('scenarios').each do |scenarioIdx|
|
424
|
+
query.scenarioIdx = scenarioIdx
|
433
425
|
# Generate line for each resource.
|
434
426
|
line = ReportTableLine.new(@table, resource, scopeLine)
|
435
427
|
|
@@ -440,7 +432,8 @@ class TaskJuggler
|
|
440
432
|
|
441
433
|
# Generate a cell for each column in this line.
|
442
434
|
a('columns').each do |column|
|
443
|
-
|
435
|
+
query.attributeId = column.id
|
436
|
+
next unless generateTableCell(line, resource, column, query)
|
444
437
|
end
|
445
438
|
end
|
446
439
|
|
@@ -481,7 +474,7 @@ class TaskJuggler
|
|
481
474
|
tableColumn.cell1.special = table = ColumnTable.new
|
482
475
|
table.equiLines = true
|
483
476
|
tableColumn.cell2.hidden = true
|
484
|
-
table.
|
477
|
+
table.viewWidth = columnDef.width ? columnDef.width : 450
|
485
478
|
|
486
479
|
# Iterate over the report interval until we hit the end date. The
|
487
480
|
# iteration is done with 2 nested loops. The outer loops generates the
|
@@ -541,20 +534,28 @@ class TaskJuggler
|
|
541
534
|
# columns. In such a case many cells are generated with a single call of
|
542
535
|
# this method. The last kind of cell is actually not a cell. It just
|
543
536
|
# generates the chart objects that belong to the property in this line.
|
544
|
-
def generateTableCell(line, property, columnDef,
|
537
|
+
def generateTableCell(line, property, columnDef, query)
|
538
|
+
if columnDef.start || columnDef.end
|
539
|
+
# If the user has specified a new start or end time for this column,
|
540
|
+
# we have to duplicate the query before we modify it.
|
541
|
+
query = query.dup
|
542
|
+
query.start = columnDef.start if columnDef.start
|
543
|
+
query.end = columnDef.end if columnDef.end
|
544
|
+
end
|
545
|
+
|
545
546
|
case columnDef.id
|
546
547
|
when 'chart'
|
547
548
|
# Generate a hidden cell. The real meat is in the actual chart object,
|
548
549
|
# not in this cell.
|
549
|
-
cell = ReportTableCell.new(line)
|
550
|
+
cell = ReportTableCell.new(line, query, '')
|
550
551
|
cell.hidden = true
|
551
552
|
cell.text = nil
|
552
553
|
# The GanttChart can be reached via the special variable of the column
|
553
554
|
# header.
|
554
555
|
chart = columnDef.column.cell1.special
|
555
|
-
GanttLine.new(chart, property,
|
556
|
-
|
557
|
-
|
556
|
+
GanttLine.new(chart, property, line.scopeProperty,
|
557
|
+
query.scenarioIdx,
|
558
|
+
(line.subLineNo - 1) * (line.height + 1),
|
558
559
|
line.height)
|
559
560
|
return true
|
560
561
|
# The calendar cells can be all generated by the same function. But we
|
@@ -579,10 +580,9 @@ class TaskJuggler
|
|
579
580
|
sameTimeNextFunc = :sameTimeNextYear
|
580
581
|
else
|
581
582
|
if calculated?(columnDef.id)
|
582
|
-
genCalculatedCell(
|
583
|
-
return true
|
583
|
+
return genCalculatedCell(query, line, columnDef, property)
|
584
584
|
else
|
585
|
-
return genStandardCell(
|
585
|
+
return genStandardCell(query, line, columnDef)
|
586
586
|
end
|
587
587
|
end
|
588
588
|
|
@@ -594,10 +594,9 @@ class TaskJuggler
|
|
594
594
|
|
595
595
|
# Depending on the property type we use different generator functions.
|
596
596
|
if property.is_a?(Task)
|
597
|
-
genCalChartTaskCell(
|
598
|
-
sameTimeNextFunc)
|
597
|
+
genCalChartTaskCell(query, tcLine, columnDef, start, sameTimeNextFunc)
|
599
598
|
elsif property.is_a?(Resource)
|
600
|
-
genCalChartResourceCell(
|
599
|
+
genCalChartResourceCell(query, tcLine, columnDef, start,
|
601
600
|
sameTimeNextFunc)
|
602
601
|
else
|
603
602
|
raise "Unknown property type #{property.class}"
|
@@ -608,10 +607,9 @@ class TaskJuggler
|
|
608
607
|
# Generate a ReportTableCell filled the value of an attribute of the
|
609
608
|
# property that line is for. It returns true if the cell exists, false for a
|
610
609
|
# hidden cell.
|
611
|
-
def genStandardCell(
|
612
|
-
property = line.property
|
613
|
-
|
610
|
+
def genStandardCell(query, line, columnDef)
|
614
611
|
# Find out, what type of PropertyTreeNode we are dealing with.
|
612
|
+
property = line.property
|
615
613
|
if property.is_a?(Task)
|
616
614
|
propertyList = @project.tasks
|
617
615
|
elsif property.is_a?(Resource)
|
@@ -619,118 +617,122 @@ class TaskJuggler
|
|
619
617
|
else
|
620
618
|
raise "Unknown property type #{property.class}"
|
621
619
|
end
|
622
|
-
colId = columnDef.id
|
623
|
-
# Get the value no matter if it's scenario specific or not.
|
624
|
-
if propertyList.scenarioSpecific?(colId)
|
625
|
-
value = property.getAttr(colId, scenarioIdx)
|
626
|
-
else
|
627
|
-
value = property.getAttr(colId)
|
628
|
-
end
|
629
|
-
# Get the type of the property
|
630
|
-
type = propertyList.attributeType(colId)
|
631
620
|
|
632
621
|
# Create a new cell
|
633
|
-
cell = newCell(
|
634
|
-
if type == ReferenceAttribute
|
635
|
-
cell.url = value.url
|
636
|
-
end
|
622
|
+
cell = newCell(query, line)
|
637
623
|
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
unless propertyList.scenarioSpecific?(columnDef.id)
|
642
|
-
if scenarioIdx == a('scenarios').first
|
643
|
-
# Use a somewhat bigger font.
|
644
|
-
cell.fontSize = 15
|
645
|
-
else
|
646
|
-
# And hide the cells for all but the first scenario.
|
647
|
-
cell.hidden = true
|
648
|
-
return false
|
649
|
-
end
|
650
|
-
cell.rows = a('scenarios').length
|
651
|
-
end
|
624
|
+
unless setScenarioSettings(cell, query.scenarioIdx,
|
625
|
+
propertyList.scenarioSpecific?(columnDef.id))
|
626
|
+
return false
|
652
627
|
end
|
653
628
|
|
654
629
|
setStandardCellAttributes(cell, columnDef,
|
655
630
|
propertyList.attributeType(columnDef.id), line)
|
656
631
|
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
'numberFormat' => a('numberFormat'),
|
664
|
-
'currencyFormat' => a('currencyFormat'),
|
665
|
-
'start' => @start, 'end' => @end,
|
666
|
-
'costAccount' => a('costAccount'),
|
667
|
-
'revenueAccount' => a('revenueAccount'))
|
668
|
-
if cell.text
|
669
|
-
if columnDef.cellText
|
670
|
-
cell.text = expandMacros(columnDef.cellText, cell.text, query)
|
671
|
-
end
|
672
|
-
else
|
673
|
-
cell.text = '<Error>'
|
674
|
-
cell.fontColor = 0xFF0000
|
632
|
+
# If the user has requested a custom cell text, this will be used
|
633
|
+
# instead of the queried one.
|
634
|
+
if (cdText = columnDef.cellText.getPattern(query))
|
635
|
+
cell.text = cdText
|
636
|
+
elsif query.process
|
637
|
+
cell.text = (rti = query.to_rti) ? rti : query.to_s
|
675
638
|
end
|
676
639
|
|
677
|
-
|
640
|
+
# Replace the font color setting if the user has requested a custom
|
641
|
+
# color.
|
642
|
+
fontColor = columnDef.fontColor.getPattern(query)
|
643
|
+
cell.fontColor = fontColor if fontColor
|
644
|
+
|
645
|
+
# Replace the cell background color if the user has requested a custom
|
646
|
+
# color.
|
647
|
+
cellColor = columnDef.cellColor.getPattern(query)
|
648
|
+
cell.cellColor = cellColor if cellColor
|
649
|
+
|
650
|
+
# If the user has requested a custom tooltip, add it to the cell.
|
651
|
+
cell.tooltip = columnDef.tooltip.getPattern(query) || nil
|
652
|
+
|
653
|
+
checkCellText(cell)
|
654
|
+
|
678
655
|
true
|
679
656
|
end
|
680
657
|
|
681
658
|
# Generate a ReportTableCell filled with a calculted value from the property
|
682
659
|
# or other sources of information. It returns true if the cell exists, false
|
683
|
-
# for a hidden cell.
|
684
|
-
#
|
660
|
+
# for a hidden cell. _query_ is the Query to get the cell value. _line_
|
661
|
+
# is the ReportTableLine of the cell. _columnDef_ is the
|
685
662
|
# TableColumnDefinition of the column. _property_ is the PropertyTreeNode
|
686
663
|
# that is reported in this cell.
|
687
|
-
def genCalculatedCell(
|
664
|
+
def genCalculatedCell(query, line, columnDef, property)
|
688
665
|
# Create a new cell
|
689
|
-
cell = newCell(line)
|
666
|
+
cell = newCell(query, line)
|
690
667
|
|
691
|
-
unless
|
692
|
-
|
693
|
-
|
694
|
-
return false
|
695
|
-
end
|
696
|
-
cell.rows = a('scenarios').length
|
668
|
+
unless setScenarioSettings(cell, query.scenarioIdx,
|
669
|
+
scenarioSpecific?(columnDef.id))
|
670
|
+
return false
|
697
671
|
end
|
698
672
|
|
699
673
|
setStandardCellAttributes(cell, columnDef, nil, line)
|
700
674
|
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
query = Query.new('property' => property,
|
706
|
-
'scopeProperty' => scopeProperty,
|
707
|
-
'attributeId' => columnDef.id,
|
708
|
-
'scenarioIdx' => scenarioIdx,
|
709
|
-
'loadUnit' => a('loadUnit'),
|
710
|
-
'numberFormat' => a('numberFormat'),
|
711
|
-
'currencyFormat' => a('currencyFormat'),
|
712
|
-
'start' => @start, 'end' => @end,
|
713
|
-
'costAccount' => a('costAccount'),
|
714
|
-
'revenueAccount' => a('revenueAccount'))
|
715
|
-
query.process
|
716
|
-
cell.text = query.result
|
675
|
+
if query.process
|
676
|
+
cell.text = (rti = query.to_rti) ? rti : query.to_s
|
677
|
+
end
|
717
678
|
|
718
679
|
# Some columns need some extra care.
|
719
680
|
case columnDef.id
|
681
|
+
when 'alert'
|
682
|
+
id = @project.alertLevelId(query.to_num)
|
683
|
+
cell.icon = "flag-#{id}"
|
684
|
+
cell.fontColor = @project.alertLevelColor(query.to_sort)
|
685
|
+
when 'alerttrend'
|
686
|
+
icons = %w( up flat down )
|
687
|
+
cell.icon = "trend-#{icons[query.to_sort]}"
|
720
688
|
when 'line'
|
721
689
|
cell.text = line.lineNo.to_s
|
690
|
+
when 'name'
|
691
|
+
cell.icon =
|
692
|
+
if property.is_a?(Task)
|
693
|
+
if property.container?
|
694
|
+
'taskgroup'
|
695
|
+
else
|
696
|
+
'task'
|
697
|
+
end
|
698
|
+
elsif property.is_a?(Resource)
|
699
|
+
if property.container?
|
700
|
+
'resourcegroup'
|
701
|
+
else
|
702
|
+
'resource'
|
703
|
+
end
|
704
|
+
else
|
705
|
+
nil
|
706
|
+
end
|
722
707
|
when 'no'
|
723
708
|
cell.text = line.no.to_s
|
724
709
|
when 'wbs'
|
725
710
|
cell.indent = 2 if line.scopeLine
|
726
711
|
when 'scenario'
|
727
|
-
cell.text = @project.scenario(scenarioIdx).name
|
712
|
+
cell.text = @project.scenario(query.scenarioIdx).name
|
728
713
|
end
|
729
714
|
|
730
|
-
if
|
731
|
-
|
732
|
-
|
733
|
-
|
715
|
+
# Replace the cell text if the user has requested a custom cell text.
|
716
|
+
cdText = columnDef.cellText.getPattern(query)
|
717
|
+
cell.text = cdText if cdText
|
718
|
+
|
719
|
+
# Replace the cell background color if the user has requested a custom
|
720
|
+
# color.
|
721
|
+
cellColor = columnDef.cellColor.getPattern(query)
|
722
|
+
cell.cellColor = cellColor if cellColor
|
723
|
+
|
724
|
+
# Replace the font color setting if the user has requested a custom
|
725
|
+
# color.
|
726
|
+
fontColor = columnDef.fontColor.getPattern(query)
|
727
|
+
cell.fontColor = fontColor if fontColor
|
728
|
+
|
729
|
+
# Register the custom tooltip if the user has requested one.
|
730
|
+
cdTooltip = columnDef.tooltip.getPattern(query)
|
731
|
+
cell.tooltip = cdTooltip if cdTooltip
|
732
|
+
|
733
|
+
checkCellText(cell)
|
734
|
+
|
735
|
+
true
|
734
736
|
end
|
735
737
|
|
736
738
|
# Generate the cells for the task lines of a calendar column. These lines do
|
@@ -740,7 +742,7 @@ class TaskJuggler
|
|
740
742
|
# in this line. _line_ is the @table line. _t_ is the start date for the
|
741
743
|
# calendar. _sameTimeNextFunc_ is the function that will move the date to
|
742
744
|
# the next cell.
|
743
|
-
def genCalChartTaskCell(
|
745
|
+
def genCalChartTaskCell(query, line, columnDef, t, sameTimeNextFunc)
|
744
746
|
task = line.property
|
745
747
|
# Find out if we have an enclosing resource scope.
|
746
748
|
if line.scopeLine && line.scopeLine.property.is_a?(Resource)
|
@@ -751,23 +753,15 @@ class TaskJuggler
|
|
751
753
|
|
752
754
|
# Get the interval of the task. In case a date is invalid due to a
|
753
755
|
# scheduling problem, we use the full project interval.
|
754
|
-
taskIv = Interval.new(task['start', scenarioIdx].nil? ?
|
755
|
-
@project['start'] : task['start', scenarioIdx],
|
756
|
-
task['end', scenarioIdx].nil? ?
|
757
|
-
@project['end'] : task['end', scenarioIdx])
|
758
|
-
|
759
|
-
query = Query.new('property' => task, 'scopeProperty' => resource,
|
760
|
-
'scenarioIdx' => scenarioIdx,
|
761
|
-
'loadUnit' => a('loadUnit'),
|
762
|
-
'numberFormat' => a('numberFormat'),
|
763
|
-
'currencyFormat' => a('currencyFormat'),
|
764
|
-
'costAccount' => a('costAccount'),
|
765
|
-
'revenueAccount' => a('revenueAccount'))
|
756
|
+
taskIv = Interval.new(task['start', query.scenarioIdx].nil? ?
|
757
|
+
@project['start'] : task['start', query.scenarioIdx],
|
758
|
+
task['end', query.scenarioIdx].nil? ?
|
759
|
+
@project['end'] : task['end', query.scenarioIdx])
|
766
760
|
|
767
761
|
firstCell = nil
|
768
762
|
while t < @end
|
769
763
|
# Create a new cell
|
770
|
-
cell = newCell(line)
|
764
|
+
cell = newCell(query, line)
|
771
765
|
|
772
766
|
# call TjTime::sameTimeNext... function
|
773
767
|
nextT = t.send(sameTimeNextFunc)
|
@@ -781,7 +775,7 @@ class TaskJuggler
|
|
781
775
|
query.endIdx = nextT
|
782
776
|
query.process
|
783
777
|
# To increase readability, we don't show 0.0 values.
|
784
|
-
cell.text = query.
|
778
|
+
cell.text = query.to_s if query.to_num != 0.0
|
785
779
|
else
|
786
780
|
raise "Unknown column content #{column.content}"
|
787
781
|
end
|
@@ -814,7 +808,7 @@ class TaskJuggler
|
|
814
808
|
# reported in this line. _line_ is the @table line. _t_ is the start date
|
815
809
|
# for the calendar. _sameTimeNextFunc_ is the function that will move the
|
816
810
|
# date to the next cell.
|
817
|
-
def genCalChartResourceCell(
|
811
|
+
def genCalChartResourceCell(query, line, columnDef, t,
|
818
812
|
sameTimeNextFunc)
|
819
813
|
resource = line.property
|
820
814
|
# Find out if we have an enclosing task scope.
|
@@ -822,26 +816,19 @@ class TaskJuggler
|
|
822
816
|
task = line.scopeLine.property
|
823
817
|
# Get the interval of the task. In case a date is invalid due to a
|
824
818
|
# scheduling problem, we use the full project interval.
|
825
|
-
taskIv = Interval.new(task['start', scenarioIdx].nil? ?
|
826
|
-
@project['start'] :
|
827
|
-
task['
|
828
|
-
|
819
|
+
taskIv = Interval.new(task['start', query.scenarioIdx].nil? ?
|
820
|
+
@project['start'] :
|
821
|
+
task['start', query.scenarioIdx],
|
822
|
+
task['end', query.scenarioIdx].nil? ?
|
823
|
+
@project['end'] : task['end', query.scenarioIdx])
|
829
824
|
else
|
830
825
|
task = nil
|
831
826
|
end
|
832
827
|
|
833
|
-
query = Query.new('property' => resource,
|
834
|
-
'scenarioIdx' => scenarioIdx,
|
835
|
-
'loadUnit' => a('loadUnit'),
|
836
|
-
'numberFormat' => a('numberFormat'),
|
837
|
-
'currencyFormat' => a('currencyFormat'),
|
838
|
-
'costAccount' => a('costAccount'),
|
839
|
-
'revenueAccount' => a('revenueAccount'))
|
840
|
-
|
841
828
|
firstCell = nil
|
842
829
|
while t < @end
|
843
830
|
# Create a new cell
|
844
|
-
cell = newCell(line)
|
831
|
+
cell = newCell(query, line)
|
845
832
|
|
846
833
|
# call TjTime::sameTimeNext... function
|
847
834
|
nextT = t.send(sameTimeNextFunc)
|
@@ -852,21 +839,21 @@ class TaskJuggler
|
|
852
839
|
query.startIdx = @project.dateToIdx(t, true)
|
853
840
|
query.endIdx = @project.dateToIdx(nextT, true) - 1
|
854
841
|
query.process
|
855
|
-
workLoad = query.
|
856
|
-
scaledWorkLoad = query.
|
842
|
+
workLoad = query.to_num
|
843
|
+
scaledWorkLoad = query.to_s
|
857
844
|
if task
|
858
845
|
# Get work load for the particular task.
|
859
846
|
query.scopeProperty = task
|
860
847
|
query.process
|
861
|
-
workLoadTask = query.
|
862
|
-
scaledWorkLoad = query.
|
848
|
+
workLoadTask = query.to_num
|
849
|
+
scaledWorkLoad = query.to_s
|
863
850
|
else
|
864
851
|
workLoadTask = 0.0
|
865
852
|
end
|
866
853
|
# Get unassigned work load.
|
867
854
|
query.attributeId = 'freework'
|
868
855
|
query.process
|
869
|
-
freeLoad = query.
|
856
|
+
freeLoad = query.to_num
|
870
857
|
case columnDef.content
|
871
858
|
when 'empty'
|
872
859
|
# We only generate cells will different background colors.
|
@@ -925,6 +912,8 @@ class TaskJuggler
|
|
925
912
|
legend.addCalendarItem('Off duty time', 'offduty')
|
926
913
|
end
|
927
914
|
|
915
|
+
# This method takes care of often used cell attributes like indentation,
|
916
|
+
# alignment and background color.
|
928
917
|
def setStandardCellAttributes(cell, columnDef, attributeType, line)
|
929
918
|
# Determine whether it should be indented
|
930
919
|
if indent(columnDef.id, attributeType)
|
@@ -942,16 +931,38 @@ class TaskJuggler
|
|
942
931
|
cell.category = line.property.get('index') % 2 == 1 ?
|
943
932
|
'resourcecell1' : 'resourcecell2'
|
944
933
|
end
|
934
|
+
|
935
|
+
# Set column width
|
936
|
+
cell.width = columnDef.width if columnDef.width
|
937
|
+
end
|
938
|
+
|
939
|
+
def setScenarioSettings(cell, scenarioIdx, scenarioSpecific)
|
940
|
+
# Check if we are dealing with multiple scenarios.
|
941
|
+
if a('scenarios').length > 1
|
942
|
+
# Check if the attribute is not scenario specific
|
943
|
+
unless scenarioSpecific
|
944
|
+
if scenarioIdx == a('scenarios').first
|
945
|
+
# Use a somewhat bigger font.
|
946
|
+
cell.fontSize = 15
|
947
|
+
else
|
948
|
+
# And hide the cells for all but the first scenario.
|
949
|
+
cell.hidden = true
|
950
|
+
return false
|
951
|
+
end
|
952
|
+
cell.rows = a('scenarios').length
|
953
|
+
end
|
954
|
+
end
|
955
|
+
true
|
945
956
|
end
|
946
957
|
|
947
958
|
# Create a new ReportTableCell object and initialize some common values.
|
948
|
-
def newCell(
|
959
|
+
def newCell(query, line)
|
949
960
|
property = line.property
|
950
|
-
cell = ReportTableCell.new(line,
|
961
|
+
cell = ReportTableCell.new(line, query)
|
951
962
|
|
952
963
|
# Cells for containers should be using bold font face.
|
953
|
-
cell.bold = true if property.container?
|
954
|
-
|
964
|
+
cell.bold = true if property.container? && line.bold
|
965
|
+
cell.selfcontained = a('selfcontained')
|
955
966
|
cell
|
956
967
|
end
|
957
968
|
|
@@ -963,22 +974,19 @@ class TaskJuggler
|
|
963
974
|
# We indent at least as much as the scopeline + 1, if we have a scope.
|
964
975
|
line.indentation = scopeLine.indentation + 1 if scopeLine
|
965
976
|
# In tree mode we indent according to the level.
|
966
|
-
|
977
|
+
if treeMode
|
978
|
+
line.indentation += level
|
979
|
+
line.bold = true
|
980
|
+
end
|
967
981
|
end
|
968
982
|
|
969
|
-
#
|
970
|
-
#
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
if columnDef.hideCellURL &&
|
976
|
-
columnDef.hideCellURL.eval(query.property, query.scopeProperty)
|
977
|
-
url = nil
|
978
|
-
else
|
979
|
-
url = expandMacros(columnDef.cellURL, cell.text, query)
|
983
|
+
# Make sure we have a valid cell text. If not, this is the result of an
|
984
|
+
# error. This could happen after scheduling errors.
|
985
|
+
def checkCellText(cell)
|
986
|
+
unless cell.text
|
987
|
+
cell.text = '<Error>'
|
988
|
+
cell.fontColor = '#FF0000'
|
980
989
|
end
|
981
|
-
cell.url = url unless url.nil? || url.empty?
|
982
990
|
end
|
983
991
|
|
984
992
|
# Try to merge equal cells without text to multi-column cells.
|
@@ -989,64 +997,6 @@ class TaskJuggler
|
|
989
997
|
end
|
990
998
|
end
|
991
999
|
|
992
|
-
# Expand the run-time macros in _pattern_. ${0} is a special case and will
|
993
|
-
# be replaced with the _originalText_. For all other macros the _query_ will
|
994
|
-
# be used with the macro name used for the attributeId of the query. The
|
995
|
-
# method returns the expanded pattern.
|
996
|
-
def expandMacros(pattern, originalText, query)
|
997
|
-
return pattern unless pattern.include?('${')
|
998
|
-
|
999
|
-
out = ''
|
1000
|
-
# Scan the pattern for macros ${...}
|
1001
|
-
i = 0
|
1002
|
-
while i < pattern.length
|
1003
|
-
c = pattern[i]
|
1004
|
-
if c == ?$
|
1005
|
-
# This could be a macro
|
1006
|
-
if pattern[i + 1] != ?{
|
1007
|
-
# It's not. Just append the '$'
|
1008
|
-
out << c
|
1009
|
-
else
|
1010
|
-
# It is a macro.
|
1011
|
-
i += 2
|
1012
|
-
macro = ''
|
1013
|
-
# Scan for the end '}' and get the macro name.
|
1014
|
-
while i < pattern.length && pattern[i] != ?}
|
1015
|
-
macro << pattern[i]
|
1016
|
-
i += 1
|
1017
|
-
end
|
1018
|
-
if macro == '0'
|
1019
|
-
# This turns RichText into plain ASCII!
|
1020
|
-
out += originalText
|
1021
|
-
else
|
1022
|
-
# resolve by query
|
1023
|
-
# If the macro is prefixed by a '?' it may be undefined.
|
1024
|
-
if macro[0] == ??
|
1025
|
-
macro = macro[1..-1]
|
1026
|
-
ignoreErrors = true
|
1027
|
-
else
|
1028
|
-
ignoreErrors = false
|
1029
|
-
end
|
1030
|
-
query.attributeId = macro
|
1031
|
-
query.process
|
1032
|
-
unless query.ok || ignoreErrors
|
1033
|
-
raise TjException.new, query.errorMessage
|
1034
|
-
end
|
1035
|
-
# This turns RichText into plain ASCII!
|
1036
|
-
out += query.result
|
1037
|
-
end
|
1038
|
-
end
|
1039
|
-
else
|
1040
|
-
# Just append the character to the output.
|
1041
|
-
out << c
|
1042
|
-
end
|
1043
|
-
i += 1
|
1044
|
-
end
|
1045
|
-
|
1046
|
-
out
|
1047
|
-
end
|
1048
|
-
|
1049
1000
|
end
|
1050
1001
|
|
1051
1002
|
end
|
1052
|
-
|