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