<?xml version="1.0" encoding="utf-8"?> |
<!-- |
* |
* The MIT License |
* |
* Copyright (c) 2008 |
* United Nations Office at Geneva |
* Center for Advanced Visual Analytics |
* http://cava.unog.ch |
* |
* Permission is hereby granted, free of charge, to any person obtaining a copy |
* of this software and associated documentation files (the "Software"), to deal |
* in the Software without restriction, including without limitation the rights |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
* copies of the Software, and to permit persons to whom the Software is |
* furnished to do so, subject to the following conditions: |
* |
* The above copyright notice and this permission notice shall be included in |
* all copies or substantial portions of the Software. |
* |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
* THE SOFTWARE. |
* |
--> |
<mx:ComboBoxxmlns:mx="http://www.adobe.com/2006/mxml" |
height="20" |
width="95%" |
color="#CCCCCC" |
prompt="Select layout algorithm." |
toolTip="Some layouters may not be fully stable." |
initialize="initData()" |
change="changeLayouter()"> |
|
<mx:ArrayCollectionid="layouts"> |
<mx:String>---Radial---</mx:String> |
<mx:String>ConcentricRadial</mx:String> |
<mx:String>ParentCenteredRadial</mx:String> |
<mx:String>SingleCycleCircle</mx:String> |
<mx:String>Hyperbolic</mx:String> |
<mx:String>---Tree---</mx:String> |
<mx:String>Hierarchical</mx:String> |
<mx:String>---Physics---</mx:String> |
<mx:String>ForceDirected</mx:String> |
<mx:String>ISOM</mx:String> |
<mx:String>---Coordinates---</mx:String> |
<mx:String>DirectPlacement</mx:String> |
<mx:String>---Experimental---</mx:String> |
<mx:String>Phyllotactic</mx:String> |
</mx:ArrayCollection> |
|
<mx:Script> |
<![CDATA[ |
import mx.utils.ObjectUtil; |
import org.un.cava.birdeye.ravis.utils.LogUtil; |
import org.un.cava.birdeye.ravis.utils.events.VGraphEvent; |
import org.un.cava.birdeye.ravis.graphLayout.visual.VisualGraph; |
import org.un.cava.birdeye.ravis.graphLayout.layout.ILayoutAlgorithm; |
import org.un.cava.birdeye.ravis.graphLayout.layout.CircularLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.ConcentricRadialLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.DirectPlacementLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.ForceDirectedLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.HierarchicalLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.Hyperbolic2DLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.ISOMLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.ParentCenteredRadialLayouter; |
import org.un.cava.birdeye.ravis.graphLayout.layout.PhylloTreeLayouter; |
|
private static const _LOG:String = "components.ui.controls.layouterControls.LayoutSelector"; |
private var _vgraph:VisualGraph; |
|
/** |
* Provides access to the registered vgraph object. |
* */ |
public function set vgraph(v:VisualGraph):void { |
_vgraph = v; |
registerListeners(); |
} |
|
|
/** |
* @private |
* */ |
public function get vgraph():VisualGraph { |
return _vgraph; |
} |
|
/** |
* When enabling or disabling this component, we also |
* perform some specific tasks. |
* Attention do completely disable interaction |
* there is also the mouseEnabled property. |
* |
* @inheritDoc |
* */ |
override public function set enabled(e:Boolean):void { |
if(e == true) { |
this.setStyle("color",0x000000); |
this.alpha=1; |
} else { |
this.setStyle("color",0xCCCCCC); |
this.alpha=0.3; |
} |
/* call superclass (ComboBox) */ |
super.enabled = e; |
} |
|
/** |
* Set the selected Layouter. |
* */ |
public function changeLayouter():void { |
/* check if we have a vgraph at all */ |
if(_vgraph == null) { |
LogUtil.warn(_LOG, "Cannot change Layouter without vgraph."); |
return; |
} |
setLayouter(); |
_vgraph.draw(); // run the layout |
} |
|
/** |
* Set/Activate the layouter set in the selector. |
* */ |
public function setLayouter():void { |
|
var layouter:ILayoutAlgorithm; |
var layouterName:String = (this.selectedItem as String); |
|
/* check if we have a vgraph at all */ |
if(_vgraph == null) { |
LogUtil.warn(_LOG, "Cannot change Layouter without vgraph."); |
return; |
} |
|
/* kill off animation in old layouter if present */ |
if(_vgraph.layouter != null) { |
_vgraph.layouter.resetAll(); |
/* remove also existing references thus |
* destroying the object (maybe this is not needed?) */ |
_vgraph.layouter = null; |
} |
|
/* now choose the selected layouter */ |
switch(layouterName) { |
case "ConcentricRadial": |
layouter = new ConcentricRadialLayouter(_vgraph); |
break; |
case "ParentCenteredRadial": |
layouter = new ParentCenteredRadialLayouter(_vgraph); |
break; |
case "SingleCycleCircle": |
layouter = new CircularLayouter(_vgraph); |
|
/* set the hyperbolic edge renderer type * |
_vgraph.edgeRenderer = new CircularEdgeRenderer(); |
_vgraph.scrollBackgroundInDrag = false; |
_vgraph.moveNodeInDrag = false; |
absoluteScaling = true; |
updateScale(); |
*/ |
break; |
case "Hyperbolic": |
layouter = new Hyperbolic2DLayouter(_vgraph); |
|
/* set some layouter specific defaults: |
_vgraph.edgeRenderer = new HyperbolicEdgeRenderer((layouter as Hyperbolic2DLayouter).projector); |
_vgraph.scrollBackgroundInDrag = false; |
_vgraph.moveNodeInDrag = false; |
absoluteScaling = false; |
*/ |
break; |
case "Hierarchical": |
layouter = new HierarchicalLayouter(_vgraph); |
break; |
case "ForceDirected": |
layouter = new ForceDirectedLayouter(_vgraph); |
break; |
case "ISOM": |
layouter = new ISOMLayouter(_vgraph); |
break; |
case "DirectPlacement": |
layouter = new DirectPlacementLayouter(_vgraph); |
/* set some layouter specific values, i.e. create a control |
* for these first, also they could be prepopulated from |
* XML data |
(layouter as DirectPlacementLayouter).relativeHeight = 400; |
(layouter as DirectPlacementLayouter).relativeWidth = 400; |
*/ |
/* |
/* set the orthogonal edge renderer type * |
_vgraph.edgeRenderer = new OrthogonalEdgeRenderer(); |
_vgraph.scrollBackgroundInDrag = true; |
_vgraph.moveNodeInDrag = true; |
absoluteScaling = true; |
updateScale(); |
*/ |
break; |
case "Phyllotactic": |
layouter = new PhylloTreeLayouter(_vgraph); |
break; |
default: |
LogUtil.warn(_LOG, "Illegal Layouter selected, defaulting to ConcentricRadial"+ |
layouterName); |
layouter = new ConcentricRadialLayouter(_vgraph); |
break; |
} |
_vgraph.layouter = layouter; |
} |
|
/** |
* Refresh the selector if an external event changes the layouter. |
* */ |
public function refreshSelector(e:VGraphEvent = null):void { |
|
var layouterClassName:String; |
var layouterName:String; |
|
/* check if we have a vgraph/layouter at all */ |
if(_vgraph == null || _vgraph.layouter == null) { |
LogUtil.warn(_LOG, "Cannot refresh the LayoutSelector without vgraph or Layouter."); |
return; |
} |
|
layouterClassName = ObjectUtil.getClassInfo(_vgraph.layouter).name; |
layouterClassName = layouterClassName.replace(/org.un.cava.birdeye.ravis.graphLayout.layout::/,""); |
|
/* now choose the selected layouter */ |
switch(layouterClassName) { |
case "ConcentricRadialLayouter": |
layouterName = "ConcentricRadial"; |
break; |
case "ParentCenteredRadialLayouter": |
layouterName = "ParentCenteredRadial"; |
break; |
case "CircularLayouter": |
layouterName = "SingleCycleCircle"; |
break; |
case "Hyperbolic2DLayouter": |
layouterName = "Hyperbolic"; |
break; |
case "HierarchicalLayouter": |
layouterName = "Hierarchical"; |
break; |
case "ForceDirectedLayouter": |
layouterName = "ForceDirected"; |
break; |
case "ISOMLayouter": |
layouterName = "ISOM"; |
break; |
case "DirectPlacementLayouter": |
layouterName = "DirectPlacement"; |
break; |
case "PhylloTreeLayouter": |
layouterName = "Phyllotactic"; |
break; |
default: |
layouterName = "Unknown"; |
LogUtil.warn(_LOG, "Unknown Layouter found:"+layouterClassName); |
break; |
} |
/* make the selection */ |
|
/* XXX THIS MAY CAUSE A LOOP POSSIBLY */ |
this.selectedItem = layouterName; |
} |
|
/** |
* initialise the selection data. |
* It is a bit unclear, why this seems to be necessary. |
* */ |
private function initData():void { |
this.dataProvider = layouts; |
} |
|
/** |
* Adds the listeners to update on changes in the VGraph |
* */ |
private function registerListeners():void { |
_vgraph.addEventListener(VGraphEvent.LAYOUTER_CHANGED,refreshSelector); |
} |
]]> |
</mx:Script> |
</mx:ComboBox> |