Project

General

Profile

Download (10.9 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.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
}
(1-1/18)