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
.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
;
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 import eu
.etaxonomy
.taxeditor
.store
.TermStore
;
49 * <p>Abstract AbstractMenuPreferences class.</p>
55 public abstract class AbstractMenuPreferences
<T
extends DefinedTermBase
> extends PreferencePage
implements
56 IWorkbenchPreferencePage
, IConversationEnabled
{
58 private Button toggleButton
;
59 protected HashMap
<DefinedTermBase
<T
>, Button
> menuButtons
;
61 protected Button newButton
;
62 protected Button editButton
;
63 protected Button removeButton
;
65 protected CheckboxTableViewer tableViewer
;
67 private boolean state
= true;
68 private boolean vocabularyIsEditable
;
69 private ConversationHolder conversation
;
72 * Constructs a new menu preference page.
74 * @param initialVocabulary
75 * the initial vocabulary containing all possible entries for the menu
77 * the title of the page
79 * describing text for the preference page
81 * whether this vocabulary should be editable. Will render "New", "Edit", "Delete" buttons
82 * Handler for these buttons have to be overriding addEditButtonListeners()
83 * @param <T> a T object.
85 public AbstractMenuPreferences(String title
, String description
, boolean editable
) {
87 vocabularyIsEditable
= editable
;
88 setDescription(description
);
91 protected abstract List
<T
> getTerms();
96 * Create contents of the preference page
99 public Control
createContents(Composite parent
) {
101 Composite container
= new Composite(parent
, SWT
.NULL
);
102 final GridLayout gridLayout
= new GridLayout();
103 gridLayout
.numColumns
= 2;
104 container
.setLayout(gridLayout
);
106 tableViewer
= CheckboxTableViewer
.newCheckList(container
, SWT
.NULL
);
107 GridData tableLayoutData
= new GridData(SWT
.FILL
, SWT
.FILL
, true, false);
108 tableLayoutData
.heightHint
= 300;
109 tableViewer
.getTable().setLayoutData(tableLayoutData
);
111 tableViewer
.setContentProvider(new DefinedTermBaseContentProvider());
112 tableViewer
.setLabelProvider(new DefinedTermBaseLabelProvider());
116 tableViewer
.addCheckStateListener(new ICheckStateListener() {
119 public void checkStateChanged(CheckStateChangedEvent arg0
) {
124 Composite buttonContainer
= new Composite(container
, SWT
.NULL
);
125 GridData buttonContainerLayoutData
= new GridData();
126 buttonContainerLayoutData
.verticalAlignment
= SWT
.TOP
;
127 buttonContainer
.setLayoutData(buttonContainerLayoutData
);
128 buttonContainer
.setLayout(new GridLayout());
130 if(vocabularyIsEditable
) createEditButtons(buttonContainer
);
132 toggleButton
= new Button(buttonContainer
, SWT
.PUSH
);
133 toggleButton
.setText("Toggle");
134 toggleButton
.addSelectionListener(new SelectionAdapter(){
136 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
139 public void widgetSelected(SelectionEvent e
) {
140 state
= state ?
false : true;
141 tableViewer
.setAllChecked(state
);
146 createAdditionalContent(container
);
155 * @param definedTerms a {@link java.util.List} object.
157 protected void refresh(List
<T
> definedTerms
) {
158 tableViewer
.setInput(definedTerms
);
160 List
<T
> preferedTerms
= CdmStore
.getTermManager().getFilteredTerms(definedTerms
);
161 tableViewer
.setCheckedElements(preferedTerms
.toArray());
165 * <p>createAdditionalContent</p>
167 * @param container a {@link org.eclipse.swt.widgets.Composite} object.
169 protected void createAdditionalContent(Composite container
) {
170 // implement where needed
174 * @see eu.etaxonomy.taxeditor.preference.AbstractMenuPreferences#createButtons(org.eclipse.swt.widgets.Composite)
177 * <p>createEditButtons</p>
179 * @param buttonContainer a {@link org.eclipse.swt.widgets.Composite} object.
181 protected void createEditButtons(Composite buttonContainer
) {
182 newButton
= new Button(buttonContainer
, SWT
.PUSH
);
183 newButton
.setText("New");
184 newButton
.setLayoutData(new GridData(SWT
.FILL
));
187 editButton
= new Button(buttonContainer
, SWT
.PUSH
);
188 editButton
.setText("Edit");
189 editButton
.setLayoutData(new GridData(SWT
.FILL
));
192 removeButton
= new Button(buttonContainer
, SWT
.PUSH
);
193 removeButton
.setText("Remove");
194 removeButton
.setLayoutData(new GridData(SWT
.FILL
));
197 addNewButtonListeners();
198 addEditButtonListeners();
199 addDeleteButtonListeners();
203 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
206 protected void addNewButtonListeners() {
207 newButton
.addSelectionListener(new SelectionAdapter(){
209 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
212 public void widgetSelected(SelectionEvent e
) {
213 VocabularyTermWizard
<T
> wizard
= new VocabularyTermWizard
<T
>(getTermClass(), getConversationHolder());
215 WizardDialog dialog
= new WizardDialog(StoreUtil
.getShell(), wizard
);
216 if(dialog
.open() == IStatus
.OK
){
217 tableViewer
.setInput(getTerms());
226 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
229 protected void addEditButtonListeners() {
230 editButton
.addSelectionListener(new SelectionAdapter(){
232 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
235 public void widgetSelected(SelectionEvent e
) {
236 T selection
= (T
) ((StructuredSelection
) tableViewer
.getSelection()).getFirstElement();
238 if(selection
== null){
239 StoreUtil
.informationDialog("Nothing selected", "Please select a term to edit.");
243 VocabularyTermWizard
<T
> wizard
= new VocabularyTermWizard
<T
>(getTermClass(), selection
, getConversationHolder());
245 WizardDialog dialog
= new WizardDialog(StoreUtil
.getShell(), wizard
);
247 if(dialog
.open() == IStatus
.OK
){
248 tableViewer
.setInput(getTerms());
249 tableViewer
.reveal(selection
);
256 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
259 protected void addDeleteButtonListeners() {
260 removeButton
.addSelectionListener(new SelectionAdapter(){
262 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
265 public void widgetSelected(SelectionEvent e
) {
266 boolean confirmation
= StoreUtil
.confirmDialog("Confirm deletion", "Do you really want to delete the selected terms?");
269 IStructuredSelection selection
= (IStructuredSelection
) tableViewer
.getSelection();
271 Iterator
<T
> selectionIterator
= selection
.iterator();
273 while(selectionIterator
.hasNext()){
274 T term
= selectionIterator
.next();
276 tableViewer
.remove(term
);
278 if(getConversationHolder().getSessionHolder().getSession().contains(term
)){
279 ITermService service
= CdmStore
.getService(ITermService
.class);
280 DefinedTermBase theTerm
= service
.load(term
.getUuid());
282 service
.delete(theTerm
);
286 // tableViewer.refresh();
293 public void init(IWorkbench workbench
) {
294 setPreferenceStore(PreferencesUtil
.getPreferenceStore());
295 getConversationHolder().bind();
300 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
303 * <p>performDefaults</p>
305 protected void performDefaults() {
306 tableViewer
.setAllChecked(true);
310 * <p>Getter for the field <code>tableViewer</code>.</p>
312 * @return the tableViewer
314 public CheckboxTableViewer
getTableViewer() {
319 * @see org.eclipse.jface.preference.PreferencePage#performOk()
323 public boolean performOk() {
324 if(checkNoneChecked()){
328 getConversationHolder().commit(true);
330 List
<T
> preferredTerms
= new ArrayList
<T
>();
331 for (Object element
: getTableViewer().getCheckedElements()){
332 preferredTerms
.add((T
) element
);
335 CdmStore
.getTermManager().setPreferredTerms(preferredTerms
, getTerms());
337 PreferencesUtil
.firePreferencesChanged(this.getClass());
342 private boolean checkNoneChecked(){
344 if(tableViewer
.getCheckedElements().length
== 0){
345 setMessage("Please check at least one item", WARNING
);
354 * <p>getTermClass</p>
356 * @return a {@link java.lang.Class} object.
358 protected abstract Class
<T
> getTermClass();
361 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
364 public ConversationHolder
getConversationHolder() {
365 if(conversation
== null){
366 conversation
= CdmStore
.createConversation();
372 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
375 public void update(CdmDataChangeMap changeEvents
) {
376 // implement where needed