1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.vectomatic.svg.edit.client.model;
18
19 import java.util.Collection;
20 import java.util.Map;
21
22 import com.extjs.gxt.ui.client.data.ChangeEvent;
23 import com.extjs.gxt.ui.client.data.ChangeEventSupport;
24 import com.extjs.gxt.ui.client.data.ChangeListener;
25 import com.extjs.gxt.ui.client.data.Model;
26 import com.extjs.gxt.ui.client.data.PropertyChangeEvent;
27 import com.extjs.gxt.ui.client.store.Store;
28 import com.extjs.gxt.ui.client.util.Util;
29 import com.google.gwt.core.client.GWT;
30
31
32
33
34
35
36
37 public abstract class AbstractModel<U> implements Model {
38
39
40
41 protected transient ChangeEventSupport changeEventSupport;
42
43
44
45 protected U element;
46
47 public AbstractModel(U element) {
48 this.element = element;
49 changeEventSupport = new ChangeEventSupport();
50 }
51
52 public abstract MetaModel<U> getMetaModel();
53
54 public U getElement() {
55 return element;
56 }
57
58
59
60
61
62 public abstract Store getStore();
63
64
65
66
67
68 @Override
69 public <X> X get(String property) {
70 IMetadata propertyDefinition = getMetaModel().getMetadata(property);
71 assert propertyDefinition != null : "Undefined property " + property;
72 return (X)propertyDefinition.get(element);
73 }
74
75 @Override
76 public Map<String, Object> getProperties() {
77 return getMetaModel().getProperties(element);
78 }
79
80 @Override
81 public Collection<String> getPropertyNames() {
82 return getMetaModel().getPropertyNames();
83 }
84
85 @Override
86 public <X> X remove(String property) {
87 IMetadata propertyDefinition = getMetaModel().getMetadata(property);
88 assert propertyDefinition != null : "Undefined property " + property;
89 X oldValue = (X)propertyDefinition.remove(element);
90 notifyPropertyChanged(propertyDefinition.getName(), null, oldValue);
91 return oldValue;
92 }
93
94 @Override
95 public <X> X set(String property, X value) {
96 IMetadata propertyDefinition = getMetaModel().getMetadata(property);
97 assert propertyDefinition != null : "Undefined property " + property;
98 X oldValue = (X)propertyDefinition.set(element, value);
99 GWT.log("AbstractModel.set(" + property + ") = " + oldValue + ", " + value);
100 notifyPropertyChanged(propertyDefinition.getName(), value, oldValue);
101 return oldValue;
102 }
103
104
105
106
107 @Override
108 public void addChangeListener(ChangeListener... listener) {
109 changeEventSupport.addChangeListener(listener);
110 }
111
112 @Override
113 public void removeChangeListener(ChangeListener... listener) {
114 changeEventSupport.removeChangeListener(listener);
115 }
116
117 @Override
118 public void removeChangeListeners() {
119 changeEventSupport.removeChangeListeners();
120 }
121
122 @Override
123 public void setSilent(boolean silent) {
124 changeEventSupport.setSilent(silent);
125 }
126
127 @Override
128 public void notify(ChangeEvent event) {
129 changeEventSupport.notify(event);
130 }
131
132 protected void notifyPropertyChanged(String name, Object value, Object oldValue) {
133 if (!Util.equalWithNull(value, oldValue)) {
134 notify(new PropertyChangeEvent(Update, this, name, oldValue, value));
135 }
136 }
137
138 public boolean isSilent() {
139 return changeEventSupport.isSilent();
140 }
141
142 protected void fireEvent(int type) {
143 notify(new ChangeEvent(type, this));
144 }
145
146 protected void fireEvent(int type, Model item) {
147 notify(new ChangeEvent(type, this, item));
148 }
149 }