Merge branch 'release/4.0.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / AbstractCdmDataViewer.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.view;
12
13 import org.eclipse.jface.viewers.StructuredSelection;
14 import org.eclipse.jface.viewers.Viewer;
15 import org.eclipse.swt.widgets.Composite;
16 import org.eclipse.swt.widgets.Control;
17 import org.eclipse.swt.widgets.Display;
18 import org.eclipse.ui.forms.IFormPart;
19 import org.eclipse.ui.forms.ManagedForm;
20 import org.eclipse.ui.forms.widgets.ScrolledForm;
21
22 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
23 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
24 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
25 import eu.etaxonomy.taxeditor.ui.element.AbstractFormSection;
26 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
27 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
28 import eu.etaxonomy.taxeditor.ui.element.RootElement;
29 import eu.etaxonomy.taxeditor.view.detail.CdmSectionPart;
30
31 /**
32 * <p>Abstract AbstractCdmDataViewer class.</p>
33 *
34 * @author n.hoffmann
35 * @created Feb 9, 2010
36 * @version 1.0
37 */
38 public abstract class AbstractCdmDataViewer extends Viewer implements IConversationEnabled{
39
40 protected ManagedForm managedForm;
41
42 protected CdmFormFactory formFactory;
43
44 protected ScrolledForm scrolledForm;
45
46 private final Composite body;
47
48 protected RootElement rootElement;
49
50 //TODO: create a super class for this?
51 private Object input;
52
53 private final AbstractCdmViewPart viewPart;
54
55
56 /**
57 * <p>Constructor for AbstractCdmDataViewer.</p>
58 *
59 * @param parent a {@link org.eclipse.swt.widgets.Composite} object.
60 * @param viewPart a {@link eu.etaxonomy.taxeditor.view.AbstractCdmViewPart} object.
61 */
62 public AbstractCdmDataViewer(Composite parent, AbstractCdmViewPart viewPart) {
63 this.viewPart = viewPart;
64
65 managedForm = new ManagedForm(parent){
66
67 /* (non-Javadoc)
68 * @see org.eclipse.ui.forms.ManagedForm#dirtyStateChanged()
69 */
70 @Override
71 public void dirtyStateChanged() {
72 markViewPartDirty();
73 }
74 };
75
76 createFormFactory();
77
78 scrolledForm = managedForm.getForm();
79
80 body = scrolledForm.getBody();
81
82 body.setLayout(LayoutConstants.LAYOUT());
83
84 rootElement = new RootElement(formFactory, body);
85 }
86
87 /**
88 * <p>createFormFactory</p>
89 */
90 protected void createFormFactory() {
91 if(formFactory != null){
92 formFactory.dispose();
93 formFactory = null;
94 }
95 formFactory = new CdmFormFactory(Display.getCurrent(), this);
96 }
97
98 protected void markViewPartDirty(){
99 viewPart.changed(input);
100 }
101
102
103 /**
104 * @return
105 */
106 protected AbstractCdmViewPart getViewPart() {
107 return viewPart;
108 }
109
110 /* (non-Javadoc)
111 * @see org.eclipse.jface.viewers.Viewer#getControl()
112 */
113 /** {@inheritDoc} */
114 @Override
115 public Control getControl() {
116 if(body.isDisposed()){
117 return null;
118 }
119 for(Control child : body.getChildren()){
120 return child;
121 }
122
123 return body;
124 }
125
126 /* (non-Javadoc)
127 * @see org.eclipse.jface.viewers.Viewer#setInput(java.lang.Object)
128 */
129 /** {@inheritDoc} */
130 @Override
131 public void setInput(Object input) {
132 this.input = input;
133 // reset selection
134 setSelection(new StructuredSelection(input));
135 refresh();
136 }
137
138 /* (non-Javadoc)
139 * @see org.eclipse.jface.viewers.Viewer#getInput()
140 */
141 /** {@inheritDoc} */
142 @Override
143 public Object getInput() {
144 return input;
145 }
146
147 /* (non-Javadoc)
148 * @see org.eclipse.jface.viewers.Viewer#refresh()
149 */
150 /** {@inheritDoc} */
151 @Override
152 public void refresh() {
153 showParts();
154
155 managedForm.setInput(input);
156
157 managedForm.refresh();
158
159 managedForm.reflow(true);
160 }
161
162
163 /**
164 * <p>layout</p>
165 */
166 public void layout(){
167 body.layout();
168 }
169
170 /**
171 * <p>showParts</p>
172 */
173 protected abstract void showParts();
174
175
176 /**
177 * <p>destroySections</p>
178 */
179 protected void destroySections() {
180 for (IFormPart formPart : managedForm.getParts()){
181 removePart((CdmSectionPart) formPart);
182 }
183
184 managedForm.setInput(null);
185
186 formFactory.destroyElement(rootElement);
187
188 createFormFactory();
189
190 rootElement = new RootElement(formFactory, body);
191
192 for(Control control : body.getChildren()){
193 control.dispose();
194 control = null;
195 }
196 }
197
198
199 /**
200 * <p>setFocus</p>
201 */
202 public void setFocus(){
203 // we have to set focus to a control of this viewer
204 // otherwise, after opening a dialog from the details, the focus will not be
205 // given back to the details view but to the editor
206 for(Control child : body.getChildren()){
207 child.setFocus();
208 break;
209 }
210 }
211
212 /**
213 * <p>reflow</p>
214 */
215 public void reflow(){
216 managedForm.reflow(true);
217 }
218
219 /**
220 * <p>removePart</p>
221 *
222 * @param sectionPart a {@link eu.etaxonomy.taxeditor.view.detail.CdmSectionPart} object.
223 */
224 protected void removePart(CdmSectionPart sectionPart){
225 managedForm.removePart(sectionPart);
226 formFactory.removePropertyChangeListener(sectionPart);
227 }
228
229 /**
230 * <p>addPart</p>
231 *
232 * @param section a {@link eu.etaxonomy.taxeditor.ui.element.AbstractFormSection} object.
233 */
234 protected void addPart(AbstractFormSection section){
235 CdmSectionPart sectionPart = new CdmSectionPart(section);
236 managedForm.addPart(sectionPart);
237 formFactory.addPropertyChangeListener(sectionPart);
238 }
239
240 /**
241 * <p>getConversationHolder</p>
242 *
243 * @return a {@link eu.etaxonomy.cdm.api.conversation.ConversationHolder} object.
244 */
245 @Override
246 public ConversationHolder getConversationHolder() {
247 return viewPart.getConversationHolder();
248 }
249
250 /** {@inheritDoc} */
251 @Override
252 public void update(CdmDataChangeMap changeEvents) {}
253
254 }