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