3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.preference
.menu
;
13 import java
.util
.ArrayList
;
14 import java
.util
.HashMap
;
15 import java
.util
.Iterator
;
16 import java
.util
.List
;
18 import org
.eclipse
.core
.commands
.Command
;
19 import org
.eclipse
.core
.commands
.IParameter
;
20 import org
.eclipse
.core
.commands
.Parameterization
;
21 import org
.eclipse
.core
.commands
.ParameterizedCommand
;
22 import org
.eclipse
.core
.commands
.common
.NotDefinedException
;
23 import org
.eclipse
.core
.runtime
.IStatus
;
24 import org
.eclipse
.jface
.preference
.PreferencePage
;
25 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
26 import org
.eclipse
.jface
.viewers
.CheckboxTableViewer
;
27 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
28 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
29 import org
.eclipse
.jface
.wizard
.WizardDialog
;
30 import org
.eclipse
.swt
.SWT
;
31 import org
.eclipse
.swt
.events
.SelectionAdapter
;
32 import org
.eclipse
.swt
.events
.SelectionEvent
;
33 import org
.eclipse
.swt
.layout
.GridData
;
34 import org
.eclipse
.swt
.layout
.GridLayout
;
35 import org
.eclipse
.swt
.widgets
.Button
;
36 import org
.eclipse
.swt
.widgets
.Composite
;
37 import org
.eclipse
.swt
.widgets
.Control
;
38 import org
.eclipse
.ui
.IWorkbench
;
39 import org
.eclipse
.ui
.IWorkbenchPreferencePage
;
40 import org
.eclipse
.ui
.commands
.ICommandService
;
41 import org
.eclipse
.ui
.handlers
.IHandlerService
;
42 import org
.eclipse
.ui
.internal
.commands
.Parameter
;
44 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
45 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
46 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
47 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
48 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
49 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.DefinedTermEditor
;
50 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
51 import eu
.etaxonomy
.taxeditor
.preference
.wizard
.VocabularyTermWizard
;
52 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
53 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
54 import eu
.etaxonomy
.taxeditor
.store
.TermStore
;
57 * <p>Abstract AbstractMenuPreferences class.</p>
63 public abstract class AbstractMenuPreferences
<T
extends DefinedTermBase
> extends PreferencePage
implements
64 IWorkbenchPreferencePage
, IConversationEnabled
{
66 private Button toggleButton
;
67 protected HashMap
<DefinedTermBase
<T
>, Button
> menuButtons
;
69 protected Button newButton
;
70 protected Button editButton
;
71 protected Button removeButton
;
73 protected CheckboxTableViewer tableViewer
;
75 private boolean state
= true;
76 private boolean vocabularyIsEditable
;
77 private ConversationHolder conversation
;
80 * Constructs a new menu preference page.
82 * @param initialVocabulary
83 * the initial vocabulary containing all possible entries for the menu
85 * the title of the page
87 * describing text for the preference page
89 * whether this vocabulary should be editable. Will render "New", "Edit", "Delete" buttons
90 * Handler for these buttons have to be overriding addEditButtonListeners()
91 * @param <T> a T object.
93 public AbstractMenuPreferences(String title
, String description
, boolean editable
) {
95 vocabularyIsEditable
= editable
;
96 setDescription(description
);
99 protected List
<T
> getTerms(){
100 return TermStore
.getTerms(getTermClass());
106 * Create contents of the preference page
109 public Control
createContents(Composite parent
) {
111 Composite container
= new Composite(parent
, SWT
.NULL
);
112 final GridLayout gridLayout
= new GridLayout();
113 gridLayout
.numColumns
= 2;
114 container
.setLayout(gridLayout
);
116 tableViewer
= CheckboxTableViewer
.newCheckList(container
, SWT
.NULL
);
117 GridData tableLayoutData
= new GridData(SWT
.FILL
, SWT
.FILL
, true, false);
118 tableLayoutData
.heightHint
= 300;
119 tableViewer
.getTable().setLayoutData(tableLayoutData
);
121 tableViewer
.setContentProvider(new DefinedTermBaseContentProvider());
122 tableViewer
.setLabelProvider(new DefinedTermBaseLabelProvider());
126 tableViewer
.addCheckStateListener(new ICheckStateListener() {
129 public void checkStateChanged(CheckStateChangedEvent arg0
) {
134 Composite buttonContainer
= new Composite(container
, SWT
.NULL
);
135 GridData buttonContainerLayoutData
= new GridData();
136 buttonContainerLayoutData
.verticalAlignment
= SWT
.TOP
;
137 buttonContainer
.setLayoutData(buttonContainerLayoutData
);
138 buttonContainer
.setLayout(new GridLayout());
140 if(vocabularyIsEditable
) createEditButtons(buttonContainer
);
142 toggleButton
= new Button(buttonContainer
, SWT
.PUSH
);
143 toggleButton
.setText("Toggle");
144 toggleButton
.addSelectionListener(new SelectionAdapter(){
146 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
149 public void widgetSelected(SelectionEvent e
) {
150 state
= state ?
false : true;
151 tableViewer
.setAllChecked(state
);
156 createAdditionalContent(container
);
165 * @param definedTerms a {@link java.util.List} object.
167 protected void refresh(List
<T
> definedTerms
) {
168 tableViewer
.setInput(definedTerms
);
170 List
<T
> preferedTerms
= CdmStore
.getTermManager().getFilteredTerms(definedTerms
);
171 tableViewer
.setCheckedElements(preferedTerms
.toArray());
175 * <p>createAdditionalContent</p>
177 * @param container a {@link org.eclipse.swt.widgets.Composite} object.
179 protected void createAdditionalContent(Composite container
) {
180 // implement where needed
184 * @see eu.etaxonomy.taxeditor.preference.AbstractMenuPreferences#createButtons(org.eclipse.swt.widgets.Composite)
187 * <p>createEditButtons</p>
189 * @param buttonContainer a {@link org.eclipse.swt.widgets.Composite} object.
191 protected void createEditButtons(Composite buttonContainer
) {
193 editButton
= new Button(buttonContainer
, SWT
.PUSH
);
194 editButton
.setText("Open Term Editor");
195 editButton
.setLayoutData(new GridData(SWT
.FILL
));
197 addEditButtonListeners();
201 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
204 protected void addNewButtonListeners() {
205 newButton
.addSelectionListener(new SelectionAdapter(){
207 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
210 public void widgetSelected(SelectionEvent e
) {
211 VocabularyTermWizard
<T
> wizard
= new VocabularyTermWizard
<T
>(getTermClass(), getConversationHolder());
213 WizardDialog dialog
= new WizardDialog(StoreUtil
.getShell(), wizard
);
214 if(dialog
.open() == IStatus
.OK
){
215 tableViewer
.setInput(getTerms());
224 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
227 protected void addEditButtonListeners() {
228 editButton
.addSelectionListener(new SelectionAdapter(){
230 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
233 public void widgetSelected(SelectionEvent event
) {
235 ICommandService commandService
= (ICommandService
) StoreUtil
.getService(ICommandService
.class);
237 Command command
= commandService
.getCommand(DefinedTermEditor
.OPEN_COMMAND_ID
);
239 IParameter parameter
;
241 parameter
= command
.getParameter("eu.etaxonomy.taxeditor.store.openDefinedTermEditor.parameter");
243 Parameterization
[] parameterizations
= new Parameterization
[]{
244 new Parameterization(parameter
, getTermClass().getName())
247 ParameterizedCommand pCommand
= new ParameterizedCommand(command
, parameterizations
);
249 if (command
.isEnabled()) {
250 IHandlerService handlerService
= (IHandlerService
) StoreUtil
.getService(IHandlerService
.class);
252 handlerService
.executeCommand(pCommand
, null);
253 } catch (NotDefinedException e
) {
254 throw new RuntimeException("Could not find open command: "
255 + DefinedTermEditor
.OPEN_COMMAND_ID
);
256 } catch (Exception e
) {
259 "An exception occured while trying to open a selection",
263 } catch (NotDefinedException e
) {
266 "An exception occured while trying to open the Term Editor",
275 public void init(IWorkbench workbench
) {
276 setPreferenceStore(PreferencesUtil
.getPreferenceStore());
277 getConversationHolder().bind();
282 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
285 * <p>performDefaults</p>
287 protected void performDefaults() {
288 tableViewer
.setAllChecked(true);
292 * <p>Getter for the field <code>tableViewer</code>.</p>
294 * @return the tableViewer
296 public CheckboxTableViewer
getTableViewer() {
301 * @see org.eclipse.jface.preference.PreferencePage#performOk()
305 public boolean performOk() {
306 if(checkNoneChecked()){
310 getConversationHolder().commit(true);
312 List
<T
> preferredTerms
= new ArrayList
<T
>();
313 for (Object element
: getTableViewer().getCheckedElements()){
314 preferredTerms
.add((T
) element
);
317 CdmStore
.getTermManager().setPreferredTerms(preferredTerms
, getTerms());
319 PreferencesUtil
.firePreferencesChanged(this.getClass());
324 private boolean checkNoneChecked(){
326 if(tableViewer
.getCheckedElements().length
== 0){
327 setMessage("Please check at least one item", WARNING
);
336 * <p>getTermClass</p>
338 * @return a {@link java.lang.Class} object.
340 protected abstract Class
<T
> getTermClass();
343 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
346 public ConversationHolder
getConversationHolder() {
347 if(conversation
== null){
348 conversation
= CdmStore
.createConversation();
354 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
357 public void update(CdmDataChangeMap changeEvents
) {
358 // implement where needed