Merge branch 'master' into snapshotserver
[potlatch2.git] / net / systemeD / potlatch2 / panels / BackgroundMergePanel.mxml
1 <?xml version="1.0" encoding="utf-8"?>
2
3 <!--
4     Background Merge Panel
5 -->
6
7 <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" height="100%">
8   <mx:Text id="backgroundMergePanelText" text="Review and Merge tags from the Background layer" width="100%" styleName="helpInfo" />
9   <mx:DataGrid editable="false" id="backgroundPanelDG" width="100%" height="50%">
10     <mx:columns>
11       <mx:DataGridColumn editable="false" dataField="k" headerText="Key" />
12       <mx:DataGridColumn editable="false" dataField="e" headerText="OSM value" />
13       <mx:DataGridColumn editable="false" headerText="Merge" width="50" textAlign="center">
14         <mx:itemRenderer>
15           <mx:Component>
16             <mx:HBox horizontalAlign="center" verticalAlign="middle">
17               <mx:Button label="&lt;&lt;" visible="{parentDocument.buttonVisible(data.b, data.e)}" click="parentDocument.mergeForKey(data.k);" />
18             </mx:HBox>
19           </mx:Component>
20         </mx:itemRenderer>
21       </mx:DataGridColumn>
22       <mx:DataGridColumn editable="false" itemRenderer="net.systemeD.potlatch2.panels.BackgroundMergeFieldComponent" dataField="b" headerText="Background value" />
23     </mx:columns>
24   </mx:DataGrid>
25   <mx:ViewStack id="statusStack" resizeToContent="true" width="100%">
26     <mx:VBox id="empty" />
27     <mx:VBox id="not_complete">
28       <mx:Text text="All the data copied to the main layer? Click 'complete'!" />
29       <mx:Button label="Complete" click="markComplete()"/>
30     </mx:VBox>
31     <mx:VBox id="complete">
32       <mx:Text text="This feature has been marked as complete. If this is wrong, press the button below." />
33       <mx:Button label="Not complete" click="markNotComplete()"/>
34     </mx:VBox>
35   </mx:ViewStack>
36   <mx:Script><![CDATA[
37
38       import net.systemeD.halcyon.connection.*;
39       import net.systemeD.halcyon.MapPaint;
40       import net.systemeD.potlatch2.utils.SnapshotConnection;
41
42       import mx.collections.*;
43
44       private var editableEntity:Entity;
45       private var backgroundEntity:Entity;
46       private var tagDataProvider:ArrayCollection;
47
48       public function init(entities:Array):void {
49           if ( tagDataProvider == null ) {
50               tagDataProvider = new ArrayCollection();
51               backgroundPanelDG.dataProvider = tagDataProvider;
52           }
53
54           if (parentDocument.controller.map.getLayerForEntity(entities[0]).isBackground) {
55               backgroundEntity = entities[0];
56               editableEntity = entities[1];
57           } else {
58               backgroundEntity = entities[1];
59               editableEntity = entities[0];
60           }
61           backgroundEntity.addEventListener(Connection.STATUS_CHANGED, statusEvent, false, 0, true);
62           setStatusStack();
63           editableEntity.addEventListener(Connection.TAG_CHANGED, tagChanged, false, 0, true);
64           updateTagDataProvider();
65       }
66
67       private function updateTagDataProvider():void {
68           var tag:Tag;
69           var keys:Array = [];
70
71           tagDataProvider.removeAll();
72
73           for each (tag in backgroundEntity.getTagArray() ) {
74               keys.push(tag.key);
75           }
76
77           for each (tag in editableEntity.getTagArray() ) {
78               keys.push(tag.key);
79           }
80
81           keys=keys.filter(function(k:*, i:int, arr:Array):Boolean { return arr.indexOf(k) == i } ); // remove duplicates
82           keys.sort();
83
84           for each (var key:String in keys) {
85               tagDataProvider.addItem({k:key, e:editableEntity.getTag(key), b:backgroundEntity.getTag(key)});
86           }
87           backgroundPanelDG.invalidateList();
88       }
89
90       private function tagChanged(e:Event):void {
91           updateTagDataProvider();
92       }
93
94       public function buttonVisible(b:String, e:String):Boolean {
95           if (b != null && b != e) {
96               return true;
97           }
98           return false;
99       }
100
101       public function mergeForKey(key:String):void {
102           editableEntity.setTag(key, backgroundEntity.getTag(key), MainUndoStack.getGlobalStack().addAction);
103       }
104
105       // Don't call this for things you don't want coloured in. Like for empty tags.
106       public function getColorFor(i:int):int {
107           if (tagDataProvider[i].e == tagDataProvider[i].b) {
108               return 0xDDFFDD; // matching, green
109            } else if (tagDataProvider[i].e == null) {
110               return 0xDDDDFF; // new value, blue
111            } else if (tagDataProvider[i].b) {
112               return 0xFFDDDD; // conflicting, red
113            }
114            return NaN; // which is interpretted as black
115       }
116
117       private function statusEvent(e:Event):void {
118             setStatusStack();
119       }
120
121       private function setStatusStack():void {
122           switch (backgroundEntity.status) {
123               case 'incomplete':
124                   statusStack.selectedChild = not_complete;
125                   break;
126               case 'complete':
127                   statusStack.selectedChild = complete;
128                   break;
129               default:
130                   statusStack.selectedChild = empty;
131           }
132       }
133
134       private function markComplete():void {
135           if (backgroundEntity.connection is SnapshotConnection) {
136               SnapshotConnection(backgroundEntity.connection).markComplete(backgroundEntity);
137           }
138       }
139
140       private function markNotComplete():void {
141           if (backgroundEntity.connection is SnapshotConnection) {
142               SnapshotConnection(backgroundEntity.connection).markNotComplete(backgroundEntity);
143           }
144       }
145   ]]>
146   </mx:Script>
147 </mx:VBox>