8233285538a3950e39fc62dc88dc8245d8db9b5a
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractEntityCollectionElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10
11 package eu.etaxonomy.taxeditor.ui.section;
12
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;
24
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;
36
37 /**
38 * Visualizes an element of type ENTITY in an {@link AbstractEntityCollectionSection}
39 * and links listener functionalities to it.
40 *
41 * @param ENTITY the type of the element which is visualized by this class
42 *
43 * @author n.hoffmann
44 * @created Nov 16, 2009
45 * @version 1.0
46 */
47 public abstract class AbstractEntityCollectionElement<ENTITY> extends
48 AbstractCdmFormElement implements IEntityElement<ENTITY>,
49 SelectionListener, IConversationEnabled {
50
51 protected ENTITY entity;
52
53 private final Composite container;
54
55 /**
56 * Composite "around" the actual content. Is used for control action like e.g. remove button
57 */
58 private final Composite box;
59
60 private Button btnRemove;
61 protected Button btnChooseEntity;
62
63 private Color backgroundColor;
64
65 public AbstractEntityCollectionElement(CdmFormFactory formFactory,
66 AbstractFormSection section, ENTITY entity,
67 SelectionListener removeListener, Color backgroundColor, int style) {
68 this(formFactory, section, entity, removeListener, false, backgroundColor, style);
69 }
70 public AbstractEntityCollectionElement(CdmFormFactory formFactory,
71 AbstractFormSection section, ENTITY entity, SelectionListener removeListener,
72 boolean isChoosableEntity, Color backgroundColor, int style) {
73 super(formFactory, (ICdmFormElement) section);
74
75 init();
76
77 formFactory.addPropertyChangeListener(this);
78
79 box = formFactory.createComposite(section.getLayoutComposite());
80 box.setBackgroundMode(SWT.INHERIT_DEFAULT);
81 addControl(box);
82
83 TableWrapLayout boxLayout = LayoutConstants.LAYOUT(4, false);
84 boxLayout.topMargin = 4;
85 boxLayout.bottomMargin = 4;
86 box.setLayout(boxLayout);
87
88 box.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
89
90 container = formFactory.createComposite(box);
91 container.setBackgroundMode(SWT.INHERIT_DEFAULT);
92
93 setLayoutComposite(container);
94
95 addControl(container);
96 Layout containerLayout = LayoutConstants.LAYOUT(2, false);
97
98 container.setLayout(containerLayout);
99 container.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
100
101 if(isChoosableEntity){
102 btnChooseEntity = formFactory.createButton(box, null, SWT.PUSH);
103 addControl(btnChooseEntity);
104
105 btnChooseEntity.setLayoutData(LayoutConstants.RIGHT());
106 btnChooseEntity.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON));
107 btnChooseEntity.setToolTipText("Browse");
108 btnChooseEntity.addListener(SWT.Selection, new Listener() {
109
110 @Override
111 public void handleEvent(Event event) {
112 ENTITY entity = selectFromDialog();
113 if(entity!=null){
114 if(getParentElement() instanceof AbstractEntityCollectionSection){
115 ((AbstractEntityCollectionSection)getParentElement()).removeElement(getEntity());
116 setEntity(entity);
117 ((AbstractEntityCollectionSection)getParentElement()).addElement(entity);
118 ((AbstractEntityCollectionSection)getParentElement()).firePropertyChangeEvent(getParentElement());
119 }
120
121 }
122 }
123 });
124 }
125
126 if (removeListener != null) {
127 btnRemove = formFactory.createButton(box, null, SWT.PUSH);
128 addControl(btnRemove);
129 btnRemove.setLayoutData(LayoutConstants.RIGHT());
130 btnRemove.setImage(ImageResources
131 .getImage(ImageResources.TRASH_ICON));
132 btnRemove.setToolTipText("Remove");
133
134 btnRemove.addSelectionListener(removeListener);
135 }
136
137 createControls(this, style);
138
139 setEntity(entity);
140 }
141
142 /**
143 * Init gets executed before any other setup of the section takes place
144 *
145 * Implement this if you want to configure the section
146 */
147 public void init() {
148 // default implementation is empty
149 }
150
151 public abstract void setEntity(ENTITY entity);
152
153 @Override
154 public ENTITY getEntity() {
155 return entity;
156 }
157
158 /**
159 * Sub classes should override to provide the functionality to choose the
160 * entity from existing ones from the data source.<br>
161 * <b>Note:</b> to enable this functionality sub classes have to set
162 * the corresponding flag in the super constructor
163 * @return an existing entity from the data source
164 */
165 protected ENTITY selectFromDialog(){
166 return null;
167 }
168
169 public abstract void createControls(ICdmFormElement element, int style);
170
171 /**
172 * Mark <code>this</code> element as selected.
173 */
174 @Override
175 public void setSelected(boolean selected) {
176
177 for (ICdmFormElement element : getElements()) {
178 if (element instanceof ISelectable) {
179 ((ISelectable) element).setSelected(selected);
180 }
181 }
182 setBackground(selected ? SELECTED : getPersistentBackground());
183 }
184
185 /** {@inheritDoc} */
186 @Override
187 public void propertyChange(PropertyChangeEvent event) {
188 if (event == null) {
189 return;
190 }
191 Object eventSource = event.getSource();
192 if (getElements().contains(eventSource) || getControls().contains(eventSource)) {
193 handleEvent(eventSource);
194 }
195 }
196
197 public abstract void handleEvent(Object eventSource);
198
199 /** {@inheritDoc} */
200 @Override
201 public void setBackground(Color color) {
202 if(box.isDisposed() || container.isDisposed()){
203 return;
204 }
205 backgroundColor = color;
206 super.setBackground(color);
207 box.setBackground(color);
208 container.setBackground(color);
209 }
210
211 /**
212 * {@inheritDoc}
213 *
214 * React when selection occurs
215 */
216 @Override
217 public void widgetSelected(SelectionEvent e) {
218
219 }
220
221 /** {@inheritDoc} */
222 @Override
223 public void widgetDefaultSelected(SelectionEvent e) {
224 }
225
226 /** {@inheritDoc} */
227 @Override
228 public Composite getLayoutComposite() {
229 return container;
230 }
231
232 public Color getBackgroundColor() {
233 return backgroundColor;
234 }
235
236 public Composite getBox() {
237 return box;
238 }
239
240 @Override
241 public ConversationHolder getConversationHolder() {
242 if (getParentElement() instanceof IConversationEnabled) {
243 return ((IConversationEnabled) getParentElement())
244 .getConversationHolder();
245 }
246 throw new IllegalArgumentException(
247 "Parent element should be IConversationEnabled");
248 }
249
250 /** {@inheritDoc} */
251 @Override
252 public void update(CdmDataChangeMap changeEvents) {
253 }
254 }