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