Project

General

Profile

Download (10 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.featuretree;
12

    
13
import java.util.Collection;
14

    
15
import org.eclipse.core.runtime.IStatus;
16
import org.eclipse.jface.viewers.ISelectionChangedListener;
17
import org.eclipse.jface.viewers.IStructuredSelection;
18
import org.eclipse.jface.viewers.SelectionChangedEvent;
19
import org.eclipse.jface.viewers.TreeViewer;
20
import org.eclipse.jface.viewers.Viewer;
21
import org.eclipse.jface.viewers.ViewerDropAdapter;
22
import org.eclipse.jface.wizard.WizardDialog;
23
import org.eclipse.jface.wizard.WizardPage;
24
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.dnd.DND;
26
import org.eclipse.swt.dnd.DragSourceAdapter;
27
import org.eclipse.swt.dnd.DragSourceEvent;
28
import org.eclipse.swt.dnd.Transfer;
29
import org.eclipse.swt.dnd.TransferData;
30
import org.eclipse.swt.events.ModifyEvent;
31
import org.eclipse.swt.events.ModifyListener;
32
import org.eclipse.swt.events.SelectionAdapter;
33
import org.eclipse.swt.events.SelectionEvent;
34
import org.eclipse.swt.layout.GridData;
35
import org.eclipse.swt.layout.GridLayout;
36
import org.eclipse.swt.widgets.Button;
37
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Label;
39
import org.eclipse.swt.widgets.Text;
40

    
41
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
42
import eu.etaxonomy.cdm.model.description.Feature;
43
import eu.etaxonomy.cdm.model.description.FeatureNode;
44
import eu.etaxonomy.cdm.model.description.FeatureTree;
45
import eu.etaxonomy.taxeditor.model.MessagingUtils;
46
import eu.etaxonomy.taxeditor.store.CdmStore;
47

    
48
/**
49
 * <p>
50
 * EditFeatureTreeWizardPage class.
51
 * </p>
52
 * 
53
 * @author n.hoffmann
54
 * @created Aug 5, 2010
55
 * @version 1.0
56
 */
57
public class EditFeatureTreeWizardPage extends WizardPage implements
58
		ModifyListener, ISelectionChangedListener {
59

    
60
	private TreeViewer viewer;
61
	private Label label_title;
62
	private Text text_title;
63
	private Button button_add;
64
	private Button button_remove;
65
	private Label label_treeInfo;
66
	private FeatureTree featureTree;
67

    
68
	/**
69
	 * <p>
70
	 * Constructor for EditFeatureTreeWizardPage.
71
	 * </p>
72
	 * 
73
	 * @param pageName
74
	 *            a {@link java.lang.String} object.
75
	 */
76
	protected EditFeatureTreeWizardPage(String pageName) {
77
		super(pageName);
78
		setMessage("Edit the Feature Tree.");
79
	}
80

    
81
	/*
82
	 * (non-Javadoc)
83
	 * 
84
	 * @see
85
	 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
86
	 * .Composite)
87
	 */
88
	/** {@inheritDoc} */
89
	@Override
90
	public void createControl(Composite parent) {
91
		Composite composite = new Composite(parent, SWT.NULL);
92
		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
93
		composite.setLayout(new GridLayout());
94

    
95
		Composite composite_treeTitle = new Composite(composite, SWT.NULL);
96
		composite_treeTitle.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true,
97
				false));
98
		composite_treeTitle.setLayout(new GridLayout(2, false));
99

    
100
		label_title = new Label(composite_treeTitle, SWT.NULL);
101
		label_title.setText("Title");
102

    
103
		text_title = new Text(composite_treeTitle, SWT.NULL);
104
		text_title.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
105

    
106
		Composite composite_treeContent = new Composite(composite, SWT.NULL);
107
		composite_treeContent.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
108
				true, true));
109
		composite_treeContent.setLayout(new GridLayout(2, false));
110

    
111
		viewer = new TreeViewer(composite_treeContent);
112
		viewer.getControl().setLayoutData(
113
				new GridData(SWT.FILL, SWT.FILL, true, true));
