Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/Canvas.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/Canvas.as (.../Canvas.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/Canvas.as (.../Canvas.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -3,21 +3,37 @@ import org.lamsfoundation.lams.common.util.* import org.lamsfoundation.lams.authoring.* import org.lamsfoundation.lams.common.ui.* +import org.lamsfoundation.lams.common.dict.* import mx.managers.* +import mx.utils.* /** -* The canvas is the main screen area of the LAMS application where activies are added and sequenced -*/ + * The canvas is the main screen area of the LAMS application where activies are added and sequenced + * Note - This holds the DesignDataModel _ddm + * @version 1.0 + * @since + */ class org.lamsfoundation.lams.authoring.cv.Canvas { + + //Constants + public static var USE_PROPERTY_INSPECTOR = false; + //Model private var canvasModel:CanvasModel; //View private var canvasView:CanvasView; - private var _canvasView_mc:MovieClip; - private var app:Application; - private var ddm:DesignDataModel; + private var _canvasView_mc:MovieClip; + private var app:Application; + private var _ddm:DesignDataModel; + private var _undoStack:Array; + private var _redoStack:Array; + + + private var _pi:MovieClip; //Property inspector + private var _bin:MovieClip;//bin + //Defined so compiler can 'see' events added at runtime by EventDispatcher private var dispatchEvent:Function; public var addEventListener:Function; @@ -32,8 +48,12 @@ public function Canvas (target_mc:MovieClip,depth:Number,x:Number,y:Number,w:Number,h:Number){ mx.events.EventDispatcher.initialize(this); + //Design Data Model. + _ddm = new DesignDataModel(); + //Create the model. - canvasModel = new CanvasModel(); + //pass in a ref to this container + canvasModel = new CanvasModel(this); //Create the view _canvasView_mc = target_mc.createChildAtDepth("canvasView",DepthManager.kTop); @@ -42,90 +62,278 @@ canvasView = CanvasView(_canvasView_mc); canvasView.init(canvasModel,undefined,x,y,w,h); - //Add listener to view so that we know when it's loaded + + //Get reference to application and design data model + app = Application.getInstance(); + + _undoStack = new Array(); + _redoStack = new Array(); + + //some initialisation: + + + //Add listener to view so that we know when it's loaded canvasView.addEventListener('load',Proxy.create(this,viewLoaded)); + + _ddm.addEventListener('ddmUpdate',Proxy.create(this,onDDMUpdated)); + _ddm.addEventListener('ddmBeforeUpdate',Proxy.create(this,onDDMBeforeUpdate)); + + //Register view with model to receive update events canvasModel.addObserver(canvasView); - //Get reference to application and design data model - app = Application.getInstance(); - ddm = app.getDesignDataModel(); - + //Set the position by setting the model which will call update on the view canvasModel.setPosition(x,y); - //Initialise size to the designed size canvasModel.setSize(w,h); + + //muist comne after the canvasView as we use the defaultController method to get a controller ref. + if(USE_PROPERTY_INSPECTOR){ + initPropertyInspector(); + } + + //if in monitor, dont do it! + initBin(); + + } /** * Event dispatched from the view once it's loaded */ public function viewLoaded(evt:Object) { - Debugger.log('Canvas view loaded: ' + evt.type,Debugger.GEN,'viewLoaded','Canvas'); + //Debugger.log('Canvas view loaded: ' + evt.type,Debugger.GEN,'viewLoaded','Canvas'); if(evt.type=='load') { dispatchEvent({type:'load',target:this}); }else { Debugger.log('Event type not recognised : ' + evt.type,Debugger.CRITICAL,'viewLoaded','Canvas'); } } + + /** * Opens a design using workspace and user to select design ID - * + * passes the callback function to recieve selected ID */ public function openDesignBySelection(){ //Work space opens dialog and user will select view - var ws = Application.getInstance().getWorkspace(); - ws.userSelectItem(); + var callback:Function = Proxy.create(this, openDesignById); + var ws = Application.getInstance().getWorkspace(); + ws.userSelectItem(callback); } - public function openDesignById(designId:Number){ - //trace('Canvas.openDesignById'); - //Request design from server via Comms + /** + * Request design from server using supplied ID. + * @usage + * @param designId + * @return + */ + public function openDesignById(workspaceResultDTO:Object){ + + ObjectUtils.toString(workspaceResultDTO); + var designId:Number = workspaceResultDTO.selectedResourceID; + var callback:Function = Proxy.create(this,setDesign); - - Application.getInstance().getComms().getRequest('http://dolly.uklams.net/lams/lams_authoring/learning_design.xml',callback, true); + + //Application.getInstance().getComms().getRequest('flashxml/learning_design.xml',callback, false); + Application.getInstance().getComms().getRequest('authoring/author.do?method=getLearningDesignDetails&learningDesignID='+designId,callback, false); //var designObject:Object = Application.getInstance().getComms().getRequest('authoring/author.do?method=getLearningDesign&learningDesignID='+designId,callback); - //var designObject:Object = Application.getInstance().getComms().getRequest('http://dolly.uklams.net/lams/lams_authoring/liblist.xml',callback); + } + + public function saveDesign(){ + if(_ddm.learningDesignID == undefined){ + saveDesignToServerAs(); + }else{ + saveDesignToServer(); + } + } - public function setDroppedTemplateActivity(ta:TemplateActivity):Void{ - var dto:Object = ta.getTemplateActivityData(); - Debugger.log('ta, got a:'+dto.title,4,'setDroppedTemplateActivity','Canvas'); - //TODO: Create a fully fledged activity - including all required fields. + /** + * Launch workspace browser dialog and set the design metat data for saving + * E.g. Title, Desc, Folder etc... also license if required? + * @usage + * @param tabToShow The tab to be selected when the dialogue opens. + * @return + */ + public function saveDesignToServerAs(){ + //clear the learningDesignID so it will not overwrite the existing one + _ddm.learningDesignID = null; - - //see what kind of activity we are to produce. - //if(dto. - _global.breakPointbreakpoint(); -// function Activity(activityUIID:Number, activityTypeID:Number, activityCategoryID:Number, learningLibraryID:Number,libraryActivityUIImage:String){ - //TODO:FIx this bug here... constructor values are not correct, need to rebuild server first and use actual call. - Debugger.log('!!!! WARNING USING HARDCODED ACTIVITY VALUES To be fixed at deployment !!!!!!' ,Debugger.CRITICAL,'setDroppedTemplateActivity','Canvas'); - var actToAdd:Activity = new Activity(ddm.newUIID(), Activity.TOOL_ACTIVITY_TYPE, Activity.CATEGORY_COLLABORATION ,dto.learningLibraryID, dto.libraryActivityUiImage); + var onOkCallback:Function = Proxy.create(this, saveDesignToServer); + var ws = Application.getInstance().getWorkspace(); + ws.setDesignProperties("LOCATION",onOkCallback); + + } + /** + * Updates the design with the detsils form the workspace : + * * + * _resultDTO.selectedResourceID //The ID of the resource that was selected when the dialogue closed + * _resultDTO.resourceName //The contents of the Name text field + * _resultDTO.resourceDescription //The contents of the description field on the propertirs tab + * _resultDTO.resourceLicenseText //The contents of the license text field + * _resultDTO.resourceLicenseID //The ID of the selected license from the drop down. + * + * And then saves the design to the sever by posting XML via comms class + * @usage + * @return + */ + public function saveDesignToServer(workspaceResultDTO:Object):Boolean{ + _global.breakpoint(); + //TODO: Set the results from wsp into design. + if(workspaceResultDTO != null){ + if(workspaceResultDTO.selectedResourceID != null){ + //must be overwriting an existing design as we have a new resourceID + _ddm.learningDesignID = workspaceResultDTO.selectedResourceID; + } + _ddm.workspaceFolderID = workspaceResultDTO.targetWorkspaceFolderID; + _ddm.title = workspaceResultDTO.resourceName; + _ddm.description = workspaceResultDTO.resourceDescription; + _ddm.licenseText = workspaceResultDTO.resourceLicenseText; + _ddm.licenseID = workspaceResultDTO.resourceLicenseID; + } + + var dto:Object = _ddm.getDesignForSaving(); + + var callback:Function = Proxy.create(this,onStoreDesignResponse); + + Application.getInstance().getComms().sendAndReceive(dto,"authoring/storeLearningDesignDetails",callback,false); + //Application.getInstance().getComms().sendAndReceive(dto,"http://dolly.uklams.net:8080/lams/authoring/authorServlet",onStoreDesignResponse,true); + //Application.getInstance().getComms().sendAndReceive(dto,"http://geo.uklams.net/testing/printPost.php",onStoreDesignResponse,true); + + return true; + //public function sendAndReceive(dto:Object, requestURL:String,handler:Function,isFullURL){ + } + + public function onStoreDesignResponse(r):Void{ + //Debugger.log('Response:'+ObjectUtils.printObject(response),Debugger.GEN,'onStoreDesignResponse','Canvas'); + if(r instanceof LFError){ + r.showErrorAlert(); + }else{ + //_global.breakpoint(); + //TODO: + //Debugger.log('_ddm.learningDesignID:'+_ddm.learningDesignID,Debugger.GEN,'setDroppedTemplateActivity','Canvas'); + _ddm.learningDesignID = r; + Debugger.log('_ddm.learningDesignID:'+_ddm.learningDesignID,Debugger.GEN,'onStoreDesignResponse','Canvas'); + + + var msg:String = "Your design has been saved with ID:"+r; + LFMessage.showMessageAlert(msg); + + } + } + + /** + * Called when a template activity is dropped onto the canvas + * @usage + * @param ta TemplateActivity + * @return + */ + public function setDroppedTemplateActivity(ta:TemplateActivity):Void{ + + var actToCopy:Activity = ta.mainActivity; + //loosly typed this var as it might be any type of activity + var actToAdd:Activity; + + Debugger.log('actToCopy.activityTypeID:'+actToCopy.activityTypeID,Debugger.GEN,'setDroppedTemplateActivity','Canvas'); + //_global.breakpoint(); + switch(actToCopy.activityTypeID){ + + case(Activity.TOOL_ACTIVITY_TYPE): + actToAdd = ToolActivity(actToCopy.clone()); + //give it a new UIID: + actToAdd.activityUIID = _ddm.newUIID(); + break; + //case(Activity.OPTIONS_ACTIVITY_TYPE): + case(Activity.PARALLEL_ACTIVITY_TYPE): + + actToAdd = Activity(actToCopy.clone()); + + //give it a new UIID: + actToAdd.activityUIID = _ddm.newUIID(); + + + Debugger.log('parallel activity given new UIID of:'+actToAdd.activityUIID ,Debugger.GEN,'setDroppedTemplateActivity','Canvas'); + //now get this acts children and add them to the design (WHINEY VOICE:"will somebody pleeeease think of the children.....") + for(var i=0;i0){ + //get the last state off the stack + var snapshot = _undoStack.pop(); + + //get a copy of the current design and stick it in redo + _redoStack.push(_ddm.toData()); + + clearCanvas(true); + //set the current design to the snapshot value + _ddm.setDesign(snapshot,true); + canvasModel.setDirty(); + + //Debugger.log('After executing _undoStack.length:'+_undoStack.length,Debugger.GEN,'undo','Canvas'); + //Debugger.log('After executing _redoStack.length:'+_redoStack.length,Debugger.GEN,'undo','Canvas'); + + }else{ + Debugger.log("Cannot Undo! no data on stack!",Debugger.GEN,'redo','Canvas'); + } + } + + /** + * Redo last what was undone by the undo method. + * NOTE: if a new edit is made, the re-do stack is cleared + * @usage + * @return + */ + public function redo():Void{ + + //Debugger.log('Before executing _undoStack.length:'+_undoStack.length,Debugger.GEN,'redo','Canvas'); + //Debugger.log('Before executing _redoStack.length:'+_redoStack.length,Debugger.GEN,'redo','Canvas'); + //_global.breakpoint(); + + if(_redoStack.length > 0){ + //get the last state off the stack + var snapshot = _redoStack.pop(); + + _undoStack.push(_ddm.toData()); + + clearCanvas(true); + + _ddm.setDesign(snapshot,true); + canvasModel.setDirty(); + + //Debugger.log('After executing _undoStack.length:'+_undoStack.length,Debugger.GEN,'undo','Canvas'); + //Debugger.log('After executing _redoStack.length:'+_redoStack.length,Debugger.GEN,'undo','Canvas'); + + }else{ + Debugger.log("Cannot Redo! no data on stack!",Debugger.GEN,'redo','Canvas'); + } + + } + + + + + /** * Used by application to set the Position * @param x * @param y @@ -214,4 +680,20 @@ return 'Canvas'; } + public function get ddm():DesignDataModel{ + return _ddm; + } + + + /** + * + * @usage + * @return + */ + public function get bin ():MovieClip { + return _bin; + } + + + } Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as (.../CanvasActivity.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasActivity.as (.../CanvasActivity.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -8,55 +8,73 @@ /** * CanvasActivity - */ -class org.lamsfoundation.lams.authoring.cv.CanvasActivity extends MovieClip{ +class org.lamsfoundation.lams.authoring.cv.CanvasActivity extends MovieClip implements ICanvasActivity{ +//class org.lamsfoundation.lams.authoring.cv.CanvasActivity extends MovieClip{ //this is set by the init object private var _canvasController:CanvasController; private var _canvasView:CanvasView; + //TODO:This should be ToolActivity private var _activity:Activity; //locals - private var _icon_mc; + private var icon_mc:MovieClip; + private var icon_mcl:MovieClipLoader; private var title_lbl:MovieClip; private var stopSign_mc:MovieClip; private var clickTarget_mc:MovieClip; private var canvasActivity_mc:MovieClip; private var _dcStartTime:Number = 0; private var _doubleClicking:Boolean; + private var _visibleWidth:Number; + private var _visibleHeight:Number; + + function CanvasActivity(){ - Debugger.log("_activity:"+_activity.title,4,'Constructor','CanvasActivity'); - //let it wait one frame to set up the components. - MovieClipUtils.doLater(Proxy.create(this,init)); + //Debugger.log("_activity:"+_activity.title,4,'Constructor','CanvasActivity'); + //let it wait one frame to set up the components. + //this has to be set b4 ther do later :) + _visibleHeight = canvasActivity_mc._height; + _visibleWidth = canvasActivity_mc._width; + //call init if we have passed in the _activity as an initObj in the attach movie, + //otherwise wait as the class outside will call it + if(_activity != undefined){ + init(); + } + } - public function init():Void{ + public function init(initObj):Void{ + if(initObj){ + _canvasView = initObj.canvasView; + _canvasController = initObj.canvasController; + _activity = initObj.activity; + } canvasActivity_mc._visible=false; stopSign_mc._visible=false; title_lbl._visible=false; clickTarget_mc._visible=false; - _global.breakpoint(); - if(_activity.isGateActivity()){ - loadIcon(); - } - draw(); + + loadIcon(); + + MovieClipUtils.doLater(Proxy.create(this,draw)); + } - public function get activity():Activity{ - return _activity; - } - public function set activity(a:Activity){ - _activity = a; - } - private function loadIcon():Void{ - Debugger.log('Running, _activity.libraryActivityUIImage:'+_activity.libraryActivityUIImage,4,'loadIcon','CanvasActivity'); - _icon_mc = this.createEmptyMovieClip("_icon_mc", this.getNextHighestDepth()); - var ml = new MovieLoader(_activity.libraryActivityUIImage,setUpActIcon,this,_icon_mc); + //Debugger.log('Running, _activity.libraryActivityUIImage:'+_activity.libraryActivityUIImage,4,'loadIcon','CanvasActivity'); + icon_mc = this.createEmptyMovieClip("icon_mc", this.getNextHighestDepth()); + var ml = new MovieLoader(Config.getInstance().serverUrl+_activity.libraryActivityUIImage,setUpActIcon,this,icon_mc); + //icon_mc = MovieLoader.movieCache[Config.getInstance().serverUrl+_activity.libraryActivityUIImage]; + //Debugger.log('icon_mc:'+icon_mc,4,'loadIcon','CanvasActivity'); + setUpActIcon(icon_mc); } + + @@ -66,7 +84,7 @@ } private function draw(){ - Debugger.log(_activity.title,4,'draw','CanvasActivity'); + Debugger.log(_activity.title+',_activity.isGateActivity():'+_activity.isGateActivity(),4,'draw','CanvasActivity'); if(_activity.isGateActivity()){ stopSign_mc._visible = true; }else{ @@ -78,7 +96,15 @@ } //indicate grouping - + + //position + _x = _activity.xCoord; + _y = _activity.yCoord; + + + + Debugger.log('canvasActivity_mc._visible'+canvasActivity_mc._visible,4,'draw','CanvasActivity'); + _visible = true; } @@ -89,7 +115,7 @@ var now:Number = new Date().getTime(); if((now - _dcStartTime) <= Config.DOUBLE_CLICK_DELAY){ - Debugger.log('DoubleClicking:'+this,Debugger.GEN,'onPress','CanvasActivity'); + //Debugger.log('DoubleClicking:'+this,Debugger.GEN,'onPress','CanvasActivity'); _doubleClicking = true; _canvasController.activityDoubleClick(this); @@ -105,10 +131,11 @@ */ }else{ - Debugger.log('SingleClicking:+'+this,Debugger.GEN,'onPress','CanvasActivity'); + //Debugger.log('SingleClicking:+'+this,Debugger.GEN,'onPress','CanvasActivity'); _doubleClicking = false; - Debugger.log('_canvasController:'+_canvasController,Debugger.GEN,'onPress','CanvasActivity'); + //Debugger.log('_canvasController:'+_canvasController,Debugger.GEN,'onPress','CanvasActivity'); + _canvasController.activityClick(this); @@ -138,23 +165,58 @@ private function onRelease():Void{ if(!_doubleClicking){ - Debugger.log('Releasing:'+this,Debugger.GEN,'onRelease','CanvasActivity'); + //Debugger.log('Releasing:'+this,Debugger.GEN,'onRelease','CanvasActivity'); + _canvasController.activityRelease(this); } } private function onReleaseOutside():Void{ - Debugger.log('ReleasingOutside:'+this,Debugger.GEN,'onReleaseOutside','CanvasActivity'); + //Debugger.log('ReleasingOutside:'+this,Debugger.GEN,'onReleaseOutside','CanvasActivity'); + _canvasController.activityReleaseOutside(this); } + /** + * + * @usage + * @return + */ + public function getVisibleWidth ():Number { + return _visibleWidth; + } + + /** + * + * @usage + * @return + */ + public function getVisibleHeight ():Number { + return _visibleHeight; + } + - + public function get activity():Activity{ + return getActivity(); + } + + public function set activity(a:Activity){ + setActivity(a); + } + + + public function getActivity():Activity{ + return _activity; + + } + + public function setActivity(a:Activity){ + _activity = a; + } - } \ No newline at end of file Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as (.../CanvasController.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasController.as (.../CanvasController.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -25,34 +25,74 @@ } - public function activityClick(ca:CanvasActivity):Void{ + public function activityClick(ca:Object):Void{ Debugger.log('activityClick CanvasActivity:'+ca.activity.activityUIID,Debugger.GEN,'activityClick','CanvasController'); //if transition tool active - if(isTransitionToolActive()){ + if(_canvasModel.isTransitionToolActive()){ + var transitionTarget = createValidTransitionTarget(ca); + if(transitionTarget instanceof LFError){ + transitionTarget.showErrorAlert(null); + }else{ + _canvasModel.addActivityToTransition(transitionTarget); + } + /* _canvasModel.resetTransitionTool(); - if(ca instanceof CanvasActivity){ + if(ca instanceof CanvasActivity || ca instanceof CanvasParallelActivity ){ _canvasModel.addActivityToTransition(ca); } + */ }else{ + //just select the activity + _canvasModel.selectedItem = ca; + _canvasModel.isDragging = true; + ca.startDrag(false); - } } - public function activityDoubleClick(ca:CanvasActivity):Void{ + public function activityDoubleClick(ca:Object):Void{ Debugger.log('activityDoubleClick CanvasActivity:'+ca.activity.activityUIID,Debugger.GEN,'activityDoubleClick','CanvasController'); - + _canvasModel.selectedItem = ca; + if(ca.activity.activityTypeID == Activity.TOOL_ACTIVITY_TYPE){ + _canvasModel.openToolActivityContent(ca.activity); + }else{ + //TODO: Show the property inspector if its a parralel activity or whatever + } } - public function activityRelease(ca:CanvasActivity):Void{ + public function activityRelease(ca:Object):Void{ Debugger.log('activityRelease CanvasActivity:'+ca.activity.activityUIID,Debugger.GEN,'activityRelease','CanvasController'); - + if(_canvasModel.isDragging){ + ca.stopDrag(); + //if we are on the bin - trash it + if (ca.hitTest(_canvasModel.getCanvas().bin)){ + _canvasModel.getCanvas().removeActivity(ca.activity.activityUIID); + } + + //get a view if ther is not one + if(!_canvasView){ + _canvasView = CanvasView(getView()); + } + + //give it the new co-ords and 'drop' it + + ca.activity.xCoord = ca._x; + ca.activity.yCoord = ca._y; + + //refresh the transitions + + Debugger.log('ca.activity.xCoord:'+ca.activity.xCoord,Debugger.GEN,'activityRelease','CanvasController'); + + + } } - public function activityReleaseOutside(ca:CanvasActivity):Void{ + public function activityReleaseOutside(ca:Object):Void{ Debugger.log('activityReleaseOutside CanvasActivity:'+ca.activity.activityUIID,Debugger.GEN,'activityReleaseOutside','CanvasController'); - if(isTransitionToolActive()){ + if(_canvasModel.isTransitionToolActive()){ + + //get a ref to the CanvasActivity the transition pen is over when released var currentCursor:MovieClip = Cursor.getCurrentCursorRef(); //Debugger.log("currentCursor:"+currentCursor, Debugger.GEN,'activityReleaseOutside','CanvasController'); @@ -65,39 +105,24 @@ //Debugger.log("Subst:"+dt, Debugger.GEN,'activityReleaseOutside','CanvasController'); var transitionTarget_mc:MovieClip = eval(dt); Debugger.log("Transition drop target:"+transitionTarget_mc, Debugger.GEN,'activityReleaseOutside','CanvasController'); - //try to cast to a CanvasActivity - ca = CanvasActivity(transitionTarget_mc); - if(ca instanceof CanvasActivity){ - - //TODO: Check on status of try catch bug - /* - try{ - _canvasModel.addActivityToTransition(ca); - //}catch(e:org.lamsfoundation.lams.common.util.LFError){ - }catch(e:LFError){ - trace('in catch'); - Debugger.error(e); - } - */ - - var r:Object = _canvasModel.addActivityToTransition(ca); - if(r instanceof LFError){ - Debugger.error(r); - } + var transitionTarget = createValidTransitionTarget(transitionTarget_mc); + if(transitionTarget instanceof LFError){ + transitionTarget.showErrorAlert(null); }else{ - //released over something other than a CanvasActivity so reset the t tool - _canvasModel.resetTransitionTool(); + _canvasModel.addActivityToTransition(transitionTarget); } + _canvasModel.resetTransitionTool(); + - //var path:String = dt.split("."); - //var droppedActIconId = path[3]; - //check to make sure it is not optional - //var actualTrTarget = checkTransitionTarget(droppedActIconId); - //createTransition(workspaceRef[actualTrTarget]); }else{ + if(_canvasModel.isDragging){ + ca.stopDrag(); + if (ca.hitTest(_canvasModel.getCanvas().bin)){ + _canvasModel.getCanvas().removeActivity(ca.activity.activityUIID); + } + } - } @@ -107,8 +132,10 @@ public function transitionClick(ct:CanvasTransition):Void{ Debugger.log('transitionClick Transition:'+ct.transition.uiID,Debugger.GEN,'transitionClick','CanvasController'); + _canvasModel.selectedItem = ct; + _canvasModel.isDragging = true; + ct.startDrag(false); - } public function transitionDoubleClick(ct:CanvasTransition):Void{ @@ -118,18 +145,86 @@ _canvasView = CanvasView(getView()); Debugger.log('_canvasView:'+_canvasView,Debugger.GEN,'transitionDoubleClick','CanvasController'); _canvasView.createTransitionPropertiesDialog("centre",tpOKHandler); + + _canvasModel.selectedItem = ct; } - public function tpOKHandler():Void{ - + public function transitionRelease(ct:CanvasTransition):Void{ + if(_canvasModel.isDragging){ + ct.stopDrag(); + + if (ct.hitTest(_canvasModel.getCanvas().bin)){ + _canvasModel.getCanvas().removeTransition(ct.transition.transitionUIID); + } + + + } + + } + + public function transitionReleaseOutside(ct:CanvasTransition):Void{ + transitionRelease(ct); + } - private function isTransitionToolActive():Boolean{ - if(_canvasModel.activeTool == CanvasModel.TRANSITION_TOOL){ - return true; - }else{ - return false; - } + + /** + * Transition Properties OK Handler + * @usage + * @return + */ + public function tpOKHandler():Void{ + Debugger.log('!!!!!!!!! FUNCTION NOT IMPLEMENTED !!!!!!!!',Debugger.CRITICAL,'tpOKHandler','CanvasController'); } + + private function createValidTransitionTarget(transitionTargetObj:Object):Object{ + var targetCA:Object; + //see what we can cast to + if(CanvasActivity(transitionTargetObj)!=null){ + Debugger.log("Casting to CanvasActivity", Debugger.GEN,'activityReleaseOutside','CanvasController'); + targetCA = CanvasActivity(transitionTargetObj); + return targetCA; + }else if(CanvasParallelActivity(transitionTargetObj)!=null){ + Debugger.log("Casting to CanvasParallelActivity", Debugger.GEN,'activityReleaseOutside','CanvasController'); + targetCA = CanvasParallelActivity(transitionTargetObj); + return targetCA; + }else{ + var e = new LFError("__You cannot create a transition to this object__","activityReleaseOutside",this,String(transitionTargetObj)); + //bail + return e; + } + + /* + //if(ca instanceof CanvasActivity){ + if(ICanvasActivity(ca) != null){ + Debugger.log("Target implements ICanvasActivity", Debugger.GEN,'activityReleaseOutside','CanvasController'); + var r:Object = _canvasModel.addActivityToTransition(targetCA); + if(r instanceof LFError){ + //Debugger.error(r); + r.showErrorAlert(null); + } + //TODO: Check on status of try catch bug + *//* + try{ + _canvasModel.addActivityToTransition(ca); + //}catch(e:org.lamsfoundation.lams.common.util.LFError){ + }catch(e:LFError){ + trace('in catch'); + Debugger.error(e); + } + */ + + + + /* + }else{ + Debugger.log("Target does NOT implement ICanvasActivity", Debugger.CRITICAL,'activityReleaseOutside','CanvasController'); + //released over something other than a CanvasActivity so reset the t tool + + } + */ + } + + } Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as (.../CanvasModel.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasModel.as (.../CanvasModel.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -1,4 +1,4 @@ -import org.lamsfoundation.lams.common.util.Observable; +import org.lamsfoundation.lams.common.*; import org.lamsfoundation.lams.authoring.cv.*; import org.lamsfoundation.lams.authoring.*; import org.lamsfoundation.lams.common.util.*; @@ -18,18 +18,21 @@ private var infoObj:Object; - private var _ddm:DesignDataModel; + + private var _cv:Canvas; //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 _isDrawingTransition:Boolean; private var _transitionActivities:Array; + private var _isDragging:Boolean; + - //these are hashtables of mc refs MOVIECLIPS + //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; @@ -41,14 +44,18 @@ /** * Constructor. */ - public function CanvasModel (){ + public function CanvasModel (cv:Canvas){ //Set up this class to use the Flash event delegation model EventDispatcher.initialize(this); - + _cv = cv; _activitiesDisplayed = new Hashtable("_activitiesDisplayed"); _transitionsDisplayed = new Hashtable("_transitionsDisplayed"); - _ddm = Application.getInstance().getDesignDataModel(); + + + + + _activeTool = null; _transitionActivities = new Array(); } @@ -133,6 +140,11 @@ refreshDesign(); } + + //////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////// TRANSITIONS ////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////// + /** * Starts the transition tool * @usage @@ -153,16 +165,24 @@ public function stopTransitionTool():Void{ Debugger.log('Stopping transition tool',Debugger.GEN,'stopTransitionTool','CanvasModel'); + resetTransitionTool(); + _activeTool = null; broadcastViewUpdate("STOP_TRANSITION_TOOL"); } - public function addActivityToTransition(ca:CanvasActivity):Object{ + /** + * Adds another Canvas Activity to the transition. + * Only 2 may be added, adding the 2nd one triggers the creation of the transition. + * @usage + * @param ca (Canvas Activity) + * @return + */ + public function addActivityToTransition(ca:Object):Object{ //check we have not added too many if(_transitionActivities.length >= 2){ //TODO: show an error - Debugger.log('Too many activities in the Transition',Debugger.CRITICAL,'addActivityToTransition','CanvasModel'); - return false; + return new LFError("Too many activities in the Transition","addActivityToTransition",this); } Debugger.log('Adding Activity.UIID:'+ca.activity.activityUIID,Debugger.GEN,'addActivityToTransition','CanvasModel'); _transitionActivities.push(ca); @@ -173,22 +193,41 @@ return new LFError("You cannot create a Transition between the same Activities","addActivityToTransition",this); } if(!_activitiesDisplayed.containsKey(_transitionActivities[0].activity.activityUIID)){ - return new LFError("First activity of the Transition is missing, UIID:"+ca[0].activity.activityUIID,"addActivityToTransition",this); + return new LFError("First activity of the Transition is missing, UIID:"+_transitionActivities[0].activity.activityUIID,"addActivityToTransition",this); } if(!_activitiesDisplayed.containsKey(_transitionActivities[1].activity.activityUIID)){ - return new LFError("Second activity of the Transition is missing, UIID:"+ca[1].activity.activityUIID,"addActivityToTransition",this); + return new LFError("Second activity of the Transition is missing, UIID:"+_transitionActivities[1].activity.activityUIID,"addActivityToTransition",this); } + //check there is not already a transition to or from this activity: + var transitionsArray:Array = _cv.ddm.transitions.values(); + /**/ + for(var i=0;i 0 || ddm_activity.parentUIID > 0){ + return r = "CHILD"; + } + //if they are the same (ref should point to same act) then nothing to do. //if the ddm does not have an act displayed then we need to remove it from the cm //if the ddm has an act that cm does not ref, then we need to add it. @@ -233,19 +302,27 @@ } //check for a new act in the dmm - if(cm_activity == null){ + if(cm_activity == null || cm_activity == undefined){ return r = "NEW"; } //check if act has been removed from canvas - if(ddm_activity == null){ + if(ddm_activity == null || ddm_activity == undefined){ return r = "DELETE"; } } + /** + * Compares 2 transitions, decides if they are new, the same or to be deleted + * @usage + * @param ddm_transition + * @param cm_transition + * @return + */ private function compareTransitions(ddm_transition:Transition, cm_transition:Transition):Object{ + Debugger.log('Comparing ddm_activity:'+ddm_transition.title+'('+ddm_transition.transitionUIID+') WITH cm_transition:'+cm_transition.title+'('+cm_transition.transitionUIID+')',Debugger.GEN,'compareTransitions','CanvasModel'); var r:Object = new Object(); if(ddm_transition === cm_transition){ return r = "SAME"; @@ -264,56 +341,116 @@ } + /** + * Compares the design in the CanvasModel (what is displayed on the screen) + * against the design in the DesignDataModel and updates the Canvas Model accordingly. + * NOTE: Design elements are added to the DDM here, but removed in the View + * + * @usage + * @return + */ private function refreshDesign(){ + //porobbably need to get a bit more granular Debugger.log('Running',Debugger.GEN,'refreshDesign','CanvasModel'); //go through the design and see what has changed, compare DDM to canvasModel - //_global.breakpoint(); - var ddmActivity_keys:Array = _ddm.activities.keys(); + var ddmActivity_keys:Array = _cv.ddm.activities.keys(); + Debugger.log('ddmActivity_keys.length:'+ddmActivity_keys.length,Debugger.GEN,'refreshDesign','CanvasModel'); + //Debugger.log('ddmActivity_keys::'+ddmActivity_keys.toString(),Debugger.GEN,'refreshDesign','CanvasModel'); var cmActivity_keys:Array = _activitiesDisplayed.keys(); + Debugger.log('cmActivity_keys.length:'+cmActivity_keys.length,Debugger.GEN,'refreshDesign','CanvasModel'); + //Debugger.log('cmActivity_keys:'+cmActivity_keys.toString(),Debugger.GEN,'refreshDesign','CanvasModel'); + + + var longest = Math.max(ddmActivity_keys.length, cmActivity_keys.length); + //chose which array we are going to loop over + var indexArray:Array; + + if(ddmActivity_keys.length == longest){ + indexArray = ddmActivity_keys; + }else{ + indexArray = cmActivity_keys; + } + + //loop through and do comparison for(var i=0;i 0){ + var url:String; + var cfg = Config.getInstance(); + if(ta.authoringURL.indexOf("?") != -1){ + //09-11-05 Change to toolContentID and remove userID. + //url = cfg.serverUrl+ta.authoringURL + '&toolContentId='+ta.toolContentID+'&userID='+cfg.userID; + url = cfg.serverUrl+ta.authoringURL + '&toolContentID='+ta.toolContentID; + }else{ + //url = cfg.serverUrl+ta.authoringURL + '?toolContentId='+ta.toolContentID+'&userID='+cfg.userID; + url = cfg.serverUrl+ta.authoringURL + '?toolContentID='+ta.toolContentID; + } + + Debugger.log('Opening url:'+url,Debugger.GEN,'openToolActivityContent','CanvasModel'); + getURL(url,"_blank"); + + + }else{ + new LFError("We dont have a valid toolContentID","openToolActivityContent",this); + } + + } + + + + + } + + public function getNewToolContentID(ta:ToolActivity):Void{ + Debugger.log('ta:'+ta.title+', activityUIID:'+ta.activityUIID,Debugger.GEN,'getNewToolContentID','CanvasModel'); + var callback:Function = Proxy.create(this,setNewToolContentID,ta); + Application.getInstance().getComms().getRequest('authoring/author.do?method=getToolContentID&toolID='+ta.toolID,callback, false); + } + + public function setNewToolContentID(toolContentID:Number,ta:ToolActivity):Void{ + Debugger.log('new content ID from server:'+toolContentID,Debugger.GEN,'setNewToolContentID','CanvasModel'); + ta.toolContentID = toolContentID; + Debugger.log('ta:'+ta.title+',toolContentID:'+ta.toolContentID+', activityUIID:'+ta.activityUIID,Debugger.GEN,'setNewToolContentID','CanvasModel'); + openToolActivityContent(ta); + } + + + + /** + * Notify registered listeners that a data model change has happened */ public function broadcastViewUpdate(_updateType,_data){ dispatchEvent({type:'viewUpdate',target:this,updateType:_updateType,data:_data}); trace('broadcast'); } - //Getters n setters + /** * Returns a reference to the Activity Movieclip for the UIID passed in. Gets from _activitiesDisplayed Hashable * @usage @@ -343,15 +542,26 @@ public function getActivityMCByUIID(UIID:Number):MovieClip{ var a_mc:MovieClip = _activitiesDisplayed.get(UIID); - Debugger.log('UIID:'+UIID+'='+a_mc,Debugger.GEN,'getActivityMCByUIID','CanvasModel'); + //Debugger.log('UIID:'+UIID+'='+a_mc,Debugger.GEN,'getActivityMCByUIID','CanvasModel'); return a_mc; } + /* + public function setContainerRef(c:Canvas):Void{ + _cv = c; + } + */ + //Getters n setters + + public function getCanvas():Canvas{ + return _cv; + } + public function get activitiesDisplayed():Hashtable{ return _activitiesDisplayed; } - public function get trasitionsDisplayed():Hashtable{ + public function get transitionsDisplayed():Hashtable{ return _transitionsDisplayed; } @@ -376,4 +586,41 @@ return _activeTool; } + /** + * + * @usage + * @param newselectItem + * @return + */ + public function set selectedItem (newselectItem:Object):Void { + _selectedItem = newselectItem; + broadcastViewUpdate("SELECTED_ITEM"); + } + /** + * + * @usage + * @return + */ + public function get selectedItem ():Object { + return _selectedItem; + } + + /** + * + * @usage + * @return + */ + public function get isDragging ():Boolean { + return _isDragging; + } + + /** + * + * @usage + * @return + */ + public function set isDragging (newisDragging:Boolean):Void{ + _isDragging = newisDragging; + } + } Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as =================================================================== diff -u --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as (revision 0) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasParallelActivity.as (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -0,0 +1,223 @@ +import org.lamsfoundation.lams.common.*; +import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.ui.*; +import org.lamsfoundation.lams.authoring.*; +import org.lamsfoundation.lams.authoring.cv.*; +import mx.controls.*; +import mx.managers.* + + +/** +* CanvasParallelActivity +* This is the UI / view representation of a complex (parralel) activity +*/ +class org.lamsfoundation.lams.authoring.cv.CanvasParallelActivity extends MovieClip implements ICanvasActivity{ +//class org.lamsfoundation.lams.authoring.cv.CanvasParallelActivity extends MovieClip { + + private var CHILD_OFFSET_X:Number = 8; + private var CHILD1_OFFSET_Y:Number = 45; + private var CHILD2_OFFSET_Y:Number = 108; + //this is set by the init object + private var _canvasController:CanvasController; + private var _canvasView:CanvasView; + + //Set by the init obj + private var _activity:Activity; + private var _children:Array; + + //refs to screen items: + private var container_pnl:Panel; + private var header_pnl:Panel; + private var title_lbl:Label; + private var actCount_lbl:Label; + private var childActivities_mc:MovieClip; + private var clickTarget_mc:MovieClip; + private var padlockClosed_mc:MovieClip; + private var padlockOpen_mc:MovieClip; + + + + private var _dcStartTime:Number = 0; + private var _doubleClicking:Boolean; + private var child1_mc:MovieClip; + private var child2_mc:MovieClip; + private var _locked:Boolean; + private var _visibleHeight:Number; + private var _visibleWidth:Number; + + + + + function CanvasParallelActivity(){ + Debugger.log("_activity:"+_activity.title+'uiID:'+_activity.activityUIID+' children:'+_children.length,Debugger.GEN,'Constructor','CanvasParallelActivity'); + _visible = false; + + _visibleHeight = container_pnl._height; + _visibleWidth = container_pnl._width; + //init(); + MovieClipUtils.doLater(Proxy.create(this,init)); + } + + public function init():Void{ + + + + //set up some handlers: + clickTarget_mc.onPress = Proxy.create(this,localOnPress); + clickTarget_mc.onRelease = Proxy.create(this,localOnRelease); + clickTarget_mc.onReleaseOutside = Proxy.create(this,localOnReleaseOutside); + + + _locked = true; + + + + var child1:Activity; + var child2:Activity; + if(_children[0].orderID < _children[1].orderID){ + child1 = _children[0]; + child2 = _children[1]; + + }else{ + child1 = _children[1]; + child2 = _children[0]; + + } + //set the positioning co-ords + child1.xCoord = CHILD_OFFSET_X; + child1.yCoord = CHILD1_OFFSET_Y; + child2.xCoord = CHILD_OFFSET_X; + child2.yCoord = CHILD2_OFFSET_Y; + //for some reason attachmovie is not showing mc, only the label fields!? + //child1_mc = childActivities_mc.createChildAtDepth("CanvasActivity",DepthManager.kTop,{_activity:child1,_canvasController:_canvasController,_canvasView:_canvasView}); + //var child1_mc = childActivities_mc.attachMovie("CanvasActivity",'child_'+child1.activityUIID,this.getNextHighestDepth(),{_activity:child1,_canvasController:_canvasController,_canvasView:_canvasView}); + //child2_mc = childActivities_mc.createChildAtDepth("CanvasActivity",DepthManager.kTop,{_activity:child2,_canvasController:_canvasController,_canvasView:_canvasView}); + //var child2_mc = childActivities_mc.attachMovie("CanvasActivity",'child_'+child2.activityUIID,this.getNextHighestDepth(),{_activity:child2,_canvasController:_canvasController,_canvasView:_canvasView}); + + //so now it is placed on in the IDE and we just call init + child1_mc.init({activity:child1,canvasController:_canvasController,canvasView:_canvasView}); + child2_mc.init({activity:child2,canvasController:_canvasController,canvasView:_canvasView}); + + //let it wait one frame to set up the components. + childActivities_mc.createChildAtDepth("Bin",DepthManager.kTop); + MovieClipUtils.doLater(Proxy.create(this,draw)); + + } + + public function get activity():Activity{ + return getActivity(); + } + + public function set activity(a:Activity){ + setActivity(a); + } + + public function getActivity():Activity{ + return _activity; + + } + + public function setActivity(a:Activity){ + _activity = a; + } + + private function draw(){ + + //write text + title_lbl.text = _activity.title; + actCount_lbl.text = _children.length+" activities"; + +// _global.breakpoint(); + + header_pnl.borderType='outset'; + container_pnl.setStyle("backgroundColor",0x4289FF); + + //position the container (this) + _x = _activity.xCoord; + _y = _activity.yCoord; + + if(_locked){ + padlockClosed_mc._visible = true; + padlockOpen_mc._visible = false; + clickTarget_mc._height = 173; + }else{ + padlockOpen_mc._visible = true; + padlockClosed_mc._visible = false; + clickTarget_mc._height = 38; + } + + _visible = true; + //child1_mc._visible = true; + + } + + + 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','CanvasParallelActivity'); + _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){ + _locked = false; + }else{ + _locked = true; + } + draw(); + + + + }else{ + Debugger.log('SingleClicking:+'+this,Debugger.GEN,'localOnPress','CanvasParallelActivity'); + _doubleClicking = false; + _canvasController.activityClick(this); + + } + + _dcStartTime = now; + + } + + private function localOnRelease():Void{ + Debugger.log('_doubleClicking:'+_doubleClicking+', localOnRelease:'+this,Debugger.GEN,'localOnRelease','CanvasParallelActivity'); + if(!_doubleClicking){ + _canvasController.activityRelease(this); + } + + } + + private function localOnReleaseOutside():Void{ + Debugger.log('localOnReleaseOutside:'+this,Debugger.GEN,'localOnReleaseOutside','CanvasParallelActivity'); + _canvasController.activityReleaseOutside(this); + } + + /** + * + * @usage + * @return + */ + public function getVisibleWidth ():Number { + return _visibleWidth; + } + + + /** + * + * @usage + * @return + */ + public function getVisibleHeight ():Number { + return _visibleHeight; + } + + + + + + + +} \ No newline at end of file Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasTransition.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasTransition.as (.../CanvasTransition.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasTransition.as (.../CanvasTransition.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -38,7 +38,8 @@ } public function init():Void{ - Debugger.log('Running,',4,'init','CanvasTransition'); + //Debugger.log('Running,',4,'init','CanvasTransition'); + //todo: all a get style for this _drawnLineStyle = 0x777E9D; draw(); } @@ -60,27 +61,50 @@ * @return */ private function draw():Void{ - Debugger.log('',4,'draw','CanvasTransition'); - _global.breakpoint(); - + //Debugger.log('',4,'draw','CanvasTransition'); + var cv:Canvas = Application.getInstance().getCanvas(); - var fromAct_mc = cv.model.getActivityMCByUIID(_transition.fromUIID); - Debugger.log('fromAct_mc:'+fromAct_mc,4,'draw','CanvasTransition'); + //var fromAct = cv.ddm.getActivityByUIID(_transition.fromUIID); + //var toAct = cv.ddm.getActivityByUIID(_transition.toUIID); + var fromAct_mc = cv.model.getActivityMCByUIID(_transition.fromUIID); var toAct_mc = cv.model.getActivityMCByUIID(_transition.toUIID); - Debugger.log('toAct_mc:'+toAct_mc,4,'draw','CanvasTransition'); + //var startPoint:Point = MovieClipUtils.getCenterOfMC(fromAct_mc); + //var endPoint:Point = MovieClipUtils.getCenterOfMC(toAct_mc); + //TODO: check if its a gate transition and if so render a shorty var isGateTransition = toAct_mc.activity.isGateActivity(); - var startPoint:Point = MovieClipUtils.getCenterOfMC(fromAct_mc); - var endPoint:Point = MovieClipUtils.getCenterOfMC(toAct_mc); + + + + //var startPoint:Point = new Point(fromAct.xCoord,fromAct.yCoord); + //var endPoint:Point = new Point(toAct.xCoord,toAct.yCoord); + + var offsetToCentre_x = fromAct_mc.getVisibleWidth() / 2; + var offsetToCentre_y = fromAct_mc.getVisibleHeight() / 2; + Debugger.log('fromAct_mc.getActivity().xCoord:'+fromAct_mc.getActivity().xCoord,4,'draw','CanvasTransition'); + Debugger.log('offsetToCentre_x:'+offsetToCentre_x,4,'draw','CanvasTransition'); + + + var startPoint:Point = new Point(fromAct_mc.getActivity().xCoord+offsetToCentre_x,fromAct_mc.getActivity().yCoord+offsetToCentre_y); + + var toOTC_x:Number = toAct_mc.getVisibleWidth() /2; + var toOTC_y:Number = toAct_mc.getVisibleHeight() /2; + + var endPoint:Point = new Point(toAct_mc.getActivity().xCoord+toOTC_x,toAct_mc.getActivity().yCoord+toOTC_y); + + + Debugger.log('fromAct_mc:'+fromAct_mc,4,'draw','CanvasTransition'); + Debugger.log('toAct_mc:'+toAct_mc,4,'draw','CanvasTransition'); this.lineStyle(2, _drawnLineStyle); this.moveTo(startPoint.x, startPoint.y); + //this.dashTo(startX, startY, endX, endY, 8, 4); this.lineTo(endPoint.x, endPoint.y); - + Debugger.log('drawn line from:'+startPoint.x+','+startPoint.y+'to:'+endPoint.x+','+endPoint.y,4,'draw','CanvasTransition'); // calculate the position and angle for the arrow_mc arrow_mc._x = (startPoint.x + endPoint.x)/2; arrow_mc._y = (startPoint.y + endPoint.y)/2; @@ -89,6 +113,7 @@ var angle:Number = Math.atan2((endPoint.y- startPoint.y),(endPoint.x- startPoint.x)); var degs:Number = Math.round(angle*180/Math.PI); arrow_mc._rotation = degs; + arrow_mc._visible = true; /* stopArrow_mc._rotation = degs; @@ -99,10 +124,7 @@ stopArrow_mc._x = arrow_mc._x; stopArrow_mc._y = arrow_mc._y; */ - - - - + } /* private function updateSynchStatus():Void{ @@ -122,11 +144,11 @@ private function onPress():Void{ // check double-click var now:Number = new Date().getTime(); - Debugger.log('now:'+now,Debugger.GEN,'onPress','CanvasTransition'); - Debugger.log('_dcStartTime:'+_dcStartTime,Debugger.GEN,'onPress','CanvasTransition'); + //Debugger.log('now:'+now,Debugger.GEN,'onPress','CanvasTransition'); + //Debugger.log('_dcStartTime:'+_dcStartTime,Debugger.GEN,'onPress','CanvasTransition'); Debugger.log('now - _dcStartTime:'+(now - _dcStartTime)+' Config.DOUBLE_CLICK_DELAY:'+Config.DOUBLE_CLICK_DELAY,Debugger.GEN,'onPress','CanvasTransition'); if((now - _dcStartTime) <= Config.DOUBLE_CLICK_DELAY){ - Debugger.log('DoubleClicking:'+this,Debugger.GEN,'onPress','CanvasTransition'); + //Debugger.log('DoubleClicking:'+this,Debugger.GEN,'onPress','CanvasTransition'); _doubleClicking = true; _canvasController.transitionDoubleClick(this); @@ -135,7 +157,7 @@ Debugger.log('SingleClicking:+'+this,Debugger.GEN,'onPress','CanvasTransition'); _doubleClicking = false; - Debugger.log('_canvasController:'+_canvasController,Debugger.GEN,'onPress','CanvasTransition'); + //Debugger.log('_canvasController:'+_canvasController,Debugger.GEN,'onPress','CanvasTransition'); _canvasController.transitionClick(this); @@ -144,21 +166,21 @@ _dcStartTime = now; } - /* + private function onRelease():Void{ if(!_doubleClicking){ - Debugger.log('Releasing:'+this,Debugger.GEN,'onRelease','CanvasTransition'); + //Debugger.log('Releasing:'+this,Debugger.GEN,'onRelease','CanvasTransition'); _canvasController.transitionRelease(this); } } private function onReleaseOutside():Void{ - Debugger.log('ReleasingOutside:'+this,Debugger.GEN,'onReleaseOutside','CanvasTransition'); + //Debugger.log('ReleasingOutside:'+this,Debugger.GEN,'onReleaseOutside','CanvasTransition'); _canvasController.transitionReleaseOutside(this); } - */ + } \ No newline at end of file Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasView.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasView.as (.../CanvasView.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/CanvasView.as (.../CanvasView.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -12,6 +12,7 @@ /** *Authoring view for the canvas +* Relects changes in the CanvasModel */ class org.lamsfoundation.lams.authoring.cv.CanvasView extends AbstractView{ @@ -39,7 +40,7 @@ /** * Constructor */ - function CanvasView (){ + function CanvasView(){ //Init for event delegation mx.events.EventDispatcher.initialize(this); } @@ -57,13 +58,19 @@ H_GAP = 10; V_GAP = 10; + //register to recive updates form the model CanvasModel(m).addEventListener('viewUpdate',this); MovieClipUtils.doLater(Proxy.create(this,draw)); } +/** + * Recieved update events from the CanvasModel. Dispatches to relevent handler depending on update.Type + * @usage + * @param event + */ public function viewUpdate(event:Object):Void{ Debugger.log('Recived an Event dispather UPDATE!, updateType:'+event.updateType+', target'+event.target,4,'viewUpdate','CanvasView'); //Update view from info object @@ -98,7 +105,6 @@ case 'STOP_TRANSITION_TOOL': stopDrawingTransition(cm); break; - default : Debugger.log('unknown update type :' + event.updateType,Debugger.CRITICAL,'update','org.lamsfoundation.lams.CanvasView'); } @@ -113,7 +119,7 @@ private function draw(){ //get the content path for the sp _canvas_mc = canvas_scp.content; - Debugger.log('_canvas_mc'+_canvas_mc,Debugger.GEN,'draw','CanvasView'); + //Debugger.log('_canvas_mc'+_canvas_mc,Debugger.GEN,'draw','CanvasView'); bkg_pnl = _canvas_mc.createClassObject(Panel, "bkg_pnl", getNextHighestDepth()); @@ -134,7 +140,7 @@ Grid.drawGrid(_canvas_mc,w,h,V_GAP,H_GAP); */ - Debugger.log('canvas view dispatching load event'+_canvas_mc,Debugger.GEN,'draw','CanvasView'); + //Debugger.log('canvas view dispatching load event'+_canvas_mc,Debugger.GEN,'draw','CanvasView'); //Dispatch load event dispatchEvent({type:'load',target:this}); } @@ -159,36 +165,51 @@ */ private function drawActivity(a:Activity,cm:CanvasModel):Boolean{ var s:Boolean = false; - Debugger.log('a.title:'+a.title,4,'drawActivity','CanvasView'); + //Debugger.log('a.title:'+a.title,4,'drawActivity','CanvasView'); //var initObj:Object = {_activity=a}; //_global.breakpoint(); var cvv = CanvasView(this); var cvc = getController(); - var newActivity_mc = _activityLayer_mc.createChildAtDepth("CanvasActivity",DepthManager.kTop,{_activity:a,_canvasController:cvc,_canvasView:cvv}); - cm.activitiesDisplayed.put(a.activityUIID,newActivity_mc); + //take action depending on act type + if(a.activityTypeID==Activity.TOOL_ACTIVITY_TYPE){ + var newActivity_mc = _activityLayer_mc.createChildAtDepth("CanvasActivity",DepthManager.kTop,{_activity:a,_canvasController:cvc,_canvasView:cvv}); + cm.activitiesDisplayed.put(a.activityUIID,newActivity_mc); + Debugger.log('Tool activity a.title:'+a.title+','+a.activityUIID+' added to the cm.activitiesDisplayed hashtable:'+newActivity_mc,4,'drawActivity','CanvasView'); + }else if(a.activityTypeID==Activity.PARALLEL_ACTIVITY_TYPE){ + //get the children + var children:Array = cm.getCanvas().ddm.getComplexActivityChildren(a.activityUIID); + //var newActivity_mc = _activityLayer_mc.createChildAtDepth("CanvasParallelActivity",DepthManager.kTop,{_activity:a,_children:children,_canvasController:cvc,_canvasView:cvv}); + var newActivity_mc = _activityLayer_mc.createChildAtDepth("CanvasParallelActivity",DepthManager.kTop,{_activity:a,_children:children,_canvasController:cvc,_canvasView:cvv}); + cm.activitiesDisplayed.put(a.activityUIID,newActivity_mc); + Debugger.log('Parallel activity a.title:'+a.title+','+a.activityUIID+' added to the cm.activitiesDisplayed hashtable :'+newActivity_mc,4,'drawActivity','CanvasView'); + } + + //position - newActivity_mc._x = a.xCoord; - newActivity_mc._y = a.yCoord; + //newActivity_mc._x = a.xCoord; + //newActivity_mc._y = a.yCoord; - newActivity_mc._visible = true; + //newActivity_mc._visible = true; s = true; return s; } /** - * Removes existing activity from canvas stage. + * Removes existing activity from canvas stage. DOES not affect DDM. called by an update, so DDM change is already made * @usage * @param a - Activity to be Removed * @param cm - Refernce to the model * @return Boolean - successfull */ private function removeActivity(a:Activity,cm:CanvasModel):Boolean{ - var s:Boolean = false; - Debugger.log('a.title'+a.title,4,'removeActivity','CanvasView'); + //Debugger.log('a.title:'+a.title,4,'removeActivity','CanvasView'); + var r = cm.activitiesDisplayed.remove(a.activityUIID); + r.removeMovieClip(); + var s:Boolean = (r==null) ? false : true; return s; } @@ -201,12 +222,13 @@ */ private function drawTransition(t:Transition,cm:CanvasModel):Boolean{ var s:Boolean = true; - Debugger.log('t.fromUIID:'+t.fromUIID+', t.toUIID:'+t.toUIID,Debugger.GEN,'drawTransition','CanvasView'); + //Debugger.log('t.fromUIID:'+t.fromUIID+', t.toUIID:'+t.toUIID,Debugger.GEN,'drawTransition','CanvasView'); var cvv = CanvasView(this); var cvc = getController(); var newTransition_mc:MovieClip = _transitionLayer_mc.createChildAtDepth("CanvasTransition",DepthManager.kTop,{_transition:t,_canvasController:cvc,_canvasView:cvv}); - + cm.transitionsDisplayed.put(t.transitionUIID,newTransition_mc); + Debugger.log('drawn a transition:'+t.transitionUIID+','+newTransition_mc,Debugger.GEN,'drawTransition','CanvasView'); return s; } @@ -219,8 +241,11 @@ * @return */ private function removeTransition(t:Transition,cm:CanvasModel){ - Debugger.log('!Function not Implemented!',Debugger.CRITICAL,'removeTransition','CanvasView'); - //todo:DO + //Debugger.log('t.uiID:'+t.transitionUIID,Debugger.CRITICAL,'removeTransition','CanvasView'); + var r = cm.transitionsDisplayed.remove(t.transitionUIID); + r.removeMovieClip(); + var s:Boolean = (r==null) ? false : true; + return s; } private function startDrawingTransition(cm:CanvasModel):Void{ @@ -230,41 +255,17 @@ private function stopDrawingTransition(cm:CanvasModel):Void{ } - /* - * - * CanvasActivity now calls methods of controller directly. - //Event handlers to pass onto controller - public function activityClick(mc):Void{ - Debugger.log('activityClick mc:'+mc,Debugger.GEN,'activityClick','CanvasView'); - getController().activityClick(mc); - } - - public function activityDoubleClick(mc):Void{ - Debugger.log('activityClick mc:'+mc,Debugger.GEN,'activityDoubleClick','CanvasView'); - getController().activityDoubleClick(mc); - } - - public function activityRelease(mc):Void{ - Debugger.log('activityClick mc:'+mc,Debugger.GEN,'activityRelease','CanvasView'); - getController().activityRelease(mc); - } - - public function activityReleaseOutside(mc):Void{ - Debugger.log('activityClick mc:'+mc,Debugger.GEN,'activityReleaseOutside','CanvasView'); - getController().activityReleaseOutside(mc); - } - */ - + /** * Create a popup dialog to set transition parameters * @param pos - Position, either 'centre' or an object containing x + y coordinates */ public function createTransitionPropertiesDialog(pos:Object,callBack:Function){ - Debugger.log('Call',Debugger.GEN,'createTransitionPropertiesDialog','CanvasView'); + //Debugger.log('Call',Debugger.GEN,'createTransitionPropertiesDialog','CanvasView'); var dialog:MovieClip; //Check to see whether this should be a centered or positioned dialog if(typeof(pos)=='string'){ - Debugger.log('pos:'+pos,Debugger.GEN,'createTransitionPropertiesDialog','CanvasView'); + //Debugger.log('pos:'+pos,Debugger.GEN,'createTransitionPropertiesDialog','CanvasView'); dialog = PopUpManager.createPopUp(Application.root, LFWindow, true,{title:Dictionary.getValue('trans_dlg_title'),closeButton:true,scrollContentPath:"TransitionProperties"}); } else { dialog = PopUpManager.createPopUp(Application.root, LFWindow, true,{title:Dictionary.getValue('trans_dlg_title'),closeButton:true,scrollContentPath:"TransitionProperties",_x:pos.x,_y:pos.y}); @@ -274,15 +275,15 @@ //okClickedCallback = callBack; } - /** + /** * called when the dialog is loaded */ public function dialogLoaded(evt:Object) { - Debugger.log('!evt.type:'+evt.type,Debugger.GEN,'dialogLoaded','CanvasView'); + //Debugger.log('!evt.type:'+evt.type,Debugger.GEN,'dialogLoaded','CanvasView'); //Check type is correct if(evt.type == 'contentLoaded'){ //Set up callback for ok button click - Debugger.log('!evt.target.scrollContent:'+evt.target.scrollContent,Debugger.GEN,'dialogLoaded','CanvasView'); + //Debugger.log('!evt.target.scrollContent:'+evt.target.scrollContent,Debugger.GEN,'dialogLoaded','CanvasView'); evt.target.scrollContent.addEventListener('okClicked',Delegate.create(this,okClicked)); }else { //TODO DI 25/05/05 raise wrong event type error @@ -293,7 +294,7 @@ * Workspace dialog OK button clicked handler */ private function okClicked(evt:Object) { - Debugger.log('!okClicked:',Debugger.GEN,'okClicked','CanvasView'); + //Debugger.log('!okClicked:',Debugger.GEN,'okClicked','CanvasView'); //Check type is correct if(evt.type == 'okClicked'){ //Call the callback, passing in the design selected designId @@ -315,6 +316,11 @@ var grid_mc = Grid.drawGrid(_gridLayer_mc,s.w,s.h,V_GAP,H_GAP); //Debugger.log('grid_mc depth:'+grid_mc.getDepth(),4,'setSize','CanvasView'); //Debugger.log('_activityLayer_mc depth:'+_activityLayer_mc.getDepth(),4,'setSize','CanvasView'); + //position bin in canvas. + var bin = cm.getCanvas().bin; + bin._x = (s.w - bin._width) - 20; + bin._y = (s.h - bin._height) - 20; + } @@ -334,6 +340,16 @@ } /** + * Overrides method in abstract view to ensure cortect type of controller is returned + * @usage + * @return CanvasController + */ + public function getController():CanvasController{ + var c:Controller = super.getController(); + return CanvasController(c); + } + + /** * Returns the default controller for this view . * Overrides AbstractView.defaultController() */ Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/ICanvasActivity.as =================================================================== diff -u --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/ICanvasActivity.as (revision 0) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/ICanvasActivity.as (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -0,0 +1,32 @@ +import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.mvc.*; +import org.lamsfoundation.lams.authoring.* +import org.lamsfoundation.lams.authoring.cv.* + +/** + * Specifies the minimum services that a canvaas element must provide + */ +interface org.lamsfoundation.lams.authoring.cv.ICanvasActivity { + + + /** + * Sets the activity for this Canvas Element. If its a complex activity it will get the mainActivity. + */ + public function getActivity():Activity; + + /** + * Sets the activity for this Canvas Element. If its a complex activity it will set the mainActivity. + */ + public function setActivity(newActivity:Activity); + + /** + * Retrieves the visible width and height of the canvas element, usefull for the transition class + */ + public function getVisibleWidth():Number; + + public function getVisibleHeight():Number; + + + + +} \ No newline at end of file Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspector.as =================================================================== diff -u --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspector.as (revision 0) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/PropertyInspector.as (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -0,0 +1,284 @@ +import org.lamsfoundation.lams.authoring.cv.*; +import org.lamsfoundation.lams.common.dict.* +import org.lamsfoundation.lams.common.util.* +import org.lamsfoundation.lams.common.ui.* +import mx.utils.* +import mx.events.* +import mx.controls.* + +/* +* +* @author DC +* @version 0.1 +* @comments Property Inspector for the canvas +* +*/ +class PropertyInspector extends MovieClip{ + + private var _canvasModel:CanvasModel; + private var _canvasController:CanvasController; + //References to components + clips + private var _container:MovieClip; //The container window that holds the dialog. Will contain any init params that were passed into createPopUp + + private var toolDisplayName_lbl:Label; + + //tabs + private var prop_btn:Button; + private var comm_btn:Button; + + //Properties tab + private var title_lbl:Label; + private var title_txt:TextInput; + private var desc_lbl:Label; + private var desc_txt:TextInput; + private var grouping_lbl:Label; + private var currentGrouping_lbl:Label; + private var runOffline_chk:CheckBox; + private var defineLater_chk:CheckBox; + + + //Comments tab + /* + private var runOffline_lbl:Label; + private var runOnline_lbl:Label; + private var runOffline_txa:TextArea; + private var runOnline_txa:TextArea; + */ + + + + + + + + + //screen assets: + private var body_pnl:Panel; + private var bar_pnl:Panel; + + //Defined so compiler can 'see' events added at runtime by EventDispatcher + private var dispatchEvent:Function; + public var addEventListener:Function; + public var removeEventListener:Function; + + + /** + * Constructor + */ + function PropertyInspector(){ + //register to recive updates form the model + Debugger.log('Constructor',Debugger.GEN,'PropertyInspector','PropertyInspector'); + //Set up this class to use the Flash event delegation model + + EventDispatcher.initialize(this); + + //let it wait one frame to set up the components. + MovieClipUtils.doLater(Proxy.create(this,init)); + + } + + public function init():Void{ + _canvasModel = _container._canvasModel; + //might not need this ref.. + _canvasController = _container._canvasController; + //_global.breakpoint(); + _canvasModel.addEventListener('viewUpdate',this); + + //Debugger.log('_canvasModel: ' + _canvasModel,Debugger.GEN,'init','PropertyInspector'); + + //set up handlers + + title_txt.addEventListener("focusOut",this); + desc_txt.addEventListener("focusOut",this); + runOffline_chk.addEventListener("click",this); + defineLater_chk.addEventListener("click",this); + + + /* + runOffline_txa.addEventListener("focusOut",this); + runOnline_txa.addEventListener("focusOut",this); + */ + + //showProperties(); + + //fire event to say we have loaded + _container.contentLoaded(); + } + + + + /** + * Recieves update events from the model. + * @usage + * @param event + * @return + */ + public function viewUpdate(event:Object):Void{ + //Debugger.log('Recived an Event dispather UPDATE!, updateType:'+event.updateType+', target'+event.target,4,'viewUpdate','PropertyInspector'); + //Update view from info object + + var cm:CanvasModel = event.target; + + switch (event.updateType){ + case 'SELECTED_ITEM' : + updateItemProperties(cm); + break; + + + default : + //Debugger.log('unknown update type :' + event.updateType,Debugger.CRITICAL,'update','org.lamsfoundation.lams.CanvasView'); + } + + } + + /** + * + * @usage + * @param cm + * @return + */ + private function updateItemProperties(cm:CanvasModel):Void{ + //Debugger.log('cm.selectedItem:'+cm.selectedItem+' is a:'+typeof(cm.selectedItem) ,4,'updateItemProperties','PropertyInspector'); + + if(cm.selectedItem instanceof CanvasActivity){ + //Debugger.log('Its a canvas activity',4,'updateItemProperties','PropertyInspector'); + + toolDisplayName_lbl.text = StringUtils.cleanNull(cm.selectedItem.activity.toolDisplayName); + title_txt.text = StringUtils.cleanNull(cm.selectedItem.activity.title); + desc_txt.text = StringUtils.cleanNull(cm.selectedItem.activity.description); + runOffline_chk.selected = cm.selectedItem.activity.runOffline; + defineLater_chk.selected = cm.selectedItem.activity.defineLater; + + currentGrouping_lbl.text = "GroupingUIID:"+StringUtils.cleanNull(cm.selectedItem.activity.runOffline.groupingUIID); + + /* + runOffline_txa.text = StringUtils.cleanNull(cm.selectedItem.activity.offlineInstructions); + runOnline_txa.text = StringUtils.cleanNull(cm.selectedItem.activity.onlineInstructions); + */ + + + + + + + + }else if(cm.selectedItem instanceof CanvasTransition){ + //Debugger.log('Its a canvas transition',4,'updateItemProperties','PropertyInspector'); + title_txt.text = StringUtils.cleanNull(cm.selectedItem.transition.title); + desc_txt.text = StringUtils.cleanNull(cm.selectedItem.transition.description); + + + + + }else{ + //Debugger.log('Its a something we dont know',Debugger.CRITICAL,'updateItemProperties','PropertyInspector'); + + } + } + + /* + private function showProperties():Void{ + //Properties tab + title_lbl._visible = true; + title_txt._visible = true; + desc_lbl._visible = true; + desc_txt._visible = true; + grouping_lbl._visible = true; + runOffline_chk._visible = true; + //Comments tab + runOffline_lbl._visible = false; + runOnline_lbl._visible = false; + runOffline_txa._visible = false; + runOnline_txa._visible = false; + + } + + private function showComments():Void{ + //Properties tab + title_lbl._visible = false; + title_txt._visible = false; + desc_lbl._visible = false; + desc_txt._visible = false; + grouping_lbl._visible = false; + runOffline_chk._visible = false; + //Comments tab + runOffline_lbl._visible = true; + runOnline_lbl._visible = true; + runOffline_txa._visible = true; + runOnline_txa._visible = true; + + + } + + */ + + /** + * Main resize method, called by scrollpane container/parent + */ + public function setSize(w:Number,h:Number){ + //Debugger.log('setSize',Debugger.GEN,'setSize','org.lamsfoundation.lams.common.ws.WorkspaceDialog'); + //Size the bkg_pnl + + body_pnl.setSize(w,h-bar_pnl.height); + bar_pnl.setSize(w); + + + } + + //Gets+Sets + /** + * set the container refernce to the window holding the dialog + */ + public function set container(value:MovieClip){ + _container = value; + } + + + ///////////////////////////////////////////////// + //------------ controller section -------------// + ///////////////////////////////////////////////// + + /** + * Recieves the click events from the canvas views (inc Property Inspector) buttons. Based on the target + * the relevent method is called to action the user request + * @param evt + */ + /**/ + public function click(e):Void{ + var tgt:String = new String(e.target); + //Debugger.log('click tgt:'+tgt,Debugger.GEN,'click','PropertyInspector'); + //Debugger.log('indexOf("defineLater_chk"):'+tgt.indexOf("defineLater_chk"),Debugger.GEN,'click','PropertyInspector'); + //Debugger.log('indexOf("runOffline_chk"):'+tgt.indexOf("runOffline_chk"),Debugger.GEN,'click','PropertyInspector'); + if(tgt.indexOf("defineLater_chk") != -1){ + + _canvasModel.selectedItem.activity.defineLater = defineLater_chk.selected; + Debugger.log('_canvasModel.selectedItem.activity.defineLater:'+_canvasModel.selectedItem.activity.defineLater,Debugger.GEN,'click','PropertyInspector'); + + }else if(tgt.indexOf("runOffline_chk") != -1){ + + _canvasModel.selectedItem.activity.runOffline = runOffline_chk.selected; + Debugger.log('_canvasModel.selectedItem.activity.runOffline:'+_canvasModel.selectedItem.activity.runOffline,Debugger.GEN,'click','PropertyInspector'); + } + } + + + /** + * Recieves the click events from the canvas views (inc Property Inspector) buttons. Based on the label + * the relevent method is called to action the user request + * @param evt + */ + public function focusOut(e):Void{ + var tgt:String = new String(e.target); + Debugger.log('focusOut tgt:'+tgt,Debugger.GEN,'focusOut','PropertyInspector'); + + if(tgt.indexOf("title_txt") != -1){ + //todo check if this is the right place to set edited content, should it be ddm? + _canvasModel.selectedItem.activity.title = title_txt.text; + }else if(tgt.indexOf("desc_txt") != -1){ + _canvasModel.selectedItem.activity.description= desc_txt.text; + } + + } + +} + Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/TransitionPropertiesDialog.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/TransitionPropertiesDialog.as (.../TransitionPropertiesDialog.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/cv/TransitionPropertiesDialog.as (.../TransitionPropertiesDialog.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -1,4 +1,5 @@ import org.lamsfoundation.lams.authoring.cv.*; +import org.lamsfoundation.lams.authoring.*; import mx.controls.* import mx.utils.* import mx.managers.* @@ -18,8 +19,11 @@ private var ok_btn:Button; //OK+Cancel buttons private var cancel_btn:Button; private var bkg_pnl:MovieClip; //The underlaying panel base - private var syncType_cmb:MovieClip; //combo to allow you select the sybnc =gate type + private var gateType_cmb:ComboBox; //combo to allow you select the sybnc =gate type + private var gateType_lbl:Label; + private var section_lbl:Label; + private var fm:FocusManager; //Reference to focus manager private var themeManager:ThemeManager; //Theme manager @@ -57,10 +61,17 @@ //Delete the enterframe dispatcher delete this.onEnterFrame; + //text for labels + section_lbl.text = Dictionary.getValue('trans_dlg_gate'); + gateType_lbl.text = Dictionary.getValue('trans_dlg_gatetypecmb'); + //Set the text for buttons ok_btn.label = Dictionary.getValue('trans_dlg_ok'); cancel_btn.label = Dictionary.getValue('trans_dlg_cancel'); + //populate the synch type combo: + gateType_cmb.dataProvider = Activity.getGateActivityTypes(); + /* //get focus manager + set focus to OK button, focus manager is available to all components through getFocusManager fm = _container.getFocusManager(); Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as (.../TemplateActivity.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/TemplateActivity.as (.../TemplateActivity.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -1,15 +1,18 @@ -import org.lamsfoundation.lams.common.util.*; +import org.lamsfoundation.lams.common.*; +import org.lamsfoundation.lams.common.util.*; import org.lamsfoundation.lams.common.util.ui.*; -import org.lamsfoundation.lams.authoring.tk.*; -import org.lamsfoundation.lams.authoring.Application; +import org.lamsfoundation.lams.authoring.*; +import org.lamsfoundation.lams.authoring.tk.*; import mx.controls.*; import mx.managers.*; import mx.events.*; /** -* TemplateActivity - these are the visual elements in the toolkit - each one representing a LearningLibrary template activity +* TemplateActivity - +* these are the visual elements in the toolkit - +* each one representing a LearningLibrary template activity */ -class TemplateActivity extends MovieClip{ +class org.lamsfoundation.lams.authoring.tk.TemplateActivity extends MovieClip{ //Declarations private var bkg_pnl:MovieClip; private var title_lbl:Label; @@ -19,15 +22,24 @@ private var _instance:TemplateActivity; private var icon_mcl:MovieClipLoader; - //this is set by the init object - private var _templateActivityData:Object; + + //this is set by the init object + //contains refs to the classInstances of the activities in this TemplateActivity + private var _activities:Array; + private var _mainActivity:Activity; + private var _childActivities:Array; + + private var _toolkitView:ToolkitView; /** * Constructor - creates an onEnterFrame doLater call to init */ function TemplateActivity() { - this.onEnterFrame = init; + this.onEnterFrame = init; + + _childActivities = new Array(); + } /** @@ -42,10 +54,29 @@ //Set up this class to use the Flash event delegation model EventDispatcher.initialize(this); - + //_global.breakpoint(); + Debugger.log('_activities.length:'+_activities.length,Debugger.GEN,'init','TemplateActivity'); + //find the 'main'/container activity + if(_activities.length > 1){ + for (var i=0; i<_activities.length; i++){ + + if(_activities[i].activityTypeID == Activity.PARALLEL_ACTIVITY_TYPE){ + _mainActivity = _activities[i]; + //SOMEBODY THINK OF THE CHILDREN! + setUpComplexActivity(); + + } + } + }else if(_activities.length == 1){ + _mainActivity = _activities[0]; + }else{ + new LFError("The activities array recieved is not valid, maybe undefined","init",this); + //we must bail entirely now to prevent a crash or loop + this.removeMovieClip(); + } - + icon_mcl = new MovieClipLoader(); icon_mcl.addListener(this); @@ -58,22 +89,43 @@ loadIcon(); } - /** - * Sets this TemplateActivity's data - */ - function setTemplateActivity(templateActivityData:Object):Void{ - _templateActivityData = templateActivityData; - + /** + * Populates the _childActivities array if this is a complex activity + * @usage + * @return + */ + private function setUpComplexActivity(){ + if(_mainActivity.activityTypeID == Activity.PARALLEL_ACTIVITY_TYPE){ + //populate the _childActivities hash + for(var i=0; i<_activities.length; i++){ + if(_activities[i].parentActivityID == _mainActivity.activityID){ + //TODO: Check they are tool activities, if not give a warning and bail. + _childActivities.push(_activities[i]); + } + } + }else{ + new LFError("Cannot handle this activity type yet","setUpComplexActivity",this,'_mainActivity.activityTypeID:'+_mainActivity.activityTypeID); + } } /** * Loads the icon for the temopate activity using a movieclip loader * */ - private function loadIcon():Void{ - Debugger.log('!!!! HARD-CODED ICON URL !!!!!',4,'loadIcon','TemplateActivity'); + private function loadIcon(loadDefaultIcon:Boolean):Void{ + //Debugger.log('Loading icon:'+Config.getInstance().serverUrl+_toolActivity.libraryActivityUIImage,4,'loadIcon','TemplateActivity'); //TODO: Get URL from packet when its done. - icon_mcl.loadClip("http://dolly.uklams.net/lams/lams_central/icons/icon_chat.swf",icon_mc); + //icon_mcl.loadClip(Config.getInstance().serverUrl+"images/icon_chat.swf",icon_mc); + if(loadDefaultIcon){ + Debugger.log('Going to use default icon: images/icon_missing.swf',Debugger.GEN,'loadIcon','TemplateActivity'); + //icon_missing.swf + _mainActivity.libraryActivityUIImage = "images/icon_missing.swf"; + //icon_mcl.loadClip(Config.getInstance().serverUrl+"images/icon_missing.swf",icon_mc); + + } + var icon_url = Config.getInstance().serverUrl+_mainActivity.libraryActivityUIImage; + Debugger.log('Loading icon:'+icon_url,4,'loadIcon','TemplateActivity'); + icon_mcl.loadClip(icon_url,icon_mc); } /** @@ -85,6 +137,23 @@ Debugger.log('icon_mc:'+icon_mc,4,'onLoadInit','TemplateActivity'); //now icon is loaded lets call draw to display the stuff draw(); + } + + private function onLoadError(icon_mc:MovieClip,errorCode:String):Void{ + switch(errorCode){ + + case 'URLNotFound' : + Debugger.log('TemplateActivity icon failed to load - URL is not found:'+icon_mc._url,Debugger.CRITICAL,'onLoadError','TemplateActivity'); + break; + case 'LoadNeverCompleted' : + Debugger.log('TemplateActivity icon failed to load - Load never completed:'+icon_mc,Debugger.CRITICAL,'onLoadError','TemplateActivity'); + break; + } + + //if there was an error - try and load the missing.swf + loadIcon(true); + //draw(); + } /** @@ -94,26 +163,60 @@ //Debugger.log('bkg_pnl:'+bkg_pnl,4,'draw','TemplateActivity'); bkg_pnl.setStyle("borderStyle","outset"); - //Debugger.log('Setting '+this+' title '+_templateActivityData.title,4,'draw','TemplateActivity'); - title_lbl.text=_templateActivityData.title; + //Debugger.log('Setting '+this+' title '+_templateActivityData.title,4,'draw','TemplateActivity') + title_lbl.text=_mainActivity.title; //attach the icon now... //icon_mc.loadMovie("http://dolly.uklams.net/lams/lams_central/icons/icon_chat.swf"); icon_mc._width = 20; icon_mc._height = 20; - Debugger.log('icon_mc._width:'+icon_mc._width,4,'draw','TemplateActivity'); - Debugger.log('icon_mc._height:'+icon_mc._height,4,'draw','TemplateActivity'); + //Debugger.log('icon_mc._width:'+icon_mc._width,4,'draw','TemplateActivity'); + //Debugger.log('icon_mc._height:'+icon_mc._height,4,'draw','TemplateActivity'); } /** * Gets this TemplateActivity's data */ - function getTemplateActivityData():Object{ - return _templateActivityData; + function get toolActivity():Object{ + /* + //if we only have one element then return that cos it must be a single toolActiivity + if(_activities.length ==1){ + return _mainActivity; + }else{ + return new LFError("There is more than one item in the activities array, may be a complex activity - cant return a ToolActitiy","get toolActivity",this); + } + */ + Debugger.log('This function is deprecated, use mainActivity instead',Debugger.MED,'getToolActivity','TemplateActivity'); + return _mainActivity; + } + + function get mainActivity():Activity{ + return _mainActivity; + } + + /** + * + * @usage + * @param newactivities + * @return + */ + public function set activities (newactivities:Array):Void { + _activities = newactivities; + } + /** + * + * @usage + * @return + */ + public function get activities ():Array { + return _activities; + } + + function setState(selected:Boolean):Void{ - Debugger.log('this'+this+' selected:'+selected,4,'setState','TemplateActivity'); + //Debugger.log('this'+this+' selected:'+selected,4,'setState','TemplateActivity'); //_global.breakpoint(); //Debugger.log('bkg_pnl:'+bkg_pnl,4,'setState','TemplateActivity'); if(selected){ @@ -129,9 +232,28 @@ private function select():Void{ //Debugger.log('btn: '+this,4,'select','TemplateActivity'); - var dummy:Number = 0; - Debugger.log('_toolkitView:'+_toolkitView.className(),4,'select','TemplateActivity'); + //Debugger.log('_toolkitView:'+_toolkitView.className(),4,'select','TemplateActivity'); var toolkitController = _toolkitView.getController(); toolkitController.selectTemplateActivity(this); } + + + /** + * + * @usage + * @param newchildActivities + * @return + */ + public function set childActivities (newchildActivities:Array):Void { + _childActivities = newchildActivities; + } + /** + * + * @usage + * @return + */ + public function get childActivities ():Array { + return _childActivities; + } + } \ No newline at end of file Index: lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/Toolkit.as =================================================================== diff -u -r9bef1de27d0d527d75191115a535bc2c4311ade9 -ra1b0194b0dffe7d71c8c4e63a042bac24946176f --- lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/Toolkit.as (.../Toolkit.as) (revision 9bef1de27d0d527d75191115a535bc2c4311ade9) +++ lams_central/src/flash/org/lamsfoundation/lams/authoring/tk/Toolkit.as (.../Toolkit.as) (revision a1b0194b0dffe7d71c8c4e63a042bac24946176f) @@ -70,17 +70,184 @@ Debugger.log('Running',4,'getToolkitActivities','Toolkit'); var callback:Function = Proxy.create(this,setToolkitLibraries); - Application.getInstance().getComms().getRequest('http://dolly.uklams.net/lams/lams_authoring/all_library_details.xml',callback,true); + //Application.getInstance().getComms().getRequest('flashxml/all_library_details.xml',callback,false); //Application.getInstance().getComms().getRequest('http://dolly.uklams.net/lams/lams_authoring/liblist.xml',callback,true); - //Application.getInstance().getComms().getRequest('authoring/author.do?method=getAllLearningLibraryDetails',callback); + //TODO: sort out with the aussies what is going on with this structure + Application.getInstance().getComms().getRequest('authoring/author.do?method=getAllLearningLibraryDetails',callback); } + + /** + * Call back, get the response from getToolkitLibraries server call + * @usage + * @param toolkits + * @return + */ public function setToolkitLibraries(toolkits:Array):Void{ Debugger.log('Recieved toolkits array length:'+toolkits.length,4,'setToolkitActivities','Toolkit'); //TODO: Validate if correct data? + //go throught the recieved toolkits and make ToolActivities from them: + for(var i=0; i< toolkits.length; i++){ + var toolkit:Object = toolkits[i]; + + var classInstanceRefs = new Array(); + //loop through the template activities, there should only be one for LAMS 1.1 + //but coding a loop so we can use it later + + //this templateActivities array may contain other types, such as Parallel activities check with Fiona. + + for(var j=0; j + toolAct.activityID = ta.activityID; + toolAct.activityTypeID = ta.activityTypeID; + toolAct.description = ta.description; + toolAct.helpText = ta.helpText; + //NOTE 09-11-05: this has changed from libraryActivityUiImage to libraryActivityUIImage + toolAct.libraryActivityUIImage = ta.libraryActivityUIImage; + toolAct.title = ta.title; + toolAct.learningLibraryID = toolkit.learningLibraryID; + //TODO get this field included in lib packet + toolAct.groupingSupportType = Activity.GROUPING_SUPPORT_OPTIONAL; + + toolAct.authoringURL = ta.tool.authoringURL; + toolAct.toolContentID = ta.tool.toolContentID; + toolAct.toolID = ta.tool.toolID; + toolAct.toolDisplayName = ta.tool.toolDisplayName; + toolAct.supportsContribute = ta.tool.supportsContribute; + toolAct.supportsDefineLater = ta.tool.supportsDefineLater; + toolAct.supportsModeration = ta.tool.supportsModeration; + toolAct.supportsRunOffline = ta.tool.supportsRunOffline; + + toolActivities.push(toolAct); + */ + } + + //put the instance ref array into the toolkit object + toolkit.classInstanceRefs = classInstanceRefs; + + + } + + + //sets these in the toolkit model in a hashtable by lib id toolkitModel.setToolkitLibraries(toolkits); + + + + /** + * Returns the TemplateActivity as Toolactivity + * @usage + * @return ToolActivity + */ + + /* + function getAsToolActivity():ToolActivity{ + activityUIID:Number, + activityTypeID:Number, + activityCategoryID:Number, + learningLibraryID:Number, + libraryActivityUIImage:String, + toolContentUIID:Number, + toolUIID:Number){ + + + var myToolAct = new ToolActivity( _templateActivityData.activityUIID, + _templateActivityData.activityCategoryID, + _ + + + + ); + + + } + +*/ + + } + + /** + * Retrieves the defaultContentID for a given learning libraryID and toolID. + * It is the content ID that was in the library packet when it arrived + * @usage + * @param lid - The learning library id + * @param tid - The tool id + * @return default content ID + */ + public function getDefaultContentID(lid:Number,tid:Number):Number{ + var ll:Object = toolkitModel.getLearningLibrary(lid); + for (var i=0; i 1){ + Debugger.log('Template activities library length is greater than 1, may be complex activity',Debugger.GEN,'updateLibraries','ToolkitView'); + } - var templateActivity_mc = toolkitLibraries_sp.content.attachMovie("TemplateActivity","ta_"+templateActivity.activityId,_depth++,{_templateActivityData:templateActivity,_toolkitView:tkv}); - //templateActivity_mc.setTemplateActivity(templateActivity); + //NOW we pass in the whole array, as complex activities are supprted in this way + var activities:Array = learningLib.classInstanceRefs; + //Debugger.log('toolActivity '+ta.title+'('+ta.activityID+')',4,'updateLibraries','ToolkitView'); + var templateActivity_mc = toolkitLibraries_sp.content.attachMovie("TemplateActivity","ta_"+learningLib.learningLibraryID,_depth++,{_activities:activities,_toolkitView:tkv}); //position it templateActivity_mc._y = yPos; @@ -235,7 +237,7 @@ var c = tkm.getSelectedTemplateActivity(); c.setState(true); //Update the descripotion panel - libraryActivityDesc_txa.text = "

"+c.getTemplateActivityData().title+"

"+c.getTemplateActivityData().description+"

"; + libraryActivityDesc_txa.text = "

"+c.toolActivity.title+"

"+c.toolActivity.description+"

"; //set up the drag initDrag(c); @@ -256,12 +258,12 @@ //dragIcon_mc = _root.createObjectAtDepth("dummy_mc",DepthManager.kCursor); //dragIcon_mc = Application.root.createObjectAtDepth("dummy_mc",DepthManager.kCursor); - Debugger.log('dragIcon_mc:'+dragIcon_mc,4,'initDrag','TemplateActivity'); + //Debugger.log('dragIcon_mc:'+dragIcon_mc,4,'initDrag','ToolkitView'); //TODO: Here we need to load the right icon. - //var icon_url = selectedTA.getTemplateActivityData().library_activity_ui_image - dragIcon_mcl.loadClip("http://dolly.uklams.net/lams/lams_central/icons/icon_chat.swf",dragIcon_mc); - //dragIcon_mc = _global.myRoot.duplicateMovieClip('dragIcon_mc',DepthManager.kTopmost); + dragIcon_mcl.loadClip(Config.getInstance().serverUrl+selectedTA.toolActivity.libraryActivityUIImage,dragIcon_mc); + //dragIcon_mc = _global.myRoot.duplicateMovieClip('dragIcon_mc',DepthManager.kTopmost); + //Debugger.log('dragIcon_mc:'+dragIcon_mc,4,'initDrag','ToolkitView'); } /* @@ -277,8 +279,8 @@ */ private function setUpDrag(aDragIcon_mc):Void{ - Debugger.log('aDragIcon_mc:'+aDragIcon_mc,4,'setUpDrag','TemplateActivity'); - Debugger.log('this:'+this,4,'setUpDrag','TemplateActivity'); + //Debugger.log('aDragIcon_mc:'+aDragIcon_mc,4,'setUpDrag','TemplateActivity'); + //Debugger.log('this:'+this,4,'setUpDrag','TemplateActivity'); dragIcon_mc = aDragIcon_mc; _dragging = true;