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 }