Project

General

Profile

Download (11 KB) Statistics
| Branch: | Tag: | Revision:
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
import eu.etaxonomy.taxeditor.store.TermStore;
47

    
48
/**
49
 * <p>Abstract AbstractMenuPreferences class.</p>
50
 *
51
 * @author n.hoffmann
52
 * @created 12.06.2009
53
 * @version 1.0
54
 */
55
public abstract class AbstractMenuPreferences<T extends DefinedTermBase> extends PreferencePage implements
56
		IWorkbenchPreferencePage, IConversationEnabled{
57

    
58
	private Button toggleButton;
59
	protected HashMap<DefinedTermBase<T>, Button> menuButtons;
60
	
61
	protected Button newButton;
62
	protected Button editButton;
63
	protected Button removeButton;
64
		
65
	protected CheckboxTableViewer tableViewer;
66
	
67
	private boolean state = true;
68
	private boolean vocabularyIsEditable;
69
	private ConversationHolder conversation;
70
	
71
	/**
72
	 * Constructs a new menu preference page.
73
	 *
74
	 * @param initialVocabulary
75
	 * 			the initial vocabulary containing all possible entries for the menu
76
	 * @param title
77
	 * 			the title of the page
78
	 * @param description
79
	 * 			describing text for the preference page
80
	 * @param editable
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.
84
	 */
85
	public AbstractMenuPreferences(String title, String description, boolean editable) {
86
		super(title);
87
		vocabularyIsEditable = editable;
88
		setDescription(description);
89
	}
90
	
91
	protected abstract List<T> getTerms();
92

    
93
	/**
94
	 * {@inheritDoc}
95
	 *
96
	 * Create contents of the preference page
97
	 */
98
	@Override
99
	public Control createContents(Composite parent) {
100
		
101
		Composite container = new Composite(parent, SWT.NULL);
102
		final GridLayout gridLayout = new GridLayout();
103
		gridLayout.numColumns = 2;
104
		container.setLayout(gridLayout);
105
	
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);
110
		
111
		tableViewer.setContentProvider(new DefinedTermBaseContentProvider());
112
		tableViewer.setLabelProvider(new DefinedTermBaseLabelProvider());
113

    
114
		refresh(getTerms());
115
		
116
		tableViewer.addCheckStateListener(new ICheckStateListener() {
117
			
118
			@Override
119
			public void checkStateChanged(CheckStateChangedEvent arg0) {
120
				checkNoneChecked();
121
			}
122
		});
123
		
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());
129
		
130
		if(vocabularyIsEditable) createEditButtons(buttonContainer);
131
		
132
		toggleButton = new Button(buttonContainer, SWT.PUSH);
133
		toggleButton.setText("Toggle");
134
		toggleButton.addSelectionListener(new SelectionAdapter(){
135
			/* (non-Javadoc)
136
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
137
			 */
138
			@Override
139
			public void widgetSelected(SelectionEvent e) {
140
				state = state ? false : true;
141
				tableViewer.setAllChecked(state);
142
				checkNoneChecked();
143
			}
144
		});
145
		
146
		createAdditionalContent(container);
147
		
148
		return container;
149
	}
150

    
151

    
152
	/**
153
	 * <p>refresh</p>
154
	 *
155
	 * @param definedTerms a {@link java.util.List} object.
156
	 */
157
	protected void refresh(List<T> definedTerms) {
158
		tableViewer.setInput(definedTerms);
159

    
160
		List<T> preferedTerms = CdmStore.getTermManager().getFilteredTerms(definedTerms);
161
		tableViewer.setCheckedElements(preferedTerms.toArray());
162
	}
163

    
164
	/**
165
	 * <p>createAdditionalContent</p>
166
	 *
167
	 * @param container a {@link org.eclipse.swt.widgets.Composite} object.
168
	 */
169
	protected void createAdditionalContent(Composite container) {
170
		// implement where needed		
171
	}
172

    
173
	/* (non-Javadoc)
174
	 * @see eu.etaxonomy.taxeditor.preference.AbstractMenuPreferences#createButtons(org.eclipse.swt.widgets.Composite)
175
	 */
176
	/**
177
	 * <p>createEditButtons</p>
178
	 *
179
	 * @param buttonContainer a {@link org.eclipse.swt.widgets.Composite} object.
180
	 */
181
	protected void createEditButtons(Composite buttonContainer) {
182
		newButton = new Button(buttonContainer, SWT.PUSH);
183
		newButton.setText("New");
184
		newButton.setLayoutData(new GridData(SWT.FILL));
185

    
186
		
187
		editButton = new Button(buttonContainer, SWT.PUSH);
188
		editButton.setText("Edit");
189
		editButton.setLayoutData(new GridData(SWT.FILL));
190

    
191
		
192
		removeButton = new Button(buttonContainer, SWT.PUSH);
193
		removeButton.setText("Remove");
194
		removeButton.setLayoutData(new GridData(SWT.FILL));
195

    
196
		
197
		addNewButtonListeners();
198
		addEditButtonListeners();
199
		addDeleteButtonListeners();
200
	}
201

    
202
	/**
203
	 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
204
	 * is set.
205
	 */
