From e6bdaf87e7d94d6c4bfb32e3e47e66b3867be401 Mon Sep 17 00:00:00 2001 From: Denis Flaven Date: Sun, 29 Aug 2010 19:38:36 +0000 Subject: [PATCH] - Updated flash navigator: better objects placement, auto-zoom & pan at startup, improved tooltip with some details on each objects. SVN:trunk[710] --- navigator/iTop/GraphNode.as | 36 +++- navigator/iTop/Navigator.as | 363 ++++++++++++++++++++++++++++++++---- navigator/iTop/ToolTip.as | 88 +++++++-- navigator/navigator.fla | Bin 484864 -> 898048 bytes navigator/navigator.swf | Bin 24545 -> 29410 bytes pages/xml.navigator.php | 11 +- 6 files changed, 435 insertions(+), 63 deletions(-) diff --git a/navigator/iTop/GraphNode.as b/navigator/iTop/GraphNode.as index 7a51a0f71..f52d93dc4 100644 --- a/navigator/iTop/GraphNode.as +++ b/navigator/iTop/GraphNode.as @@ -5,6 +5,7 @@ import flash.net.*; import flash.events.*; import flash.text.*; + import flash.xml.*; import flash.ui.ContextMenu; import flash.ui.ContextMenuItem; import iTop.ToolTip; @@ -14,27 +15,46 @@ public class GraphNode extends Sprite { private var m_oIcon:Loader; - private var m_sClass;String; + private var m_sClass:String; + private var m_sClassName:String; private var m_iId:Number; private var m_sParentKey:String; private var m_oToolTip:ToolTip; private var m_fZoom:Number; private var m_oParent:Navigator; + private static const ROUND:Number = 20; + private static const PADDING:Number = 5; + public var m_speed_x:Number = 0; + public var m_speed_y:Number = 0; + public var m_bInDrag:Boolean = false; - public function GraphNode(oParent:Navigator, oPt:Point, sClass:String, iId:Number, sLabel:String, sIconPath:String, sParentKey:String, fZoom:Number) + public function GraphNode(oParent:Navigator, oPt:Point, sClass:String, sClassName:String, iId:Number, sLabel:String, sIconPath:String, sParentKey:String, fZoom:Number, oDetails:Object) { x = oPt.x; y = oPt.y; m_fZoom = fZoom; m_sClass = sClass; + m_sClassName = sClassName; m_iId = iId; + m_sLabel.autoSize = TextFieldAutoSize.LEFT; + m_sLabel.multiline = false; m_sLabel.text = sLabel; - m_sLabel.autoSize = TextFieldAutoSize.CENTER; m_sLabel.width = m_sLabel.textWidth; m_sLabel.x = -m_sLabel.width/2; m_sLabel.height = m_sLabel.textHeight; + // Draw the background + graphics.beginFill( 0xf1f1f6, 0.8 ); + graphics.drawRoundRect( m_sLabel.x -PADDING, m_sLabel.y - PADDING, m_sLabel.width+PADDING*2, m_sLabel.height+PADDING*2, ROUND ); + graphics.endFill(); + m_sParentKey = sParentKey; - m_oToolTip = new ToolTip( "

"+m_sClass+"

"+sLabel+"

"); + var sTooltipText:String = "

"+m_sClassName+"

"+sLabel+"

"; + for (var s:String in oDetails) + { + sTooltipText += '

'+s+': '+oDetails[s]+'

'; + } + trace('Tooltip text: '+sTooltipText); + m_oToolTip = new ToolTip(sTooltipText); m_oToolTip.scaleX = 1 / m_fZoom; m_oToolTip.scaleY = 1 / m_fZoom; m_oParent = oParent; @@ -94,11 +114,14 @@ { trace("Click in Node"); m_oParent.m_bChildDragging = true; + m_bInDrag = true; + m_oToolTip.timer.stop(); // Don't show the tooltip while dragging startDrag(); } function mouseReleased(event:MouseEvent):void { + m_bInDrag = false; stopDrag(); m_oParent.m_bChildDragging = false; } @@ -130,5 +153,10 @@ return sDefaultValue; } } + + public function GetLabelWidth():Number + { + return m_sLabel.width; + } } } \ No newline at end of file diff --git a/navigator/iTop/Navigator.as b/navigator/iTop/Navigator.as index 327f27220..b2c08ad45 100644 --- a/navigator/iTop/Navigator.as +++ b/navigator/iTop/Navigator.as @@ -1,4 +1,4 @@ -package iTop +package iTop { import flash.display.*; import flash.geom.*; @@ -8,7 +8,7 @@ import fl.controls.Slider; import fl.events.SliderEvent; import fl.controls.Label; - + // The main canvas public class Navigator extends MovieClip { @@ -28,8 +28,14 @@ protected var m_sObjId:String; // Constants - protected var m_RADIUS = 120; - protected var m_ITEMS_PER_ROW = 8; + protected var m_RADIUS = 150; + protected var m_Q = 0.9; // Electrostatic forces coeff + protected var m_K = 1.0; // Elastic forces coeff + protected var m_Kf = 0.7; // Fluid friction coeff + protected var m_Ks = 30; // Solid friction coeff + protected var m_deltaT = 0.1; // Interval of time between updates + protected var m_MAX_ITEMS_PER_ROW = 8; + protected var m_FOCUS_DELAY_COUNTDOWN = 50; // 50 images to zoom & pan correctly protected var m_fZoom:Number; // Constructor @@ -41,6 +47,8 @@ initParameters(); doLoadData(); addEventListener(Event.ENTER_FRAME, initGraphics); + //Stop scaling the flash content + stage.scaleMode = StageScaleMode.NO_SCALE; } protected function initParameters():void @@ -62,11 +70,6 @@ m_oCanvas.scaleY = m_fZoom; // Handle listeners... removeEventListener(Event.ENTER_FRAME,initGraphics); - addEventListener(Event.ENTER_FRAME, drawLines); - m_oZoomSlider.value = 100; - m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange); - stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) - stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); } function mouseDown(event:MouseEvent):void { @@ -87,14 +90,24 @@ function onZoomChange(event:SliderEvent):void { - m_fZoom = event.value/100; + SetZoomLevel(event.value/100); + } + + function SetZoomLevel(fZoomLevel:Number):void + { + m_fZoom = fZoomLevel; m_oCanvas.scaleX = m_fZoom; m_oCanvas.scaleY = m_fZoom; } function doLoadData() { - var myString:String = m_sDataUrl+'?relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId; + var sSeparator:String = '?'; + if (m_sDataUrl.indexOf(sSeparator) != -1) + { + sSeparator = '&'; + } + var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId; trace("Requesting:"+myString); var myXMLURL:URLRequest = new URLRequest(myString); m_oLoader = new URLLoader(); @@ -109,10 +122,17 @@ var myXML:XML = XML(m_oLoader.data); //trace("Data loaded." + myXML); //trace("==========================="); - parseXMLData(null, myXML, 0); + parseXMLData(null, myXML, 0, 0); m_sTitle.text = myXML.attribute("title"); m_oZoomSlider.enabled = true; removeChild(m_oPreloader); + addEventListener(Event.ENTER_FRAME, drawLines); + m_oZoomSlider.value = 100; + m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange); + stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) + stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); + //trace('======= Initial Posistions ========='); + //DumpPositions(); } function onXMLLoadError(event:IOErrorEvent):void @@ -120,11 +140,11 @@ trace("An error occured:" + Event); } - function parseXMLData(oParentNode:GraphNode, oXMLData:XML, iChildIndex:Number) + function parseXMLData(oParentNode:GraphNode, oXMLData:XML, iChildIndex:Number, iChildCount:Number) { //trace(oXMLData.child("node").length()); var oNode:GraphNode; - oNode = addNode(oParentNode, oXMLData.child("node")[0], iChildIndex); + oNode = addNode(oParentNode, oXMLData.child("node")[0], iChildIndex, iChildCount); if (oParentNode != null) { AddLink(oParentNode.GetKey(), oNode.GetKey()); @@ -138,30 +158,43 @@ var oLink = oLinks.link; for each(var oChild:XML in oLink) { - parseXMLData(oNode, oChild, iChildIndex); + parseXMLData(oNode, oChild, iChildIndex, oLinks.link.length()); iChildIndex++; } } } - function addNode(oParent:GraphNode, oXMLData:XML, iChildIndex) + function addNode(oParent:GraphNode, oXMLData:XML, iChildIndex:Number, iChildCount:Number) { - var sClass = oXMLData.@obj_class; + var sClass:String = oXMLData.@obj_class; + var sClassName:String = oXMLData.@obj_class_name; var iId = oXMLData.@id; - var sLabel = oXMLData.@name; - var sIcon = oXMLData.@icon; + var sLabel:String = oXMLData.@name; + var sIcon:String = oXMLData.@icon; + var oDetails:Object = new Object; + var sZlist:String = oXMLData.@zlist; var oNode:GraphNode = GetNode(sClass+'/'+iId); if (oNode == null) { // If the node does not already exist, let's create it - var oPt:Point = GetNextFreePosition(oParent, iChildIndex); + var oPt:Point = GetNextFreePosition(oParent, iChildIndex, iChildCount); var sParentKey = null; if (oParent != null) { sParentKey = oParent.GetKey(); } - oNode = new GraphNode(this, oPt, sClass, iId, sLabel, sIcon, sParentKey, m_fZoom); + // Read the details + var aDetails:Array; + aDetails = sZlist.split(','); + for(var i:String in aDetails) + { + //if (oXMLData.hasOwnProperty('att_'+i)) + //{ + oDetails[aDetails[i]] = oXMLData.attribute('att_'+i).toString(); + //} + } + oNode = new GraphNode(this, oPt, sClass, sClassName, iId, sLabel, sIcon, sParentKey, m_fZoom, oDetails); this.m_aNodes[oNode.GetKey()] = oNode; //Keep it referenced if (oParent == null) { @@ -185,7 +218,7 @@ } } - function GetNextFreePosition(oParent:GraphNode, iChildIndex:Number):Point + function GetNextFreePosition(oParent:GraphNode, iChildIndex:Number, iChildCount:Number):Point { var oPt:Point = GetInitialPosition(); var angle:Number = GetInitialAngle(); @@ -208,13 +241,43 @@ angle = Math.atan2(dy, dx); } } - var radius = m_RADIUS * Math.floor(iChildIndex / m_ITEMS_PER_ROW); - angle += iChildIndex*(2*Math.PI) / m_ITEMS_PER_ROW; + var nbItemsOnRow:Number = 0; + var nbRows:Number = 0; + // Determines the position of this element + // The elements are placed on circles of maximum m_MAX_ITEMS_PER_ROW elements per row + // The last row containing potentially less items + // nbRows indicates on which row (first row = 0) the item is to be placed + if (iChildCount > m_MAX_ITEMS_PER_ROW) + { + nbRows = Math.floor(iChildIndex / m_MAX_ITEMS_PER_ROW); + if ( iChildIndex > (Math.floor(iChildCount / m_MAX_ITEMS_PER_ROW)*m_MAX_ITEMS_PER_ROW)) + { + // node is on the last (incomplete) row + nbItemsOnRow = (iChildCount % m_MAX_ITEMS_PER_ROW); + } + else + { + nbItemsOnRow = m_MAX_ITEMS_PER_ROW; + } + } + else + { + if (iChildCount == 2) + { + nbItemsOnRow = 4; // Nicer display than everything aligned at 180 deg. + } + else + { + nbItemsOnRow = iChildCount; + } + } + var radius = this.m_RADIUS * (1 + nbRows); + angle += (1 - 2*((1+iChildIndex) % 2))*(Math.floor((1+iChildIndex) / 2))*(2*Math.PI) / nbItemsOnRow; - oPt.x += m_RADIUS * Math.cos(angle); - oPt.y += m_RADIUS * Math.sin(angle); + oPt.x += radius * Math.cos(angle); + oPt.y += radius * 0.7 * Math.sin(angle); // Ellipse because the labels are written horizontally ! - trace("iChildIndex: "+iChildIndex+" x: "+oPt.x+" y: "+oPt.y+" sGdParentKey: "+sGrandParentKey); + //trace("iChildIndex: "+iChildIndex+" (iChildCount: "+iChildCount+") x: "+oPt.x+" y: "+oPt.y+" sGdParentKey: "+sGrandParentKey); } return oPt; } @@ -280,8 +343,10 @@ function drawLines(event:Event):void { + var color:uint = 0x666666; m_oCanvas.graphics.clear(); m_oCanvas.graphics.lineStyle(2,0x666666,100); + UpdatePositions(); for (var index:String in m_aLinks) { var oStartNode:GraphNode = GetNode(m_aLinks[index].GetStart()); @@ -289,18 +354,28 @@ m_oCanvas.graphics.moveTo(oStartNode.x, oStartNode.y); m_oCanvas.graphics.lineTo(oEndNode.x, oEndNode.y); var oMiddlePoint:Point = new Point((oEndNode.x+oStartNode.x)/2, (oEndNode.y+oStartNode.y)/2); - drawArrow(oMiddlePoint, oEndNode.x - oStartNode.x, oEndNode.y - oStartNode.y); + drawArrow(oMiddlePoint, oEndNode.x - oStartNode.x, oEndNode.y - oStartNode.y, color); + } + + if (this.m_FOCUS_DELAY_COUNTDOWN > 0) + { + this.m_FOCUS_DELAY_COUNTDOWN--; + trace('FOCUS_DELAY:'+this.m_FOCUS_DELAY_COUNTDOWN); + UpdatePanAndZoom(m_FOCUS_DELAY_COUNTDOWN / 30); } } - function drawArrow(oPt:Point, dx:Number, dy:Number):void + function drawArrow(oPt:Point, dx:Number, dy:Number, color:uint):void { var l:Number = Math.sqrt(dx*dx+dy*dy); var arrowSize:Number = 5; - m_oCanvas.graphics.lineStyle(2,0x666666,100,false,"normal",CapsStyle.ROUND); - m_oCanvas.graphics.moveTo(oPt.x, oPt.y); - m_oCanvas.graphics.lineTo(oPt.x + arrowSize*(dy-dx)/l, oPt.y - arrowSize*(dx+dy)/l); - m_oCanvas.graphics.moveTo(oPt.x, oPt.y); - m_oCanvas.graphics.lineTo(oPt.x - arrowSize*(dx+dy)/l, oPt.y - arrowSize*(dy-dx)/l); + if (l > 0) + { + m_oCanvas.graphics.lineStyle(2,color,100,false,"normal",CapsStyle.ROUND); + m_oCanvas.graphics.moveTo(oPt.x, oPt.y); + m_oCanvas.graphics.lineTo(oPt.x + arrowSize*(dy-dx)/l, oPt.y - arrowSize*(dx+dy)/l); + m_oCanvas.graphics.moveTo(oPt.x, oPt.y); + m_oCanvas.graphics.lineTo(oPt.x - arrowSize*(dx+dy)/l, oPt.y - arrowSize*(dy-dx)/l); + } } public function ReadParam(sName:String, sDefaultValue:String) @@ -316,6 +391,226 @@ return sDefaultValue; } } + + public function ComputeElectrostaticForces():Array + { + var aForces:Array = new Array; + //trace('====== BEGIN ComputeElectrostaticForces() ======='); + + for (var i:String in this.m_aNodes) + { + aForces[i] = new Object; + aForces[i].FxTotal = 0; + aForces[i].FyTotal = 0; + var oCurrentNode:GraphNode = GetNode(i); + for (var j:String in this.m_aNodes) + { + if (i != j) + { + var oRemoteNode:GraphNode = GetNode(j); + var dx:Number = oRemoteNode.x - oCurrentNode.x; + var dy:Number = oRemoteNode.y - oCurrentNode.y; + var d2:Number = (dx*dx + dy*dy) / (this.m_RADIUS * this.m_RADIUS); + var d:Number = Math.sqrt(d2); + var Fx:Number = 0; + var Fy:Number = 0; + if (d2 < 0.05) + { + d2 = 0.05; + } + if (d2 < 2 ) // Full influence under 2 * m_RADIUS px + { + Fx = -this.m_Q * dx / d2; + Fy = -this.m_Q * dy / d2; + aForces[i].FxTotal += Fx; + aForces[i].FyTotal += Fy; + } + else if (d2 < 4 ) // Decrease the influence to between 4 and 2 * m_RADIUS px + { + Fx = -this.m_Q * (4 - d2) * dx / d2; + Fy = -this.m_Q * (4 - d2) * dy / d2; + aForces[i].FxTotal += Fx; + aForces[i].FyTotal += Fy; + } + } + } + } + //for (i in this.m_aNodes) + //{ + // trace('ELECTROSTATIC forces on '+i+': Fx='+aForces[i].FxTotal+', Fy='+aForces[i].FyTotal); + // if (Math.abs(aForces[i].FyTotal) > 1) + // { + // for (i in this.m_aNodes) + // { + // var oNode:GraphNode = GetNode(i); + // trace('node: '+i+' (x='+oNode.x+', y='+oNode.y+')'); + // } + // } + //} + //trace('====== END ComputeElectrostaticForces() ======='); + return aForces; + } + + + function ComputeElasticForces() + { + //trace('====== BEGIN ComputeElasticForces() ======='); + var aForces:Array = new Array; + + for (var i:String in this.m_aNodes) + { + aForces[i] = new Object; + aForces[i].FxTotal = 0; + aForces[i].FyTotal = 0; + } + // Elastic forces: each link applies a force proportional to its length (F = - K * x) + for(i in this.m_aLinks) + { + var oStartNode:GraphNode = GetNode(m_aLinks[i].GetStart()); + var oEndNode = GetNode(m_aLinks[i].GetEnd()); + var dx = oStartNode.x - oEndNode.x; + var dy = oStartNode.y - oEndNode.y; + //d = Math.sqrt(dx*dx + dy*dy); + //Fx = -K * d * dx / d; + //Fy = -K * d * dy / d; + // Links with more weight attached are more rigid ! + //weightCoeff = (aWeights[aLinks[l].start] + aWeights[aLinks[l].end])/2; + var Fx = -this.m_K * dx; + var Fy = -this.m_K * dy; + aForces[oStartNode.GetKey()].FxTotal += Fx; + aForces[oStartNode.GetKey()].FyTotal += Fy; + aForces[oEndNode.GetKey()].FxTotal -= Fx; + aForces[oEndNode.GetKey()].FyTotal -= Fy; + } + //for (i in this.m_aNodes) + //{ + // trace('Elastic forces on '+i+': Fx='+aForces[i].FxTotal+', Fy='+aForces[i].FyTotal); + // if (Math.abs(aForces[i].FyTotal) > 1) + // { + // for (i in this.m_aNodes) + // { + // var oNode:GraphNode = GetNode(i); + // trace('node: '+i+' (x='+oNode.x+', y='+oNode.y+')'); + // } + // } + //} + //trace('====== END ComputeElasticForces() ======='); + return aForces; + } + + /** + * Update the nodes' position based on their current movement and the forces applied + */ + function UpdatePositions() + { + //trace('====== BEGIN UpdatePositions() ======='); + var aElasticForces:Array = ComputeElasticForces(); + var aElectrostaticForces:Array = ComputeElectrostaticForces(); + //DrawForces(aElectrostaticForces, 0xcc0000); + //DrawForces(aElectrostaticForces, 0x0000cc); + for (var i:String in this.m_aNodes) + { + var oNode:GraphNode = GetNode(i); + if (!oNode.m_bInDrag) + { + var Fx:Number = aElasticForces[i].FxTotal + aElectrostaticForces[i].FxTotal; + var Fy:Number = aElasticForces[i].FyTotal + aElectrostaticForces[i].FyTotal; + + if ( (Fx*Fx + Fy*Fy) < (this.m_Ks*this.m_Ks)) + { + // Movement is less than minimum level (solid friction) => object is stopped + // otherwise let's keep it moving + oNode.m_speed_x = 0; + oNode.m_speed_y = 0; + //trace('object '+i+' stopped ! (x='+oNode.x+', y='+oNode.y+')'); + } + else + { + oNode.m_speed_x = oNode.m_speed_x*this.m_Kf + this.m_deltaT*Fx; + oNode.m_speed_y = oNode.m_speed_y*this.m_Kf + this.m_deltaT*Fy; + var dx:Number = oNode.m_speed_x * this.m_deltaT; + var dy:Number = oNode.m_speed_y * this.m_deltaT; + oNode.x = Math.round(oNode.x + dx); + oNode.y = Math.round(oNode.y + dy); + //trace('object '+i+' moves (Force: Fx='+Fx+', Fy='+Fy+')! '); + } + } + } + //trace('======= Updated Positions ========='); + //DumpPositions(); + //trace('====== END UpdatePositions() ======='); + } + + public function DrawForces(aForces:Array, color:uint) + { + for (var i:String in aForces) + { + var oNode:GraphNode = GetNode(i); + var oForce:Object = aForces[i]; + m_oCanvas.graphics.lineStyle(2,color,100,false,"normal",CapsStyle.ROUND); + m_oCanvas.graphics.moveTo(oNode.x, oNode.y); + var oEndPoint:Point = new Point; + oEndPoint.x = Math.round(oNode.x + oForce.FxTotal); + oEndPoint.y = Math.round(oNode.y + oForce.FyTotal); + m_oCanvas.graphics.lineTo(oEndPoint.x, oEndPoint.y); + drawArrow(oEndPoint, oForce.FxTotal, oForce.FyTotal, color); + //trace('Drawinf vector '+i+': (x='+oNode.x+', y='+oNode.y+') to (x='+oEndPoint.x+', y='+oEndPoint.y+')'); + } + } + + public function UpdatePanAndZoom(countDownRatio:Number) + { + var sceneRect:Rectangle = null; + for(var i:String in this.m_aNodes) + { + if (sceneRect == null) + { + sceneRect = GetNode(i).getBounds(m_oCanvas); + } + else + { + sceneRect = sceneRect.union(GetNode(i).getBounds(m_oCanvas)); + } + } + if (sceneRect != null) + { + var idealZoomLevel:Number = 1; + trace('Stage dimensions: width:'+stage.stageWidth+' height:'+stage.stageHeight); + + if ((sceneRect.width > stage.stageWidth) || (sceneRect.height > (stage.stageHeight - 50))) + { + var wRatio:Number = stage.stageWidth / sceneRect.width; + var hRatio:Number = (stage.stageHeight - 50) / sceneRect.height; + idealZoomLevel = Math.min(wRatio, hRatio); + SetZoomLevel(idealZoomLevel); + m_oZoomSlider.value = Math.round(100*idealZoomLevel); + + } + var xOffset:Number = 0; + var yOffset:Number = 50; + if (stage.stageWidth > sceneRect.width) + { + xOffset = (stage.stageWidth-sceneRect.width)/2 + } + if (stage.stageHeight > sceneRect.height) + { + yOffset = 50 + (stage.stageHeight-50-sceneRect.height)/2 + } + m_oCanvas.x = xOffset-sceneRect.x; + m_oCanvas.y = yOffset-sceneRect.y; + + trace('Scene bounding rect: x:'+sceneRect.x+' y:'+sceneRect.y+' width:'+sceneRect.width+' height:'+sceneRect.height+' zoomLevel:'+idealZoomLevel); + } + } + + public function DumpPositions() + { + for (var i:String in this.m_aNodes) + { + var oNode:GraphNode = GetNode(i); + trace(i+' Position: (x='+oNode.x+', y='+oNode.y+')'); + } + } } } diff --git a/navigator/iTop/ToolTip.as b/navigator/iTop/ToolTip.as index 3cb79ccbc..898a4b79a 100644 --- a/navigator/iTop/ToolTip.as +++ b/navigator/iTop/ToolTip.as @@ -1,6 +1,7 @@ -package iTop +package iTop { - import flash.display.Sprite; + import flash.display.*; + import flash.geom.*; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; @@ -15,17 +16,18 @@ // You'll need this for proper text formatting private var _tf:TextField = new TextField(); private var _format:TextFormat = new TextFormat(); - private static const ROUND:Number = 2; + private static const ROUND:Number = 10; private static const HEIGHT:Number = 25; private static const FONT_SIZE:uint = 12; private static const FONT:String = 'Arial'; private static const PADDING:Number = 5; - private static const MIN_ALPHA:Number = 0; - private static const ALPHA_INC:Number = .1; + private static const MIN_ALPHA:Number = 0.0; + private static const ALPHA_INC:Number = 0.1; private static const MAX_ALPHA:Number = 1; - private static const REFRESH:Number = MAX_ALPHA / ALPHA_INC; - // For fading in and out - private var _timer:Timer; + private static const REFRESH:Number = (MAX_ALPHA - MIN_ALPHA) / ALPHA_INC; + private static const APPEAR_TIMEOUT = 1000; // ms + // For appearence, fading in and out + public var timer:Timer; public function ToolTip( tip:String ) { // Hold onto the tip for posterity @@ -51,7 +53,7 @@ _tf.y += PADDING; addChild( _tf ); // Draw the background - graphics.beginFill( 0xF6F6F1, 1 ); + graphics.beginFill( 0xEEEE99, 0.95 ); graphics.drawRoundRect( 0, 0, _tf.textWidth+PADDING*4, _tf.textHeight+PADDING*4, ROUND ); graphics.endFill(); this.alpha = MIN_ALPHA; @@ -65,28 +67,74 @@ } public function mouse_over( e:MouseEvent ):void { - this.parent.setChildIndex( this, this.parent.numChildren-1 ) - // Move the tool tip to the top! - var fadeSpeed:Number = 500 / REFRESH; - _timer = new Timer( fadeSpeed, REFRESH ); - _timer.addEventListener( "timer", fadeIn ); - _timer.start(); + // Make the tooltip appear smoothly after a delay + if (this.timer != null) + { + this.timer.stop(); + } + this.timer = new Timer( APPEAR_TIMEOUT, 1 ); + this.timer.addEventListener( "timer", appear ); + this.timer.start(); this.parent.addEventListener( MouseEvent.MOUSE_OUT, mouse_out ); } public function mouse_out( e:MouseEvent ):void { var fadeSpeed:Number = 500 / REFRESH; - _timer = new Timer( fadeSpeed, REFRESH ); - _timer.addEventListener( "timer", fadeOut ); - _timer.start(); + if (this.timer != null) + { + this.timer.stop(); + } + this.timer = new Timer( fadeSpeed, REFRESH ); + this.timer.addEventListener( "timer", fadeOut ); + this.timer.start(); + this.parent.removeEventListener( MouseEvent.MOUSE_OUT, mouse_out ); } + + private function appear(i:uint):void + { + // The delay has elapsed, show (smoothly) the tooltip + if (this.timer != null) + { + this.timer.stop(); + } + // Reuse the time for the fadeIn + this.parent.setChildIndex( this, this.parent.numChildren-1 ) + // Move the tool tip to the top! + var fadeSpeed:Number = 500 / REFRESH; + this.alpha = MIN_ALPHA; + if (this.timer != null) + { + this.timer.stop(); + } + this.timer = new Timer( fadeSpeed, REFRESH ); + this.timer.addEventListener( "timer", fadeIn ); + this.timer.start(); + this.parent.addEventListener( MouseEvent.MOUSE_OUT, mouse_out ); + } + private function fadeIn( i:uint ):void { - this.alpha += ALPHA_INC; + if (this.alpha < (1.0 - ALPHA_INC)) + { + this.alpha += ALPHA_INC; + } + else + { + this.alpha = 1.0; + } + //trace("++ Tooltip alpha: "+this.alpha+" ALPHA_INC:"+ALPHA_INC); } private function fadeOut( i:uint ):void { - this.alpha -= ALPHA_INC; + if (this.alpha > ALPHA_INC) + { + this.alpha -= ALPHA_INC; + } + else + { + this.alpha = 0.0; + } + //trace("-- Tooltip alpha: "+this.alpha+" ALPHA_INC:"+ALPHA_INC); } } } diff --git a/navigator/navigator.fla b/navigator/navigator.fla index 10ddd55dc788a826252e64a8eeec51626d15151c..8049e4cd1afa63cd596a728c1fda42355770e309 100755 GIT binary patch delta 4814 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 GweT-6xs!YV delta 1726 zcmbu8Yfuwc6vy{&9t22aA+aH#29Y`e0SVD4ib9)!qP%^KGxAVdr%*+UGF3n=FDn&P zHW%ds2+=}1A|kLFIxy3M#DWy1_(o8RT9H0xv>KJ7p=V=#O=-V)XMVFM_nw@)=fD4x zbx)nuHL=JK5wy~ECL#zT8$b|b1BiqtfH(xfg?&C?0|)?n;5|TFpZy!+6UI#gs)=|L znS+*MGntES<8;n0v;-sW5}6dzo{x@>S^##%!f#g~1gCgQah_lTve2{!-{B@98IJIo z&RqqEILpTk>v>)LpGJI}tfgacTaA+M31`Am{1>@{y~Ac7a>llT#nwC6+Uy-NNRa?< z-N9u~aHSv+CF23XIy!#^uC(>w8lg3so}sfdAq#^h%(ZQhbU4v^in%&9pH%ch$Jc;9 zpdYvn+yHI@KLZ26AVAX+Tvp)Cdk8V~qSASpgyY~1*f(MqruiQDkyn(6U?m1cttad* zlQyl8+fc0~g(BExg?*XNq}6mIkyUfMx3+7)M~q5+R-~)Tpx74SFP2e)a3ma@5#C+* z7!S8lcyB-;(^Wr%)U^zgTOIL8%V8=!LE!dXKv3lIs>myfJ(L+AYmK2y{kATTQ-d@| z7u0NOlH>*Bn7CP39_NJ1;#{b6Wy=FB)76WQ-QAecNvLHw`&0x~Yq=cQRIiUR#O|!n zp72?QC&!0TBD43Uw7adE@}BicPg+Ofa7KJQwfSPJZb%E4pfHZH}ErVz^fO?l~~P~*aqGd z+u*{@yJc*jtblJW)|;#Vd4ag6U5syLo<}O|=sFqye%eIxD10bg&VC63@&1)J)0%g$ z-9+YkH^wb3NlNRtHWaqGh+Y}* zmBk);3DMyi@_*ZLcsO4<(wk}47K9HnYvgC}gO$W}r%y=Fgf$=7;=Vs|i}aOs@amaCOnBl6fi6Ki zmKR^w9n+Jt|McX`!cGPunqc4}^6+IR;~dl+LX8(Et?%#(U$lQH>=*B~2isxrUie|i z#*)*pLbCXXNb6zOo+q-ZXe`pp^HRDORIR=`^;t&!$=52HduIR8xu!jA-*E60al+*Y ztBS>osy5UWS8IwR^Fy>Ui`1$je*Y{H+qf#C_GWrT?q=%23l%Lx1w%F;Jq#{c8_Fi_d|DJ6ylp%|=pA5^VUQa$ I4~h8bZymLeR@9%xT@BVr3?OI)@YjvHf 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

8yGzHrobx6u>9vsG*@h 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 if (!$oAttDef->IsLinkSet()) { - $oNode->SetAttribute('att_'.$index, $oObj->Get($sAttCode)); + $oNode->SetAttribute('att_'.$index, $oObj->GetAsHTML($sAttCode)); } $index++; } @@ -78,6 +78,7 @@ function GetRelatedObjects(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, $oLinkedNode = $oXmlDoc->CreateElement('node'); $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey()); $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj)); + $oLinkedNode->SetAttribute('obj_class_name', MetaModel::GetName(get_class($oTargetObj))); $oLinkedNode->SetAttribute('name', $oTargetObj->GetName()); $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */))); AddNodeDetails($oLinkedNode, $oTargetObj); @@ -104,11 +105,10 @@ function BuildIconPath($sIconPath) require_once('../application/startup.inc.php'); require_once('../application/loginwebpage.class.inc.php'); -//// For developping the Navigator +// For developping the Navigator from within Flash //session_start(); //$_SESSION['auth_user'] = 'admin'; -//$_SESSION['auth_pwd'] = 'admin2'; -//UserRights::Login($_SESSION['auth_user'], $_SESSION['auth_pwd']); // Set the user's language +//UserRights::Login($_SESSION['auth_user']); // Set the user's language LoginWebPage::DoLogin(); // Check user rights and prompt if needed $oPage = new ajax_page(""); @@ -134,6 +134,7 @@ if ($id != 0) $oXmlNode = $oXmlDoc->CreateElement('node'); $oXmlNode->SetAttribute('id', $oObj->GetKey()); $oXmlNode->SetAttribute('obj_class', get_class($oObj)); + $oXmlNode->SetAttribute('obj_class_name', MetaModel::GetName(get_class($oObj))); $oXmlNode->SetAttribute('name', $oObj->GetName()); $oXmlNode->SetAttribute('icon', BuildIconPath($oObj->GetIcon(false /* No IMG tag */))); // Hard coded for the moment AddNodeDetails($oXmlNode, $oObj);