Merge branch 'master' of github.com:systemed/potlatch2
[potlatch2.git] / net / systemeD / halcyon / connection / actions / SetTagAction.as
1 package net.systemeD.halcyon.connection.actions {
2
3     import net.systemeD.halcyon.connection.*;
4
5     /** An UndoableEntityAction corresponding to the setting of a single tag and value. */
6     public class SetTagAction extends UndoableEntityAction {
7         private var oldValue:String;
8         private var key:String;
9         private var value:String;
10
11         public function SetTagAction(entity:Entity, key:String, value:String) {
12             super(entity, "Set "+key+"="+value);
13             this.key = key;
14             this.value = value ? value.substr(0,255): null;
15         }
16
17         public override function doAction():uint {
18             var tags:Object = entity.getTagsHash();
19             oldValue = tags[key];
20
21             if ( !( ( entity.getTag(key) == null ) && ( value == null && oldValue == null ) ) &&
22                 ( value == null || key == '' || oldValue != value ) ) {
23                 if ( value == null || key == '' || value == '' )
24                     delete tags[key];
25                 else
26                     tags[key] = value;
27                 markDirty();
28                 entity.dispatchEvent(new TagEvent(Connection.TAG_CHANGED, entity, key, key, oldValue, value));
29                 return SUCCESS;
30             } else {
31                 return NO_CHANGE;
32             }
33         }
34
35         public override function undoAction():uint {
36             var tags:Object = entity.getTagsHash();
37             if ( oldValue == null || oldValue == "" )
38                 delete tags[key];
39             else
40                 tags[key] = oldValue;
41             markClean();
42             entity.dispatchEvent(new TagEvent(Connection.TAG_CHANGED, entity, key, key, value, oldValue));
43
44             return SUCCESS;
45         }
46
47         public override function mergePrevious(prev:UndoableAction):Boolean {
48             if ( !(prev is SetTagAction) )
49                 return false;
50
51             var prevSet:SetTagAction = prev as SetTagAction;
52             if ( prevSet.entity == entity && prevSet.key == key ) {
53                 oldValue = prevSet.oldValue;
54                 return true;
55             }
56             return false;
57         }
58     }
59 }
60