Project

General

Profile

Download (9.04 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2013 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
package eu.etaxonomy.taxeditor.ui.section;
11

    
12
import java.util.Collection;
13

    
14
import org.eclipse.jface.util.PropertyChangeEvent;
15
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.widgets.Composite;
17
import org.eclipse.ui.forms.widgets.FormToolkit;
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.model.AbstractUtility;
23
import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElementComposite;
24
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
25
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
26
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
27
import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
28

    
29
/**
30
 * @author pplitzner
31
 * @date 25.07.2013
32
 *
33
 */
34
public abstract class AbstractCdmDetailElementComposite<T> extends AbstractCdmFormElementComposite implements ICdmDetailElement<T>{
35

    
36
    private T entity;
37

    
38
    private boolean irrelevant;
39

    
40
    /**
41
     * <p>
42
     * Constructor for AbstractCdmDetailElement.
43
     * </p>
44
     *
45
     * @param formFactory
46
     *            a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
47
     *            object.
48
     * @param formElement
49
     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
50
     *            object.
51
     * @param <T>
52
     *            a T object.
53
     */
54
    public AbstractCdmDetailElementComposite(Composite parent, FormToolkit formFactory, ICdmFormElement parentFormElement, int style) {
55
        super(parent, formFactory, parentFormElement, style);
56
        // register as property change listener
57
        if(formFactory instanceof CdmFormFactory){
58
            ((CdmFormFactory) formFactory).addPropertyChangeListener(this);
59
        }
60
    }
61

    
62
    /**
63
     * Sets the entity and updates controls
64
     *
65
     * @param entity
66
     *            a T object.
67
     */
68
    @Override
69
    public void setEntity(T entity) {
70
        this.entity = entity;
71
        updateContent();
72
    }
73

    
74
    /*
75
     * (non-Javadoc)
76
     *
77
     * @see eu.etaxonomy.taxeditor.forms.IEntityElement#getEntity()
78
     */
79
    /**
80
     * <p>
81
     * Getter for the field <code>entity</code>.
82
     * </p>
83
     *
84
     * @return a T object.
85
     */
86
    @Override
87
    public T getEntity() {
88
        return entity;
89
    }
90

    
91
    /**
92
     * Updates all widgets to display the latest data
93
     */
94
    protected void updateContent() {
95
        removeElements();
96
        createControls(this, entity, SWT.WRAP);
97
        getLayoutComposite().layout();
98
    }
99

    
100
    /*
101
     * (non-Javadoc)
102
     *
103
     * @see
104
     * eu.etaxonomy.taxeditor.forms.ISelectableComposite#setSelected(boolean)
105
     */
106
    /** {@inheritDoc} */
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
        for (ICdmFormElement element : getElements()) {
125
            if (element instanceof IEnableableFormElement) {
126
                IEnableableFormElement enableableElement = (IEnableableFormElement) element;
127
                if (except != null && except.contains(enableableElement)) {
128
                    // enableableElement.setEnabled(enabled);
129
                } else {
130
                    enableableElement.setEnabled(enabled);
131
                }
132
            }
133
        }
134
    }
135

    
136
    /**
137
     * <p>
138
     * Setter for the field <code>irrelevant</code>.
139
     * </p>
140
     *
141
     * @param irrelevant
142
     *            a boolean.
143
     * @param except
144
     *            a {@link java.util.Collection} object.
145
     */
146
    public void setIrrelevant(boolean irrelevant, Collection<Object> except) {
147
        // logger.warn("Setting " + this.getClass().getSimpleName() +
148
        // " to irrelevant state: " + irrelevant);
149
        for (ICdmFormElement element : getElements()) {
150
            if (element instanceof IEnableableFormElement) {
151
                IEnableableFormElement relevantElement = (IEnableableFormElement) element;
152
                if (except != null && except.contains(relevantElement)) {
153
                    // do nothing
154
                    // logger.warn("not setting elements irrelevance: " +
155
                    // relevantElement.getClass().getSimpleName() + " in :" +
156
                    // this.getClass().getSimpleName());
157
                } else {
158
                    relevantElement.setIrrelevant(irrelevant);
159
                }
160
            }
161
        }
162
    }
163

    
164
    /** {@inheritDoc} */
165
    @Override
166
    public void setEnabled(boolean enabled) {
167
        setEnabled(enabled, null);
168
    }
169

    
170
    /** {@inheritDoc} */
171
    @Override
172
    public void setIrrelevant(boolean irrelevant) {
173
        this.irrelevant = irrelevant;
174
        setIrrelevant(irrelevant, null);
175
    }
176

    
177
    /**
178
     * Create all content elements
179
     *
180
     * @param formElement
181
     *            a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
182
     *            object.
183
     * @param entity
184
     *            a T object.
185
     * @param style
186
     *            a int.
187
     */
188
    protected abstract void createControls(ICdmFormElement formElement, T entity, int style);
189

    
190
    /** {@inheritDoc} */
191
    @Override
192
    public void propertyChange(PropertyChangeEvent event) {
193
        if (event == null) {
194
            return;
195
        }
196

    
197
        handleTitleCacheRelevantChange(event);
198

    
199
        Object eventSource = event.getSource();
200

    
201
        if (eventSource instanceof ICdmFormElement) {
202
            ICdmFormElement eventElement = (ICdmFormElement) eventSource;
203
            ICdmFormElement eventElementContainer = eventElement
204
                    .getParentElement();
205

    
206
            if (eventElementContainer == this) {
207
                if (event instanceof CdmPropertyChangeEvent) {
208
                    if (((CdmPropertyChangeEvent) event).hasException()) {
209
                        handleException((CdmPropertyChangeEvent) event);
210
                        return;
211
                    }
212
                }
213
                // call specific handler implementation
214
                handleEvent(eventSource);
215
                // refire the event
216
                firePropertyChangeEvent(this, event);
217
                // update possible parents
218
                updateParentSection();
219
            }
220
        }
221
    }
222

    
223
    protected void handleTitleCacheRelevantChange(PropertyChangeEvent event) {
224
        //FIXME uncomment
225

    
226
//        boolean isRelevant = getEntity() instanceof TaxonNameBase
227
//                || getEntity() instanceof TaxonBase;
228
//        isRelevant &= this instanceof AbstractIdentifiableEntityDetailElement;
229
//
230
//        if (isRelevant) {
231
//            ((AbstractIdentifiableEntityDetailElement) this)
232
//                    .updateToggleableCacheField();
233
//            updateParentSection();
234
//        }
235
    }
236

    
237
    private void updateParentSection() {
238
        if (getParentElement() instanceof AbstractCdmDetailSection) {
239
            ((AbstractCdmDetailSection) getParentElement()).updateTitle();
240
        }
241
    }
242

    
243
    /**
244
     * Gets called when the source of the event is a child widget of this
245
     * widget.
246
     *
247
     * @param eventSource
248
     *            a {@link java.lang.Object} object.
249
     */
250
    public abstract void handleEvent(Object eventSource);
251

    
252
    /**
253
     * <p>
254
     * handleException
255
     * </p>
256
     *
257
     * @param event
258
     *            a
259
     *            {@link eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent}
260
     *            object.
261
     */
262
    public void handleException(CdmPropertyChangeEvent event) {
263
        // override this in subclasses if you want to deal with the error
264
        AbstractUtility.error(event.getSource().getClass(), event.getException());
265
    }
266

    
267
    /**
268
     * <p>
269
     * isIrrelevant
270
     * </p>
271
     *
272
     * @return a boolean.
273
     */
274
    public boolean isIrrelevant() {
275
        return irrelevant;
276
    }
277

    
278
    /**
279
     * <p>
280
     * getConversationHolder
281
     * </p>
282
     *
283
     * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
284
     *         object.
285
     */
286
    @Override
287
    public ConversationHolder getConversationHolder() {
288
        if (getParentElement() instanceof IConversationEnabled) {
289
            return ((IConversationEnabled) getParentElement())
290
                    .getConversationHolder();
291
        }
292
        throw new IllegalArgumentException(
293
                "Parent element should be IConversationEnabled");
294
    }
295

    
296
    /** {@inheritDoc} */
297
    @Override
298
    public void update(CdmDataChangeMap changeEvents) {
299
    }
300
}
(2-2/9)