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