Beispiel fensterbasiertes atlasFX-Tool

Parent Previous Next

Beispiel für ein fensterbasiertes atlasFX-Tool:


Die Basisklasse für fensterbasierte atlasFX-Tools ist WindowedToolBase. Diese Klasse erweitert SimpleToolBase. Sämtliche für die Erstellung eines einfachen Tools beschriebenen Techniken gelten also auch für die Erstellung eines fensterbasierten Tools.


Erstellen des Tools


Ein fensterbasiertes Tool wird erstellt, indem die WindowedToolBase-Klasse erweitert wird:


Nach dem Erstellen der Klasse können jetzt sehr leicht im Quellcode folgende Eigenschaften festgelegt werden:


<?xml version="1.0" encoding="utf-8"?>

<tools:WindowedToolBase

       xmlns:fx="http://ns.adobe.com/mxml/2009"

       xmlns:s="library://ns.adobe.com/flex/spark"

       xmlns:mx="library://ns.adobe.com/flex/mx"

       xmlns:tools="com.alta4.atlas.tools.*"

       xmlns:configuration="com.alta4.atlas.tools.configuration.*"

       windowTitleIcon="{overviewIcon}"

       windowTitle="{resourceManager.getString('tools','overviewMapName')}"

       resizable="true" minimizable="true"

       windowStartHeight="250" windowStartWidth="400"

       windowStartX="50" windowStartY="100">


Zum aktivieren des Tools kann analog zum einfachen Tool ein visuelles Element für die atlasFX Toolbar an der Eigenschaft toolbarVisualElement deklariert werden:


<tools:toolbarVisualElement>

               <mx:Button id="button" icon="{overviewIcon}"

                       paddingLeft="0" paddingRight="0"

                       width="24" height="24"

                       buttonMode="true"

                       click="button_clickHandler(event)"

                       toggle="true"

                       selected="{activated}"

                       toolTip="{resourceManager.getString('tools','overviewMapTooltip')}"/>

</tools:toolbarVisualElement>


Die Basisfunktionalitäten des Fensters (öffnen, schliessen, verschieben, Größe ändern, minimieren) sind bereits in der WindowedToolBase-Klasse implementiert. Das Fenster merkt sich beim schliessen die aktuelle Größe und Position.


Der Inhalt des Fensters wird an der Eigenschaft windowContent deklariert. Etwa so:


<tools:windowContent>

       <s:Group

               id="contentBox"

               width="100%" height="100%">

               <s:Rect width="100%" height="100%">

                       <s:fill>

                               <s:SolidColor color="0xffffff"/>

                       </s:fill>

               </s:Rect>

       </s:Group>

</tools:windowContent>


Der Fensterinhalt kann an dieser Stelle direkt im Quelltext statisch deklariert werden. Es ist jedoch eine gute Praxis, wenn der Fensterinhalt beim aktivieren des Tools neu instantiiert wird, wenn ein frischer ‚state‘ des Tools bei jedem Aktivieren gewünscht ist.


Folgende Funktionalitäten müssen vom Entwickler implementiert werden:


                               <tools:WindowedToolBase xmlns:fx="http://ns.adobe.com/mxml/2009"

                                       xmlns:s="library://ns.adobe.com/flex/spark"

                                       xmlns:mx="library://ns.adobe.com/flex/mx"

                                       xmlns:tools="com.alta4.atlas.tools.*"

                                       windowOpen="windowedtoolbase1_windowOpenHandler(event)"

                                       >


                                       <fx:Script>

                                               <![CDATA[

                                                       protected function windowedtoolbase1_windowOpenHandler(event:Event):void

                                                       {

                                                               createContent();

                                                               activated = true;

                                                       }

                                               ]]>

                               </fx:Script>

Je nach Bedarf sollten Deaktivierungslogik und weitere Aufräumarbeiten des Tools mit diesen Events verknüpft werden.




Styling des Tool-Fensters


Auf ein Tool-Fenster werden die Styles angewendet, die in einem der Applikation bekannten Stylesheet unter dem Attribut .toolWindow definiert sind. Akzeptierte Styles sind in den Klassen ResizableTitleWindow (s. Atlas-ASDocs) sowie spark.components.TitleWindow (s. ActionScript 3.0 Reference) definiert.

