Basic implementation for LoadPherogramHandler added. (Imported data is currently...
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / menu / AbstractMenuPreferences.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.preference.menu;
12
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
16
17 import org.eclipse.core.commands.Command;
18 import org.eclipse.core.commands.IParameter;
19 import org.eclipse.core.commands.Parameterization;
20 import org.eclipse.core.commands.ParameterizedCommand;
21 import org.eclipse.core.commands.common.NotDefinedException;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.jface.preference.PreferencePage;
24 import org.eclipse.jface.viewers.CheckStateChangedEvent;
25 import org.eclipse.jface.viewers.CheckboxTableViewer;
26 import org.eclipse.jface.viewers.ICheckStateListener;
27 import org.eclipse.jface.wizard.WizardDialog;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.events.SelectionAdapter;
30 import org.eclipse.swt.events.SelectionEvent;
31 import org.eclipse.swt.layout.GridData;
32 import org.eclipse.swt.layout.GridLayout;
33 import org.eclipse.swt.widgets.Button;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Control;
36 import org.eclipse.ui.IWorkbench;
37 import org.eclipse.ui.IWorkbenchPreferencePage;
38 import org.eclipse.ui.commands.ICommandService;
39 import org.eclipse.ui.handlers.IHandlerService;
40
41 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
42 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
43 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
44 import eu.etaxonomy.cdm.model.common.TermType;
45 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
46 import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermEditor;
47 import eu.etaxonomy.taxeditor.model.MessagingUtils;
48 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
49 import eu.etaxonomy.taxeditor.preference.wizard.VocabularyTermWizard;
50 import eu.etaxonomy.taxeditor.store.CdmStore;
51 import eu.etaxonomy.taxeditor.store.StoreUtil;
52 import eu.etaxonomy.taxeditor.store.TermStore;
53
54 /**
55 * <p>Abstract AbstractMenuPreferences class.</p>
56 *
57 * @author n.hoffmann
58 * @created 12.06.2009
59 * @version 1.0
60 */
61 public abstract class AbstractMenuPreferences<T extends DefinedTermBase> extends PreferencePage implements
62 IWorkbenchPreferencePage, IConversationEnabled{
63
64 private Button toggleButton;
65 protected HashMap<DefinedTermBase<T>, Button> menuButtons;
66
67 protected Button newButton;
68 protected Button editButton;
69 protected Button removeButton;
70
71 protected CheckboxTableViewer tableViewer;
72
73 private boolean state = true;
74 private boolean vocabularyIsEditable;
75 private ConversationHolder conversation;
76
77 /**
78 * Constructs a new menu preference page.
79 *
80 * @param initialVocabulary
81 * the initial vocabulary containing all possible entries for the menu
82 * @param title
83 * the title of the page
84 * @param description
85 * describing text for the preference page
86 * @param editable
87 * whether this vocabulary should be editable. Will render "New", "Edit", "Delete" buttons
88 * Handler for these buttons have to be overriding addEditButtonListeners()
89 * @param <T> a T object.
90 */
91 public AbstractMenuPreferences(String title, String description, boolean editable) {
92 super(title);
93 vocabularyIsEditable = editable;
94 setDescription(description);
95 }
96
97 protected List<T> getTerms(){
98 return TermStore.getTerms(getTermClass());
99 }
100
101 /**
102 * {@inheritDoc}
103 *
104 * Create contents of the preference page
105 */
106 @Override
107 public Control createContents(Composite parent) {
108
109 Composite container = new Composite(parent, SWT.NULL);
110 final GridLayout gridLayout = new GridLayout();
111 gridLayout.numColumns = 2;
112 container.setLayout(gridLayout);
113
114 tableViewer = CheckboxTableViewer.newCheckList(container, SWT.NULL);
115 GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
116 tableLayoutData.heightHint = 300;
117 tableViewer.getTable().setLayoutData(tableLayoutData);
118
119 tableViewer.setContentProvider(new DefinedTermBaseContentProvider());
120 tableViewer.setLabelProvider(new DefinedTermBaseLabelProvider());
121
122 refresh(getTerms());
123
124 tableViewer.addCheckStateListener(new ICheckStateListener() {
125
126 @Override
127 public void checkStateChanged(CheckStateChangedEvent arg0) {
128 checkNoneChecked();
129 }
130 });
131
132 Composite buttonContainer = new Composite(container, SWT.NULL);
133 GridData buttonContainerLayoutData = new GridData();
134 buttonContainerLayoutData.verticalAlignment = SWT.TOP;
135 buttonContainer.setLayoutData(buttonContainerLayoutData);
136 buttonContainer.setLayout(new GridLayout());
137
138 if(vocabularyIsEditable) createEditButtons(buttonContainer);
139
140 toggleButton = new Button(buttonContainer, SWT.PUSH);
141 toggleButton.setText("Toggle");
142 toggleButton.addSelectionListener(new SelectionAdapter(){
143 /* (non-Javadoc)
144 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
145 */
146 @Override
147 public void widgetSelected(SelectionEvent e) {
148 state = state ? false : true;
149 tableViewer.setAllChecked(state);
150 checkNoneChecked();
151 }
152 });
153
154 createAdditionalContent(container);
155
156 return container;
157 }
158
159
160 /**
161 * <p>refresh</p>
162 *
163 * @param definedTerms a {@link java.util.List} object.
164 */
165 protected void refresh(List<T> definedTerms) {
166 tableViewer.setInput(definedTerms);
167
168 List<T> preferedTerms = CdmStore.getTermManager().getFilteredTerms(definedTerms);
169 tableViewer.setCheckedElements(preferedTerms.toArray());
170 }
171
172 /**
173 * <p>createAdditionalContent</p>
174 *
175 * @param container a {@link org.eclipse.swt.widgets.Composite} object.
176 */
177 protected void createAdditionalContent(Composite container) {
178 // implement where needed
179 }
180
181 /* (non-Javadoc)
182 * @see eu.etaxonomy.taxeditor.preference.AbstractMenuPreferences#createButtons(org.eclipse.swt.widgets.Composite)
183 */
184 /**
185 * <p>createEditButtons</p>
186 *
187 * @param buttonContainer a {@link org.eclipse.swt.widgets.Composite} object.
188 */
189 protected void createEditButtons(Composite buttonContainer) {
190
191 editButton = new Button(buttonContainer, SWT.PUSH);
192 editButton.setText("Open Term Editor");
193 editButton.setLayoutData(new GridData(SWT.FILL));
194
195 addEditButtonListeners();
196 }
197
198 /**
199 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
200 * is set.
201 */
202 protected void addNewButtonListeners() {
203 newButton.addSelectionListener(new SelectionAdapter(){
204 /* (non-Javadoc)
205 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
206 */
207 @Override
208 public void widgetSelected(SelectionEvent e) {
209 VocabularyTermWizard<T> wizard = new VocabularyTermWizard<T>(getTermClass(), getConversationHolder());
210
211 WizardDialog dialog = new WizardDialog(StoreUtil.getShell(), wizard);
212 if(dialog.open() == IStatus.OK){
213 tableViewer.setInput(getTerms());
214 }
215 }
216
217
218 });
219 }
220
221 /**
222 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
223 * is set.
224 */
225 protected void addEditButtonListeners() {
226 editButton.addSelectionListener(new SelectionAdapter(){
227 /* (non-Javadoc)
228 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
229 */
230 @Override
231 public void widgetSelected(SelectionEvent event) {
232
233 ICommandService commandService = (ICommandService) StoreUtil.getService(ICommandService.class);
234
235 Command command = commandService.getCommand(DefinedTermEditor.OPEN_COMMAND_ID);
236
237 IParameter parameter;
238 try {
239 parameter = command.getParameter("eu.etaxonomy.taxeditor.store.openDefinedTermEditor.termTypeUuid");
240
241 Parameterization[] parameterizations = new Parameterization[]{
242 new Parameterization(parameter, TermType.valueOf(getTermClass().getSimpleName()).getUuid().toString())
243 };
244
245 ParameterizedCommand pCommand = new ParameterizedCommand(command, parameterizations);
246
247 if (command.isEnabled()) {
248 IHandlerService handlerService = (IHandlerService) StoreUtil.getService(IHandlerService.class);
249 try {
250 handlerService.executeCommand(pCommand, null);
251 } catch (NotDefinedException e) {
252 throw new RuntimeException("Could not find open command: "
253 + DefinedTermEditor.OPEN_COMMAND_ID);
254 } catch (Exception e) {
255 MessagingUtils
256 .error(getClass(),
257 "An exception occured while trying to open a selection",
258 e);
259 }
260 }
261 } catch (NotDefinedException e) {
262 MessagingUtils
263 .error(getClass(),
264 "An exception occured while trying to open the Term Editor",
265 e);
266 }
267
268 }
269 });
270 }
271
272 /** {@inheritDoc} */
273 public void init(IWorkbench workbench) {
274 setPreferenceStore(PreferencesUtil.getPreferenceStore());
275 getConversationHolder().bind();
276 }
277
278 /*
279 * (non-Javadoc)
280 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
281 */
282 /**
283 * <p>performDefaults</p>
284 */
285 protected void performDefaults() {
286 tableViewer.setAllChecked(true);
287 }
288
289 /**
290 * <p>Getter for the field <code>tableViewer</code>.</p>
291 *
292 * @return the tableViewer
293 */
294 public CheckboxTableViewer getTableViewer() {
295 return tableViewer;
296 }
297
298 /* (non-Javadoc)
299 * @see org.eclipse.jface.preference.PreferencePage#performOk()
300 */
301 /** {@inheritDoc} */
302 @Override
303 public boolean performOk() {
304 if(checkNoneChecked()){
305 return false;
306 }
307
308 getConversationHolder().commit(true);
309
310 List<T> preferredTerms = new ArrayList<T>();
311 for (Object element : getTableViewer().getCheckedElements()){
312 preferredTerms.add((T) element);
313 }
314
315 CdmStore.getTermManager().setPreferredTerms(preferredTerms, getTerms());
316
317 PreferencesUtil.firePreferencesChanged(this.getClass());
318
319 return true;
320 }
321
322 private boolean checkNoneChecked(){
323
324 if(tableViewer.getCheckedElements().length == 0){
325 setMessage("Please check at least one item", WARNING);
326 return true;
327 }else{
328 setMessage(null);
329 return false;
330 }
331 }
332
333 /**
334 * <p>getTermClass</p>
335 *
336 * @return a {@link java.lang.Class} object.
337 */
338 protected abstract Class<T> getTermClass();
339
340 /* (non-Javadoc)
341 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
342 */
343 @Override
344 public ConversationHolder getConversationHolder() {
345 if(conversation == null){
346 conversation = CdmStore.createConversation();
347 }
348 return conversation;
349 }
350
351 /* (non-Javadoc)
352 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
353 */
354 @Override
355 public void update(CdmDataChangeMap changeEvents) {
356 // implement where needed
357 }
358 }