Project

General

Profile

Download (7.62 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * 
3
 */
4
package eu.etaxonomy.taxeditor.forms;
5

    
6
import java.util.HashSet;
7
import java.util.Set;
8

    
9
import org.eclipse.core.runtime.Assert;
10
import org.eclipse.jface.util.IPropertyChangeListener;
11
import org.eclipse.jface.util.PropertyChangeEvent;
12
import org.eclipse.swt.graphics.Color;
13
import org.eclipse.swt.widgets.Composite;
14
import org.eclipse.swt.widgets.Control;
15
import org.eclipse.ui.forms.widgets.Section;
16

    
17
/**
18
 * <p>Abstract AbstractCdmFormElement class.</p>
19
 *
20
 * @author n.hoffmann
21
 * @version $Id: $
22
 */
23
public abstract class AbstractCdmFormElement implements IPropertyChangeEmitter, ICdmFormElement, ISelectable {
24

    
25
	protected CdmFormFactory formFactory;
26

    
27
	private Set<IPropertyChangeListener> propertyChangeListeners;
28

    
29
	private Composite layoutComposite;
30
	
31
	private Set<Control> controls = new HashSet<Control>();
32
	
33
	private Set<ICdmFormElement> elements = new HashSet<ICdmFormElement>();
34
	private ICdmFormElement parentElement;
35
	
36
	
37
	/**
38
	 * <p>Constructor for AbstractCdmFormElement.</p>
39
	 *
40
	 * @param formFactory a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
41
	 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
42
	 */
43
	protected AbstractCdmFormElement(CdmFormFactory formFactory, Composite layoutComposite){
44
		this.layoutComposite = layoutComposite;
45
		this.formFactory = formFactory;
46
	}
47
	
48
	/**
49
	 * <p>Constructor for AbstractCdmFormElement.</p>
50
	 *
51
	 * @param formFactory a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
52
	 * @param formElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
53
	 */
54
	public AbstractCdmFormElement(CdmFormFactory formFactory, ICdmFormElement formElement) {
55
		this(formFactory, formElement.getLayoutComposite());
56
		this.parentElement = formElement;
57
//		addControl(layoutComposite);
58
	}
59
	
60
	/**
61
	 * <p>Getter for the field <code>formFactory</code>.</p>
62
	 *
63
	 * @return a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
64
	 */
65
	public CdmFormFactory getFormFactory() {
66
		return formFactory;
67
	}
68
	
69
	/** {@inheritDoc} */
70
	public Color getColor(boolean selected) {
71
		return selected ? SELECTED : NOT_SELECTED;
72
	}
73
	
74
	/**
75
	 * Delegates the focus to <code>this</code> elements main input control
76
	 */
77
	public void setFocus(){
78
		// Override in subclasses where needed 
79
	}
80
	
81
	/**
82
	 * Returns all Controls that are managed by this element
83
	 *
84
	 * @return a {@link java.util.Set} object.
85
	 */
86
	public Set<Control> getControls(){
87
		return controls;
88
	}
89
	
90
	/**
91
	 * adds the control to the set of controls that are managed by this element
92
	 *
93
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
94
	 */
95
	protected void addControl(Control child){
96
		controls.add(child);
97
	}
98
	
99
	/**
100
	 * <p>removeControl</p>
101
	 *
102
	 * @param child a {@link org.eclipse.swt.widgets.Control} object.
103
	 */
104
	protected void removeControl(Control child){
105
		controls.remove(child);
106
	}
107
	
108
	/**
109
	 * <p>Getter for the field <code>elements</code>.</p>
110
	 *
111
	 * @return a {@link java.util.Set} object.
112
	 */
113
	public Set<ICdmFormElement> getElements(){
114
		return elements;
115
	}
116
	
117
	/**
118
	 * <p>Getter for the field <code>parentElement</code>.</p>
119
	 *
120
	 * @return a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
121
	 */
122
	public ICdmFormElement getParentElement(){
123
		return parentElement;
124
	}
125
	
126
	/** {@inheritDoc} */
127
	public void addElement(ICdmFormElement element){
128
		elements.add(element);
129
	}
130
	
131
	/**
132
	 * <p>removeElement</p>
133
	 *
134
	 * @param element a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
135
	 */
136
	protected void removeElement(ICdmFormElement element){
137
		elements.remove(element);
138
	}
139
	
140
	/**
141
	 * <p>removeElements</p>
142
	 */
143
	public void removeElements(){
144
		for(ICdmFormElement childElement : getElements()){
145
			// recursion
146
			childElement.removeElements();
147
			
148
			// unregister selection arbitrator
149
			if(childElement instanceof ISelectableElement){
150
				SelectionArbitrator selectionArbitrator = ((ISelectableElement) childElement).getSelectionArbitrator();
151
				if(selectionArbitrator != null){
152
					formFactory.destroySelectionArbitrator(selectionArbitrator);
153
				}
154
			}
155
			
156
			// unregister from property changes
157
			if(childElement instanceof IPropertyChangeListener){
158
				formFactory.removePropertyChangeListener((IPropertyChangeListener) childElement); 
159
			}
160
			
161
			// dispose of the controls
162
			removeControls(childElement);
163
		}
164
		elements.clear();
165
	}
166
	
167
	private void removeControls(ICdmFormElement element){
168
		if(element instanceof Section){
169
			((Section) element).dispose();
170
			element = null;
171
		}else{
172
			for(Control control : element.getControls()){
173
				// we added the layoutComposite of the parental element as the layout composite to this formElement
174
				// but we do not want to destroy it.
175
				if(control.equals(element.getLayoutComposite())){
176
					continue;
177
				}else{
178
					control.dispose();
179
					control = null;
180
				}
181
			}
182
		}
183
	}
184
	
185
	/**
186
	 * <p>Getter for the field <code>layoutComposite</code>.</p>
187
	 *
188
	 * @return a {@link org.eclipse.swt.widgets.Composite} object.
189
	 */
190
	public Composite getLayoutComposite() {
191
		return layoutComposite;
192
	}
193
	
194
	/**
195
	 * <p>Setter for the field <code>layoutComposite</code>.</p>
196
	 *
197
	 * @param layoutComposite a {@link org.eclipse.swt.widgets.Composite} object.
198
	 */
199
	public void setLayoutComposite(Composite layoutComposite){
200
		this.layoutComposite = layoutComposite;
201
	}
202
	
203
	/* (non-Javadoc)
204
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#getPropertyChangeListeners()
205
	 */
206
	/**
207
	 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
208
	 *
209
	 * @return a {@link java.util.Set} object.
210
	 */
211
	public Set<IPropertyChangeListener> getPropertyChangeListeners() {
212
		return propertyChangeListeners;
213
	}
214
	
215
	/* (non-Javadoc)
216
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#setPropertyChangeListeners(org.eclipse.core.runtime.ListenerList)
217
	 */
218
	/** {@inheritDoc} */
219
	public void setPropertyChangeListeners(Set<IPropertyChangeListener> propertyChangeListeners){
220
		this.propertyChangeListeners = propertyChangeListeners;
221
	}
222
	
223
	/* (non-Javadoc)
224
	 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
225
	 */
226
	/* (non-Javadoc)
227
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormComposite#firePropertyChangeEvent(org.eclipse.jface.util.PropertyChangeEvent)
228
	 */
229
	/** {@inheritDoc} */
230
	public void firePropertyChangeEvent(CdmPropertyChangeEvent event) {
231
		Assert.isNotNull(propertyChangeListeners, "Property change listeners are not present");
232
		for(Object listener : propertyChangeListeners){
233
			((IPropertyChangeListener)listener).propertyChange(event);
234
		}
235
	}
236
	
237

    
238
	/**
239
	 * {@inheritDoc}
240
	 *
241
	 * This method gets called whenever the toolkit this composite was created with gets a property change notification.
242
	 *
243
	 * It is good advice to check whether the PropertyChangeEvent is destined for the implementing composite.
244
	 * Implementations should also check for null PropertyChangeEvents and return immediately in that case.
245
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
246
	 */
247
	public void propertyChange(PropertyChangeEvent event) {
248
		// implement in subclasses
249
	}
250
	
251
	/** {@inheritDoc} */
252
	public boolean containsFormElement(ICdmFormElement formElement){
253
		if(formElement == this){
254
			return true;
255
		}else{
256
			for(ICdmFormElement element : getElements()){
257
				boolean contains = element.containsFormElement(formElement);
258
				if(contains == true){
259
					return true;
260
				}
261
			}
262
			return false;
263
		}
264
	}
265
	
266
	/*
267
	 * (non-Javadoc)
268
	 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
269
	 */
270
	/**
271
	 * <p>refresh</p>
272
	 */
273
	public void refresh() {
274
		// empty default implementation	
275
	}
276
	
277
	/** {@inheritDoc} */
278
	@Override
279
	public void setBackground(Color color) {
280
		for(ICdmFormElement element : getElements()){
281
			element.setBackground(color);
282
		}
283
	}
284
}
(2-2/33)