Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as =================================================================== diff -u -r86aae1b21277f5fc950a0303361b63fd7adde39c -r1aa870575978de0fbe4b5ab485f47d85d9b3c0be --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as (.../ComplexActivity.as) (revision 86aae1b21277f5fc950a0303361b63fd7adde39c) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as (.../ComplexActivity.as) (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -42,7 +42,9 @@ private var _optionsInstructions:String; private var _firstActivityUIID:Number; + private var _isSequenceBased:Boolean; + private var _noSequences:Number; function ComplexActivity(activityUIID:Number){ super(activityUIID); @@ -169,5 +171,13 @@ public function set isSequenceBased(a:Boolean):Void{ _isSequenceBased = a; } + + public function get noSequences():Number{ + return _noSequences; + } + + public function set noSequences(a:Number):Void{ + _noSequences = a; + } } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as =================================================================== diff -u -r96b7d23e6ff1d27f5f2637fa1c1dfe471861fa63 -r1aa870575978de0fbe4b5ab485f47d85d9b3c0be --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as (.../DesignDataModel.as) (revision 96b7d23e6ff1d27f5f2637fa1c1dfe471861fa63) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as (.../DesignDataModel.as) (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -1064,9 +1064,12 @@ var target = null; var sequence = null; + var hasBranches:Boolean = false; + for(var i=0; i 1){ container_pnl._height = CHILD_OFFSET_Y + (numOfChildren * CHILD_INCRE); @@ -377,5 +439,9 @@ _canvasController = a; else _monitorController = a; + } + + public function get type():Number { + return _type; } } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as =================================================================== diff -u --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as (revision 0) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -0,0 +1,502 @@ +/**************************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * ************************************************************************ + */ + +import org.lamsfoundation.lams.common.*; +import org.lamsfoundation.lams.authoring.cv.*; +import org.lamsfoundation.lams.authoring.br.BranchConnector; +import org.lamsfoundation.lams.authoring.br.CanvasBranchView; +import org.lamsfoundation.lams.authoring.*; +import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.ui.*; +import org.lamsfoundation.lams.common.dict.*; +import mx.events.*; + + +/** + * + * @author + * @version + **/ +class org.lamsfoundation.lams.authoring.cv.CanvasSuperModel extends Observable { + + private var _defaultGroupingTypeID; + private var __width:Number; + private var __height:Number; + private var __x:Number; + private var __y:Number; + private var _piHeight:Number; + private var infoObj:Object; + + private var _cv:Canvas; + private var _ddm:DesignDataModel; + private var optionalCA:CanvasOptionalActivity; + + //UI State variabls + private var _isDirty:Boolean; + private var _activeTool:String; + private var _selectedItem:Object; // the currently selected thing - could be activity, transition etc. + private var _prevSelectedItem:Object; + private var _isDrawingTransition:Boolean; + private var _connectionActivities:Array; + private var _isDragging:Boolean; + private var _importing:Boolean; + private var _editing:Boolean; + private var _autoSaveWait:Boolean; + + //these are hashtables of mc refs MOVIECLIPS (like CanvasActivity or CanvasTransition) + //each on contains a reference to the emelment in the ddm (activity or transition) + private var _activitiesDisplayed:Hashtable; + private var _transitionsDisplayed:Hashtable; + private var _branchesDisplayed:Hashtable; + + private var _currentBranchingActivity:Object; + private var _activeView:Object; + + private var _lastBranchActionType:Number; + + //These are defined so that the compiler can 'see' the events that are added at runtime by EventDispatcher + private var dispatchEvent:Function; + public var addEventListener:Function; + public var removeEventListener:Function; + + public function CanvasSuperModel(cv:Canvas) { + + _cv = cv; + _ddm = new DesignDataModel(); + _activitiesDisplayed = new Hashtable("_activitiesDisplayed"); + _transitionsDisplayed = new Hashtable("_transitionsDisplayed"); + _branchesDisplayed = new Hashtable("_branchesDisplayed"); + + _activeTool = "none"; + _activeView = null; + _currentBranchingActivity = null; + _lastBranchActionType = null; + + _autoSaveWait = false; + _connectionActivities = new Array(); + _defaultGroupingTypeID = Grouping.RANDOM_GROUPING; + + //Set up this class to use the Flash event delegation model + EventDispatcher.initialize(this); + + } + + //////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////// TRANSITIONS ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Starts the transition tool + * @usage + * @return + */ + public function startTransitionTool():Void{ + Debugger.log('Starting transition tool',Debugger.GEN,'startTransitionTool','CanvasModel'); + resetTransitionTool(); + _activeTool = CanvasModel.TRANSITION_TOOL; + } + + /** + * Stops it + * @usage + * @return + */ + + public function stopTransitionTool():Void{ + Debugger.log('Stopping transition tool',Debugger.GEN,'stopTransitionTool','CanvasModel'); + resetTransitionTool(); + _activeTool = "none"; + } + + + /** + * Resets the transition tool to its starting state, e.g. if one chas been created or the user released the mouse over an unsuitable clip + * @usage + */ + public function resetTransitionTool():Void{ + //clear the transitions array + _connectionActivities = new Array(); + } + + public function isTransitionToolActive():Boolean{ + if(_activeTool == CanvasModel.TRANSITION_TOOL){ + return true; + }else{ + return false; + } + } + + /** + * Notify registered listeners that a data model change has happened + */ + public function broadcastViewUpdate(_updateType,_data){ + dispatchEvent({type:'viewUpdate',target:this,updateType:_updateType,data:_data}); + } + + public function clearAllElements():Void { + var branch_keys:Array = _branchesDisplayed.keys(); + var act_keys:Array = _activitiesDisplayed.keys(); + var trans_keys:Array = _transitionsDisplayed.keys(); + + for(var i=0; i - "+Dictionary.getValue('pi_optional_title'); + runOffline_chk.selected = ca.runOffline; defineLater_chk.selected = ca.defineLater; if(ca.minOptions == undefined) { - minAct_stp.value = 0 + minAct_stp.value = 0; } else { - minAct_stp.value = ca.minOptions + minAct_stp.value = ca.minOptions; } if(ca.maxOptions == undefined) { - maxAct_stp.value = 0 + maxAct_stp.value = 0; } else { - maxAct_stp.value = ca.maxOptions + maxAct_stp.value = ca.maxOptions; } currentGrouping_lbl.text = "GroupingUIID:"+StringUtils.cleanNull(ca.runOffline.groupingUIID); } + + private function showOptionalSequenceActivityProperties(ca:ComplexActivity){ + toolDisplayName_lbl.text = ""+Dictionary.getValue('pi_title')+" - "+Dictionary.getValue('opt_activity_seq_title'); + + runOffline_chk.selected = ca.runOffline; + defineLater_chk.selected = ca.defineLater; + + if(ca.noSequences == undefined) + noSeqAct_stp.value = 0; + else + noSeqAct_stp.value = ca.noSequences; + } private function updateOptionalData(){ var oa = _canvasModel.selectedItem.activity; var o = ComplexActivity(oa); o.minOptions = minAct_stp.value; o.maxOptions = maxAct_stp.value; - oa.init(); + + var newChildren = _canvasModel.getCanvas().ddm.getComplexActivityChildren(oa.activityUIID); + CanvasOptionalActivity(_canvasModel.selectedItem).updateChildren(newChildren); setModified(); + } + + private function updateOptionalSequenceData(){ + var controller = _canvasModel.activeView.getController(); + if(!controller.isBusy) { + controller.setBusy() + + var oa = _canvasModel.selectedItem.activity; + var o = ComplexActivity(oa); + + if(o.noSequences < noSeqAct_stp.value) { + _canvasModel.createNewSequenceActivity(oa); + } else { + var itemToRemove:Number = CanvasOptionalActivity(_canvasModel.selectedItem).getLastItem(); + _canvasModel.removeActivity(itemToRemove); + } + + var newChildren:Array = _canvasModel.getCanvas().ddm.getComplexActivityChildren(oa.activityUIID); + CanvasOptionalActivity(_canvasModel.selectedItem).updateChildren(newChildren); + + setModified(); + controller.clearBusy() + } } private function showParallelActivityProperties(ca:ComplexActivity){ Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspectorControls.as =================================================================== diff -u -r5a7eca0c6ef2deca52b32c88459666cc9ee12889 -r1aa870575978de0fbe4b5ab485f47d85d9b3c0be --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspectorControls.as (.../PropertyInspectorControls.as) (revision 5a7eca0c6ef2deca52b32c88459666cc9ee12889) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspectorControls.as (.../PropertyInspectorControls.as) (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -126,8 +126,10 @@ //Complex Activity private var min_lbl:Label; private var max_lbl:Label; + private var noSeqAct_lbl:Label; private var minAct_stp:NumericStepper; private var maxAct_stp:NumericStepper; + private var noSeqAct_stp:NumericStepper; // Branch Connector private var _pi_defaultBranch_cb:CheckBox; @@ -192,6 +194,8 @@ //Complex Activity min_lbl.text = Dictionary.getValue('pi_min_act'); max_lbl.text = Dictionary.getValue('pi_max_act'); + + noSeqAct_lbl.text = Dictionary.getValue('pi_no_seq_act'); _group_match_btn.label = Dictionary.getValue('pi_mapping_btn_lbl'); _group_naming_btn.label = Dictionary.getValue('pi_group_naming_btn_lbl'); @@ -219,7 +223,8 @@ delimitLine._visible = false; _group_match_btn.visible = false; - hideAllSteppers(false); + hideAllSteppers(false); + showGroupingControls(false); showGeneralControls(false); showOptionalControls(false); @@ -349,27 +354,81 @@ title_txt.enabled = e; } } + + private function showOptionalSequenceControls(v:Boolean, e:Boolean){ + desc_lbl.visible = v; + desc_txt.visible = v; + noSeqAct_lbl.visible = v; + noSeqAct_stp.visible = v; + + if(e != null) { + noSeqAct_stp.enabled = e; + noSeqAct_lbl.enabled = e; + desc_lbl.enabled = e; + desc_txt.enabled = e; + } + + grouping_lbl.visible = false; + + } + + private function showOptionalActivityControls(v:Boolean, e:Boolean){ + min_lbl.visible = v; + max_lbl.visible = v; + minAct_stp.visible = v; + maxAct_stp.visible = v; + desc_lbl.visible = v; + desc_txt.visible = v; + + if(e != null) { + min_lbl.enabled = e; + max_lbl.enabled = e; + minAct_stp.enabled = e; + maxAct_stp.enabled = e; + desc_lbl.enabled = e; + desc_txt.enabled = e; + } + + grouping_lbl.visible = false; + } private function showOptionalControls(v:Boolean, e:Boolean){ - - min_lbl.visible = v; - max_lbl.visible = v; - minAct_stp.visible = v; - maxAct_stp.visible = v; - desc_lbl.visible = v; - desc_txt.visible = v; - - if(e != null) { - min_lbl.enabled = e; - max_lbl.enabled = e; - minAct_stp.enabled = e; - maxAct_stp.enabled = e; - desc_lbl.enabled = e; - desc_txt.enabled = e; - } - - grouping_lbl.visible = false; - + if(!v) { + showOptionalActivityControls(v); + showOptionalSequenceControls(v); + } + + } + + private function checkEnableOptionalControls(e:Boolean):Void { + + if(CanvasOptionalActivity(_canvasModel.selectedItem).type == CanvasOptionalActivity.SEQ_TYPE) { + if(e != null) + noSeqAct_stp.enabled = e; + else + noSeqAct_stp.enabled = true; + + MovieClipUtils.doLater(Proxy.create(this,showOptionalControlsLater, true)); + } else { + if(e != null) { + minAct_stp.enabled = e; + maxAct_stp.enabled = e; + } else { + minAct_stp.enabled = true; + maxAct_stp.enabled = true; + } + + MovieClipUtils.doLater(Proxy.create(this, showOptionalControlsLater, false)); + } + + + } + + private function showOptionalControlsLater(isSequence:Boolean):Void { + if(isSequence) + MovieClipUtils.doLater(Proxy.create(this, showOptionalSequenceControls, true)); + else + MovieClipUtils.doLater(Proxy.create(this, showOptionalActivityControls, true)); } private function showGateControls(v:Boolean, e:Boolean){ @@ -406,6 +465,7 @@ branchType_lbl.visible = v; branchType_cmb.visible = v; hideAllSteppers(false); + var _activityTypeID:Number = _canvasModel.selectedItem.activity.activityTypeID; if(_activityTypeID == Activity.GROUP_BRANCHING_ACTIVITY_TYPE) { @@ -799,7 +859,8 @@ title_lbl.setStyle('styleName', styleObj); desc_lbl.setStyle('styleName', styleObj); min_lbl.setStyle('styleName', styleObj); - max_lbl.setStyle('styleName', styleObj); + max_lbl.setStyle('styleName', styleObj); + noSeqAct_lbl.setStyle('styleName', styleObj); grouping_lbl.setStyle('styleName', styleObj); currentGrouping_lbl.setStyle('styleName', styleObj); gateType_lbl.setStyle('styleName', styleObj); @@ -827,6 +888,7 @@ endMins_stp.setStyle('styleName', styleObj); minAct_stp.setStyle('styleName', styleObj); maxAct_stp.setStyle('styleName', styleObj); + noSeqAct_stp.setStyle('styleName', styleObj); _pi_defaultBranch_cb.setStyle('styleName', styleObj); _define_monitor_cb.setStyle('styleName', styleObj); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as =================================================================== diff -u -rc5ce2369b6232db2c25a966f7873f695ebf6e485 -r1aa870575978de0fbe4b5ab485f47d85d9b3c0be --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as (.../TemplateActivity.as) (revision c5ce2369b6232db2c25a966f7873f695ebf6e485) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as (.../TemplateActivity.as) (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -354,4 +354,8 @@ return _childActivities; } + public function get title():String { + return title_lbl.text; + } + } \ No newline at end of file Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as =================================================================== diff -u -r837d613b49df41259866b6caa79fb43d5fe4fb48 -r1aa870575978de0fbe4b5ab485f47d85d9b3c0be --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as (.../ToolkitController.as) (revision 837d613b49df41259866b6caa79fb43d5fe4fb48) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as (.../ToolkitController.as) (revision 1aa870575978de0fbe4b5ab485f47d85d9b3c0be) @@ -74,23 +74,27 @@ var isCanvasDrop:Boolean = cv.getCanvasModel().activeView.content.hitTest(dragIcon_mc); Debugger.log('isCanvasDrop:'+isCanvasDrop,Debugger.GEN,'iconDrop','ToolkitController'); - for (var i=0; i= optionalX && iconMouseX <= (optionalX + optionalWidth)){ - if (iconMouseY >= optionalY && iconMouseY <= (optionalY + optionalHeight)){ + if(iconMouseX >= optionalX && iconMouseX <= (optionalX + optionalWidth)){ + if(iconMouseY >= optionalY && iconMouseY <= (optionalY + optionalHeight)){ isCanvasDrop = false; dragIcon_mc.removeMovieClip(); - if (optionalOnCanvas[i].locked){ - var msg:String = Dictionary.getValue('act_lock_chk'); + var ta:TemplateActivity = _toolkitModel.getSelectedTemplateActivity(); + + if(optionalOnCanvas[i].locked){ + var msg:String = (!optionalOnCanvas[i].activity.isSequenceBased) ? Dictionary.getValue('act_lock_chk') : Dictionary.getValue('act_seq_lock_chk'); LFMessage.showMessageAlert(msg); - }else{ - var ta:TemplateActivity; - ta = _toolkitModel.getSelectedTemplateActivity(); + } else if(optionalOnCanvas[i].activity.isSequenceBased && optionalOnCanvas[i].activity.noSequences <= 0) { + var msg:String = Dictionary.getValue('ta_iconDrop_optseq_error_msg'); + LFMessage.showMessageAlert(msg); + } else { cv.setDroppedTemplateActivity(ta, optionalOnCanvas[i].activity.activityUIID); } }