114

    
115
		Composite composite_buttons = new Composite(composite_treeContent,
116
				SWT.NULL);
117
		composite_buttons.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false,
118
				false));
119
		composite_buttons.setLayout(new GridLayout());
120

    
121
		button_add = new Button(composite_buttons, SWT.PUSH);
122
		button_add.setText("Add");
123
		button_add.setToolTipText("Add a feature to this feature treee.");
124
		button_remove = new Button(composite_buttons, SWT.PUSH);
125
		button_remove.setText("Remove");
126
		button_remove
127
				.setToolTipText("Remove a feature from this feature tree.");
128

    
129
		label_treeInfo = new Label(composite, SWT.NULL);
130
		label_treeInfo
131
				.setText("Order and nesting of feature nodes may be changed through drag and drop.");
132

    
133
		viewer.setContentProvider(new FeatureTreeContentProvider());
134
		viewer.setLabelProvider(new FeatureTreeLabelProvider());
135

    
136
		int ops = DND.DROP_COPY | DND.DROP_MOVE;
137
		Transfer[] transfers = new Transfer[] { FeatureNodeTransfer
138
				.getInstance() };
139
		viewer.addDragSupport(ops, transfers, new FeatureNodeDragListener(
140
				viewer));
141
		viewer.addDropSupport(ops, transfers,
142
				new FeatureNodeDropAdapter(viewer));
143

    
144
		viewer.addSelectionChangedListener(this);
145

    
146
		button_add.addSelectionListener(new AddButtonListener());
147
		button_remove.addSelectionListener(new RemoveSelectionListener());
148

    
149
		setControl(composite);
150
	}
151

    
152
	/**
153
	 * <p>
154
	 * setSelectedTree
155
	 * </p>
156
	 * 
157
	 * @param featureTree
158
	 *            a {@link eu.etaxonomy.cdm.model.description.FeatureTree}
159
	 *            object.
160
	 */
161
	public void setSelectedTree(FeatureTree featureTree) {
162
		this.featureTree = featureTree;
163
		viewer.setInput(featureTree);
164

    
165
		text_title.removeModifyListener(this);
166
		text_title.setText(featureTree.getTitleCache());
167
		text_title.addModifyListener(this);
168
	}
169

    
170
	/** {@inheritDoc} */
171
	@Override
172
	public void modifyText(ModifyEvent e) {
173
		featureTree.setTitleCache(text_title.getText(), true);
174
	}
175

    
176
	/** {@inheritDoc} */
177
	@Override
178
	public void selectionChanged(SelectionChangedEvent event) {
179
		IStructuredSelection selection = (IStructuredSelection) event
180
				.getSelection();
181

    
182
		button_add.setEnabled(selection.size() <= 1);
183
		button_remove.setEnabled(selection.size() > 0);
184
	}
185

    
186
	private class AddButtonListener extends SelectionAdapter {
187
		@Override
188
		public void widgetSelected(SelectionEvent e) {
189
			AvailableFeaturesWizard wizard = new AvailableFeaturesWizard(
190
					featureTree);
191
			WizardDialog dialog = new WizardDialog(getShell(), wizard);
192

    
193
			if (dialog.open() == IStatus.OK) {
194
				IStructuredSelection selection = (IStructuredSelection) viewer
195
						.getSelection();
196
				FeatureNode parent = (FeatureNode) (selection.getFirstElement() != null ? selection
197
						.getFirstElement() : ((FeatureTree) viewer.getInput())
198
						.getRoot());
199
				Collection<Feature> additionalFeatures = wizard
200
						.getAdditionalFeatures();
201
				for (Feature feature : additionalFeatures) {
202
					FeatureNode child = FeatureNode.NewInstance(feature);
203
					CdmStore.getService(IFeatureNodeService.class)
204
							.saveOrUpdate(child);
205
					parent.addChild(child);
206
				}
207
				viewer.refresh();
208
			}
209
		}
210
	}
