4 package eu
.etaxonomy
.taxeditor
.ui
.element
;
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
.IEditorPart
;
29 import org
.eclipse
.ui
.forms
.widgets
.Section
;
30 import org
.eclipse
.ui
.forms
.widgets
.TableWrapLayout
;
31 import org
.eclipse
.ui
.forms
.widgets
.ToggleHyperlink
;
33 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
34 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
35 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
36 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
40 * Abstract AbstractFormSection class.
44 * @created Feb 22, 2010
48 public abstract class AbstractFormSection
<ENTITY
> extends Section
implements
49 ISelectionChangedListener
, ICdmFormElement
, IEntityElement
<ENTITY
>,
50 IConversationEnabled
{
52 private ISelectionProvider selectionProvider
;
54 private ENTITY entity
;
56 private Set
<ICdmFormElement
> elements
= new HashSet
<ICdmFormElement
>();
58 protected CdmFormFactory formFactory
;
60 private List
<IPropertyChangeListener
> propertyChangeListeners
;
62 private ICdmFormElement parentElement
;
64 private Color persistentBackgroundColor
;
68 * Constructor for AbstractFormSection.
76 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
78 * @param parentElement
79 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
84 protected AbstractFormSection(CdmFormFactory formFactory
, ICdmFormElement parentElement
,
86 super(parentElement
.getLayoutComposite(), style
);
88 this.parentElement
= parentElement
;
90 this.formFactory
= formFactory
;
92 this.setLayoutData(CdmFormFactory
.FILL());
94 Composite client
= formFactory
.createComposite(this, SWT
.WRAP
);
95 client
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
97 TableWrapLayout layout
= CdmFormFactory
.LAYOUT();
98 layout
.bottomMargin
= 10;
99 layout
.rightMargin
= 5;
101 client
.setLayout(layout
);
103 this.setClient(client
);
108 * Constructor for AbstractFormSection.
112 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
114 * @param conversation
115 * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
117 * @param parentElement
118 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
120 * @param selectionProvider
121 * a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
125 protected AbstractFormSection(CdmFormFactory formFactory
,
126 ICdmFormElement parentElement
,
127 ISelectionProvider selectionProvider
, int style
) {
128 this(formFactory
, parentElement
, style
);
129 this.selectionProvider
= selectionProvider
;
134 * Getter for the field <code>propertyChangeListeners</code>.
137 * @return a {@link java.util.Set} object.
139 public List
<IPropertyChangeListener
> getPropertyChangeListeners() {
140 return propertyChangeListeners
;
144 public void setPropertyChangeListeners(
145 List
<IPropertyChangeListener
> propertyChangeListeners
) {
146 this.propertyChangeListeners
= propertyChangeListeners
;
151 * Setter for the field <code>entity</code>.
157 public void setEntity(ENTITY entity
) {
158 this.entity
= entity
;
164 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
168 * Getter for the field <code>entity</code>.
171 * @return a ENTITY object.
173 public ENTITY
getEntity() {
182 * @return a {@link org.eclipse.ui.forms.widgets.ToggleHyperlink} object.
184 public ToggleHyperlink
getToggle() {
193 * @return a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
196 public AbstractFormSection
<ENTITY
> getSection() {
204 * eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent
208 public void firePropertyChangeEvent(CdmPropertyChangeEvent event
) {
209 Assert
.isNotNull(propertyChangeListeners
,
210 "No property change listeners.");
212 for (Object listener
: propertyChangeListeners
) {
213 ((IPropertyChangeListener
) listener
).propertyChange(event
);
215 } catch (ConcurrentModificationException e
) {
216 StoreUtil
.warn(getClass(),
217 "ConcurrentModificationException while handling PropertyChangeEvents."
218 + " It seems like this is not critical");
223 * Fires a {@link CdmPropertyChangeEvent} with the given object as source.
226 * the object on which the property changed
228 public void firePropertyChangeEvent(Object object
) {
229 firePropertyChangeEvent(object
, null);
233 * Fires a {@link CdmPropertyChangeEvent} with the given object as source
234 * also containing the originating event
237 * the object on which the property changed
238 * @param originatingEvent
239 * the originating event
241 public void firePropertyChangeEvent(Object object
,
242 PropertyChangeEvent originatingEvent
) {
243 firePropertyChangeEvent(new CdmPropertyChangeEvent(object
,
250 * @see org.eclipse.swt.widgets.Composite#setFocus()
254 public boolean setFocus() {
255 return getClient().setFocus();
262 * org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse
263 * .jface.util.PropertyChangeEvent)
266 public void propertyChange(PropertyChangeEvent event
) {
267 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event
));
274 * org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics
279 public void setBackground(Color color
) {
280 for (ICdmFormElement element
: getElements()) {
281 element
.setBackground(color
);
283 getLayoutComposite().setBackground(color
);
284 super.setBackground(color
);
288 public void setPersistentBackground(Color color
) {
289 persistentBackgroundColor
= color
;
290 setBackground(color
);
294 public Color
getPersistentBackground() {
295 return persistentBackgroundColor
;
305 * a {@link org.eclipse.swt.events.SelectionEvent} object.
307 public void widgetSelected(SelectionEvent e
) {
308 Widget widget
= e
.widget
;
310 if (widget
instanceof Control
) {
311 Control control
= (Control
) widget
;
312 if (checkControlAncestryForWidget(control
)) {
313 if (getEntity() != null) {
314 IStructuredSelection selection
= new StructuredSelection(
316 if (selectionProvider
!= null) {
317 selectionProvider
.setSelection(selection
);
324 private boolean checkControlAncestryForWidget(Control control
) {
325 if (control
.equals(this)) {
328 Control parent
= control
.getParent();
329 if (parent
== null) {
332 return checkControlAncestryForWidget(parent
);
338 public void setSelected(boolean selected
) {
340 setBackground(Display
.getCurrent().getSystemColor(
341 SWT
.COLOR_LIST_SELECTION
));
343 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_WHITE
));
348 public void selectionChanged(SelectionChangedEvent event
) {
349 if (event
.getSelection() == CdmFormFactory
.EMPTY_SELECTION
) {
353 IStructuredSelection selection
= (IStructuredSelection
) event
357 Object selectedObject
= selection
.getFirstElement();
359 if (selectedObject
!= null && selectedObject
.equals(getEntity())) {
366 * addSelectionListener
370 * a {@link org.eclipse.swt.events.SelectionListener} object.
372 public void addSelectionListener(SelectionListener listener
) {
373 addListener(SWT
.Selection
, new TypedListener(listener
));
378 * removeSelectionListener
382 * a {@link org.eclipse.swt.events.SelectionListener} object.
384 public void removeSelectionListener(SelectionListener listener
) {
385 removeListener(SWT
.Selection
, listener
);
389 public void addElement(ICdmFormElement element
) {
390 elements
.add(element
);
399 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
402 protected void removeElement(ICdmFormElement element
) {
403 elements
.remove(element
);
411 public void removeElements() {
412 for (ICdmFormElement childElement
: getElements()) {
414 childElement
.removeElements();
416 // unregister selection arbitrator
417 if (childElement
instanceof ISelectableElement
) {
418 ISelectableElement selectableElement
= (ISelectableElement
) childElement
;
419 if (selectableElement
!= null
420 && selectableElement
.getSelectionArbitrator() != null) {
421 formFactory
.destroySelectionArbitrator(selectableElement
422 .getSelectionArbitrator());
426 // unregister propertyChangeListener
427 formFactory
.removePropertyChangeListener(childElement
);
429 // dispose of the controls
430 for (Control control
: childElement
.getControls()) {
431 // we added the layoutComposite of the parental element as the
432 // layout composite to this formElement
433 // but we do not want to destroy it.
434 if (control
.equals(childElement
.getLayoutComposite())) {
448 * Getter for the field <code>parentElement</code>.
451 * @return a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement} object.
453 public ICdmFormElement
getParentElement() {
454 return parentElement
;
459 * Getter for the field <code>elements</code>.
462 * @return a {@link java.util.Set} object.
464 public Set
<ICdmFormElement
> getElements() {
473 * @return a {@link java.util.Set} object.
475 public Set
<Control
> getControls() {
476 Set
<Control
> controls
= new HashSet
<Control
>();
478 for (Control control
: getChildren()) {
479 controls
.add(control
);
487 public void dispose() {
497 * @return a {@link org.eclipse.swt.widgets.Composite} object.
499 public Composite
getLayoutComposite() {
500 return (Composite
) getClient();
504 public boolean containsFormElement(ICdmFormElement formElement
) {
505 if (formElement
== this) {
508 for (ICdmFormElement element
: getElements()) {
509 boolean contains
= element
.containsFormElement(formElement
);
510 if (contains
== true) {
520 * Getter for the field <code>formFactory</code>.
523 * @return a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory} object.
525 public CdmFormFactory
getFormFactory() {
532 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
539 public void refresh() {
540 // empty default implementation
546 * getConversationHolder
549 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
552 public ConversationHolder
getConversationHolder() {
553 if(getParentElement() instanceof RootElement
|| getParentElement() == null){
555 IEditorPart activeEditor
= StoreUtil
.getActiveEditor();
556 if(activeEditor
instanceof IConversationEnabled
){
557 ConversationHolder conversation
= ((IConversationEnabled
) StoreUtil
.getActiveEditor()).getConversationHolder();
560 }else if(getParentElement() instanceof IConversationEnabled
){
561 return ((IConversationEnabled
) getParentElement()).getConversationHolder();
563 StoreUtil
.errorDialog("Could not get conversation for AbstractFormSection",
564 getClass(), "There is an error in the implementation. There should have been an active editor but it wasn't",
565 new IllegalArgumentException());
571 public void update(CdmDataChangeMap changeEvents
) {