MessagingUtils : added new method for a warning dialog when not connected to a datas...
[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.AbstractUtility;
48 import eu.etaxonomy.taxeditor.model.MessagingUtils;
49 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
50 import eu.etaxonomy.taxeditor.preference.wizard.VocabularyTermWizard;
51 import eu.etaxonomy.taxeditor.store.CdmStore;
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 final 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 if(!CdmStore.isActive()) {
99 return new ArrayList<T>();
100 } else {
101 return TermStore.getTerms(getTermClass());
102 }
103 }
104
105 /**
106 * {@inheritDoc}
107 *
108 * Create contents of the preference page
109 */
110 @Override
111 public Control createContents(Composite parent) {
112
113 Composite container = new Composite(parent, SWT.NULL);
114 final GridLayout gridLayout = new GridLayout();
115 gridLayout.numColumns = 2;
116 container.setLayout(gridLayout);
117
118 tableViewer = CheckboxTableViewer.newCheckList(container, SWT.NULL);
119 GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
120 tableLayoutData.heightHint = 300;
121 tableViewer.getTable().setLayoutData(tableLayoutData);
122
123 tableViewer.setContentProvider(new DefinedTermBaseContentProvider());
124 tableViewer.setLabelProvider(new DefinedTermBaseLabelProvider());
125
126 refresh(getTerms());
127
128 tableViewer.addCheckStateListener(new ICheckStateListener() {
129
130 @Override
131 public void checkStateChanged(CheckStateChangedEvent arg0) {
132 checkNoneChecked();
133 }
134 });
135
136 Composite buttonContainer = new Composite(container, SWT.NULL);
137 GridData buttonContainerLayoutData = new GridData();
138 buttonContainerLayoutData.verticalAlignment = SWT.TOP;
139 buttonContainer.setLayoutData(buttonContainerLayoutData);
140 buttonContainer.setLayout(new GridLayout());
141
142 if(vocabularyIsEditable) {
143 createEditButtons(buttonContainer);
144 }
145
146 toggleButton = new Button(buttonContainer, SWT.PUSH);
147 toggleButton.setText("Toggle");
148 toggleButton.addSelectionListener(new SelectionAdapter(){
149 /* (non-Javadoc)
150 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
151 */
152 @Override
153 public void widgetSelected(SelectionEvent e) {
154 state = state ? false : true;
155 tableViewer.setAllChecked(state);
156 checkNoneChecked();
157 }
158 });
159
160 createAdditionalContent(container);
161
162 return container;
163 }
164
165
166 /**
167 * <p>refresh</p>
168 *
169 * @param definedTerms a {@link java.util.List} object.
170 */
171 protected void refresh(List<T> definedTerms) {
172 tableViewer.setInput(definedTerms);
173
174 List<T> preferedTerms = CdmStore.getTermManager().getFilteredTerms(definedTerms);
175 tableViewer.setCheckedElements(preferedTerms.toArray());
176 }
177
178 /**
179 * <p>createAdditionalContent</p>
180 *
181 * @param container a {@link org.eclipse.swt.widgets.Composite} object.
182 */
183 protected void createAdditionalContent(Composite container) {
184 // implement where needed
185 }
186
187 /* (non-Javadoc)
188 * @see eu.etaxonomy.taxeditor.preference.AbstractMenuPreferences#createButtons(org.eclipse.swt.widgets.Composite)
189 */
190 /**
191 * <p>createEditButtons</p>
192 *
193 * @param buttonContainer a {@link org.eclipse.swt.widgets.Composite} object.
194 */
195 protected void createEditButtons(Composite buttonContainer) {
196
197 editButton = new Button(buttonContainer, SWT.PUSH);
198 editButton.setText("Open Term Editor");
199 editButton.setLayoutData(new GridData(SWT.FILL));
200
201 addEditButtonListeners();
202 }
203
204 /**
205 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
206 * is set.
207 */
208 protected void addNewButtonListeners() {
209 newButton.addSelectionListener(new SelectionAdapter(){
210 /* (non-Javadoc)
211 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
212 */
213 @Override
214 public void widgetSelected(SelectionEvent e) {
215 VocabularyTermWizard<T> wizard = new VocabularyTermWizard<T>(getTermClass(), getConversationHolder());
216
217 WizardDialog dialog = new WizardDialog(AbstractUtility.getShell(), wizard);
218 if(dialog.open() == IStatus.OK){
219 tableViewer.setInput(getTerms());
220 }
221 }
222
223
224 });
225 }
226
227 /**
228 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
229 * is set.
230 */
231 protected void addEditButtonListeners() {
232 editButton.addSelectionListener(new SelectionAdapter(){
233 /* (non-Javadoc)
234 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
235 */
236 @Override
237 public void widgetSelected(SelectionEvent event) {
238
239 ICommandService commandService = (ICommandService) AbstractUtility.getService(ICommandService.class);
240
241 Command command = commandService.getCommand(DefinedTermEditor.OPEN_COMMAND_ID);
242
243 IParameter parameter;
244 try {
245 parameter = command.getParameter("eu.etaxonomy.taxeditor.store.openDefinedTermEditor.termTypeUuid");
246
247 Parameterization[] parameterizations = new Parameterization[]{
248 new Parameterization(parameter, TermType.valueOf(getTermClass().getSimpleName()).getUuid().toString())
249 };
250
251 ParameterizedCommand pCommand = new ParameterizedCommand(command, parameterizations);
252
253 if (command.isEnabled()) {
254 IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
255 try {
256 handlerService.executeCommand(pCommand, null);
257 } catch (NotDefinedException e) {
258 throw new RuntimeException("Could not find open command: "
259 + DefinedTermEditor.OPEN_COMMAND_ID);
260 } catch (Exception e) {
261 MessagingUtils
262 .error(getClass(),
263 "An exception occured while trying to open a selection",
264 e);
265 }
266 }
267 } catch (NotDefinedException e) {
268 MessagingUtils
269 .error(getClass(),
270 "An exception occured while trying to open the Term Editor",
271 e);
272 }
273
274 }
275 });
276 }
277
278 /** {@inheritDoc} */
279 @Override
280 public void init(IWorkbench workbench) {
281 setPreferenceStore(PreferencesUtil.getPreferenceStore());
282 if(!CdmStore.isActive()) {
283 MessagingUtils.noDataSourceWarningDialog(null);
284
285 } else {
286 getConversationHolder().bind();
287 }
288 }
289
290 /*
291 * (non-Javadoc)
292 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
293 */
294 /**
295 * <p>performDefaults</p>
296 */
297 @Override
298 protected void performDefaults() {
299 tableViewer.setAllChecked(true);
300 }
301
302 /**
303 * <p>Getter for the field <code>tableViewer</code>.</p>
304 *
305 * @return the tableViewer
306 */
307 public CheckboxTableViewer getTableViewer() {
308 return tableViewer;
309 }
310
311 /* (non-Javadoc)
312 * @see org.eclipse.jface.preference.PreferencePage#performOk()
313 */
314 /** {@inheritDoc} */
315 @Override
316 public boolean performOk() {
317 if(!CdmStore.isActive()) {
318 return true;
319 }
320
321 if(checkNoneChecked()){
322 return false;
323 }
324
325 getConversationHolder().commit(true);
326
327 List<T> preferredTerms = new ArrayList<T>();
328 for (Object element : getTableViewer().getCheckedElements()){
329 preferredTerms.add((T) element);
330 }
331
332 CdmStore.getTermManager().setPreferredTerms(preferredTerms, getTerms());
333
334 PreferencesUtil.firePreferencesChanged(this.getClass());
335
336 return true;
337 }
338
339 private boolean checkNoneChecked(){
340
341 if(tableViewer.getCheckedElements().length == 0){
342 setMessage("Please check at least one item", WARNING);
343 return true;
344 }else{
345 setMessage(null);
346 return false;
347 }
348 }
349
350 /**
351 * <p>getTermClass</p>
352 *
353 * @return a {@link java.lang.Class} object.
354 */
355 protected abstract Class<T> getTermClass();
356
357 /* (non-Javadoc)
358 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
359 */
360 @Override
361 public ConversationHolder getConversationHolder() {
362 if(conversation == null){
363 conversation = CdmStore.createConversation();
364 }
365 return conversation;
366 }
367
368 /* (non-Javadoc)
369 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
370 */
371 @Override
372 public void update(CdmDataChangeMap changeEvents) {
373 // implement where needed
374 }
375 }