4 package eu
.etaxonomy
.taxeditor
.ui
.forms
;
6 import java
.util
.ConcurrentModificationException
;
7 import java
.util
.HashSet
;
11 import org
.eclipse
.core
.runtime
.Assert
;
12 import org
.eclipse
.jface
.util
.IPropertyChangeListener
;
13 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
14 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
15 import org
.eclipse
.jface
.viewers
.ISelectionProvider
;
16 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
17 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
18 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
19 import org
.eclipse
.swt
.SWT
;
20 import org
.eclipse
.swt
.events
.SelectionEvent
;
21 import org
.eclipse
.swt
.events
.SelectionListener
;
22 import org
.eclipse
.swt
.graphics
.Color
;
23 import org
.eclipse
.swt
.widgets
.Composite
;
24 import org
.eclipse
.swt
.widgets
.Control
;
25 import org
.eclipse
.swt
.widgets
.Display
;
26 import org
.eclipse
.swt
.widgets
.TypedListener
;
27 import org
.eclipse
.swt
.widgets
.Widget
;
28 import org
.eclipse
.ui
.forms
.widgets
.Section
;
29 import org
.eclipse
.ui
.forms
.widgets
.TableWrapLayout
;
30 import org
.eclipse
.ui
.forms
.widgets
.ToggleHyperlink
;
32 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
33 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
34 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
35 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
39 * Abstract AbstractFormSection class.
43 * @created Feb 22, 2010
47 public abstract class AbstractFormSection
<ENTITY
> extends Section
implements
48 ISelectionChangedListener
, ICdmFormElement
, IEntityElement
<ENTITY
>,
49 IConversationEnabled
{
51 private ISelectionProvider selectionProvider
;
53 private ENTITY entity
;
55 private Set
<ICdmFormElement
> elements
= new HashSet
<ICdmFormElement
>();
57 protected CdmFormFactory formFactory
;
59 private List
<IPropertyChangeListener
> propertyChangeListeners
;
61 private ICdmFormElement parentElement
;
63 private ConversationHolder conversation
;
65 private boolean handlingPropertyChange
;
67 private Color persistentBackgroundColor
;
71 * Constructor for AbstractFormSection.
79 * a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory}
81 * @param parentElement
82 * a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
87 protected AbstractFormSection(CdmFormFactory formFactory
,
88 ConversationHolder conversation
, ICdmFormElement parentElement
,
90 super(parentElement
.getLayoutComposite(), style
);
92 this.parentElement
= parentElement
;
94 this.formFactory
= formFactory
;
96 this.conversation
= conversation
;
98 this.setLayoutData(CdmFormFactory
.FILL());
100 Composite client
= formFactory
.createComposite(this, SWT
.WRAP
);
101 client
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
103 TableWrapLayout layout
= CdmFormFactory
.LAYOUT();
104 layout
.bottomMargin
= 10;
105 layout
.rightMargin
= 5;
107 client
.setLayout(layout
);
109 this.setClient(client
);
114 * Constructor for AbstractFormSection.
118 * a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory}
120 * @param conversation
121 * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
123 * @param parentElement
124 * a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
126 * @param selectionProvider
127 * a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
131 protected AbstractFormSection(CdmFormFactory formFactory
,
132 ConversationHolder conversation
, ICdmFormElement parentElement
,
133 ISelectionProvider selectionProvider
, int style
) {
134 this(formFactory
, conversation
, parentElement
, style
);
135 this.selectionProvider
= selectionProvider
;
140 * Getter for the field <code>propertyChangeListeners</code>.
143 * @return a {@link java.util.Set} object.
145 public List
<IPropertyChangeListener
> getPropertyChangeListeners() {
146 return propertyChangeListeners
;
150 public void setPropertyChangeListeners(
151 List
<IPropertyChangeListener
> propertyChangeListeners
) {
152 this.propertyChangeListeners
= propertyChangeListeners
;
157 * Setter for the field <code>entity</code>.
163 public void setEntity(ENTITY entity
) {
164 this.entity
= entity
;
170 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
174 * Getter for the field <code>entity</code>.
177 * @return a ENTITY object.
179 public ENTITY
getEntity() {
188 * @return a {@link org.eclipse.ui.forms.widgets.ToggleHyperlink} object.
190 public ToggleHyperlink
getToggle() {
199 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.AbstractFormSection}
202 public AbstractFormSection
<ENTITY
> getSection() {
210 * eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent
214 public void firePropertyChangeEvent(CdmPropertyChangeEvent event
) {
215 Assert
.isNotNull(propertyChangeListeners
,
216 "No property change listeners.");
218 for (Object listener
: propertyChangeListeners
) {
219 ((IPropertyChangeListener
) listener
).propertyChange(event
);
221 } catch (ConcurrentModificationException e
) {
222 StoreUtil
.warn(getClass(),
223 "ConcurrentModificationException while handling PropertyChangeEvents."
224 + " It seems like this is not critical");
229 * Fires a {@link CdmPropertyChangeEvent} with the given object as source.
232 * the object on which the property changed
234 public void firePropertyChangeEvent(Object object
) {
235 firePropertyChangeEvent(object
, null);
239 * Fires a {@link CdmPropertyChangeEvent} with the given object as source
240 * also containing the originating event
243 * the object on which the property changed
244 * @param originatingEvent
245 * the originating event
247 public void firePropertyChangeEvent(Object object
,
248 PropertyChangeEvent originatingEvent
) {
249 firePropertyChangeEvent(new CdmPropertyChangeEvent(object
,
256 * @see org.eclipse.swt.widgets.Composite#setFocus()
260 public boolean setFocus() {
261 return getClient().setFocus();
268 * org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse
269 * .jface.util.PropertyChangeEvent)
272 public void propertyChange(PropertyChangeEvent event
) {
273 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event
));
280 * org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics
285 public void setBackground(Color color
) {
286 for (ICdmFormElement element
: getElements()) {
287 element
.setBackground(color
);
289 getLayoutComposite().setBackground(color
);
290 super.setBackground(color
);
294 public void setPersistentBackground(Color color
) {
295 persistentBackgroundColor
= color
;
296 setBackground(color
);
300 public Color
getPersistentBackground() {
301 return persistentBackgroundColor
;
311 * a {@link org.eclipse.swt.events.SelectionEvent} object.
313 public void widgetSelected(SelectionEvent e
) {
314 Widget widget
= e
.widget
;
316 if (widget
instanceof Control
) {
317 Control control
= (Control
) widget
;
318 if (checkControlAncestryForWidget(control
)) {
319 if (getEntity() != null) {
320 IStructuredSelection selection
= new StructuredSelection(
322 if (selectionProvider
!= null) {
323 selectionProvider
.setSelection(selection
);
330 private boolean checkControlAncestryForWidget(Control control
) {
331 if (control
.equals(this)) {
334 Control parent
= control
.getParent();
335 if (parent
== null) {
338 return checkControlAncestryForWidget(parent
);
344 public void setSelected(boolean selected
) {
346 setBackground(Display
.getCurrent().getSystemColor(
347 SWT
.COLOR_LIST_SELECTION
));
349 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_WHITE
));
354 public void selectionChanged(SelectionChangedEvent event
) {
355 if (event
.getSelection() == CdmFormFactory
.EMPTY_SELECTION
) {
359 IStructuredSelection selection
= (IStructuredSelection
) event
363 Object selectedObject
= selection
.getFirstElement();
365 if (selectedObject
!= null && selectedObject
.equals(getEntity())) {
372 * addSelectionListener
376 * a {@link org.eclipse.swt.events.SelectionListener} object.
378 public void addSelectionListener(SelectionListener listener
) {
379 addListener(SWT
.Selection
, new TypedListener(listener
));
384 * removeSelectionListener
388 * a {@link org.eclipse.swt.events.SelectionListener} object.
390 public void removeSelectionListener(SelectionListener listener
) {
391 removeListener(SWT
.Selection
, listener
);
395 public void addElement(ICdmFormElement element
) {
396 elements
.add(element
);
405 * a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
408 protected void removeElement(ICdmFormElement element
) {
409 elements
.remove(element
);
417 public void removeElements() {
418 for (ICdmFormElement childElement
: getElements()) {
420 childElement
.removeElements();
422 // unregister selection arbitrator
423 if (childElement
instanceof ISelectableElement
) {
424 ISelectableElement selectableElement
= (ISelectableElement
) childElement
;
425 if (selectableElement
!= null
426 && selectableElement
.getSelectionArbitrator() != null) {
427 formFactory
.destroySelectionArbitrator(selectableElement
428 .getSelectionArbitrator());
432 // unregister propertyChangeListener
433 formFactory
.removePropertyChangeListener(childElement
);
435 // dispose of the controls
436 for (Control control
: childElement
.getControls()) {
437 // we added the layoutComposite of the parental element as the
438 // layout composite to this formElement
439 // but we do not want to destroy it.
440 if (control
.equals(childElement
.getLayoutComposite())) {
454 * Getter for the field <code>parentElement</code>.
457 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
459 public ICdmFormElement
getParentElement() {
460 return parentElement
;
465 * Getter for the field <code>elements</code>.
468 * @return a {@link java.util.Set} object.
470 public Set
<ICdmFormElement
> getElements() {
479 * @return a {@link java.util.Set} object.
481 public Set
<Control
> getControls() {
482 Set
<Control
> controls
= new HashSet
<Control
>();
484 for (Control control
: getChildren()) {
485 controls
.add(control
);
493 public void dispose() {
503 * @return a {@link org.eclipse.swt.widgets.Composite} object.
505 public Composite
getLayoutComposite() {
506 return (Composite
) getClient();
510 public boolean containsFormElement(ICdmFormElement formElement
) {
511 if (formElement
== this) {
514 for (ICdmFormElement element
: getElements()) {
515 boolean contains
= element
.containsFormElement(formElement
);
516 if (contains
== true) {
526 * Getter for the field <code>formFactory</code>.
529 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
531 public CdmFormFactory
getFormFactory() {
538 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
545 public void refresh() {
546 // empty default implementation
552 * getConversationHolder
555 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
558 public ConversationHolder
getConversationHolder() {
563 public void update(CdmDataChangeMap changeEvents
) {