Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorView.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorView.as,v diff -u -r1.2 -r1.3 --- lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorView.as 19 Jul 2007 07:12:33 -0000 1.2 +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/MonitorView.as 14 Sep 2007 06:36:08 -0000 1.3 @@ -76,6 +76,7 @@ private var _gridLayer_mc:MovieClip; private var _lessonTabLayer_mc:MovieClip; private var _monitorTabLayer_mc:MovieClip; + private var _monitorGateLayer_mc:MovieClip; private var _learnerTabLayer_mc:MovieClip; private var _todoTabLayer_mc:MovieClip; private var _editOnFlyLayer_mc:MovieClip; @@ -96,6 +97,9 @@ //MonitorTabView private var monitorTabView:MonitorTabView; private var monitorTabView_mc:MovieClip; + //MonitorGateView + private var monitorGateView:MonitorGateView; + private var monitorGateView_mc:MovieClip; //TodoTabView private var todoTabView:TodoTabView; private var todoTabView_mc:MovieClip; @@ -107,6 +111,7 @@ private var lessonTabLoaded; private var monitorTabLoaded; + private var monitorGateLoaded; private var learnerTabLoaded; //Defined so compiler can 'see' events added at runtime by EventDispatcher @@ -125,14 +130,15 @@ lessonTabLoaded = false; monitorTabLoaded = false; + monitorGateLoaded = false; learnerTabLoaded = false; //Init for event delegation mx.events.EventDispatcher.initialize(this); } /** - * Called to initialise Canvas . CAlled by the Canvas container + * Called to initialise Canvas . Called by the Canvas container */ public function init(m:Observable,c:Controller,x:Number,y:Number,w:Number,h:Number){ @@ -141,6 +147,8 @@ H_GAP = 10; V_GAP = 10; //_monitorModel = getModel(); + bkg_pnl._visible = false; + MovieClipUtils.doLater(Proxy.create(this,draw)); } @@ -152,10 +160,11 @@ var tgt:String = new String(evt.target); if(tgt.indexOf('lessonTabView_mc') != -1) { lessonTabLoaded = true; } else if(tgt.indexOf('monitorTabView_mc') != -1) { monitorTabLoaded = true; } + else if(tgt.indexOf('monitorGateView_mc') != -1) { monitorGateLoaded = true; } else if(tgt.indexOf('learnerTabView_mc') != -1) { learnerTabLoaded = true; } else Debugger.log('not recognised instance ' + evt.target,Debugger.GEN,'tabLoaded','MonitorView'); - if(lessonTabLoaded && monitorTabLoaded && learnerTabLoaded) { dispatchEvent({type:'tload',target:this}); } + if(lessonTabLoaded && monitorTabLoaded && learnerTabLoaded && monitorGateLoaded) { dispatchEvent({type:'tload',target:this}); } }else { //Raise error for unrecognized event @@ -234,13 +243,9 @@ _monitorLearner_mc = monitorLearner_scp.content; _lessonTabLayer_mc = _monitorLesson_mc.createEmptyMovieClip("_lessonTabLayer_mc", _monitorLesson_mc.getNextHighestDepth()); - - _monitorTabLayer_mc = _monitorSequence_mc.createEmptyMovieClip("_monitorTabLayer_mc", _monitorSequence_mc.getNextHighestDepth()); - - _learnerTabLayer_mc = _monitorLearner_mc.createEmptyMovieClip("_learnerTabLayer_mc", _monitorLearner_mc.getNextHighestDepth()); - + var tab_arr:Array = [{label:Dictionary.getValue('mtab_lesson'), data:"lesson"}, {label:Dictionary.getValue('mtab_seq'), data:"monitor"}, {label:Dictionary.getValue('mtab_learners'), data:"learners"}]; monitorTabs_tb.dataProvider = tab_arr; @@ -292,16 +297,22 @@ monitorTabView.init(mm, undefined); monitorTabView.addEventListener('load',Proxy.create(this,tabLoaded)); + // Inititialsation for Monitor Gate View + monitorGateView_mc = this.attachMovie("endGate", "monitorGateView_mc", DepthManager.kTop, {_x: 0, _y: 0}); + monitorGateView = MonitorGateView(monitorGateView_mc); + monitorGateView.init(mm, undefined); + monitorGateView.addEventListener('load',Proxy.create(this,tabLoaded)); + // Inititialsation for Learner Tab View learnerTabView_mc = _learnerTabLayer_mc.attachMovie("LearnerTabView", "learnerTabView_mc",DepthManager.kTop) learnerTabView = LearnerTabView(learnerTabView_mc); learnerTabView.init(mm, undefined); learnerTabView.addEventListener('load',Proxy.create(this,tabLoaded)); - + mm.addObserver(lessonTabView); mm.addObserver(monitorTabView); + mm.addObserver(monitorGateView); mm.addObserver(learnerTabView); - } public function showToolTip(btnObj, btnTT:String):Void{ @@ -364,15 +375,16 @@ var s:Object = mm.getSize(); bkg_pnl.setSize(s.w,s.h); bkgHeader_pnl.setSize(s.w, bkgHeader_pnl._height); - monitorLesson_scp.setSize(s.w-monitorLesson_scp._x,s.h-monitorLesson_scp._y); - monitorSequence_scp.setSize(s.w-monitorSequence_scp._x,s.h-monitorSequence_scp._y); - monitorLearner_scp.setSize(s.w-monitorLearner_scp._x,s.h-monitorLearner_scp._y); + monitorLesson_scp.setSize(s.w-monitorLesson_scp._x, s.h-monitorLesson_scp._y); + monitorSequence_scp.setSize(s.w-monitorSequence_scp._x, s.h-40.7); + monitorLearner_scp.setSize(s.w-monitorLearner_scp._x, s.h-monitorLearner_scp._y); + monitorGateView_mc.setSize(s.w, 40.7); + viewJournals_btn._x = s.w - 260; exportPortfolio_btn._x = s.w - 260; editFly_btn._x = s.w - 360; refresh_btn._x = s.w - 160 help_btn._x = s.w - 80 - } /** @@ -390,7 +402,7 @@ } /** - * Overrides method in abstract view to ensure cortect type of controller is returned + * Overrides method in abstract view to ensure correct type of controller is returned * @usage * @return CanvasController */ Index: lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/tabviews/MonitorGateView.as =================================================================== RCS file: /usr/local/cvsroot/lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/tabviews/MonitorGateView.as,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_flash/src/central/flash/org/lamsfoundation/lams/monitoring/mv/tabviews/MonitorGateView.as 14 Sep 2007 06:36:08 -0000 1.1 @@ -0,0 +1,267 @@ +/*************************************************************************** + * Copyright (C) 2007 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.util.* +import org.lamsfoundation.lams.common.ui.* +import org.lamsfoundation.lams.common.* +import org.lamsfoundation.lams.common.style.* +import org.lamsfoundation.lams.monitoring.mv.* +import org.lamsfoundation.lams.monitoring.mv.tabviews.*; +import org.lamsfoundation.lams.common.dict.* +import org.lamsfoundation.lams.common.mvc.* + +import mx.managers.* +import mx.containers.*; +import mx.events.* +import mx.utils.* +import mx.controls.*; + +/* +* Monitor Gate View for the monitor +* Reflects Changes in the MonitorModel +*/ + class org.lamsfoundation.lams.monitoring.mv.tabviews.MonitorGateView extends AbstractView { + + public static var _tabID:Number = 1; + private var _className = "MonitorGateView"; + + private var _tm:ThemeManager; + + private var _tip:ToolTip; + + private var mm:MonitorModel; + private var _monitorGateView:MonitorGateView; + + private var learner_X:Number = 22; + private var learner_Y:Number = 19; + + private var lessonEnd_lbl:Label; + private var finishedLearnersList:Array; + private var bg_pnl:MovieClip; + private var doorClosed:MovieClip; + private var doorOpen:MovieClip; + private var bar_pnl:MovieClip; + + private var _tooltipContainer_mc:MovieClip; + + private var endGate_mc:MovieClip; + private var _learnerContainer_mc:MovieClip; + + private var dispatchEvent:Function; + public var addEventListener:Function; + + /** + * Constructor + */ + function MonitorGateView(){ + _monitorGateView = this; + + _tm = ThemeManager.getInstance(); + _tip = new ToolTip(); + + this._visible = false; + + //Init for event delegation + mx.events.EventDispatcher.initialize(this); + } + + /** + * Called to initialise gate view. Called by setupTabInit method in MonitorView class + */ + public function init(m:Observable,c:Controller){ + //Invoke superconstructor, which sets up MVC relationships. + super (m, c); + mm = MonitorModel(model) + + setPosition(mm); + + + _tooltipContainer_mc._visible = true; + + //_tooltipContainer_mc._alpha = 100; + + MovieClipUtils.doLater(Proxy.create(this, draw)); + } + + public function update (o:Observable,infoObj:Object):Void{ + var mm:MonitorModel = MonitorModel(o); + + switch (infoObj.updateType){ + case 'POSITION' : + setPosition(mm); + break; + case 'SIZE' : + setPosition(mm); + setSize(mm); + break; + case 'TABCHANGE' : + if (infoObj.tabID == _tabID && !mm.locked){ + this._visible = true; + }else { + this._visible = false; + } + + break; + case 'DRAW_DESIGN' : + if (infoObj.tabID == _tabID && !mm.locked){ + + setStyles(); + setSize(mm); + + showEndGateData(mm); + mm.drawDesign(infoObj.tabID); + } + break; + default : + Debugger.log('unknown update type :' + infoObj.updateType,Debugger.CRITICAL,'update','org.lamsfoundation.lams.MonitorTabView'); + } + } + + /** + * layout visual elements on the MonitorTabView on initialisation + */ + private function draw(){ + + _learnerContainer_mc = this.createEmptyMovieClip("_learnerContainer_mc", DepthManager.kTop); + + var s:Object = mm.getSize(); + + mm.endGate(this); + mm.endGate = this; + + mm.endGate.tt_btn.onRollOver = Proxy.create(this,this['showToolTip'], "finish_learner_tooltip"); + mm.endGate.tt_btn.onRollOut = Proxy.create(this,this['hideToolTip']); + + setStyles(); + + dispatchEvent({type:'load',target:this}); + } + + public function showToolTip(btnTT:String):Void{ + + _tooltipContainer_mc = this.createEmptyMovieClip("_tooltipContainer_mc",DepthManager.kTop); + _tooltipContainer_mc._visible = true; + + var Xpos = this._x + 5; + var Ypos = this._y; + + var ttMessage = Dictionary.getValue(btnTT); + Debugger.log("ttMessage"+ttMessage, Debugger.CRITICAL); + + //param "true" is to specify that tooltip needs to be shown above the component + _tip.DisplayToolTip(_tooltipContainer_mc, ttMessage, Xpos, Ypos, true); + } + + public function hideToolTip():Void{ + _tip.CloseToolTip(); + } + + private function showEndGateData(mm:MonitorModel):Void{ + var mc = getController(); + var finishedLearners:Number = 0; + var totalLearners:Number = mm.allLearnersProgress.length; + + doorClosed._visible = true; + finishedLearnersList = new Array(); + + + for (var i=0; i "+finishedLearners+" of "+ totalLearners; + } + + /** + * Sets the position of the gate, called from update + * @param cm Canvas model object + */ + private function setPosition(mm:MonitorModel):Void{ + var p:Object = mm.getPosition(); + + this._x = p.x; + this._y = mm.getSize().h - 40.7; + } + + /** + * Get the CSSStyleDeclaration objects for each component and apply them + * directly to the instance + */ + private function setStyles():Void{ + var styleObj = _tm.getStyleObject('MHPanel'); + bg_pnl.setStyle('styleName',styleObj); + styleObj = _tm.getStyleObject('BGPanel'); + bar_pnl.setStyle('styleName',styleObj); + styleObj = _tm.getStyleObject('EndGatelabel'); + lessonEnd_lbl.setStyle('styleName',styleObj); + } + + private function setSize(mm:MonitorModel):Void{ + + //var s:Object = mm.getSize(); + + //TODO fixes width of endgate components, but there's prob a better way + var s:Object = MonitorModel(getModel()).getSize(); + + bg_pnl.setSize(s.w, bg_pnl.height); + bar_pnl.setSize(s.w-20, bar_pnl.height); + mm.endGate.tt_btn.setSize(s.w, bg_pnl.height); + + for (var i=0; i "+finishedLearners+" of "+ totalLearners; - - } - public function showToolTip(btnTT:String):Void{ var Xpos = Application.MONITOR_X+ 5; - var Ypos = Application.MONITOR_Y+ endGate_mc._y; + //var Ypos = Application.MONITOR_Y+ endGate_mc._y; var ttHolder = Application.tooltip; var ttMessage = Dictionary.getValue(btnTT); //param "true" is to specify that tooltip needs to be shown above the component - _tip.DisplayToolTip(ttHolder, ttMessage, Xpos, Ypos, true); + //_tip.DisplayToolTip(ttHolder, ttMessage, Xpos, Ypos, true); } @@ -302,7 +257,7 @@ /** * Reloads the learner Progress and - * @Param isChanged Boolean Value to pass it to setIsProgressChanged in monitor model so that it sets it to true if refresh button is clicked and sets it to fasle as soon as latest data is loaded and design is redrawn. + * @Param isChanged Boolean Value to pass it to setIsProgressChanged in monitor model so that it sets it to true if refresh button is clicked and sets it to fasle as soon as latest data is loaded and design is redrawn. * @usage * @return nothing */ @@ -311,17 +266,14 @@ drawDesignCalled = undefined; //Remove all the movies drawn on the transition and activity movieclip holder - this._learnerContainer_mc.removeMovieClip(); this.transitionLayer.removeMovieClip(); this.activityLayer.removeMovieClip(); - this.endGate_mc.removeMovieClip(); //Recreate both Transition holder and Activity holder Movieclips transitionLayer = this.createEmptyMovieClip("_transitionLayer_mc", this.getNextHighestDepth()); activityLayer = this.createEmptyMovieClip("_activityLayer_mc", this.getNextHighestDepth(),{_y:learnerMenuBar._height}); _learnerContainer_mc = this.createEmptyMovieClip("_learnerContainer_mc", this.getNextHighestDepth()); - endGate_mc = activityLayer.createChildAtDepth("endGate",DepthManager.kTop, {_x:0, _y:s.h-endGateOffset}); if (isChanged == false){ mm.setIsProgressChangedSequence(false); @@ -366,7 +318,6 @@ return s; } - /** * Draws new activity to monitor tab view stage. * @usage @@ -405,11 +356,35 @@ mm.activitiesDisplayed.put(a.activityUIID,newActivity_mc); } - mm.getMonitor().getMV().getMonitorSequenceScp().redraw(true); - + mm.getMonitor().getMV().getMonitorSequenceScp().redraw(true); + return true; - } - + } + + /** + * Gets the Y Coordinate of the lowest activity that will be displayed on the canvas from the DesignDataModel + * + * @usage + * @param + * @return The Y Coordinate + */ + private function getLowestActivityYCoord():Number { + + var lowestActivity:Number = 0; //lowest position in layout + var activeSeq:Sequence = MonitorModel(getModel()).getSequence(); + var activitiesHash:Hashtable = activeSeq.getLearningDesignModel().activities; + var activityKeys:Array = activitiesHash.keys(); + + for(var i=0; i < activityKeys.length; i++) { + + if (activitiesHash.get(activityKeys[i]).yCoord > lowestActivity) { + lowestActivity = activitiesHash.get(activityKeys[i]).yCoord; + } + } + Debugger.log("Lowest activity Y Coord from DDM: "+activitiesHash.get(activityKeys[i]).yCoord, Debugger.GEN, 'getLowestActivityYCoord', 'MonitorTabView'); + return lowestActivity; + } + /** * Add to canvas stage but keep hidden from view. * @@ -483,37 +458,32 @@ */ private function setStyles():Void{ var styleObj = _tm.getStyleObject('CanvasPanel'); - bkg_pnl.setStyle('styleName',styleObj); - styleObj = _tm.getStyleObject('MHPanel'); - endGate_mc.bg_pnl.setStyle('styleName',styleObj); - styleObj = _tm.getStyleObject('BGPanel'); - endGate_mc.bar_pnl.setStyle('styleName',styleObj); - styleObj = _tm.getStyleObject('EndGatelabel'); - endGate_mc.lessonEnd_lbl.setStyle('styleName',styleObj); + bkg_pnl.setStyle('styleName',styleObj); } /** * Sets the size of the canvas on stage, called from update */ - private function setSize(mm:MonitorModel):Void{ - var s:Object = mm.getSize(); - - bkg_pnl.setSize(s.w,s.h); + private function setSize(mm:MonitorModel):Void{ + + var activitySpan:Number = getLowestActivityYCoord(); + var verticalSpacing:Number = 100; + var s:Object = mm.getSize(); - endGate_mc._y = s.h-endGateOffset; - endGate_mc.bg_pnl.setSize(s.w,endGate_mc.bg_pnl.height); - endGate_mc.bar_pnl.setSize(s.w-20,endGate_mc.bar_pnl.height); - endGate_mc.tt_btn.setSize(s.w,endGate_mc.bg_pnl.height); + Debugger.log("Setting canvas size, activitySpan: "+activitySpan, Debugger.CRITICAL, 'setSize', 'MonitorTabView'); - for (var i=0; i