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