206
	protected void addNewButtonListeners() {
207
		newButton.addSelectionListener(new SelectionAdapter(){
208
			/* (non-Javadoc)
209
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
210
			 */
211
			@Override
212
			public void widgetSelected(SelectionEvent e) {
213
				VocabularyTermWizard<T> wizard = new VocabularyTermWizard<T>(getTermClass(), getConversationHolder()); 
214
				
215
				WizardDialog dialog = new WizardDialog(StoreUtil.getShell(), wizard);
216
			    if(dialog.open() == IStatus.OK){
217
			    	tableViewer.setInput(getTerms());
218
			    }
219
			}
220

    
221
			
222
		});
223
	}
224
	
225
	/**
226
	 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
227
	 * is set.
228
	 */
229
	protected void addEditButtonListeners() {
230
		editButton.addSelectionListener(new SelectionAdapter(){
231
			/* (non-Javadoc)
232
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
233
			 */
234
			@Override
235
			public void widgetSelected(SelectionEvent e) {
236
				T selection = (T) ((StructuredSelection) tableViewer.getSelection()).getFirstElement();
237
				
238
				if(selection == null){
239
					StoreUtil.informationDialog("Nothing selected", "Please select a term to edit.");
240
					return;
241
				}
242
				
243
				VocabularyTermWizard<T> wizard = new VocabularyTermWizard<T>(getTermClass(), selection, getConversationHolder()); 
244
				
245
				WizardDialog dialog = new WizardDialog(StoreUtil.getShell(), wizard);
246
			    
247
				if(dialog.open() == IStatus.OK){			    
248
				    tableViewer.setInput(getTerms());
249
				    tableViewer.reveal(selection);
250
			    }
251
			}
252
		});
253
	}
254
	
255
	/**
256
	 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
257
	 * is set.
258
	 */
259
	protected void addDeleteButtonListeners() {
260
		removeButton.addSelectionListener(new SelectionAdapter(){
261
			/* (non-Javadoc)
262
			 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
263
			 */
264
			@Override
265
			public void widgetSelected(SelectionEvent e) {
266
				boolean confirmation = StoreUtil.confirmDialog("Confirm deletion", "Do you really want to delete the selected terms?");
267
				
268
				if(confirmation){
269
					IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
270
					
271
					Iterator<T> selectionIterator = selection.iterator();
272
					
273
					while(selectionIterator.hasNext()){
274
						T term = selectionIterator.next();
275

    
276
						tableViewer.remove(term);
277
						
278
						if(getConversationHolder().getSessionHolder().getSession().contains(term)){
279
							ITermService service = CdmStore.getService(ITermService.class);
280
							DefinedTermBase theTerm = service.load(term.getUuid());
281
							
282
							service.delete(theTerm);
283
						}
284
					}
285
					
286
//					tableViewer.refresh();
287
				}
288
			}
289
		});
290
	}
291

    
292
	/** {@inheritDoc} */
293
	public void init(IWorkbench workbench) {
294
		setPreferenceStore(PreferencesUtil.getPreferenceStore());
295
		getConversationHolder().bind();
296
	}
297

    
298
	/*
299
	 * (non-Javadoc)
300
	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
301
	 */
302
	/**
303
	 * <p>performDefaults</p>
304
	 */
305
	protected void performDefaults() {
306
		tableViewer.setAllChecked(true);
307
	}
308

    
309
	/**
310
	 * <p>Getter for the field <code>tableViewer</code>.</p>
311
	 *
312
	 * @return the tableViewer
313
	 */
314
	public CheckboxTableViewer getTableViewer() {
315
		return tableViewer;
316
	}
317

    
318
	/* (non-Javadoc)
319
	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
320
	 */
321
	/** {@inheritDoc} */
322
	@Override
323
	public boolean performOk() {
324
		if(checkNoneChecked()){
325
			return false;
326
		}
327
		
328
		getConversationHolder().commit(true);
329
		
330
		List<T> preferredTerms = new ArrayList<T>();
331
		for (Object element : getTableViewer().getCheckedElements()){
332
			preferredTerms.add((T) element);
333
		}
334
		
335
		CdmStore.getTermManager().setPreferredTerms(preferredTerms, getTerms());
336
		
337
		PreferencesUtil.firePreferencesChanged(this.getClass());
338
		
339
		return true;
340
	}
341
	
342
	private boolean checkNoneChecked(){
343
		
344
		if(tableViewer.getCheckedElements().length == 0){
345
			setMessage("Please check at least one item", WARNING);
346
			return true;
347
		}else{
348
			setMessage(null);
349
			return false;
350
		}
351
	}
352
	
353
	/**
354
	 * <p>getTermClass</p>
355
	 *
356
	 * @return a {@link java.lang.Class} object.
357
	 */
358
	protected abstract Class<T> getTermClass();
359
	
360
	/* (non-Javadoc)
361
	 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
362
	 */
363
	@Override
364
	public ConversationHolder getConversationHolder() {
365
		if(conversation == null){
366
			conversation = CdmStore.createConversation();
367
		}
368
		return conversation;
369
	}
370
	
371
	/* (non-Javadoc)
372
	 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
373
	 */
374
	@Override
375
	public void update(CdmDataChangeMap changeEvents) {
376
		// implement where needed
377
	}
378
}
(1-1/18)