Project

General

Profile

Download (7.8 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(2-2/35)