had to rename the packages to make them compliant with buckminster
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / forms / AbstractCdmFormElement.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.ui.forms;
5
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Set;
9
10 import org.eclipse.core.runtime.Assert;
11 import org.eclipse.jface.util.IPropertyChangeListener;
12 import org.eclipse.jface.util.PropertyChangeEvent;
13 import org.eclipse.swt.graphics.Color;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.swt.widgets.Control;
16 import org.eclipse.ui.forms.widgets.Section;
17
18 import eu.etaxonomy.taxeditor.store.StoreUtil;
19
20 /**
21 * <p>Abstract AbstractCdmFormElement class.</p>
22 *
23 * @author n.hoffmann
24 * @version $Id: $
25 */
26 public abstract class AbstractCdmFormElement implements IPropertyChangeEmitter, ICdmFormElement, ISelectable {
27
28 protected CdmFormFactory formFactory;
29
30 private List<IPropertyChangeListener> propertyChangeListeners;
31
32 private Composite layoutComposite;
33
34 private Set<Control> controls = new HashSet<Control>();
35
36 private Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();
37 private ICdmFormElement parentElement;
38
39
40 /**
41 * <p>Constructor for AbstractCdmFormElement.</p>
42 *
43 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
44 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
45 */
46 protected AbstractCdmFormElement(CdmFormFactory formFactory, Composite layoutComposite){
47 this.layoutComposite = layoutComposite;
48 this.formFactory = formFactory;
49 }
50
51 /**
52 * <p>Constructor for AbstractCdmFormElement.</p>
53 *
54 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
55 * @param formElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
56 */
57 public AbstractCdmFormElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
58 this(formFactory, formElement.getLayoutComposite());
59 this.parentElement = formElement;
60 // addControl(layoutComposite);
61 }
62
63 /**
64 * <p>Getter for the field <code>formFactory</code>.</p>
65 *
66 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
67 */
68 public CdmFormFactory getFormFactory() {
69 return formFactory;
70 }
71
72 /** {@inheritDoc} */
73 public Color getColor(boolean selected) {
74 return selected ? SELECTED : NOT_SELECTED;
75 }
76
77 /**
78 * Delegates the focus to <code>this</code> elements main input control
79 */
80 public void setFocus(){
81 // Override in subclasses where needed
82 }
83
84 /**
85 * Returns all Controls that are managed by this element
86 *
87 * @return a {@link java.util.Set} object.
88 */
89 public Set<Control> getControls(){
90 return controls;
91 }
92
93 /**
94 * adds the control to the set of controls that are managed by this element
95 *
96 * @param child a {@link org.eclipse.swt.widgets.Control} object.
97 */
98 protected void addControl(Control child){
99 controls.add(child);
100 }
101
102 /**
103 * <p>removeControl</p>
104 *
105 * @param child a {@link org.eclipse.swt.widgets.Control} object.
106 */
107 protected void removeControl(Control child){
108 controls.remove(child);
109 }
110
111 /**
112 * <p>Getter for the field <code>elements</code>.</p>
113 *
114 * @return a {@link java.util.Set} object.
115 */
116 public Set<ICdmFormElement> getElements(){
117 return elements;
118 }
119
120 /**
121 * <p>Getter for the field <code>parentElement</code>.</p>
122 *
123 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
124 */
125 public ICdmFormElement getParentElement(){
126 return parentElement;
127 }
128
129 /** {@inheritDoc} */
130 public void addElement(ICdmFormElement element){
131 elements.add(element);
132 }
133
134 /**
135 * <p>removeElement</p>
136 *
137 * @param element a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
138 */
139 protected void removeElement(ICdmFormElement element){
140 elements.remove(element);
141 }
142
143 /**
144 * <p>removeElements</p>
145 */
146 public void removeElements(){
147 for(ICdmFormElement childElement : getElements()){
148 // recursion
149 childElement.removeElements();
150
151 // unregister selection arbitrator
152 if(childElement instanceof ISelectableElement){
153 SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();
154 if(selectionArbitrator != null){
155 formFactory.destroySelectionArbitrator(selectionArbitrator);
156 }
157 }
158
159 // unregister from property changes
160 if(childElement instanceof IPropertyChangeListener){
161 formFactory.removePropertyChangeListener((IPropertyChangeListener) childElement);
162 }
163
164 // dispose of the controls
165 removeControls(childElement);
166 }
167 elements.clear();
168 }
169
170 private void removeControls(ICdmFormElement element){
171 if(element instanceof Section){
172 ((Section) element).dispose();
173 element = null;
174 }else{
175 for(Control control : element.getControls()){
176 // we added the layoutComposite of the parental element as the layout composite to this formElement
177 // but we do not want to destroy it.
178 if(control.equals(element.getLayoutComposite())){
179 continue;
180 }else{
181 control.dispose();
182 control = null;
183 }
184 }
185 }
186 }
187
188 /**
189 * <p>Getter for the field <code>layoutComposite</code>.</p>
190 *
191 * @return a {@link org.eclipse.swt.widgets.Composite} object.
192 */
193 public Composite getLayoutComposite() {
194 return layoutComposite;
195 }
196
197 /**
198 * <p>Setter for the field <code>layoutComposite</code>.</p>
199 *
200 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
201 */
202 public void setLayoutComposite(Composite layoutComposite){
203 this.layoutComposite = layoutComposite;
204 }
205
206 /* (non-Javadoc)
207 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#getPropertyChangeListeners()
208 */
209 /**
210 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
211 *
212 * @return a {@link java.util.Set} object.
213 */
214 public List<IPropertyChangeListener> getPropertyChangeListeners() {
215 return propertyChangeListeners;
216 }
217
218 /* (non-Javadoc)
219 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#setPropertyChangeListeners(org.eclipse.core.runtime.ListenerList)
220 */
221 /** {@inheritDoc} */
222 public void setPropertyChangeListeners(List<IPropertyChangeListener> propertyChangeListeners){
223 this.propertyChangeListeners = propertyChangeListeners;
224 }
225
226 /* (non-Javadoc)
227 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
228 */
229 /* (non-Javadoc)
230 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#firePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
231 */
232 /** {@inheritDoc} */
233 public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {
234 Assert.isNotNull(propertyChangeListeners, "Property change listeners are not present");
235 for(Object listener : propertyChangeListeners){
236 ((IPropertyChangeListener)listener).propertyChange(event);
237 }
238 }
239
240
241 /**
242 * {@inheritDoc}
243 *
244 * This method gets called whenever the toolkit this composite was created with gets a property change notification.
245 *
246 * It is good advice to check whether the PropertyChangeEvent is destined for the implementing composite.
247 * Implementations should also check for null PropertyChangeEvents and return immediately in that case.
248 * @see eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
249 */
250 public void propertyChange(PropertyChangeEvent event) {
251 // implement in subclasses
252 }
253
254 /** {@inheritDoc} */
255 public boolean containsFormElement(ICdmFormElement formElement){
256 if(formElement == this){
257 return true;
258 }else{
259 for(ICdmFormElement element : getElements()){
260 boolean contains = element.containsFormElement(formElement);
261 if(contains == true){
262 return true;
263 }
264 }
265 return false;
266 }
267 }
268
269 /*
270 * (non-Javadoc)
271 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
272 */
273 /**
274 * <p>refresh</p>
275 */
276 public void refresh() {
277 // empty default implementation
278 }
279
280 /** {@inheritDoc} */
281 @Override
282 public void setBackground(Color color) {
283 for(ICdmFormElement element : getElements()){
284 element.setBackground(color);
285 }
286 }
287
288 public Color getColor(String colorId){
289 return StoreUtil.getColor(colorId);
290 }
291 }