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
.editors
.text
.EditorsUI
;
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
;
39 * <p>Abstract AbstractFormSection class.</p>
42 * @created Feb 22, 2010
46 public abstract class AbstractFormSection
<ENTITY
> extends Section
implements ISelectionChangedListener
, IEntityElement
<ENTITY
>, IConversationEnabled
{
48 private ISelectionProvider selectionProvider
;
50 private ENTITY entity
;
52 private Set
<ICdmFormElement
> elements
= new HashSet
<ICdmFormElement
>();
54 protected CdmFormFactory formFactory
;
56 private List
<IPropertyChangeListener
> propertyChangeListeners
;
58 private ICdmFormElement parentElement
;
60 private ConversationHolder conversation
;
62 private boolean handlingPropertyChange
;
65 * <p>Constructor for AbstractFormSection.</p>
67 * @param conversation TODO
69 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
70 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
71 * @param <ENTITY> a ENTITY object.
73 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, int style
) {
74 super(parentElement
.getLayoutComposite(), style
);
76 this.parentElement
= parentElement
;
78 this.formFactory
= formFactory
;
80 this.conversation
= conversation
;
82 this.setLayoutData(CdmFormFactory
.FILL());
84 Composite client
= formFactory
.createComposite(this, SWT
.WRAP
);
85 client
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
87 TableWrapLayout layout
= CdmFormFactory
.LAYOUT();
88 layout
.bottomMargin
= 10;
89 layout
.rightMargin
= 5;
91 client
.setLayout(layout
);
93 this.setClient(client
);
97 * <p>Constructor for AbstractFormSection.</p>
99 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
100 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
101 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
102 * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
103 * @param style a int.
105 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, ISelectionProvider selectionProvider
, int style
){
106 this(formFactory
, conversation
, parentElement
, style
);
107 this.selectionProvider
= selectionProvider
;
111 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
113 * @return a {@link java.util.Set} object.
115 public List
<IPropertyChangeListener
> getPropertyChangeListeners() {
116 return propertyChangeListeners
;
120 public void setPropertyChangeListeners(
121 List
<IPropertyChangeListener
> propertyChangeListeners
) {
122 this.propertyChangeListeners
= propertyChangeListeners
;
126 * <p>Setter for the field <code>entity</code>.</p>
128 * @param entity a ENTITY object.
130 public void setEntity(ENTITY entity
){
131 this.entity
= entity
;
136 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
139 * <p>Getter for the field <code>entity</code>.</p>
141 * @return a ENTITY object.
143 public ENTITY
getEntity() {
150 * @return a {@link org.eclipse.ui.forms.widgets.ToggleHyperlink} object.
152 public ToggleHyperlink
getToggle(){
159 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.AbstractFormSection} object.
161 public AbstractFormSection
<ENTITY
> getSection(){
166 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
169 public void firePropertyChangeEvent(CdmPropertyChangeEvent event
) {
170 Assert
.isNotNull(propertyChangeListeners
, "No property change listeners.");
172 for(Object listener
: propertyChangeListeners
){
173 ((IPropertyChangeListener
) listener
).propertyChange(event
);
175 }catch(ConcurrentModificationException e
){
176 StoreUtil
.warn(getClass(), "ConcurrentModificationException while handling PropertyChangeEvents." +
177 " It seems like this is not critical");
182 * @see org.eclipse.swt.widgets.Composite#setFocus()
186 public boolean setFocus() {
187 return getClient().setFocus();
191 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
194 public void propertyChange(PropertyChangeEvent event
) {
195 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event
));
199 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
203 public void setBackground(Color color
) {
204 for(ICdmFormElement element
: getElements()){
205 element
.setBackground(color
);
207 getLayoutComposite().setBackground(color
);
208 super.setBackground(color
);
212 * <p>widgetSelected</p>
214 * @param e a {@link org.eclipse.swt.events.SelectionEvent} object.
216 public void widgetSelected(SelectionEvent e
) {
217 Widget widget
= e
.widget
;
219 if(widget
instanceof Control
){
220 Control control
= (Control
) widget
;
221 if(checkControlAncestryForWidget(control
)){
222 if(getEntity() != null){
223 IStructuredSelection selection
= new StructuredSelection(getEntity());
224 if(selectionProvider
!= null){
225 selectionProvider
.setSelection(selection
);
232 private boolean checkControlAncestryForWidget(Control control
){
233 if(control
.equals(this)){
236 Control parent
= control
.getParent();
240 return checkControlAncestryForWidget(parent
);
246 public void setSelected(boolean selected
) {
248 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_LIST_SELECTION
));
250 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_WHITE
));
256 public void selectionChanged(SelectionChangedEvent event
) {
257 if(event
.getSelection() == CdmFormFactory
.EMPTY_SELECTION
){
261 IStructuredSelection selection
= (IStructuredSelection
) event
.getSelection();
264 Object selectedObject
= selection
.getFirstElement();
266 if(selectedObject
!= null && selectedObject
.equals(getEntity())){
272 * <p>addSelectionListener</p>
274 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
276 public void addSelectionListener(SelectionListener listener
) {
277 addListener(SWT
.Selection
, new TypedListener(listener
));
281 * <p>removeSelectionListener</p>
283 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
285 public void removeSelectionListener(SelectionListener listener
) {
286 removeListener(SWT
.Selection
, listener
);
290 public Color
getColor(boolean selected
) {
291 return selected ? SELECTED
: NOT_SELECTED
;
295 public void addElement(ICdmFormElement element
){
296 elements
.add(element
);
300 * <p>removeElement</p>
302 * @param element a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
304 protected void removeElement(ICdmFormElement element
){
305 elements
.remove(element
);
309 * <p>removeElements</p>
311 public void removeElements() {
312 for(ICdmFormElement childElement
: getElements()){
314 childElement
.removeElements();
316 // unregister selection arbitrator
317 if(childElement
instanceof ISelectableElement
){
318 ISelectableElement selectableElement
= (ISelectableElement
) childElement
;
319 if (selectableElement
!= null && selectableElement
.getSelectionArbitrator() != null) {
320 formFactory
.destroySelectionArbitrator(selectableElement
.getSelectionArbitrator());
324 // unregister propertyChangeListener
325 formFactory
.removePropertyChangeListener(childElement
);
327 // dispose of the controls
328 for(Control control
: childElement
.getControls()){
329 // we added the layoutComposite of the parental element as the layout composite to this formElement
330 // but we do not want to destroy it.
331 if(control
.equals(childElement
.getLayoutComposite())){
344 * <p>Getter for the field <code>parentElement</code>.</p>
346 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
348 public ICdmFormElement
getParentElement() {
349 return parentElement
;
353 * <p>Getter for the field <code>elements</code>.</p>
355 * @return a {@link java.util.Set} object.
357 public Set
<ICdmFormElement
> getElements() {
364 * @return a {@link java.util.Set} object.
366 public Set
<Control
> getControls() {
367 Set
<Control
> controls
= new HashSet
<Control
>();
369 for (Control control
: getChildren()){
370 controls
.add(control
);
378 public void dispose() {
384 * <p>getLayoutComposite</p>
386 * @return a {@link org.eclipse.swt.widgets.Composite} object.
388 public Composite
getLayoutComposite() {
389 return (Composite
) getClient();
393 public boolean containsFormElement(ICdmFormElement formElement
){
394 if(formElement
== this){
397 for(ICdmFormElement element
: getElements()){
398 boolean contains
= element
.containsFormElement(formElement
);
399 if(contains
== true){
409 * <p>Getter for the field <code>formFactory</code>.</p>
411 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
413 public CdmFormFactory
getFormFactory() {
419 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
424 public void refresh() {
425 // empty default implementation
430 * <p>getConversationHolder</p>
432 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
434 public ConversationHolder
getConversationHolder() {
439 public void update(CdmDataChangeMap changeEvents
) {}