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+"";
var tags:Array = entity.getTagArray();
tags.sortOn("key");
for each(var tag:Tag in tags)
tagDataProvider.addItem(tag);
}
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);
}
}
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 ( tagDataProvider != null ) {
// check to see if the key is already in our list
var exists:Boolean = false;
var tag:Tag = null;
var i:uint;
for ( i = 0; i < tagDataProvider.length && !exists; i++ ) {
tag = Tag(tagDataProvider.getItemAt(i));
exists = tag.key == event.key;
}
if ( !exists ) {
tag = new Tag(selectedEntity, event.key, event.newValue);
tagDataProvider.addItem(tag);
tagDataProvider.refresh();
} else {
if ( event.newValue == null ) {
tagDataProvider.removeItemAt(i-1);
tagDataProvider.refresh();
} else {
tagDataProvider.itemUpdated(tag, "value");
}
}
}
}
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 addNewTag():void {
if (stack.selectedChild!=advancedContainer || selectedEntity == null) { return; }
var newKey:String = "(new tag)";
var newTag:Tag = new Tag(selectedEntity, newKey, "(new value)");
tagDataProvider.addItem(newTag);
advancedTagGrid.editedItemPosition = {rowIndex: tagDataProvider.getItemIndex(newTag), columnIndex: 0};
}
public function removeTag():void {
var k:String = advancedTagGrid.selectedItem.key;
selectedEntity.setTag(k, null, MainUndoStack.getGlobalStack().addAction);
}
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);
}
]]>