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