Beachtenswert ist, daß hier auch eine Skin-Klasse für das Fenster angegeben werden kann. Z.B.:

skin-class:        ClassReference("skins.ToolWindowSkin");



Vollständiges fensterbasiertes Tool:


<?xml version="1.0" encoding="utf-8"?>

<tools:WindowedToolBase

       xmlns:fx="http://ns.adobe.com/mxml/2009"

       xmlns:s="library://ns.adobe.com/flex/spark"

       xmlns:mx="library://ns.adobe.com/flex/mx"

       xmlns:tools="com.alta4.atlas.tools.*"

       xmlns:configuration="com.alta4.atlas.tools.configuration.*"

       windowTitleIcon="{overviewIcon}"

       windowTitle="{resourceManager.getString('tools','overviewMapName')}"

       resizable="true"

       windowStartWidth="170" windowStartHeight="200"

       windowOpen="windowedtoolbase1_windowOpenHandler(event)"

       windowClosed="windowedtoolbase1_windowClosedHandler(event)"

       windowResized="windowedtoolbase1_windowResizedHandler(event)"        

       >        

       

       <fx:Script>

               <![CDATA[

                       import com.alta4.atlas.tools.ToolEvent;

                       import com.alta4.centralDispatcher.CentralDispatcher;

                       import com.esri.ags.layers.ArcGISTiledMapServiceLayer;

                       import com.esri.ags.layers.Layer;

                       

                       import flash.utils.setTimeout;

                       

                       import mx.core.IVisualElement;

                       import mx.core.UIComponent;

                       

                       [Embed(source='overview20.png')]

                       private const overviewIcon:Class;

                       

                       [Bindable] private var activated:Boolean;


                       

                       protected function button_clickHandler(event:MouseEvent):void

                       {

                               if(!activated) {

                                       openTool();

                               } else {

                                       closeTool();

                               }                                                                

                       }        

                       


                       protected function windowedtoolbase1_windowOpenHandler(event:Event):void

                       {

                               newOverviewMap();

                               activated = true;

                       }



                       protected function windowedtoolbase1_windowClosedHandler(event:Event):void

                       {

                               if(overviewMap)overviewMap.removeMyListeners();

                               contentBox.removeAllElements();

                               activated = false;

                       }

                       

                       private var overviewMap:OverviewMap;

                       

                       private var _count:int=0;

                       private function newOverviewMap():void {

                               if(!map || !url.value){

                                       if(_count<20)setTimeout(newOverviewMap,1000);

                                       _count++;

                                       return;

                               }

                               overviewMap = new OverviewMap();

                               overviewMap.percentWidth = 100;

                               overviewMap.percentHeight = 100;

                               overviewMap.mainMap = this.map;

                               var layer:Layer;

                               

                               layer = new ArcGISTiledMapServiceLayer(url.value);

                               

                               if(layer)overviewMap.addLayer(layer);

                               contentBox.addElement(overviewMap);

                       }



                       protected function windowedtoolbase1_windowResizedHandler(event:Event):void

                       {

                               if(overviewMap)overviewMap.update();

                       }

               ]]>

       </fx:Script>

       

       <tools:toolbarVisualElement>

               <mx:Button id="button" icon="{overviewIcon}"

                       paddingLeft="0" paddingRight="0"

                       width="24" height="24"

                       buttonMode="true"

                       click="button_clickHandler(event)"

                       toggle="true"

                       selected="{activated}"

                       toolTip="{resourceManager.getString('tools','overviewMapTooltip')}"/>

       </tools:toolbarVisualElement>

       

       

       <tools:windowContent>

               <s:Group

                       id="contentBox"

                       width="100%" height="100%">

                       <s:Rect width="100%" height="100%">

                               <s:fill>

                                       <s:SolidColor color="0xffffff"/>

                               </s:fill>

                       </s:Rect>

               </s:Group>

       </tools:windowContent>

       

       <tools:configuration>

               <configuration:AtlasToolConfiguration>

                       <configuration:StringConfigurationElement id="url"

                               description="URL für die Übersichtskarte (oder Rasterlayer auf das Feld ziehen):"

                               acceptAtlasLayerDragDrop="true"

                               defaultValue="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"

                               />

               </configuration:AtlasToolConfiguration>

       </tools:configuration>

       

</tools:WindowedToolBase>