2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.ui
.section
;
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
;
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 import org
.eclipse
.swt
.widgets
.Display
;
25 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
26 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
27 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
28 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
30 import eu
.etaxonomy
.cdm
.model
.permission
.CRUD
;
31 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
32 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
33 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
34 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
35 import eu
.etaxonomy
.taxeditor
.store
.LoginManager
;
36 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
39 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
40 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
41 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
42 import eu
.etaxonomy
.taxeditor
.ui
.element
.LabelElement
;
43 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
48 * @created Feb 26, 2010
50 public abstract class AbstractCdmDetailElement
<T
> extends AbstractCdmFormElement
implements ICdmDetailElement
<T
>, Observer
{
54 private boolean irrelevant
;
56 protected boolean enabled
= true;
58 private LabelElement warnForReferencedObjects
;
60 protected EnumSet
<CRUD
> requiredCrud
= null;
62 public AbstractCdmDetailElement(CdmFormFactory formFactory
,
63 ICdmFormElement formElement
) {
64 super(formFactory
, formElement
);
65 // register as property change listener
66 formFactory
.addPropertyChangeListener(this);
67 CdmStore
.getLoginManager().addObserver(this);
69 getLayoutComposite().getParent().addDisposeListener(new DisposeListener() {
72 public void widgetDisposed(DisposeEvent e
) {
73 CdmStore
.getLoginManager().deleteObserver(AbstractCdmDetailElement
.this);
79 * Sets the entity and updates controls
85 public void setEntity(T entity
) {
87 // the id is always 0 if the entity was not yet saved, so it is new in this case
88 if(getEntity() == null || StoreUtil
.getCdmEntity(getEntity()).getId() == 0) {
89 // new entity, not yet saved
90 requiredCrud
= EnumSet
.of(CRUD
.CREATE
);
92 requiredCrud
= EnumSet
.of(CRUD
.UPDATE
);
98 public T
getEntity() {
103 * Updates all widgets to display the latest data
105 protected void updateContent() {
107 createControls(this, entity
, SWT
.NONE
);
108 updateControlStates();
112 public void setSelected(boolean selected
) {
113 Composite section
= getLayoutComposite().getParent();
114 section
.setBackground(selected ? SELECTED
: getPersistentBackground());
118 * Sets all field to the given enablement state except the objects in
121 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#setEnabled(boolean)
125 * a {@link java.util.Collection} object.
127 public void setEnabled(boolean enabled
, Collection
<Object
> except
) {
128 this.enabled
= enabled
;
129 for (ICdmFormElement element
: getElements()) {
130 if (element
instanceof IEnableableFormElement
) {
131 IEnableableFormElement enableableElement
= (IEnableableFormElement
) element
;
132 if (except
!= null && except
.contains(enableableElement
)) {
133 // enableableElement.setEnabled(enabled);
135 enableableElement
.setEnabled(enabled
);
142 public boolean isEnabled() {
148 * Setter for the field <code>irrelevant</code>.
154 * a {@link java.util.Collection} object.
156 public void setIrrelevant(boolean irrelevant
, Collection
<Object
> except
) {
157 // logger.warn("Setting " + this.getClass().getSimpleName() +
158 // " to irrelevant state: " + irrelevant);
159 for (ICdmFormElement element
: getElements()) {
160 if (element
instanceof IEnableableFormElement
) {
161 IEnableableFormElement relevantElement
= (IEnableableFormElement
) element
;
162 if (except
!= null && except
.contains(relevantElement
)) {
164 // logger.warn("not setting elements irrelevance: " +
165 // relevantElement.getClass().getSimpleName() + " in :" +
166 // this.getClass().getSimpleName());
168 relevantElement
.setIrrelevant(irrelevant
);
176 public void setEnabled(boolean enabled
) {
177 setEnabled(enabled
, null);
182 public void setIrrelevant(boolean irrelevant
) {
183 this.irrelevant
= irrelevant
;
184 setIrrelevant(irrelevant
, null);
188 * Create all content elements
191 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
198 protected abstract void createControls(ICdmFormElement formElement
,
199 T entity
, int style
);
203 public void propertyChange(PropertyChangeEvent event
) {
208 handleTitleCacheRelevantChange(event
);
210 Object eventSource
= event
.getSource();
212 if (eventSource
instanceof ICdmFormElement
) {
213 ICdmFormElement eventElement
= (ICdmFormElement
) eventSource
;
214 ICdmFormElement eventElementContainer
= eventElement
216 ICdmFormElement parent
= this.getParentElement();
217 if (eventElementContainer
== this) {
218 if (event
instanceof CdmPropertyChangeEvent
) {
219 if (((CdmPropertyChangeEvent
) event
).hasException()) {
220 handleException((CdmPropertyChangeEvent
) event
);
224 // call specific handler implementation
225 handleEvent(eventSource
);
227 firePropertyChangeEvent(this, event
);
228 // update possible parents
229 updateParentSection();
234 protected void handleTitleCacheRelevantChange(PropertyChangeEvent event
) {
235 boolean isRelevant
= getEntity() instanceof TaxonName
236 || getEntity() instanceof TaxonBase
;
237 isRelevant
&= this instanceof AbstractIdentifiableEntityDetailElement
;
240 ((AbstractIdentifiableEntityDetailElement
) this)
241 .updateToggleableCacheField();
245 private void updateParentSection() {
246 if (getParentElement() instanceof AbstractCdmDetailSection
) {
247 ((AbstractCdmDetailSection
) getParentElement()).updateTitle();
249 //NOTE: This slows down the rendering of the details view
250 // StoreUtil.reflowParentScrolledForm(getLayoutComposite(), true);
254 * Gets called when the source of the event is a child widget of this
258 * a {@link java.lang.Object} object.
260 public abstract void handleEvent(Object eventSource
);
262 public void handleException(CdmPropertyChangeEvent event
) {
263 // override this in subclasses if you want to deal with the error
264 MessagingUtils
.error(event
.getSource().getClass(), event
.getException());
267 public boolean isIrrelevant() {
272 public ConversationHolder
getConversationHolder() {
273 if (getParentElement() instanceof IConversationEnabled
) {
274 return ((IConversationEnabled
) getParentElement())
275 .getConversationHolder();
277 throw new IllegalArgumentException(
278 "Parent element should be IConversationEnabled");
283 public void update(CdmDataChangeMap changeEvents
) {
287 public void update(Observable o
, Object arg
){
288 if(o
instanceof LoginManager
){
289 updateControlStates();
294 protected void updateControlStates(){
295 Collection
<Object
> except
= new ArrayList
<Object
>();
296 for(ICdmFormElement formElement
:getElements()){
297 if(formElement
instanceof IEnableableFormElement
&& !((IEnableableFormElement
) formElement
).isEnabled()){
298 except
.add(formElement
);
302 enabled
= getEntity() != null && CdmStore
.currentAuthentiationHasPermission(StoreUtil
.getCdmEntity(getEntity()), requiredCrud
);
303 setEnabled(enabled
, except
);
306 public LabelElement
getWarnForReferencedObjects() {
307 return warnForReferencedObjects
;
310 public void setWarnForReferencedObjects(LabelElement warnForReferencedObjects
) {
311 this.warnForReferencedObjects
= warnForReferencedObjects
;
314 public void setWarnForReferencingObjects(ICdmFormElement formElement
, int defaultReferencingObjects
){
315 if (getEntity() instanceof CdmBase
){
316 CdmBase cdmBase
= (CdmBase
) getEntity();
317 if (cdmBase
.getId() != 0){
318 long referencingObjectsCount
= CdmStore
.getCommonService().getReferencingObjectsCount(cdmBase
);
320 if (referencingObjectsCount
> defaultReferencingObjects
){
321 setWarnForReferencedObjects(formFactory
.createLabel(formElement
, CdmUtils
.Nz("The "+ cdmBase
.getUserFriendlyTypeName()+" is referenced by " + referencingObjectsCount
+ " objects, if you change it, it is changed for all these objects")));
322 getWarnForReferencedObjects().setBackground(Display
.getCurrent().getSystemColor(SWT
.COLOR_RED
));
323 getWarnForReferencedObjects().setLayout(LayoutConstants
.FILL(2, 3));
324 getWarnForReferencedObjects().setForeground(Display
.getCurrent().getSystemColor(SWT
.COLOR_RED
));
325 formFactory
.createLabel(formElement
, "");
332 public void setWarnForReferencingObjects(ICdmFormElement formElement
){
333 setWarnForReferencingObjects(formElement
, 1);
336 public void setWarnForReferencingObjectsVisible(boolean isVisible
){
337 if (getWarnForReferencedObjects() != null){
338 getWarnForReferencedObjects().setVisible(isVisible
);