ref #6190 removing svn property place holder in first line of code - java files
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / AbstractCdmDetailElement.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.ui.section;
11
12 import java.util.ArrayList;
13 import java.util.Collection;
14 import java.util.EnumSet;
15 import java.util.Observable;
16 import java.util.Observer;
17
18 import org.eclipse.jface.util.PropertyChangeEvent;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.events.DisposeEvent;
21 import org.eclipse.swt.events.DisposeListener;
22 import org.eclipse.swt.widgets.Composite;
23
24 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
25 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
26 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
27 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
28 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
29 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
30 import eu.etaxonomy.taxeditor.model.MessagingUtils;
31 import eu.etaxonomy.taxeditor.store.CdmStore;
32 import eu.etaxonomy.taxeditor.store.LoginManager;
33 import eu.etaxonomy.taxeditor.store.StoreUtil;
34 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
35 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
36 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
37 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
38 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
39
40 /**
41 *
42 * @author n.hoffmann
43 * @created Feb 26, 2010
44 * @version 1.0
45 */
46 public abstract class AbstractCdmDetailElement<T> extends AbstractCdmFormElement implements ICdmDetailElement<T>, Observer {
47
48 private T entity;
49
50 private boolean irrelevant;
51
52 private boolean enabled;
53
54 private EnumSet<CRUD> requiredCrud = null;
55
56 public AbstractCdmDetailElement(CdmFormFactory formFactory,
57 ICdmFormElement formElement) {
58 super(formFactory, formElement);
59 // register as property change listener
60 formFactory.addPropertyChangeListener(this);
61 CdmStore.getLoginManager().addObserver(this);
62
63 getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
64
65 @Override
66 public void widgetDisposed(DisposeEvent e) {
67 CdmStore.getLoginManager().deleteObserver(AbstractCdmDetailElement.this);
68 }
69 });
70 }
71
72 /**
73 * Sets the entity and updates controls
74 *
75 * @param entity
76 * a T object.
77 */
78 @Override
79 public void setEntity(T entity) {
80 this.entity = entity;
81 // the id is always 0 if the entity was not yet saved, so it is new in this case
82 if(getEntity() == null || StoreUtil.getCdmEntity(getEntity()).getId() == 0) {
83 // new entity, not yet saved
84 requiredCrud = EnumSet.of(CRUD.CREATE);
85 } else {
86 requiredCrud = EnumSet.of(CRUD.UPDATE);
87 }
88 updateContent();
89 }
90
91 @Override
92 public T getEntity() {
93 return entity;
94 }
95
96 /**
97 * Updates all widgets to display the latest data
98 */
99 protected void updateContent() {
100 removeElements();
101 createControls(this, entity, SWT.WRAP);
102 reflowParentScrolledForm(true);
103
104 updateControlStates();
105 }
106
107 @Override
108 public void setSelected(boolean selected) {
109 Composite section = getLayoutComposite().getParent();
110 section.setBackground(selected ? SELECTED : getPersistentBackground());
111 }
112
113 /**
114 * Sets all field to the given enablement state except the objects in
115 * collection except
116 *
117 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
118 * @param enabled
119 * a boolean.
120 * @param except
121 * a {@link java.util.Collection} object.
122 */
123 public void setEnabled(boolean enabled, Collection<Object> except) {
124 this.enabled = enabled;
125 for (ICdmFormElement element : getElements()) {
126 if (element instanceof IEnableableFormElement) {
127 IEnableableFormElement enableableElement = (IEnableableFormElement) element;
128 if (except != null && except.contains(enableableElement)) {
129 // enableableElement.setEnabled(enabled);
130 } else {
131 enableableElement.setEnabled(enabled);
132 }
133 }
134 }
135 }
136
137 @Override
138 public boolean isEnabled() {
139 return enabled;
140 }
141
142 /**
143 * <p>
144 * Setter for the field <code>irrelevant</code>.
145 * </p>
146 *
147 * @param irrelevant
148 * a boolean.
149 * @param except
150 * a {@link java.util.Collection} object.
151 */
152 public void setIrrelevant(boolean irrelevant, Collection<Object> except) {
153 // logger.warn("Setting " + this.getClass().getSimpleName() +
154 // " to irrelevant state: " + irrelevant);
155 for (ICdmFormElement element : getElements()) {
156 if (element instanceof IEnableableFormElement) {
157 IEnableableFormElement relevantElement = (IEnableableFormElement) element;
158 if (except != null && except.contains(relevantElement)) {
159 // do nothing
160 // logger.warn("not setting elements irrelevance: " +
161 // relevantElement.getClass().getSimpleName() + " in :" +
162 // this.getClass().getSimpleName());
163 } else {
164 relevantElement.setIrrelevant(irrelevant);
165 }
166 }
167 }
168 }
169
170 /** {@inheritDoc} */
171 @Override
172 public void setEnabled(boolean enabled) {
173 setEnabled(enabled, null);
174 }
175
176 /** {@inheritDoc} */
177 @Override
178 public void setIrrelevant(boolean irrelevant) {
179 this.irrelevant = irrelevant;
180 setIrrelevant(irrelevant, null);
181 }
182
183 /**
184 * Create all content elements
185 *
186 * @param formElement
187 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
188 * object.
189 * @param entity
190 * a T object.
191 * @param style
192 * a int.
193 */
194 protected abstract void createControls(ICdmFormElement formElement,
195 T entity, int style);
196
197 /** {@inheritDoc} */
198 @Override
199 public void propertyChange(PropertyChangeEvent event) {
200 if (event == null) {
201 return;
202 }
203
204 handleTitleCacheRelevantChange(event);
205
206 Object eventSource = event.getSource();
207
208 if (eventSource instanceof ICdmFormElement) {
209 ICdmFormElement eventElement = (ICdmFormElement) eventSource;
210 ICdmFormElement eventElementContainer = eventElement
211 .getParentElement();
212
213 if (eventElementContainer == this) {
214 if (event instanceof CdmPropertyChangeEvent) {
215 if (((CdmPropertyChangeEvent) event).hasException()) {
216 handleException((CdmPropertyChangeEvent) event);
217 return;
218 }
219 }
220 // call specific handler implementation
221 handleEvent(eventSource);
222 // refire the event
223 firePropertyChangeEvent(this, event);
224 // update possible parents
225 updateParentSection();
226 }
227 }
228 }
229
230 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
231 boolean isRelevant = getEntity() instanceof TaxonNameBase
232 || getEntity() instanceof TaxonBase;
233 isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
234
235 if (isRelevant) {
236 ((AbstractIdentifiableEntityDetailElement) this)
237 .updateToggleableCacheField();
238 updateParentSection();
239 }
240 }
241
242 private void updateParentSection() {
243 if (getParentElement() instanceof AbstractCdmDetailSection) {
244 ((AbstractCdmDetailSection) getParentElement()).updateTitle();
245 }
246 reflowParentScrolledForm(true);
247 }
248
249 /**
250 * Gets called when the source of the event is a child widget of this
251 * widget.
252 *
253 * @param eventSource
254 * a {@link java.lang.Object} object.
255 */
256 public abstract void handleEvent(Object eventSource);
257
258 public void handleException(CdmPropertyChangeEvent event) {
259 // override this in subclasses if you want to deal with the error
260 MessagingUtils.error(event.getSource().getClass(), event.getException());
261 }
262
263 public boolean isIrrelevant() {
264 return irrelevant;
265 }
266
267 @Override
268 public ConversationHolder getConversationHolder() {
269 if (getParentElement() instanceof IConversationEnabled) {
270 return ((IConversationEnabled) getParentElement())
271 .getConversationHolder();
272 }
273 throw new IllegalArgumentException(
274 "Parent element should be IConversationEnabled");
275 }
276
277 /** {@inheritDoc} */
278 @Override
279 public void update(CdmDataChangeMap changeEvents) {
280 }
281
282 @Override
283 public void update(Observable o, Object arg){
284 if(o instanceof LoginManager){
285 updateControlStates();
286 }
287 }
288
289
290 protected void updateControlStates(){
291 Collection<Object> except = new ArrayList<Object>();
292 for(ICdmFormElement formElement:getElements()){
293 if(formElement instanceof IEnableableFormElement && !((IEnableableFormElement) formElement).isEnabled()){
294 except.add(formElement);
295 }
296 }
297 setEnabled(getEntity() != null && CdmStore.currentAuthentiationHasPermission(StoreUtil.getCdmEntity(getEntity()), requiredCrud), except);
298 }
299 }