No Selection]]> Nothing selected"; tw.setNoSelectedFeature(); } else if (entity.hasTags()) { iconText.htmlText = "Not recognised
Try looking at the tags under the advanced properties"; tw.setSelectedFeature(null); } else { iconText.htmlText = "No tags set
Use the menu above to say what this "+entity.getType()+" is"; tw.setSelectedFeature(null); } helpLabel.visible = false; } private var tabComponents:Object = {}; private function initialiseEditors():void { editorStack.removeAllChildren(); if ( selectedEntity == null || feature == null ) return; var editorBox:VBox = createEditorBox(); editorBox.label = "Basic"; editorStack.addChild(editorBox); var tabs:Object = {}; tabComponents = {}; for each (var factory:EditorFactory in feature.editors) { if ( factory.presence.isEditorPresent(factory, selectedEntity, null) ) { var editor:DisplayObject = factory.createEditorInstance(selectedEntity); if ( editor != null ) editorBox.addChild(editor); } var category:String = factory.category; if (category!='') { var tab:VBox = tabs[category]; if ( tab == null) { tab = createEditorBox(); tab.label = category; editorStack.addChild(tab); tabs[category] = tab; tabComponents[tab] = []; } var catEditor:DisplayObject = factory.createEditorInstance(selectedEntity); if ( catEditor != null ) tabComponents[tab].push(catEditor); // tab.addChild(catEditor); } } } private function createEditorBox():VBox { var box:VBox = new VBox(); box.percentWidth = 100; box.percentHeight = 100; box.styleName = "editorContainer"; return box; } private function ensureEditorsPopulated(tab:VBox):void { var components:Array = tabComponents[tab]; if ( components == null || tab == null || tab.numChildren >= components.length ) return; for each (var component:DisplayObject in components ) { tab.addChild(component); } } private function initEditorStackUIs():void { editorStackTabNavigator = new SuperTabNavigator(); editorStackTabNavigator.allowTabSqueezing=false; editorStackTabNavigator.minTabWidth=10; editorStackTabNavigator.closePolicy="close_never"; editorStackTabNavigator.scrollSpeed=20; editorStackTabNavigator.creationPolicy="auto"; editorStackTabNavigator.percentWidth=100; editorStackTabNavigator.percentHeight=100; editorStackAccordion = new Accordion(); editorStackAccordion.percentWidth=100; editorStackAccordion.percentHeight=100; editorStackAccordion.creationPolicy="auto"; setEditorStackUI(true); } private function setEditorStackUI(isTabbed:Boolean):void { var children:Array=[]; var i:uint; if (editorStack) { // blank existing component editorStack.removeEventListener("change",editorStackUIChange); editorStack.removeEventListener("updateComplete",editorStackUIUpdate); editorStack.removeAllChildren(); editorContainer.removeChildAt(1); } // replace with new component editorStack = (isTabbed ? editorStackTabNavigator : editorStackAccordion) as Container; editorContainer.addChild(editorStack); // re-add children and listeners initialiseEditors(); editorStack.addEventListener("change",editorStackUIChange); editorStack.addEventListener("updateComplete",editorStackUIUpdate); } private function editorStackUIChange(event:Event):void { ensureEditorsPopulated(IndexChangedEvent(event).relatedObject as VBox); } private function editorStackUIUpdate(event:Event):void { if (editorStack is SuperTabNavigator) { var e:SuperTabNavigator = editorStack as SuperTabNavigator; if (e.selectedIndex<0) { return; } for (var i:uint=0; i"+entity.id+""; } removeRelationListeners(); if ( selectedEntity != null ) { selectedEntity.removeEventListener(Connection.ADDED_TO_RELATION, addedToRelation); selectedEntity.removeEventListener(Connection.REMOVED_FROM_RELATION, removedFromRelation); } if ( entity == null ) { relationsGrid.dataProvider = null; } else { resetRelationsGrid(entity); entity.addEventListener(Connection.ADDED_TO_RELATION, addedToRelation); entity.addEventListener(Connection.REMOVED_FROM_RELATION, removedFromRelation); } } public function addNewTag():void { if (stack.selectedChild!=advancedContainer) { return; } advancedTagGrid.addNewTag(); } private function addedToRelation(event:RelationMemberEvent):void { resetRelationsGrid(selectedEntity); } private function removedFromRelation(event:RelationMemberEvent):void { resetRelationsGrid(selectedEntity); } private function removeRelationListeners():void { for each( var rel:Relation in listeningToRelations ) { rel.removeEventListener(Connection.TAG_CHANGED, relationTagChanged); rel.removeEventListener(Connection.RELATION_MEMBER_ADDED, entityRelationMemberChanged); rel.removeEventListener(Connection.RELATION_MEMBER_REMOVED, entityRelationMemberChanged); } listeningToRelations = []; relationsGrid.removeEventListener(DataGridEvent.ITEM_EDIT_END, relationRoleChanged); } private function resetRelationsGrid(entity:Entity):void { removeRelationListeners(); var relations:Array = []; for each( var rel:Relation in entity.parentRelations ) { for each( var memberIndex:int in rel.findEntityMemberIndexes(entity)) { var props:Object = {}; props["relation"] = rel; props["id"] = rel.id; props["index"] = memberIndex; props["role"] = rel.getMember(memberIndex).role; props["description"] = rel.getDescription(); props["id_idx"] = rel.id + "/"+memberIndex; relations.push(props); } rel.addEventListener(Connection.TAG_CHANGED, relationTagChanged); rel.addEventListener(Connection.RELATION_MEMBER_ADDED, entityRelationMemberChanged); rel.addEventListener(Connection.RELATION_MEMBER_REMOVED, entityRelationMemberChanged); listeningToRelations.push(rel); } relationsGrid.dataProvider = relations; relationsGrid.addEventListener(DataGridEvent.ITEM_EDIT_END, relationRoleChanged, false, -100); } private function relationRoleChanged(event:DataGridEvent):void { if (event.dataField != 'role') { return; } // shouldn't really happen var relations:Array=event.currentTarget.dataProvider.toArray(); var props:Object=relations[event.rowIndex]; var relation:Relation=props['relation']; var index:uint=props['index']; var newRole:String=event.itemRenderer.data['role']; relation.setMember(index, new RelationMember(selectedEntity,newRole)); } private function relationTagChanged(event:TagEvent):void { resetRelationsGrid(selectedEntity); } private function entityRelationMemberChanged(event:RelationMemberEvent):void { resetRelationsGrid(selectedEntity); } private function checkMembers():void { if (selectedEntity is Relation) { setupMembers(selectedEntity as Relation); } } private function setupMembers(rel:Relation):void { var members:Array = []; for (var i:int=0 ; i=0; i--) { rel.removeMemberByIndex(i); } // add members in new order for each(var memberObject:Object in membersGrid.dataProvider) { var e:Entity; var id:Number = memberObject.id; if(memberObject.type == 'node') { e = conn.getNode(id); } else if (memberObject.type == 'way') { e = conn.getWay(id); } else if (memberObject.type == 'relation') { e = conn.getRelation(id); } rel.appendMember(new RelationMember(e, memberObject.role)); } } private function editRelation(id:Number):void { var panel:RelationEditorPanel = RelationEditorPanel( PopUpManager.createPopUp(Application(Application.application), RelationEditorPanel, true)); panel.setRelation(Connection.getConnectionInstance().getRelation(id)); PopUpManager.centerPopUp(panel); } private function tagChanged(event:TagEvent):void { refreshFeatureIcon(); // if the advancedTagGrid has already been set up, it needs to be refreshed. // FIXME make this better, maybe advancedTagGrid should be event listening. setupAdvanced(selectedEntity); } public function loadFeatures():void { mapFeatures = MapFeatures.getInstance(); stack.removeChild(membersVBox); // remove by default, will be added if relation } public function openDescription():void { if ( feature != null && feature.hasHelpURL() ) navigateToURL(new URLRequest(feature.helpURL), "potlatch_help"); } public function openEntityPage():void { if (selectedEntity != null && selectedEntity.id >= 0) { // This is slightly hard-coded, but not drastically. The ../s could be changed for string manipulation of the apiBase var urlBase:String = Connection.getConnectionInstance().apiBase + '../../browse/' navigateToURL(new URLRequest(urlBase+selectedEntity.getType()+'/'+selectedEntity.id), "potlatch_browse"); } } public function addToRelation():void { new RelationSelectPanel().init(selectedEntity,new Object()); } public function removeFromRelation(id:Number, index:int):void { Connection.getConnectionInstance().getRelation(id).removeMemberByIndex(index); } public function initFeatureBox():void { tw = new CategorySelector(); tw.addEventListener("selectedType", changeFeatureType); popupChange.popUp = tw; } public function changeFeatureType(event:Event):void { if ( selectedEntity == null ) return; UIComponent.suspendBackgroundProcessing(); var newFeature:Feature = tw.selectedType; var undoStack:Function = MainUndoStack.getGlobalStack().addAction; var action:CompositeUndoableAction = new CompositeUndoableAction( "Set "+selectedEntity.getType()+" "+selectedEntity.id+" to "+newFeature.name); selectedEntity.suspend(); // remove tags from the current feature if ( feature != null ) { for each( var oldtag:Object in feature.tags ) { selectedEntity.setTag(oldtag["k"], null, action.push); } } // set tags for new feature if ( newFeature != null ) { for each( var newtag:Object in newFeature.tags ) { selectedEntity.setTag(newtag["k"], newtag["v"], action.push); } } selectedEntity.resume(); undoStack(action); popupChange.close(); initialiseEditors(); UIComponent.resumeBackgroundProcessing(); } private function resizePOIGrid(event:Event):void { var rows:Number=event.target.dataProvider.length/event.target.columnCount; if (rows!=Math.floor(rows)) { rows=Math.floor(rows+1); } event.target.height=rows*(event.target.rowHeight+1); } ]]>