211

    
212
	private class RemoveSelectionListener extends SelectionAdapter {
213
		@Override
214
		public void widgetSelected(SelectionEvent e) {
215
			IStructuredSelection selection = (IStructuredSelection) viewer
216
					.getSelection();
217

    
218
			for (Object selectedObject : selection.toArray()) {
219
				FeatureNode featureNode = (FeatureNode) selectedObject;
220
				FeatureNode parent = featureNode.getParent();
221
				parent.removeChild(featureNode);
222
			}
223
			viewer.refresh();
224
		}
225
	}
226

    
227
	private class FeatureNodeDragListener extends DragSourceAdapter {
228

    
229
		private final TreeViewer viewer;
230

    
231
		public FeatureNodeDragListener(TreeViewer viewer) {
232
			this.viewer = viewer;
233
		}
234

    
235
		/**
236
		 * Method declared on DragSourceListener
237
		 */
238
		@Override
239
		public void dragFinished(DragSourceEvent event) {
240
			if (!event.doit)
241
				return;
242
			// if the featureNode was moved, remove it from the source viewer
243
			if (event.detail == DND.DROP_MOVE) {
244
				IStructuredSelection selection = (IStructuredSelection) viewer
245
						.getSelection();
246
				viewer.refresh();
247
			}
248
		}
249

    
250
		/**
251
		 * Method declared on DragSourceListener
252
		 */
253
		@Override
254
		public void dragSetData(DragSourceEvent event) {
255
			IStructuredSelection selection = (IStructuredSelection) viewer
256
					.getSelection();
257
			FeatureNode[] featureNodes = (FeatureNode[]) selection.toList()
258
					.toArray(new FeatureNode[selection.size()]);
259
			if (FeatureNodeTransfer.getInstance().isSupportedType(
260
					event.dataType)) {
261
				event.data = featureNodes;
262
			}
263
		}
264

    
265
		/**
266
		 * Method declared on DragSourceListener
267
		 */
268
		@Override
269
		public void dragStart(DragSourceEvent event) {
270
			event.doit = !viewer.getSelection().isEmpty();
271
		}
272

    
273
	}
274

    
275
	private class FeatureNodeDropAdapter extends ViewerDropAdapter {
276

    
277
		protected FeatureNodeDropAdapter(Viewer viewer) {
278
			super(viewer);
279
		}
280

    
281
		@Override
282
		public boolean performDrop(Object data) {
283
			FeatureNode target = (FeatureNode) getCurrentTarget();
284
			int position = 0;
285

    
286
			if (target != null) {
287
				int location = getCurrentLocation();
288
				FeatureNode parent = target.getParent();
289
				if (location == LOCATION_BEFORE) {
290
					position = Math.max(0, parent.getIndex(target) - 1);
291
					target = parent;
292
				}
293

    
294
				if (location == LOCATION_AFTER) {
295
					position = parent.getIndex(target);
296
					target = parent;
297
				}
298
			}
299

    
300
			// set target to root node if there is no target specified
301
			if (target == null) {
302
				FeatureTree featureTree = (FeatureTree) getViewer().getInput();
303
				target = featureTree.getRoot();
304
			}
305

    
306
			Object[] droppedObjects = (Object[]) data;
307
			TreeViewer viewer = (TreeViewer) getViewer();
308

    
309
			// cannot drop a feature node onto itself
310
			for (Object droppedObject : droppedObjects) {
311
				if (droppedObject == null) {
312
					MessagingUtils.warningDialog(
313
									"Operation not supported yet",
314
									this,
315
									"We are currently unable to change the order of freshly created "
316
											+ "feature trees nodes. Please close and reopen the dialog to change the order of features.");
317
					return false;
318
				}
319
				if (droppedObject.equals(target)) {
320
					return false;
321
				}
322
			}
323
			for (Object droppedObject : droppedObjects) {
324
				FeatureNode droppedNode = (FeatureNode) droppedObject;
325
				target.addChild(droppedNode, position);
326
				viewer.add(target, droppedNode);
327
				viewer.reveal(droppedNode);
328
			}
329
			return true;
330
		}
331

    
332
		@Override
333
		public boolean validateDrop(Object target, int operation,
334
				TransferData transferData) {
335
			return FeatureNodeTransfer.getInstance().isSupportedType(
336
					transferData);
337
		}
338

    
339
	}
340
}
(3-3/10)