merge-update from trunk
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / AbstractCdmEntityWizardPage.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.element;
12
13 import org.apache.commons.lang.StringUtils;
14 import org.eclipse.jface.util.IPropertyChangeListener;
15 import org.eclipse.jface.util.PropertyChangeEvent;
16 import org.eclipse.jface.wizard.WizardPage;
17 import org.eclipse.swt.graphics.Color;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.ui.forms.widgets.ScrolledForm;
20
21 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
22 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
23 import eu.etaxonomy.cdm.model.common.IIdentifiableEntity;
24 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
25 import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
26 import eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement;
27
28 /**
29 * <p>
30 * Abstract AbstractCdmEntityWizardPage class.
31 * </p>
32 *
33 * @author n.hoffmann
34 * @created Jun 1, 2010
35 * @version 1.0
36 */
37 public abstract class AbstractCdmEntityWizardPage<T> extends WizardPage
38 implements IConversationEnabled, IPropertyChangeListener {
39
40 protected CdmFormFactory formFactory;
41 protected T entity;
42
43 AbstractCdmDetailElement<T> detailElement;
44 private final ConversationHolder conversation;
45
46 /**
47 * <p>
48 * Constructor for AbstractCdmEntityWizardPage.
49 * </p>
50 *
51 * @param formFactory
52 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
53 * object.
54 * @param conversation
55 * a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
56 * object.
57 * @param entity
58 * a T object.
59 * @param <T>
60 * a T object.
61 */
62 protected AbstractCdmEntityWizardPage(CdmFormFactory formFactory,
63 ConversationHolder conversation, T entity) {
64 super("page");
65 this.formFactory = formFactory;
66 this.entity = entity;
67 this.conversation = conversation;
68 setDescription(getEntityTitle());
69
70 formFactory.addPropertyChangeListener(this);
71 setPageComplete(false);
72 }
73
74 /**
75 * @return
76 */
77 private String getEntityTitle() {
78 if (entity instanceof IIdentifiableEntity) {
79 ((IIdentifiableEntity) entity).getTitleCache();
80 }
81 return "";
82 }
83
84 /*
85 * (non-Javadoc)
86 *
87 * @see
88 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
89 * .Composite)
90 */
91 /** {@inheritDoc} */
92 @Override
93 public void createControl(Composite parent) {
94 ScrolledForm scrolledForm = formFactory.createScrolledForm(parent);
95 scrolledForm.getBody().setLayout(LayoutConstants.LAYOUT());
96
97 Composite control = formFactory.createComposite(scrolledForm.getBody());
98 control.setLayoutData(LayoutConstants.FILL());
99
100 control.setLayout(LayoutConstants.LAYOUT(2, false));
101 WizardPageRootElement rootElement = new WizardPageRootElement(
102 formFactory, control, getConversationHolder());
103
104 Color bgColor = getShell().getBackground();
105
106 detailElement = createElement(rootElement);
107
108 rootElement.setBackground(bgColor);
109 control.setBackground(bgColor);
110 scrolledForm.setBackground(bgColor);
111
112 setControl(scrolledForm);
113 }
114
115 /**
116 * <p>
117 * Getter for the field <code>entity</code>.
118 * </p>
119 *
120 * @return a T object.
121 */
122 public T getEntity() {
123 return entity;
124 }
125
126 /**
127 * Creates the detail element for this wizard page
128 *
129 * @param rootElement
130 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
131 * object.
132 * @return a
133 * {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
134 * object.
135 */
136 public abstract AbstractCdmDetailElement<T> createElement(
137 ICdmFormElement rootElement);
138
139 protected class WizardPageRootElement extends RootElement implements
140 IConversationEnabled {
141
142 private final ConversationHolder conversation;
143
144 public WizardPageRootElement(CdmFormFactory formFactory,
145 Composite layoutComposite, ConversationHolder conversation) {
146 super(formFactory, layoutComposite);
147 this.conversation = conversation;
148 }
149
150 @Override
151 public void refresh() {
152 super.refresh();
153 this.removeElements();
154 detailElement = createElement(this);
155 ((Composite) getControl()).layout();
156 }
157
158 @Override
159 public ConversationHolder getConversationHolder() {
160 return conversation;
161 }
162
163 @Override
164 public void update(CdmDataChangeMap changeEvents) {
165 }
166 }
167
168 @Override
169 public void propertyChange(PropertyChangeEvent event) {
170 if (event.getSource() == getDetailElement()) {
171 checkComplete();
172 }
173 }
174
175 /**
176 * Should check whether the wizard is complete in a sense that it contains
177 * sane data. Should setPageComplete to true if that is the case.
178 */
179 protected void checkComplete() {
180 setPageComplete(titleCacheIsNotEmpty());
181 }
182
183 private boolean titleCacheIsNotEmpty() {
184 if (getEntity() instanceof IIdentifiableEntity) {
185 IIdentifiableEntity entity = (IIdentifiableEntity) getEntity();
186 return !StringUtils.isEmpty(entity.getTitleCache());
187 }
188 return true;
189 }
190
191 /**
192 * <p>
193 * getConversationHolder
194 * </p>
195 *
196 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder}
197 * object.
198 */
199 @Override
200 public ConversationHolder getConversationHolder() {
201 return conversation;
202 }
203
204 /** {@inheritDoc} */
205 @Override
206 public void dispose() {
207 if (detailElement != null) {
208 detailElement.removeElements();
209 }
210 formFactory.removePropertyChangeListener(this);
211 super.dispose();
212 }
213
214 /**
215 * <p>
216 * Getter for the field <code>detailElement</code>.
217 * </p>
218 *
219 * @return a
220 * {@link eu.etaxonomy.taxeditor.ui.section.AbstractCdmDetailElement}
221 * object.
222 */
223 public AbstractCdmDetailElement<T> getDetailElement() {
224 return detailElement;
225 }
226
227 /** {@inheritDoc} */
228 @Override
229 public void update(CdmDataChangeMap changeEvents) {
230 }
231 }