3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.taxeditor
.ui
.section
;
13 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
14 import org
.eclipse
.swt
.SWT
;
15 import org
.eclipse
.swt
.events
.SelectionEvent
;
16 import org
.eclipse
.swt
.events
.SelectionListener
;
17 import org
.eclipse
.swt
.graphics
.Color
;
18 import org
.eclipse
.swt
.widgets
.Button
;
19 import org
.eclipse
.swt
.widgets
.Composite
;
20 import org
.eclipse
.swt
.widgets
.Event
;
21 import org
.eclipse
.swt
.widgets
.Layout
;
22 import org
.eclipse
.swt
.widgets
.Listener
;
23 import org
.eclipse
.ui
.forms
.widgets
.TableWrapLayout
;
25 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
26 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
27 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
28 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
29 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
30 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractFormSection
;
31 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
32 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEntityElement
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
38 * Visualizes an element of type ENTITY in an {@link AbstractEntityCollectionSection}
39 * and links listener functionalities to it.
41 * @param ENTITY the type of the element which is visualized by this class
44 * @created Nov 16, 2009
47 public abstract class AbstractEntityCollectionElement
<ENTITY
> extends
48 AbstractCdmFormElement
implements IEntityElement
<ENTITY
>,
49 SelectionListener
, IConversationEnabled
{
51 protected ENTITY entity
;
53 private final Composite container
;
55 private final Composite box
;
57 private Button btnRemove
;
58 private Button btnChooseEntity
;
60 private Color backgroundColor
;
64 * Constructor for AbstractEntityCollectionElement.
70 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
73 * a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection}
77 * @param removeListener
78 * a {@link org.eclipse.swt.events.SelectionListener} object.
82 public AbstractEntityCollectionElement(CdmFormFactory formFactory
,
83 AbstractFormSection section
, ENTITY entity
,
84 SelectionListener removeListener
, Color backgroundColor
, int style
) {
85 this(formFactory
, section
, entity
, removeListener
, false, backgroundColor
, style
);
87 public AbstractEntityCollectionElement(CdmFormFactory formFactory
,
88 AbstractFormSection section
, ENTITY entity
, SelectionListener removeListener
,
89 boolean isChoosableEntity
, Color backgroundColor
, int style
) {
90 super(formFactory
, (ICdmFormElement
) section
);
94 formFactory
.addPropertyChangeListener(this);
96 box
= formFactory
.createComposite(section
.getLayoutComposite());
97 box
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
100 TableWrapLayout boxLayout
= LayoutConstants
.LAYOUT(3, false);
101 boxLayout
.topMargin
= 4;
102 boxLayout
.bottomMargin
= 4;
103 box
.setLayout(boxLayout
);
105 box
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY());
107 container
= formFactory
.createComposite(box
);
108 container
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
110 setLayoutComposite(container
);
112 addControl(container
);
113 Layout containerLayout
= LayoutConstants
.LAYOUT(2, false);
115 container
.setLayout(containerLayout
);
116 container
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY());
118 if(isChoosableEntity
){
119 btnChooseEntity
= formFactory
.createButton(box
, null, SWT
.PUSH
);
120 addControl(btnChooseEntity
);
121 btnChooseEntity
.setLayoutData(LayoutConstants
.RIGHT());
122 btnChooseEntity
.setImage(ImageResources
.getImage(ImageResources
.BROWSE_ICON
));
123 btnChooseEntity
.setToolTipText("Browse");
124 btnChooseEntity
.addListener(SWT
.Selection
, new Listener() {
127 public void handleEvent(Event event
) {
128 ENTITY entity
= selectFromDialog();
130 if(getParentElement() instanceof AbstractEntityCollectionSection
){
131 ((AbstractEntityCollectionSection
)getParentElement()).removeElement(getEntity());
133 ((AbstractEntityCollectionSection
)getParentElement()).addElement(entity
);
134 ((AbstractEntityCollectionSection
)getParentElement()).firePropertyChangeEvent(getParentElement());
141 if (removeListener
!= null) {
142 btnRemove
= formFactory
.createButton(box
, null, SWT
.PUSH
);
143 addControl(btnRemove
);
144 btnRemove
.setLayoutData(LayoutConstants
.RIGHT());
145 btnRemove
.setImage(ImageResources
146 .getImage(ImageResources
.TRASH_ICON
));
147 btnRemove
.setToolTipText("Remove");
149 btnRemove
.addSelectionListener(removeListener
);
152 createControls(this, style
);
158 * Init gets executed before any other setup of the section takes place
160 * Implement this if you want to configure the section
163 // default implementation is empty
168 * Setter for the field <code>entity</code>.
174 public abstract void setEntity(ENTITY entity
);
178 * Getter for the field <code>entity</code>.
181 * @return a ENTITY object.
184 public ENTITY
getEntity() {
189 * Sub classes should override to provide the functionality to choose the
190 * entity from existing ones from the data source.<br>
191 * <b>Note:</b> to enable this functionality sub classes have to set
192 * the corresponding flag in the super constructor
193 * @return an existing entity from the data source
195 protected ENTITY
selectFromDialog(){
205 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
210 public abstract void createControls(ICdmFormElement element
, int style
);
213 * Mark <code>this</code> element as selected.
216 public void setSelected(boolean selected
) {
218 for (ICdmFormElement element
: getElements()) {
219 if (element
instanceof ISelectable
) {
220 ((ISelectable
) element
).setSelected(selected
);
223 setBackground(selected ? SELECTED
: getPersistentBackground());
230 * eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement#propertyChange(org
231 * .eclipse.jface.util.PropertyChangeEvent)
235 public void propertyChange(PropertyChangeEvent event
) {
239 Object eventSource
= event
.getSource();
240 if (getElements().contains(eventSource
)) {
241 handleEvent(eventSource
);
251 * a {@link java.lang.Object} object.
253 public abstract void handleEvent(Object eventSource
);
257 public void setBackground(Color color
) {
258 backgroundColor
= color
;
259 super.setBackground(color
);
260 box
.setBackground(color
);
261 container
.setBackground(color
);
267 * React when selection occurs
270 public void widgetSelected(SelectionEvent e
) {
276 public void widgetDefaultSelected(SelectionEvent e
) {
281 public Composite
getLayoutComposite() {
287 * Getter for the field <code>backgroundColor</code>.
290 * @return the backgroundColor
292 public Color
getBackgroundColor() {
293 return backgroundColor
;
298 * getConversationHolder
301 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
305 public ConversationHolder
getConversationHolder() {
306 if (getParentElement() instanceof IConversationEnabled
) {
307 return ((IConversationEnabled
) getParentElement())
308 .getConversationHolder();
310 throw new IllegalArgumentException(
311 "Parent element should be IConversationEnabled");
316 public void update(CdmDataChangeMap changeEvents
) {