Project

General

Profile

Download (7.88 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.taxeditor.preference.menu;
11

    
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.List;
15

    
16
import org.eclipse.core.commands.Command;
17
import org.eclipse.core.commands.IParameter;
18
import org.eclipse.core.commands.Parameterization;
19
import org.eclipse.core.commands.ParameterizedCommand;
20
import org.eclipse.core.commands.common.NotDefinedException;
21
import org.eclipse.jface.viewers.CheckStateChangedEvent;
22
import org.eclipse.jface.viewers.CheckboxTableViewer;
23
import org.eclipse.jface.viewers.ICheckStateListener;
24
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.events.SelectionAdapter;
26
import org.eclipse.swt.events.SelectionEvent;
27
import org.eclipse.swt.layout.GridData;
28
import org.eclipse.swt.layout.GridLayout;
29
import org.eclipse.swt.widgets.Button;
30
import org.eclipse.swt.widgets.Composite;
31
import org.eclipse.swt.widgets.Control;
32
import org.eclipse.ui.commands.ICommandService;
33
import org.eclipse.ui.handlers.IHandlerService;
34

    
35
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
36
import eu.etaxonomy.cdm.model.term.TermType;
37
import eu.etaxonomy.taxeditor.editor.definedterm.e4.DefinedTermEditorE4;
38
import eu.etaxonomy.taxeditor.model.AbstractUtility;
39
import eu.etaxonomy.taxeditor.model.MessagingUtils;
40
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
41
import eu.etaxonomy.taxeditor.store.CdmStore;
42
import eu.etaxonomy.taxeditor.store.TermStore;
43

    
44
/**
45
 * @author n.hoffmann
46
 * @created 12.06.2009
47
 * @version 1.0
48
 */
49
public abstract class AbstractMenuPreferences<T extends DefinedTermBase> extends CdmPreferencePage {
50

    
51
	private Button toggleButton;
52
	protected HashMap<DefinedTermBase<T>, Button> menuButtons;
53

    
54
	protected Button editButton;
55
	protected Button removeButton;
56

    
57
	protected CheckboxTableViewer tableViewer;
58

    
59
	private boolean state = true;
60
	private final boolean vocabularyIsEditable;
61

    
62

    
63
	/**
64
	 * Constructs a new menu preference page.
65
	 *
66
	 * @param initialVocabulary
67
	 * 			the initial vocabulary containing all possible entries for the menu
68
	 * @param title
69
	 * 			the title of the page
70
	 * @param description
71
	 * 			describing text for the preference page
72
	 * @param editable
73
	 * 			whether this vocabulary should be editable. Will render "New", "Edit", "Delete" buttons
74
	 * 			Handler for these buttons have to be overriding addEditButtonListeners()
75
	 * @param <T> a T object.
76
	 */
77
	public AbstractMenuPreferences(String title, String description, boolean editable) {
78
		super(title);
79
		vocabularyIsEditable = editable;
80
		setDescription(description);
81
		init();
82
	}
83

    
84
	protected List<T> getTerms(){
85
	    if(CdmStore.isActive() && getTermType()!=null){
86
	        return TermStore.getTerms(getTermType(), null);
87
	    }
88
	    return new ArrayList<T>();
89
	}
90

    
91
	/**
92
	 * {@inheritDoc}
93
	 *
94
	 * Create contents of the preference page
95
	 */
96
	@Override
97
	public Control createContents(Composite parent) {
98

    
99
		Composite container = new Composite(parent, SWT.NULL);
100
		final GridLayout gridLayout = new GridLayout();
101
		gridLayout.numColumns = 2;
102
		container.setLayout(gridLayout);
103

    
104
		tableViewer = CheckboxTableViewer.newCheckList(container, SWT.NULL);
105
		GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
106
		tableLayoutData.heightHint = 300;
107
		tableViewer.getTable().setLayoutData(tableLayoutData);
108

    
109
		tableViewer.setContentProvider(new DefinedTermBaseContentProvider());
110
		tableViewer.setLabelProvider(new DefinedTermBaseLabelProvider());
111

    
112
		refresh(getTerms());
113

    
114
		tableViewer.addCheckStateListener(new ICheckStateListener() {
115

    
116
			@Override
117
			public void checkStateChanged(CheckStateChangedEvent arg0) {
118
				checkNoneChecked();
119
				setApply(true);
120
			}
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) {
131
            createEditButtons(buttonContainer);
132
        }
133

    
134
		toggleButton = new Button(buttonContainer, SWT.PUSH);
135
		toggleButton.setText("Toggle");
136
		toggleButton.addSelectionListener(new SelectionAdapter(){
137
			@Override
138
			public void widgetSelected(SelectionEvent e) {
139
				state = state ? false : true;
140
				tableViewer.setAllChecked(state);
141
				checkNoneChecked();
142
				setApply(true);
143
			}
144
		});
145

    
146
		createAdditionalContent(container);
147

    
148
		return container;
149
	}
150

    
151
	protected void refresh(List<T> definedTerms) {
152
		tableViewer.setInput(definedTerms);
153

    
154
		List<T> preferedTerms = CdmStore.getTermManager().getFilteredTerms(definedTerms);
155
		tableViewer.setCheckedElements(preferedTerms.toArray());
156
	}
157

    
158
	protected void createAdditionalContent(Composite container) {
159
		// implement where needed
160
	}
161

    
162
	protected void createEditButtons(Composite buttonContainer) {
163

    
164
		editButton = new Button(buttonContainer, SWT.PUSH);
165
		editButton.setText("Open Term Editor");
166
		editButton.setLayoutData(new GridData(SWT.FILL));
167

    
168
		addEditButtonListeners();
169
	}
170

    
171
	/**
172
	 * Implement this method in MenuPreference Pages where the vocabulary should be editable, editable flag
173
	 * is set.
174
	 */
175
	protected void addEditButtonListeners() {
176
		editButton.addSelectionListener(new SelectionAdapter(){
177
			@Override
178
			public void widgetSelected(SelectionEvent event) {
179
			    setApply(true);
180
				ICommandService commandService = (ICommandService)  AbstractUtility.getService(ICommandService.class);
181

    
182
				Command command = commandService.getCommand(DefinedTermEditorE4.OPEN_COMMAND_ID);
183

    
184
				IParameter parameter;
185
				try {
186
					parameter = command.getParameter("eu.etaxonomy.taxeditor.store.openDefinedTermEditor.termTypeUuid");
187

    
188
					Parameterization[] parameterizations = new Parameterization[]{
189
							new Parameterization(parameter, getTermType().getUuid().toString())
190
					};
191

    
192
					ParameterizedCommand pCommand = new ParameterizedCommand(command, parameterizations);
193

    
194
					if (command.isEnabled()) {
195
						IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
196
						try {
197
							handlerService.executeCommand(pCommand, null);
198
						} catch (NotDefinedException e) {
199
							throw new RuntimeException("Could not find open command: "
200
									+ DefinedTermEditorE4.OPEN_COMMAND_ID);
201
						} catch (Exception e) {
202
							MessagingUtils
203
									.error(getClass(),
204
											"An exception occurred while trying to open a selection",
205
											e);
206
						}
207
					}
208
				} catch (NotDefinedException e) {
209
					MessagingUtils
210
					.error(getClass(),
211
							"An exception occurred while trying to open the Term Editor",
212
							e);
213
				}
214

    
215
			}
216
		});
217
	}
218

    
219
	/** {@inheritDoc} */
220
	@Override
221
    public void init() {
222
	    setPreferenceStore(PreferencesUtil.getPreferenceStore());
223

    
224
	}
225

    
226
	/**
227
	 * <p>performDefaults</p>
228
	 */
229
	@Override
230
    protected void performDefaults() {
231
		tableViewer.setAllChecked(true);
232
		setApply(true);
233
	}
234

    
235
	/** {@inheritDoc} */
236
	@Override
237
	public boolean performOk() {
238
	    if(!CdmStore.isActive()) {
239
	        return true;
240
	    }
241

    
242
		if(checkNoneChecked()){
243
			return false;
244
		}
245

    
246
		if(tableViewer!=null){
247
		    List<T> preferredTerms = new ArrayList<T>();
248
		    for (Object element : tableViewer.getCheckedElements()){
249
		        preferredTerms.add((T) element);
250
		    }
251

    
252
		    CdmStore.getTermManager().setPreferredTerms(preferredTerms, getTerms());
253

    
254
		    CdmStore.getTermManager().clearTermMapForTermType(getTermType());
255
		    refresh(getTerms());
256

    
257
		    PreferencesUtil.firePreferencesChanged(this.getClass());
258
		}
259

    
260
		return super.performOk();
261
	}
262

    
263
	protected boolean checkNoneChecked(){
264

    
265
		if(tableViewer!=null && tableViewer.getCheckedElements().length == 0){
266
			setMessage("Please check at least one item", WARNING);
267
			return true;
268
		}else{
269
			setMessage(null);
270
			return false;
271
		}
272
	}
273

    
274
	protected abstract TermType getTermType();
275

    
276

    
277
}
(1-1/21)