Index: lams_central/web/lams_authoring.swf =================================================================== diff -u -rb9c68da61a40efc2425fb80c0c1e7b06f8fcfe78 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_central/web/lams_authoring_library.swf =================================================================== diff -u -rb9c68da61a40efc2425fb80c0c1e7b06f8fcfe78 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_flash/src/central/flash/lams_authoring.fla =================================================================== diff -u -ra6beb0b7bbcea33e43e665e76d3de3185eb4472f -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_flash/src/central/flash/lams_learner.fla =================================================================== diff -u -r3fc9626d0692f03e5998d786766a82f45e640e03 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_flash/src/central/flash/lams_monitoring_v1.fla =================================================================== diff -u -r36a58619b25a62884e05e3a0d58c2cae326d2e1c -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/Activity.as =================================================================== diff -u -r64f42c88ebf08393b1c53bbd00c3cd4fec211c10 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/Activity.as (.../Activity.as) (revision 64f42c88ebf08393b1c53bbd00c3cd4fec211c10) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/Activity.as (.../Activity.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -92,15 +92,16 @@ public static var SYNCH_GATE_ACTIVITY_TYPE:Number = 3; public static var SCHEDULE_GATE_ACTIVITY_TYPE:Number = 4; public static var PERMISSION_GATE_ACTIVITY_TYPE:Number = 5; - public static var CONDITION_GATE_ACTIVITY_TYPE:Number = 14; public static var PARALLEL_ACTIVITY_TYPE:Number = 6; public static var OPTIONAL_ACTIVITY_TYPE:Number = 7; public static var SEQUENCE_ACTIVITY_TYPE:Number = 8; public static var SYSTEM_GATE_ACTIVITY_TYPE:Number = 9; public static var CHOSEN_BRANCHING_ACTIVITY_TYPE:Number = 10; public static var GROUP_BRANCHING_ACTIVITY_TYPE:Number = 11; public static var TOOL_BRANCHING_ACTIVITY_TYPE:Number = 12; - public static var OPTIONS_WITH_SEQUENCES_TYPE:Number = 13; + public static var OPTIONS_WITH_SEQUENCES_TYPE:Number = 13; + public static var CONDITION_GATE_ACTIVITY_TYPE:Number = 14; + public static var REFERENCE_ACTIVITY_TYPE:Number = 15; /******************************************************************/ @@ -196,7 +197,6 @@ _readOnly = false; _createDateTime = new Date(); _branchView = null; - } //static class level methods @@ -267,6 +267,10 @@ return (this.isSequenceActivity() && parent.isOptionsWithSequencesActivity()); } + public function isReferenceActivity():Boolean { + return (_activityTypeID == REFERENCE_ACTIVITY_TYPE); + } + public function isParallelActivity():Boolean{ return (_activityTypeID == PARALLEL_ACTIVITY_TYPE); } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as (.../ComplexActivity.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/ComplexActivity.as (.../ComplexActivity.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -42,6 +42,11 @@ private var _maxOptions:Number; private var _minOptions:Number; + + //For Reference Activities + private var _minActivities:Number; + private var _maxActivities:Number; + private var _optionsInstructions:String; private var _firstActivityUIID:Number; @@ -66,6 +71,9 @@ _minOptions = dto.minOptions; //TODO: This is missing in the Library packet - tell mai. _optionsInstructions = dto.optionsInstructions; + } else if (_activityTypeID == Activity.REFERENCE_ACTIVITY_TYPE) { + _maxActivities = dto.maxActivities; + _minActivities = dto.minActivities; } if(StringUtils.isWDDXNull(dto.defaultActivityUIID)) _firstActivityUIID = null; @@ -82,11 +90,16 @@ public function toData():Object{ var dto:Object = super.toData(); if(_activityTypeID == Activity.OPTIONAL_ACTIVITY_TYPE || _activityTypeID == Activity.OPTIONS_WITH_SEQUENCES_TYPE){ - if(_maxOptions){ dto.maxOptions = _maxOptions; } - if(_minOptions){ dto.minOptions = _minOptions; } - if(_optionsInstructions){ dto.optionsInstructions = _optionsInstructions; } + if(_maxOptions) { dto.maxOptions = _maxOptions; } + if(_minOptions) { dto.minOptions = _minOptions; } + if(_optionsInstructions) { dto.optionsInstructions = _optionsInstructions; } } + if (_activityTypeID == Activity.REFERENCE_ACTIVITY_TYPE) { + if(_minActivities) { dto.minActivities = _minActivities; } + dto.maxActivities = 6; // hard coded for now + } + dto.defaultActivityUIID = (_firstActivityUIID == null) ? Config.NUMERIC_NULL_VALUE : _firstActivityUIID; return dto; @@ -103,7 +116,7 @@ ca.populateFromDTO(dto); return ca; - } + } /** * Used by OPTIONAL_ACTIVITY_TYPE @@ -141,9 +154,45 @@ public function get minOptions ():Number { return _minOptions; } + + /** + * Used by REFERENCE_ACTIVITY_TYPE + * @usage + * @param newmaxActivities + * @return + */ + public function set maxActivities (newmaxActivities:Number):Void { + _maxActivities = newmaxActivities; + } + /** + * used by REFERENCE_ACTIVITY_TYPE + * @usage + * @return + */ + public function get maxActivities ():Number { + return _maxActivities; + } /** + * used by REFERENCE_ACTIVITY_TYPE + * @usage + * @param newminActivities + * @return + */ + public function set minActivities (newminActivities:Number):Void { + _minActivities = newminActivities; + } + /** + * used by REFERENCE_ACTIVITY_TYPE + * @usage + * @return + */ + public function get minActivities ():Number { + return _minActivities; + } + + /** * * @usage * @param newoptionsInstructions Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as =================================================================== diff -u -r54947a666d3ac83ad437f1d7700fc69161d311bc -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as (.../DesignDataModel.as) (revision 54947a666d3ac83ad437f1d7700fc69161d311bc) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/DesignDataModel.as (.../DesignDataModel.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -75,6 +75,8 @@ private var _maxID:Number; private var _firstActivityID:Number; private var _firstActivityUIID:Number; + private var _referenceActivityID:Number; + private var _referenceActivityUIID:Number; //James has asked for previous and next fields so I can build up a sequence map of LDs when browsing workspaces... private var _parentLearningDesignID:Number; @@ -165,6 +167,9 @@ if(tmp){ Debugger.log('Succesfully added:'+tmp.title+':'+tmp.activityUIID,4,'addActivity','DesignDataModel'); + if (tmp.activityTypeID == Activity.REFERENCE_ACTIVITY_TYPE) { + referenceActivityUIID = tmp.activityUIID; + } }else{ return new LFError("Adding activity failed","addActivity",this,'activityUIID:'+activity.activityUIID); } @@ -507,7 +512,10 @@ _activities.put(newGateActivity.activityUIID,newGateActivity); - } else if(dto.activityTypeID == Activity.OPTIONAL_ACTIVITY_TYPE || dto.activityTypeID == Activity.PARALLEL_ACTIVITY_TYPE || dto.activityTypeID == Activity.OPTIONS_WITH_SEQUENCES_TYPE){ + } else if(dto.activityTypeID == Activity.OPTIONAL_ACTIVITY_TYPE || + dto.activityTypeID == Activity.PARALLEL_ACTIVITY_TYPE || + dto.activityTypeID == Activity.OPTIONS_WITH_SEQUENCES_TYPE || + dto.activityTypeID == Activity.REFERENCE_ACTIVITY_TYPE){ var cAct:ComplexActivity= new ComplexActivity(dto.activityUIID); cAct.populateFromDTO(dto); @@ -794,6 +802,7 @@ if(_maxID){ design.maxID = _maxID; } if(_firstActivityID){ design.firstActivityID = _firstActivityID; } if(_firstActivityUIID){ design.firstActivityUIID= _firstActivityID; } + if(_referenceActivityID){ design.referenceActivityID= _referenceActivityID; } if(_parentLearningDesignID){design.parentLearningDesignID= _parentLearningDesignID; } if(_licenseID){ design.licenseID = _licenseID; } if(_licenseText){ design.licenseText = _licenseText; } @@ -964,6 +973,16 @@ return gActs; } + public function getReferenceActivity():ComplexActivity { + var acts:Array = _activities.values(); + for(var i=0; i= maxActs) { + //LFMessage.showMessageAlert("Cannot drop activity: "+actToAdd.title+" here. The reference activity permits a maximum of "+maxActs+" child activities.", null); + LFMessage.showMessageAlert(Dictionary.getValue("support_msg_max_children_reached", [actToAdd.title], [maxActs]), null); + return; + } + } + break; + case(Activity.OPTIONAL_ACTIVITY_TYPE): actToAdd = Activity(actToCopy.clone()); actToAdd.activityUIID = _ddm.newUIID(); @@ -391,7 +402,7 @@ var passChildToolID = ta.childActivities[i].toolID; Application.getInstance().getComms().getRequest('authoring/author.do?method=getToolContentID&toolID='+passChildToolID,callback, false); - } + } break; @@ -673,6 +684,15 @@ } } + public function toggleReferenceTool():Void{ + var c:String = Cursor.getCurrentCursor(); + if(c==ApplicationParent.C_REFERENCE){ + stopReferenceTool(); + }else{ + startReferenceTool(); + } + } + public function toggleGateTool():Void{ var c:String = Cursor.getCurrentCursor(); if(c==ApplicationParent.C_GATE){ @@ -764,6 +784,19 @@ Cursor.showCursor(ApplicationParent.C_DEFAULT); canvasModel.activeTool = "none"; } + + public function startReferenceTool(){ + Debugger.log('Starting Reference Tool',Debugger.GEN,'startReferenceTool','Canvas'); + Cursor.showCursor(ApplicationParent.C_OPTIONAL); + canvasModel.activeTool = CanvasModel.REFERENCE_TOOL; + } + + public function stopReferenceTool(){ + Debugger.log('Stopping Reference Tool',Debugger.GEN,'stopReferenceTool','Canvas'); + Cursor.showCursor(ApplicationParent.C_DEFAULT); + canvasModel.activeTool = "none"; + } + public function startGroupTool(){ Debugger.log('Starting group tool',Debugger.GEN,'startGateTool','Canvas'); Cursor.showCursor(ApplicationParent.C_GROUP); @@ -857,18 +890,19 @@ /** * Method to open Import popup window */ - public function launchImportWindow():Void{ + public function launchImportWindow(method:String):Void{ Debugger.log('Launching Import Window',Debugger.GEN,'launchImportWindow','Canvas'); if(_ddm.modified){ LFMessage.showMessageConfirm(Dictionary.getValue('cv_design_unsaved'), Proxy.create(this,doImportLaunch), null); } else { - doImportLaunch(); + doImportLaunch(method); } } - public function doImportLaunch():Void{ + public function doImportLaunch(method:String):Void{ var serverUrl = Config.getInstance().serverUrl; - var importActionUrl:String = appendCustomCSVIfExists(serverUrl+'authoring/importToolContent.do?method=import'); + if (method == null) method = "import"; + var importActionUrl:String = appendCustomCSVIfExists(serverUrl+'authoring/importToolContent.do?method='+method); JsPopup.getInstance().launchPopupWindow(importActionUrl, 'Import', 298, 800, true, true, false, false, false); } Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as =================================================================== diff -u -r26907bf342a5cfea25c87d51fee41c7c663871c6 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as (.../CanvasController.as) (revision 26907bf342a5cfea25c87d51fee41c7c663871c6) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as (.../CanvasController.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -171,10 +171,8 @@ var optionalOnCanvas:Array = _canvasModel.findOptionalActivities(); var parallelOnCanvas:Array = _canvasModel.findParallelActivities(); - - Debugger.log("optional on canvas: " + optionalOnCanvas.length, Debugger.CRITICAL, "activityRelease", "CanvasController"); - - + var referenceOnCanvas:CanvasReferenceActivity = _canvasModel.getReferenceActivityOnCanvas(); + if(_canvasModel.isDragging) { ca.stopDrag(); @@ -190,16 +188,45 @@ var iconMouseX = _canvasModel.activeView.content._xmouse; var iconMouseY = _canvasModel.activeView.content._ymouse; - if (ca.activity.parentUIID != null && + // if the reference activity was dragged somewhere + if (referenceOnCanvas.activity.activityUIID != null && + ca.activity.activityUIID == referenceOnCanvas.activity.activityUIID) { + var canvasActs:Array = _canvasModel.activitiesDisplayed.values(); + for (var i=0; i referenceOnCanvas.panelWidth) || + (ca._x < -129) || + (ca._y < -55) || + (ca._y > 121) ) { + + //give it the new co-ords and 'drop' it + ca.activity.xCoord = iconMouseX - (_canvasModel.getCanvas().taWidth/2); + ca.activity.yCoord = iconMouseY - (_canvasModel.getCanvas().taHeight/2); + + _canvasModel.removeOptionalCA(ca, referenceOnCanvas.activity.activityUIID); + } else { + activitySnapBack(ca); + } + } else if (ca.activity.parentUIID != null && sequenceActivity.activityTypeID != Activity.SEQUENCE_ACTIVITY_TYPE && ca.activity.activityUIID != _canvasModel.currentBranchingActivity.activity.activityUIID){ + // activity is taken output of an optional activity container for (var i=0; i 142 || - ca._x < -129 || - ca._y < -55 || + if (ca._x > 142 || // optional activity width + ca._x < -129 || // toolactivity width + ca._y < -55 || // toolactivity height ca._y > optionalOnCanvas[i].panelHeight) { //give it the new co-ords and 'drop' it @@ -242,14 +269,40 @@ activitySnapBack(ca); } } - } } + } // Following is validation for non-tool activities being dropped into the reference activity container which we don't want. + } else if (referenceOnCanvas != null && + ca.hitTest(referenceOnCanvas) && + (ca.activity.activityUIID != referenceOnCanvas.activity.activityUIID)) { + + if ( !(ca.activity.activityTypeID == Activity.TOOL_ACTIVITY_TYPE || ca.activity.activityTypeID == Activity.PARALLEL_ACTIVITY_TYPE) ) { + activitySnapBack(ca); + //var msg:String = "Activities of this type cannot be added as a support activity"; + var msg:String = Dictionary.getValue("support_msg_invalid_child", [ca.activity.objectType]); + LFMessage.showMessageAlert(msg); + + } else if (_canvasModel.getCanvas().ddm.getTransitionsForActivityUIID(ca.activity.activityUIID).hasTrans){ + activitySnapBack(ca); + var msg:String = Dictionary.getValue('cv_invalid_optional_activity', [ca.activity.title]); + LFMessage.showMessageAlert(msg); + + } else { + //TODO: (maybe) if activity not already added + var numChildrenActs:Number = _canvasModel.getCanvas().ddm.getComplexActivityChildren(referenceOnCanvas.activity.activityUIID).length; + + if (numChildrenActs < 6) { + _canvasModel.addParentToActivity(referenceOnCanvas.activity.activityUIID, ca, false); + var newChildren:Array = _canvasModel.getCanvas().ddm.getComplexActivityChildren(referenceOnCanvas.activity.activityUIID); // caters for parrallel acts + referenceOnCanvas.updateChildren(newChildren); + } else { + //LFMessage.showMessageAlert("Cannot drop activity: "+ca.activity.title+" here. The reference activity permits a maximum of "+numChildrenActs+" child activities.", null); + LFMessage.showMessageAlert(Dictionary.getValue("support_msg_max_children_reached", [ca.activity.title], [6]), null); + activitySnapBack(ca); + } } - } else { - Debugger.log("normal optional case", Debugger.CRITICAL, "activityRelease", "CanvasController"); - + } else { //if we are on the optional Activity remove this activity from canvas and assign it a parentID of optional activity and place it in the optional activity window. for (var i=0; i 0) ? CanvasActivity(canvasModel.openBranchingActivities[canvasModel.openBranchingActivities.length-1]) : null; - + if(prevActiveView != null) canvasModel.activeView = prevActiveView; else canvasModel.activeView = (parentBranching.activity.isBranchingActivity()) ? parentBranching.activity.branchView : canvasView; canvasModel.currentBranchingActivity = (parentBranching.activity.isBranchingActivity()) ? parentBranching : null; + if (canvasModel.currentBranchingActivity == null && canvasModel.getReferenceActivityOnCanvas() == null) { + Application.getInstance().getToolbar().setButtonState("reference_btn", true, false); + } + if(canvasModel.activeView instanceof CanvasComplexView) CanvasComplexView(canvasModel.activeView).branchingToClear.push(branchingAct); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as =================================================================== diff -u -r066d4ae414c52ddeadc1f768f90521bf6273f23f -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as (.../CanvasModel.as) (revision 066d4ae414c52ddeadc1f768f90521bf6273f23f) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as (.../CanvasModel.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -42,6 +42,7 @@ public static var GATE_TOOL:String = "GATE"; public static var GROUP_TOOL:String = "GROUP"; public static var BRANCH_TOOL:String = "BRANCH"; + public static var REFERENCE_TOOL:String = "REFERENCE"; public static var OPEN_FROM_FILE:Number = 0; public static var ADD_FROM_TEMPLATE:Number = 1; @@ -258,7 +259,7 @@ } /** - * Creates a new gate activity at the specified location + * Creates a new optional activity at the specified location * @usage * @param gateTypeID * @param pos @@ -295,6 +296,30 @@ } + public function createNewReferenceActivity(ActivityTypeID, pos:Point){ + + var referenceAct = new ComplexActivity(_cv.ddm.newUIID()); + + referenceAct.learningDesignID = _cv.ddm.learningDesignID; + referenceAct.activityTypeID = Activity.REFERENCE_ACTIVITY_TYPE; + referenceAct.title = Dictionary.getValue("support_act_title"); + + referenceAct.groupingSupportType = Activity.GROUPING_SUPPORT_NONE; + referenceAct.activityCategoryID = Activity.CATEGORY_SYSTEM; + referenceAct.yCoord = pos.y; + referenceAct.xCoord = pos.x; + + _cv.ddm.addActivity(referenceAct); + //_cv.ddm.referenceActivityUIID = referenceAct.activityUIID; + + // disable the reference activity button + Application.getInstance().getToolbar().setButtonState("reference_btn", false, false); + + setDirty(); + setSelectedItem(_activitiesDisplayed.get(referenceAct.activityUIID)); + + } + public function removeOptionalSequenceCA(ca:Object, parentID){ haltRefresh(true); @@ -504,7 +529,7 @@ public function addActivityToConnection(ca:Object):Object{ var activity:Activity; //check we have not added too many - if(ca instanceof CanvasActivity || ca instanceof CanvasParallelActivity || ca instanceof CanvasOptionalActivity){ + if(ca instanceof CanvasActivity || ca instanceof CanvasParallelActivity || ca instanceof CanvasOptionalActivity || ca instanceof CanvasReferenceActivity){ activity = ca.activity; } else if(ca instanceof Activity){ activity = Activity(ca); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasReferenceActivity.as =================================================================== diff -u --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasReferenceActivity.as (revision 0) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasReferenceActivity.as (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -0,0 +1,346 @@ +/*************************************************************************** +* 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.common.util. *; +import org.lamsfoundation.lams.common.dict.* +import org.lamsfoundation.lams.common.ui. *; +import org.lamsfoundation.lams.authoring. *; +import org.lamsfoundation.lams.authoring.cv. *; +import org.lamsfoundation.lams.authoring.br.CanvasBranchView; +import org.lamsfoundation.lams.monitoring.mv. *; +import org.lamsfoundation.lams.monitoring.mv.tabviews.*; +import org.lamsfoundation.lams.common.style. *; + +import mx.controls. *; +import mx.managers. *; + +/** +* CanvasReferenceActivity +* This is the UI / view representation of a complex (Reference) activity +*/ +class org.lamsfoundation.lams.authoring.cv.CanvasReferenceActivity extends MovieClip implements ICanvasActivity{ + + private var CHILD_OFFSET_X:Number = 8; + private var CHILD_OFFSET_Y:Number = 57; + private var CHILD_INCRE:Number = 134.8; + + private var CONTAINER_PANEL_W:Number = 142.8; + + public static var PLUS_MARGIN_X:Number = 15; + public static var PLUS_MARGIN_Y:Number = 10; + + //this is set by the init object + private var _canvasController:CanvasController; + private var _canvasView:CanvasView; + private var _canvasBranchView:CanvasBranchView; + private var _canvasComplexView:CanvasComplexView; + private var _monitorController:MonitorController; + private var _monitorTabView:MonitorTabView; + private var _ca = ComplexActivity; + + //Set by the init obj + private var _activity:Activity; + private var _children:Array; + private var children_mc:Array; + + private var _panelWidth:Number; + + private var actMinActivities:Number; + private var actMaxActivities:Number; + + //refs to screen items: + private var container_pnl:Panel; + private var header_pnl:Panel; + + private var title_lbl:Label; + private var actCount_lbl:Label; + + //locals + private var childActivities_mc:MovieClip; + private var referenceActivity_mc:MovieClip; + private var clickTarget_mc:MovieClip; + private var _dcStartTime:Number = 0; + private var _doubleClicking:Boolean; + + private var fromModuleTab:String; + private var child_mc:MovieClip; + private var _locked:Boolean = false; + private var _visibleHeight:Number; + private var _visibleWidth:Number; + private var _tm:ThemeManager; + private var _dictionary:Dictionary; + + function CanvasReferenceActivity() { + referenceActivity_mc = this; + + _visible = false; + + _tm = ThemeManager.getInstance (); + _dictionary = Dictionary.getInstance(); + + _visibleHeight = container_pnl._height; + _visibleWidth = container_pnl._width; + + _ca = new ComplexActivity(_activity.activityUIID) + _activity.activityCategoryID = Activity.CATEGORY_SYSTEM; + + MovieClipUtils.doLater(Proxy.create(this, init)); + } + + public function init():Void { + + clickTarget_mc.onPress = Proxy.create(this, localOnPress); + clickTarget_mc.onRelease = Proxy.create(this, localOnRelease); + clickTarget_mc.onReleaseOutside = Proxy.create(this, localOnReleaseOutside); + + actMinActivities = _ca.minActivities; + actMaxActivities = _ca.maxActivities; + + if (controller instanceof CanvasController) { + _canvasView.model.ddm.referenceActivityID = _activity.activityID; + _canvasView.model.ddm.referenceActivityUIID = _activity.activityUIID; + } + + removeAllChildren(); + + for (var i=0; i < _children.length; i++) { + if(fromModuleTab == "monitorMonitorTab") { + children_mc[i] = childActivities_mc.attachMovie("CanvasActivity", "CanvasActivity"+i, childActivities_mc.getNextHighestDepth (), {_activity:_children[i] , _monitorController:_monitorController, _monitorView:_monitorTabView, _module:"monitoring", learnerContainer:null}); + } else { + children_mc[i] = childActivities_mc.attachMovie("CanvasActivity", "CanvasActivity"+i, childActivities_mc.getNextHighestDepth (), {_activity:_children[i] , _canvasController:_canvasController, _canvasView:_canvasView}); + } + + //set the positioning co-ords + children_mc[i].activity.xCoord = CHILD_OFFSET_X + (i * CHILD_INCRE); + children_mc[i].activity.yCoord = CHILD_OFFSET_Y; + + children_mc[i]._visible = true; + } + + MovieClipUtils.doLater(Proxy.create(this, draw)); + } + + public function removeAllChildren():Void { + for(var j=0; j 1){ + container_pnl._width = CHILD_OFFSET_X + (numOfChildren * CHILD_INCRE); + clickTarget_mc._width = container_pnl._width; + header_pnl.setSize(container_pnl._width - 6.8, header_pnl._height); // 6.8 corresponds to the right spacing + + } else { + container_pnl._width = CHILD_OFFSET_X + CHILD_INCRE; + } + + _visibleHeight = container_pnl._height; + + if(!_canvasComplexView) { + _x = _activity.xCoord; + _y = _activity.yCoord; + } + + //dimensions of container (this) + setLocking(); + + _visible = true; + } + + private function setLocking():Void{ + if (_locked){ + clickTarget_mc._height = container_pnl._height; + }else{ + clickTarget_mc._height = 45; + } + } + + public function set locked(setLock:Boolean):Void { + _locked = setLock; + setLocking(); + + } + + public function get locked():Boolean { + return _locked; + } + + private function localOnPress ():Void{ + + // check double-click + var now : Number = new Date ().getTime (); + if ((now - _dcStartTime) <= Config.DOUBLE_CLICK_DELAY) { + Debugger.log ('DoubleClicking:' + this, Debugger.GEN, 'localOnPress', 'CanvasReferenceActivity'); + _doubleClicking = true; + //if we double click on the glass mask - then open the container to allow the usr to see the activities inside. + if (_locked && !(_activity.isReadOnly() && (fromModuleTab == null || fromModuleTab == undefined))) { + _locked = false; + }else { + if(_activity.isReadOnly() && (fromModuleTab == null || fromModuleTab == undefined)) { + /** TODO: Change label warning */ + LFMessage.showMessageAlert(Dictionary.getValue('cv_activity_dbclick_readonly')); + } + _locked = true; + } + draw(); + }else { + Debugger.log ('SingleClicking:+' + this, Debugger.GEN, 'localOnPress', 'CanvasReferenceActivity'); + _doubleClicking = false; + _canvasController.activityClick (this); + } + _dcStartTime = now; + } + + + private function localOnRelease ():Void{ + Debugger.log ('_doubleClicking:' + _doubleClicking + ', localOnRelease:' + this, Debugger.GEN, 'localOnRelease', 'CanvasReferenceActivity'); + if (! _doubleClicking) { + _canvasController.activityRelease (this); + } + } + + + private function localOnReleaseOutside():Void { + Debugger.log ('localOnReleaseOutside:' + this, Debugger.GEN, 'localOnReleaseOutside', 'CanvasReferenceActivity'); + _canvasController.activityReleaseOutside (this); + } + /** + * + * @usage + * @return + */ + public function getVisibleWidth():Number { + return _visibleWidth; + } + /** + * + * @usage + * @return + */ + public function getVisibleHeight():Number { + return _visibleHeight; + } + + public function get actChildren():Array { + return _children; + } + + public function get children():Array { + return children_mc; + } + + public function get panelWidth():Number { + return (_panelWidth + 200); + } + + private function getAssociatedStyle():Object{ + + var styleObj:Object = new Object(); + styleObj = _tm.getStyleObject('ACTPanel1') + return styleObj; + } + + private function setStyles():Void { + var styleObj = _tm.getStyleObject ('label'); + title_lbl.setStyle (styleObj); + styleObj = _tm.getStyleObject ('PIlabel'); + actCount_lbl.setStyle ('styleName', styleObj); + styleObj = _tm.getStyleObject ('OptHeadPanel'); + header_pnl.setStyle ('styleName', styleObj); + + styleObj = getAssociatedStyle(); + container_pnl.setStyle ('styleName', styleObj); + } + + public function get controller():Object { + if (fromModuleTab == "monitorMonitorTab") { + return _monitorController; + } else { + return _canvasController; + } + } + + public function set controller(a):Void { + if(a instanceof CanvasController) + _canvasController = a; + else + _monitorController = a; + } +} Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as =================================================================== diff -u -r1d4d284be0fb2b3eacf000364553f72c70e46eae -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as (.../CanvasSuperModel.as) (revision 1d4d284be0fb2b3eacf000364553f72c70e46eae) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/cv/CanvasSuperModel.as (.../CanvasSuperModel.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -268,7 +268,7 @@ Debugger.log("Locking all Complex Activities", Debugger.GEN, "lockAllComplexActivities", "CanvasModel"); var k:Array = _activitiesDisplayed.values(); for (var i=0; i= menuList.length-4) && (i < menuList.length-2)) { + if ((i >= menuList.length-5) && (i < menuList.length-2)) { _toolbarMenu[i]._x = this.optional_btn._x; _toolbarMenu[i]._y = (_toolbarMenu[i-1]._y+_toolbarMenu[i-1].height)+btnOffset_Y; } if (i >= menuList.length-2){ _toolbarMenu[i]._x = this.flow_btn._x; - _toolbarMenu[i]._y = (_toolbarMenu[i-3]._y+_toolbarMenu[i-3].height)+btnOffset_Y; + _toolbarMenu[i]._y = (_toolbarMenu[i-4]._y+_toolbarMenu[i-4].height)+btnOffset_Y; } if (i == menuList.length){ Index: lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as (.../ToolkitController.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/authoring/tk/ToolkitController.as (.../ToolkitController.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -83,12 +83,32 @@ Debugger.log("av: " + (cv.getCanvasModel().activeView instanceof CanvasComplexView), Debugger.GEN, "iconDrop", "ToolkitController"); var optionalOnCanvas:Array = (cv.getCanvasModel().activeView instanceof CanvasComplexView) ? [cv.model.activeView.openActivity] : cv.getCanvasModel().findOptionalActivities(); + var referenceOnCanvas:CanvasReferenceActivity = cv.getCanvasModel().getReferenceActivityOnCanvas(); //SEE IF ITS HIT the canvas var isCanvasDrop:Boolean = cv.getCanvasModel().activeView.content.hitTest(dragIcon_mc); - Debugger.log('isCanvasDrop:'+isCanvasDrop,Debugger.GEN,'iconDrop','ToolkitController'); + // testing if dropped on a reference activity container + if ((referenceOnCanvas != null) && (cv.getCanvasModel().activeView instanceof CanvasView)){ + + var referenceX:Number = referenceOnCanvas.activity.xCoord; + var referenceY:Number = referenceOnCanvas.activity.yCoord; + + var referenceWidth:Number = referenceOnCanvas._width; + var referenceHeight:Number = referenceOnCanvas._height; + + if(iconMouseX >= referenceX && iconMouseX <= (referenceX + referenceWidth)){ + if(iconMouseY >= referenceY && iconMouseY <= (referenceY + referenceHeight)){ + isCanvasDrop = false; + var ta:TemplateActivity = _toolkitModel.getSelectedTemplateActivity(); + + cv.setDroppedTemplateActivity(ta, referenceOnCanvas.activity.activityUIID); + } + } + } + + // testing if dropped on each of the optional activity containers for(var i=0; i 0) + refHeightFull = 39 + _numActivities * 30; + + _lessonModel.setReferenceHeight(refHeightFull); + } + } + + public function isRefExpanded():Boolean{ + return _refIsExpanded; + } + + public function refFullHeight():Number{ + return refHeightFull; + } + + public function set numActivities(num:Number) { + _numActivities = num; + refHeightFull = (_numActivities > 0) ? (39 + _numActivities * 30) : 20; + _lessonModel.setReferenceHeight(refHeightFull); + } + + public function get numActivities():Number { + return _numActivities; + } + + public function localOnReleaseOutside():Void{ + Debugger.log('Release outside so no event has been fired, current state is: ' + _refIsExpanded,Debugger.GEN,'localOnReleaseOutside','Scratch Pad'); + } + + private function setStyles(){ + var styleObj = _tm.getStyleObject('BGPanel'); + refHead_pnl.setStyle('styleName',styleObj); + } + + private function setLabels(){ + refTitle_lbl.text = Dictionary.getValue("support_acts_title"); + setStyles(); + + delete this.onEnterFrame; + + dispatchEvent({type:'load',target:this}); + } + + function get className():String { + return 'Reference'; + } +} \ No newline at end of file Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as (.../Lesson.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/Lesson.as (.../Lesson.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -199,8 +199,9 @@ } - public function moveToActivity(fromAct, toAct){ - var callback:Function = Proxy.create(this, afterMoveActivity); + public function moveToActivity(fromAct, toAct, isReference){ + //don't call the function to show the normal learner jsp if it is a reference act + var callback:Function = (isReference!=true) ? Proxy.create(this, afterMoveActivity) : null; // call action var lessonId:Number = lessonModel.ID; @@ -218,27 +219,25 @@ private function getFlashProgress():Void{ Debugger.log('Loading flash progress.',Debugger.CRITICAL,'getFlashProgress','Lesson'); - + if(!finishedDesign) { // first time through set interval for method polling if(!_loadCheckIntervalID) { + _loadCheckIntervalID = setInterval(Proxy.create(this, getFlashProgress), LOAD_CHECK_INTERVAL); } else { _loadCheckCount++; Debugger.log('Waiting (' + _loadCheckCount + ') for data to load...',Debugger.CRITICAL,'getFlashProgress','Lesson'); - // if design loaded if(finishedDesign) { clearInterval(_loadCheckIntervalID); - callFlashProgress(); } else if(_loadCheckCount >= LOAD_CHECK_TIMEOUT_COUNT) { Debugger.log('Reached timeout waiting for data to load.',Debugger.CRITICAL,'getFlashProgress','Lesson'); clearInterval(_loadCheckIntervalID); var msg:String = Dictionary.getValue('al_timeout'); LFMessage.showMessageAlert(msg); - // clear count and restart polling check _loadCheckCount = 0; getFlashProgress(); @@ -251,7 +250,7 @@ } - private function callFlashProgress():Void { + public function callFlashProgress():Void { var callback:Function = Proxy.create(this,saveProgressData); var lessonId:Number = lessonModel.ID; Application.getInstance().getComms().getRequest('learning/learner.do?method=getFlashProgressData&lessonID='+String(lessonId), callback, false); @@ -355,6 +354,10 @@ } + public function showReferenceActivityPopup(request:String, activityID:Number) { + JsPopup.getInstance().launchPopupWindow(_root.serverURL + request, 'LearnerActivity'+activityID, 600, 800, true, true, true, false, false); + } + private function loadActivity(url:String){ Debugger.log('loading activity path using forward: ' + url,Debugger.CRITICAL,'loadActivity','org.lamsfoundation.lams.Lesson'); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonController.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonController.as (.../LessonController.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonController.as (.../LessonController.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -85,6 +85,17 @@ } public function activityDoubleClick(ca:Object):Void{ + + if (ca.isReferenceChild) { + // launch a popup + var URLToSend:String = 'learning/learner.do?method=forwardToLearnerActivityURL&activityID='+ca.activity.activityID+'&userID='+_root.userID+'&lessonID='+_root.lessonID; + _lessonModel.getLesson().moveToActivity(_lessonModel.progressData.getCurrentActivityId(), ca.activity.activityID, true); + _lessonModel.getLesson().showReferenceActivityPopup(URLToSend, ca.activity.activityID); + _app.getLesson().callFlashProgress(); + + return; + } + setBusy(); Debugger.log('activityDoubleClick CanvasActivity:'+ca.activity.activityID + ' status: ' + ca.activityStatus + 'type id: ' + ca.activity.activityTypeID,Debugger.GEN,'activityDoubleClick','LessonController'); Index: lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as =================================================================== diff -u -re067b86460735bebd9946535668f0482c5a577cc -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as (.../LessonModel.as) (revision e067b86460735bebd9946535668f0482c5a577cc) +++ lams_flash/src/central/flash/org/lamsfoundation/lams/learner/ls/LessonModel.as (.../LessonModel.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -26,6 +26,7 @@ import org.lamsfoundation.lams.learner.ls.*; import org.lamsfoundation.lams.common.util.*; import org.lamsfoundation.lams.common.Progress; +import org.lamsfoundation.lams.authoring.ComplexActivity; import org.lamsfoundation.lams.authoring.DesignDataModel; import org.lamsfoundation.lams.authoring.Activity; import org.lamsfoundation.lams.authoring.SequenceActivity; @@ -43,6 +44,7 @@ private var __y:Number; private var _spadHeight:Number; private var _presenceHeight:Number; + private var _referenceHeight:Number; private var _isDirty:Boolean; private var infoObj:Object; @@ -140,6 +142,16 @@ public function getPresenceHeight(){ return _presenceHeight; } + + public function setReferenceHeight(h:Number){ + _referenceHeight = h + Application.getInstance().onResize(); + } + + public function getReferenceHeight(){ + return _referenceHeight; + } + /** * Set Lesson's unique ID * @@ -536,15 +548,23 @@ ddmTransition_keys = learningDesignModel.transitions.keys(); var orderedActivityArr:Array = new Array(); + var orderedReferenceActArr:Array = new Array(); var trIndexArray:Array; var dataObj:Object; var ddmfirstActivity_key:Number = learningDesignModel.firstActivityID; var learnerFirstActivity:Activity = learningDesignModel.activities.get(ddmfirstActivity_key); - + var referenceActivity:ComplexActivity = learningDesignModel.getReferenceActivity(); + // recursive method to order design _eventsDisabled = false; orderDesign(learnerFirstActivity, orderedActivityArr); + if (referenceActivity != null) + orderDesign(referenceActivity, orderedReferenceActArr); // order the reference activities + + for (var i=0; i"; + } else { + ttMessage = ""+ _activity.title+"\n" + ttMessage; + } + + var ttWidth = 140; + + if (isReferenceChild) { + var ttXpos = 10; + var ttYpos = _root._ymouse - 43; + + } else if(_complex){ var ttXpos = appData.compX + xPos; var ttYpos = appData.compY + yPos; + } else { if(app.module == 'learner'){ var ttXpos = appData.compX + this._x-10; @@ -299,25 +337,22 @@ var ttYpos = appData.compY + this._y+targetHeightOffset; } - var ttHolder = appData.ttHolder; - Debugger.log("ttHolder: "+ttHolder, Debugger.CRITICAL, "showToolTip", "LearnerActivity"); + if (isReferenceChild) + ttHolder.swapDepths( (this._parent.getDepth()+1) ); // tooltips were showing below depth of this._parent, the reference pain - if (ttMessage == undefined || ttMessage == null || ttMessage == "" || ttMessage == "undefined"){ - ttMessage = ""+ _activity.title+""; - } else { - ttMessage = ""+ _activity.title+"\n" + ttMessage; - } - - var ttWidth = 140; _tip.DisplayToolTip(ttHolder, ttMessage, ttXpos, ttYpos, undefined, ttWidth); } + // Returns true if the parent activity is a Reference Activity + public function get isReferenceChild():Boolean { + return _isReferenceChild; + } + /** * Hide the tooltip. * */ - public function hideToolTip():Void{ _tip.CloseToolTip(); } @@ -328,6 +363,13 @@ */ private function onRollOver(){ + + // handle reference activities + if (isReferenceChild) { + showToolTip(this.clickTarget_mc, Dictionary.getValue("support_act_tooltip")); + return; + } + if (actStatus == "completed_mc"){ showToolTip(this.clickTarget_mc, Dictionary.getValue("completed_act_tooltip")); @@ -482,6 +524,10 @@ controller.activityReleaseOutside(this); } + public function get progressData():Progress { + return learner; + } + public function set progressData(a:Progress){ learner = a; } Index: lams_flash/src/common/flash/org/lamsfoundation/lams/common/ui/LFMenuBar.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/common/flash/org/lamsfoundation/lams/common/ui/LFMenuBar.as (.../LFMenuBar.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/common/flash/org/lamsfoundation/lams/common/ui/LFMenuBar.as (.../LFMenuBar.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -141,6 +141,7 @@ file_menu.addMenuItem({type:"separator"}); file_menu.addMenuItem({label:Dictionary.getValue('mnu_file_import'), instanceName:"importItem"}); + file_menu.addMenuItem({label:"Import from community", instanceName:"importFromCommunity"}); file_menu.addMenuItem({label:Dictionary.getValue('mnu_file_export'), instanceName:"exportItem", enabled:false}); file_menu.addMenuItem({type:"separator"}); @@ -293,10 +294,17 @@ Debugger.log('Clicked File > Insert...',Debugger.GEN,'fileMenuClicked','LFMenuBar'); org.lamsfoundation.lams.authoring.Application(app).getCanvas().openDesignBySelection(Workspace.MODE_INSERT); break; + case eventObj.menu.importItem: Debugger.log('Clicked File > Import',Debugger.GEN,'fileMenuClicked','LFMenuBar'); org.lamsfoundation.lams.authoring.Application(app).getCanvas().launchImportWindow(); break; + + case eventObj.menu.importFromCommunity: + Debugger.log('Clicked File > Import from Community ...',Debugger.GEN,'fileMenuClicked','LFMenuBar'); + org.lamsfoundation.lams.authoring.Application(app).getCanvas().launchImportWindow("importLC"); + break; + case eventObj.menu.exportItem: Debugger.log('Clicked File > Export',Debugger.GEN,'fileMenuClicked','LFMenuBar'); org.lamsfoundation.lams.authoring.Application(app).getCanvas().launchExportWindow(); Index: lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/Debugger.as =================================================================== diff -u -r7b65bab3de4ed5068c5631a245c30cb4eaa8f098 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 --- lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/Debugger.as (.../Debugger.as) (revision 7b65bab3de4ed5068c5631a245c30cb4eaa8f098) +++ lams_flash/src/common/flash/org/lamsfoundation/lams/common/util/Debugger.as (.../Debugger.as) (revision 0e378dd9696fcf3cd772974aa98f0cef54fdb972) @@ -31,7 +31,7 @@ /** * Debug -* Can be used to print message to a floating windoe and to trace windoe. SHoudl be used over trace(). +* Can be used to print message to a floating window and to trace window. Should be used over trace(). * Usage: * import org.lamsfoundation.lams.common.util.Debug; * @@ -221,7 +221,7 @@ log("Recieved unsupported error type",Debugger.CRITICAL,"error","Debugger"); } - } + } /** * Legacy Method to print a message to the output - trace or window... * @param msg The actual message to be printed Index: lams_learning/web/lams_learner.swf =================================================================== diff -u -r3fc9626d0692f03e5998d786766a82f45e640e03 -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_monitoring/web/lams_monitoring.swf =================================================================== diff -u -r61f33c6437f33639bb8f9b200be50795bfaf0b5f -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ Index: lams_monitoring/web/lams_monitoring_library.swf =================================================================== diff -u -r61f33c6437f33639bb8f9b200be50795bfaf0b5f -r0e378dd9696fcf3cd772974aa98f0cef54fdb972 Binary files differ