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
;
36 import eu
.etaxonomy
.taxeditor
.ui
.selection
.AbstractSelectionElement
;
37 import eu
.etaxonomy
.taxeditor
.ui
.term
.AbstractEnumComboElement
;
38 import eu
.etaxonomy
.taxeditor
.ui
.term
.AbstractTermComboElement
;
41 * <p>Abstract AbstractFormSection class.</p>
44 * @created Feb 22, 2010
48 public abstract class AbstractFormSection
<ENTITY
> extends Section
implements ISelectionChangedListener
, IEntityElement
<ENTITY
>, IConversationEnabled
{
50 private ISelectionProvider selectionProvider
;
52 private ENTITY entity
;
54 private Set
<ICdmFormElement
> elements
= new HashSet
<ICdmFormElement
>();
56 protected CdmFormFactory formFactory
;
58 private List
<IPropertyChangeListener
> propertyChangeListeners
;
60 private ICdmFormElement parentElement
;
62 private ConversationHolder conversation
;
64 private boolean handlingPropertyChange
;
67 * <p>Constructor for AbstractFormSection.</p>
69 * @param conversation TODO
71 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
72 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
73 * @param <ENTITY> a ENTITY object.
75 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, int style
) {
76 super(parentElement
.getLayoutComposite(), style
);
78 this.parentElement
= parentElement
;
80 this.formFactory
= formFactory
;
82 this.conversation
= conversation
;
84 this.setLayoutData(CdmFormFactory
.FILL());
86 Composite client
= formFactory
.createComposite(this, SWT
.WRAP
);
87 client
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
89 TableWrapLayout layout
= CdmFormFactory
.LAYOUT();
90 layout
.bottomMargin
= 10;
91 layout
.rightMargin
= 5;
93 client
.setLayout(layout
);
95 this.setClient(client
);
99 * <p>Constructor for AbstractFormSection.</p>
101 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
102 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
103 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
104 * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
105 * @param style a int.
107 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, ISelectionProvider selectionProvider
, int style
){
108 this(formFactory
, conversation
, parentElement
, style
);
109 this.selectionProvider
= selectionProvider
;
113 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
115 * @return a {@link java.util.Set} object.
117 public List
<IPropertyChangeListener
> getPropertyChangeListeners() {
118 return propertyChangeListeners
;
122 public void setPropertyChangeListeners(
123 List
<IPropertyChangeListener
> propertyChangeListeners
) {
124 this.propertyChangeListeners
= propertyChangeListeners
;
128 * <p>Setter for the field <code>entity</code>.</p>
130 * @param entity a ENTITY object.
132 public void setEntity(ENTITY entity
){
133 this.entity
= entity
;
138 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
141 * <p>Getter for the field <code>entity</code>.</p>
143 * @return a ENTITY object.
145 public ENTITY
getEntity() {
152 * @return a {@link org.eclipse.ui.forms.widgets.ToggleHyperlink} object.
154 public ToggleHyperlink
getToggle(){
161 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.AbstractFormSection} object.
163 public AbstractFormSection
<ENTITY
> getSection(){
168 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
171 public void firePropertyChangeEvent(CdmPropertyChangeEvent event
) {
172 Assert
.isNotNull(propertyChangeListeners
, "No property change listeners.");
174 for(Object listener
: propertyChangeListeners
){
175 ((IPropertyChangeListener
) listener
).propertyChange(event
);
177 }catch(ConcurrentModificationException e
){
178 StoreUtil
.warn(getClass(), "ConcurrentModificationException while handling PropertyChangeEvents." +
179 " It seems like this is not critical");
184 * @see org.eclipse.swt.widgets.Composite#setFocus()
188 public boolean setFocus() {
189 return getClient().setFocus();
193 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
196 public void propertyChange(PropertyChangeEvent event
) {
197 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event
));
201 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
205 public void setBackground(Color color
) {
206 for(ICdmFormElement element
: getElements()){
207 element
.setBackground(color
);
209 getLayoutComposite().setBackground(color
);
210 super.setBackground(color
);
214 * <p>widgetSelected</p>
216 * @param e a {@link org.eclipse.swt.events.SelectionEvent} object.
218 public void widgetSelected(SelectionEvent e
) {
219 Widget widget
= e
.widget
;
221 if(widget
instanceof Control
){
222 Control control
= (Control
) widget
;
223 if(checkControlAncestryForWidget(control
)){
224 if(getEntity() != null){
225 IStructuredSelection selection
= new StructuredSelection(getEntity());
226 if(selectionProvider
!= null){
227 selectionProvider
.setSelection(selection
);
234 private boolean checkControlAncestryForWidget(Control control
){
235 if(control
.equals(this)){
238 Control parent
= control
.getParent();
242 return checkControlAncestryForWidget(parent
);
248 public void setSelected(boolean selected
) {
250 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_LIST_SELECTION
));
252 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_WHITE
));
258 public void selectionChanged(SelectionChangedEvent event
) {
259 if(event
.getSelection() == CdmFormFactory
.EMPTY_SELECTION
){
263 IStructuredSelection selection
= (IStructuredSelection
) event
.getSelection();
266 Object selectedObject
= selection
.getFirstElement();
268 if(selectedObject
!= null && selectedObject
.equals(getEntity())){
274 * <p>addSelectionListener</p>
276 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
278 public void addSelectionListener(SelectionListener listener
) {
279 addListener(SWT
.Selection
, new TypedListener(listener
));
283 * <p>removeSelectionListener</p>
285 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
287 public void removeSelectionListener(SelectionListener listener
) {
288 removeListener(SWT
.Selection
, listener
);
292 public Color
getColor(boolean selected
) {
293 return selected ? SELECTED
: NOT_SELECTED
;
297 public void addElement(ICdmFormElement element
){
298 elements
.add(element
);
302 * <p>removeElement</p>
304 * @param element a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
306 protected void removeElement(ICdmFormElement element
){
307 elements
.remove(element
);
311 * <p>removeElements</p>
313 public void removeElements() {
314 for(ICdmFormElement childElement
: getElements()){
316 childElement
.removeElements();
318 // unregister selection arbitrator
319 if(childElement
instanceof ISelectableElement
){
320 ISelectableElement selectableElement
= (ISelectableElement
) childElement
;
321 if (selectableElement
!= null && selectableElement
.getSelectionArbitrator() != null) {
322 formFactory
.destroySelectionArbitrator(selectableElement
.getSelectionArbitrator());
326 // unregister propertyChangeListener
327 formFactory
.removePropertyChangeListener(childElement
);
329 // dispose of the controls
330 for(Control control
: childElement
.getControls()){
331 // we added the layoutComposite of the parental element as the layout composite to this formElement
332 // but we do not want to destroy it.
333 if(control
.equals(childElement
.getLayoutComposite())){
346 * <p>Getter for the field <code>parentElement</code>.</p>
348 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
350 public ICdmFormElement
getParentElement() {
351 return parentElement
;
355 * <p>Getter for the field <code>elements</code>.</p>
357 * @return a {@link java.util.Set} object.
359 public Set
<ICdmFormElement
> getElements() {
366 * @return a {@link java.util.Set} object.
368 public Set
<Control
> getControls() {
369 Set
<Control
> controls
= new HashSet
<Control
>();
371 for (Control control
: getChildren()){
372 controls
.add(control
);
380 public void dispose() {
386 * <p>getLayoutComposite</p>
388 * @return a {@link org.eclipse.swt.widgets.Composite} object.
390 public Composite
getLayoutComposite() {
391 return (Composite
) getClient();
395 public boolean containsFormElement(ICdmFormElement formElement
){
396 if(formElement
== this){
399 for(ICdmFormElement element
: getElements()){
400 boolean contains
= element
.containsFormElement(formElement
);
401 if(contains
== true){
411 * <p>Getter for the field <code>formFactory</code>.</p>
413 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
415 public CdmFormFactory
getFormFactory() {
421 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
426 public void refresh() {
427 // empty default implementation
432 * <p>getConversationHolder</p>
434 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
436 public ConversationHolder
getConversationHolder() {
441 public void update(CdmDataChangeMap changeEvents
) {}