4 package eu
.etaxonomy
.taxeditor
.ui
.forms
;
6 import java
.util
.HashSet
;
10 import org
.eclipse
.core
.runtime
.Assert
;
11 import org
.eclipse
.jface
.util
.IPropertyChangeListener
;
12 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
13 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
14 import org
.eclipse
.jface
.viewers
.ISelectionProvider
;
15 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
16 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
17 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.events
.SelectionEvent
;
20 import org
.eclipse
.swt
.events
.SelectionListener
;
21 import org
.eclipse
.swt
.graphics
.Color
;
22 import org
.eclipse
.swt
.widgets
.Composite
;
23 import org
.eclipse
.swt
.widgets
.Control
;
24 import org
.eclipse
.swt
.widgets
.Display
;
25 import org
.eclipse
.swt
.widgets
.TypedListener
;
26 import org
.eclipse
.swt
.widgets
.Widget
;
27 import org
.eclipse
.ui
.forms
.widgets
.Section
;
28 import org
.eclipse
.ui
.forms
.widgets
.TableWrapLayout
;
29 import org
.eclipse
.ui
.forms
.widgets
.ToggleHyperlink
;
31 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
32 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
33 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
36 * <p>Abstract AbstractFormSection class.</p>
39 * @created Feb 22, 2010
43 public abstract class AbstractFormSection
<ENTITY
> extends Section
implements ISelectionChangedListener
, IEntityElement
<ENTITY
>, IConversationEnabled
{
45 private ISelectionProvider selectionProvider
;
47 private ENTITY entity
;
49 private Set
<ICdmFormElement
> elements
= new HashSet
<ICdmFormElement
>();
51 protected CdmFormFactory formFactory
;
53 private List
<IPropertyChangeListener
> propertyChangeListeners
;
55 private ICdmFormElement parentElement
;
57 private ConversationHolder conversation
;
60 * <p>Constructor for AbstractFormSection.</p>
62 * @param conversation TODO
64 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
65 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
66 * @param <ENTITY> a ENTITY object.
68 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, int style
) {
69 super(parentElement
.getLayoutComposite(), style
);
71 this.parentElement
= parentElement
;
73 this.formFactory
= formFactory
;
75 this.conversation
= conversation
;
77 this.setLayoutData(CdmFormFactory
.FILL());
79 Composite client
= formFactory
.createComposite(this, SWT
.WRAP
);
80 client
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
82 TableWrapLayout layout
= CdmFormFactory
.LAYOUT();
83 layout
.bottomMargin
= 10;
84 layout
.rightMargin
= 5;
86 client
.setLayout(layout
);
88 this.setClient(client
);
92 * <p>Constructor for AbstractFormSection.</p>
94 * @param formFactory a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
95 * @param conversation a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
96 * @param parentElement a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
97 * @param selectionProvider a {@link org.eclipse.jface.viewers.ISelectionProvider} object.
100 protected AbstractFormSection(CdmFormFactory formFactory
, ConversationHolder conversation
, ICdmFormElement parentElement
, ISelectionProvider selectionProvider
, int style
){
101 this(formFactory
, conversation
, parentElement
, style
);
102 this.selectionProvider
= selectionProvider
;
106 * <p>Getter for the field <code>propertyChangeListeners</code>.</p>
108 * @return a {@link java.util.Set} object.
110 public List
<IPropertyChangeListener
> getPropertyChangeListeners() {
111 return propertyChangeListeners
;
115 public void setPropertyChangeListeners(
116 List
<IPropertyChangeListener
> propertyChangeListeners
) {
117 this.propertyChangeListeners
= propertyChangeListeners
;
121 * <p>Setter for the field <code>entity</code>.</p>
123 * @param entity a ENTITY object.
125 public void setEntity(ENTITY entity
){
126 this.entity
= entity
;
131 * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
134 * <p>Getter for the field <code>entity</code>.</p>
136 * @return a ENTITY object.
138 public ENTITY
getEntity() {
145 * @return a {@link org.eclipse.ui.forms.widgets.ToggleHyperlink} object.
147 public ToggleHyperlink
getToggle(){
154 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.AbstractFormSection} object.
156 public AbstractFormSection
<ENTITY
> getSection(){
161 * @see eu.etaxonomy.taxeditor.forms.IPropertyChangeEmitter#firePropertyChangeEvent()
164 public void firePropertyChangeEvent(CdmPropertyChangeEvent event
) {
165 Assert
.isNotNull(propertyChangeListeners
, "No property change listeners.");
166 for(Object listener
: propertyChangeListeners
){
167 ((IPropertyChangeListener
) listener
).propertyChange(event
);
172 * @see org.eclipse.swt.widgets.Composite#setFocus()
176 public boolean setFocus() {
177 return getClient().setFocus();
181 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
184 public void propertyChange(PropertyChangeEvent event
) {
185 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event
));
189 * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
193 public void setBackground(Color color
) {
194 for(ICdmFormElement element
: getElements()){
195 element
.setBackground(color
);
197 getLayoutComposite().setBackground(color
);
198 super.setBackground(color
);
202 * <p>widgetSelected</p>
204 * @param e a {@link org.eclipse.swt.events.SelectionEvent} object.
206 public void widgetSelected(SelectionEvent e
) {
207 Widget widget
= e
.widget
;
209 if(widget
instanceof Control
){
210 Control control
= (Control
) widget
;
211 if(checkControlAncestryForWidget(control
)){
212 if(getEntity() != null){
213 IStructuredSelection selection
= new StructuredSelection(getEntity());
214 if(selectionProvider
!= null){
215 selectionProvider
.setSelection(selection
);
222 private boolean checkControlAncestryForWidget(Control control
){
223 if(control
.equals(this)){
226 Control parent
= control
.getParent();
230 return checkControlAncestryForWidget(parent
);
236 public void setSelected(boolean selected
) {
238 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_LIST_SELECTION
));
240 setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_WHITE
));
246 public void selectionChanged(SelectionChangedEvent event
) {
247 if(event
.getSelection() == CdmFormFactory
.EMPTY_SELECTION
){
251 IStructuredSelection selection
= (IStructuredSelection
) event
.getSelection();
254 Object selectedObject
= selection
.getFirstElement();
256 if(selectedObject
!= null && selectedObject
.equals(getEntity())){
262 * <p>addSelectionListener</p>
264 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
266 public void addSelectionListener(SelectionListener listener
) {
267 addListener(SWT
.Selection
, new TypedListener(listener
));
271 * <p>removeSelectionListener</p>
273 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
275 public void removeSelectionListener(SelectionListener listener
) {
276 removeListener(SWT
.Selection
, listener
);
280 public Color
getColor(boolean selected
) {
281 return selected ? SELECTED
: NOT_SELECTED
;
285 public void addElement(ICdmFormElement element
){
286 elements
.add(element
);
290 * <p>removeElement</p>
292 * @param element a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
294 protected void removeElement(ICdmFormElement element
){
295 elements
.remove(element
);
299 * <p>removeElements</p>
301 public void removeElements() {
302 for(ICdmFormElement childElement
: getElements()){
304 childElement
.removeElements();
306 // unregister selection arbitrator
307 if(childElement
instanceof ISelectableElement
){
308 ISelectableElement selectableElement
= (ISelectableElement
) childElement
;
309 if (selectableElement
!= null && selectableElement
.getSelectionArbitrator() != null) {
310 formFactory
.destroySelectionArbitrator(selectableElement
.getSelectionArbitrator());
314 // unregister propertyChangeListener
315 formFactory
.removePropertyChangeListener(childElement
);
317 // dispose of the controls
318 for(Control control
: childElement
.getControls()){
319 // we added the layoutComposite of the parental element as the layout composite to this formElement
320 // but we do not want to destroy it.
321 if(control
.equals(childElement
.getLayoutComposite())){
334 * <p>Getter for the field <code>parentElement</code>.</p>
336 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement} object.
338 public ICdmFormElement
getParentElement() {
339 return parentElement
;
343 * <p>Getter for the field <code>elements</code>.</p>
345 * @return a {@link java.util.Set} object.
347 public Set
<ICdmFormElement
> getElements() {
354 * @return a {@link java.util.Set} object.
356 public Set
<Control
> getControls() {
357 Set
<Control
> controls
= new HashSet
<Control
>();
359 for (Control control
: getChildren()){
360 controls
.add(control
);
368 public void dispose() {
374 * <p>getLayoutComposite</p>
376 * @return a {@link org.eclipse.swt.widgets.Composite} object.
378 public Composite
getLayoutComposite() {
379 return (Composite
) getClient();
383 public boolean containsFormElement(ICdmFormElement formElement
){
384 if(formElement
== this){
387 for(ICdmFormElement element
: getElements()){
388 boolean contains
= element
.containsFormElement(formElement
);
389 if(contains
== true){
399 * <p>Getter for the field <code>formFactory</code>.</p>
401 * @return a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory} object.
403 public CdmFormFactory
getFormFactory() {
409 * @see eu.etaxonomy.taxeditor.forms.ICdmFormElement#refresh()
414 public void refresh() {
415 // empty default implementation
420 * <p>getConversationHolder</p>
422 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
424 public ConversationHolder
getConversationHolder() {
429 public void update(CdmDataChangeMap changeEvents
) {}