Project

General

Profile

Download (8.37 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.api.conversation.ConversationHolder;
36
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
37
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
38
import eu.etaxonomy.cdm.model.common.TermType;
39
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
40
import eu.etaxonomy.taxeditor.editor.definedterm.e4.DefinedTermEditorE4;
41
import eu.etaxonomy.taxeditor.model.AbstractUtility;
42
import eu.etaxonomy.taxeditor.model.MessagingUtils;
43
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
44
import eu.etaxonomy.taxeditor.store.CdmStore;
45
import eu.etaxonomy.taxeditor.store.TermStore;
46

    
47
/**
48
 * @author n.hoffmann
49
 * @created 12.06.2009
50
 * @version 1.0
51
 */
52
public abstract class AbstractMenuPreferences<T extends DefinedTermBase> extends CdmPreferencePage implements IConversationEnabled{
53

    
54
	private Button toggleButton;
55
	protected HashMap<DefinedTermBase<T>, Button> menuButtons;
56

    
57
	protected Button editButton;
58
	protected Button removeButton;
59

    
60
	protected CheckboxTableViewer tableViewer;
61

    
62
	private boolean state = true;
63
	private final boolean vocabularyIsEditable;
64
	private ConversationHolder conversation;
65

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

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

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

    
102
		Composite container = new Composite(parent, SWT.NULL);
103
		final GridLayout gridLayout = new GridLayout();
104
		gridLayout.numColumns = 2;
105
		container.setLayout(gridLayout);
106

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

    
112
		tableViewer.setContentProvider(new DefinedTermBaseContentProvider());
113
		tableViewer.setLabelProvider(new DefinedTermBaseLabelProvider());
114

    
115
		refresh(getTerms());
116

    
117
		tableViewer.addCheckStateListener(new ICheckStateListener() {
118

    
119
			@Override
120
			public void checkStateChanged(CheckStateChangedEvent arg0) {
121
				checkNoneChecked();
122
			}
123
		});
124

    
125
		Composite buttonContainer = new Composite(container, SWT.NULL);
126
		GridData buttonContainerLayoutData = new GridData();
127
		buttonContainerLayoutData.verticalAlignment = SWT.TOP;
128
		buttonContainer.setLayoutData(buttonContainerLayoutData);
129
		buttonContainer.setLayout(new GridLayout());
130

    
131
		if(vocabularyIsEditable) {
132
            createEditButtons(buttonContainer);
133
        }
134

    
135
		toggleButton = new Button(buttonContainer, SWT.PUSH);
136
		toggleButton.setText("Toggle");
137
		toggleButton.addSelectionListener(new SelectionAdapter(){
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
	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

    
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
	    if(CdmStore.isActive()) {
224
	        getConversationHolder().bind();
225
	    }
226
	}
227

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

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

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

    
247
		getConversationHolder().commit(true);
248

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

    
255
		    CdmStore.getTermManager().setPreferredTerms(preferredTerms, getTerms());
256

    
257
		    refresh(getTerms());
258

    
259
		    PreferencesUtil.firePreferencesChanged(this.getClass());
260
		}
261

    
262
		return super.performOk();
263
	}
264

    
265
	private boolean checkNoneChecked(){
266

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

    
276
	protected abstract TermType getTermType();
277

    
278
	@Override
279
	public ConversationHolder getConversationHolder() {
280
		if(conversation == null){
281
			conversation = CdmStore.createConversation();
282
		}
283
		return conversation;
284
	}
285

    
286
	@Override
287
	public void update(CdmDataChangeMap changeEvents) {
288
		// implement where needed
289
	}
290
}
(1-1/21)