Project

General

Profile

Download (7.72 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.editor.view.descriptive;
12

    
13
import java.util.HashMap;
14
import java.util.Map;
15

    
16
import org.eclipse.jface.action.Action;
17
import org.eclipse.jface.action.GroupMarker;
18
import org.eclipse.jface.action.IToolBarManager;
19
import org.eclipse.jface.action.MenuManager;
20
import org.eclipse.jface.resource.ImageDescriptor;
21
import org.eclipse.jface.viewers.ISelection;
22
import org.eclipse.jface.viewers.StructuredSelection;
23
import org.eclipse.jface.viewers.TreeViewer;
24
import org.eclipse.jface.viewers.Viewer;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.dnd.DND;
27
import org.eclipse.swt.dnd.Transfer;
28
import org.eclipse.swt.graphics.ImageData;
29
import org.eclipse.swt.widgets.Composite;
30
import org.eclipse.swt.widgets.Control;
31
import org.eclipse.swt.widgets.Menu;
32
import org.eclipse.swt.widgets.Tree;
33
import org.eclipse.ui.IEditorInput;
34
import org.eclipse.ui.IEditorPart;
35
import org.eclipse.ui.IWorkbenchActionConstants;
36
import org.eclipse.ui.IWorkbenchPart;
37

    
38
import eu.etaxonomy.cdm.model.common.CdmBase;
39
import eu.etaxonomy.cdm.model.description.DescriptionBase;
40
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
41
import eu.etaxonomy.cdm.model.description.TaxonDescription;
42
import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
43
import eu.etaxonomy.taxeditor.editor.EditorUtil;
44
import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
45
import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermEditor;
46
import eu.etaxonomy.taxeditor.editor.key.AbstractGraphKeyEditor;
47
import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
48
import eu.etaxonomy.taxeditor.model.FeatureNodeContainerTree;
49
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
50
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
51
import eu.etaxonomy.taxeditor.model.ImageResources;
52
import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
53

    
54
/**
55
 * <p>DescriptiveViewPart class.</p>
56
 *
57
 * @author n.hoffmann
58
 * @created Jun 9, 2010
59
 * @version 1.0
60
 */
61
public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IPartContentHasDetails, IPartContentHasSupplementalData {
62

    
63
	/** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
64
	public static final String ID = "eu.etaxonomy.taxeditor.editor.view.descriptive";
65
	
66
	protected TreeViewer viewer;
67
	
68
	protected Map<TaxonDescription, FeatureNodeContainerTree> featureNodeContainerCache = new HashMap<TaxonDescription, FeatureNodeContainerTree>();
69

    
70
	protected ToggleDescriptionAction showAllElementsAction;
71

    
72
	protected ToggleDescriptionAction hideAllElementsAction;
73

    
74
	protected int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
75
	
76
	/** {@inheritDoc} */
77
	@Override
78
	public void createViewer(Composite parent) {
79
		viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL
80
				| SWT.V_SCROLL | SWT.FULL_SELECTION));
81
		viewer.setContentProvider(new DescriptiveContentProvider(featureNodeContainerCache));		
82
		viewer.setLabelProvider(new DescriptiveLabelProvider());
83
		viewer.setSorter(new DescriptiveViewerSorter());
84
		viewer.setAutoExpandLevel(2);
85
		Transfer[] transfers = new Transfer[] { DescriptionElementTransfer.getInstance() };
86
		viewer.addDragSupport(dndOperations, transfers, new DescriptionElementDragListener(
87
				this));
88
		viewer.addDropSupport(dndOperations, transfers,
89
				new DescriptionElementDropAdapter(viewer));
90
						
91
		// Propagate selection from viewer
92
		getSite().setSelectionProvider(viewer);
93
		
94
		showAllElementsAction = new ToggleDescriptionAction(false);		
95
		hideAllElementsAction = new ToggleDescriptionAction(true);
96
		
97
		// Add context menu to tree
98
		createMenu();
99
		
100
		createToolbar();
101
		
102
		// set initial input
103
//		if(getEditor() != null){
104
//			viewer.setInput(getEditor().getEditorInput());
105
//		}
106
	}
107
	
108
	/* (non-Javadoc)
109
	 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection()
110
	 */
111
	/** {@inheritDoc} */
112
	@Override
113
	protected ISelection getInitialSelection() {
114
		if(getEditor() != null){
115
			return new StructuredSelection(getEditor().getEditorInput());
116
		}	
117
		
118
		return super.getInitialSelection();
119
	}
120

    
121
	protected void createToolbar() {
122
		IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
123
		toolBarManager.add(showAllElementsAction);
124
		toolBarManager.add(hideAllElementsAction);
125
	}
126
	
127
	/*
128
	 * TODO add to the views menu
129
	 */
130
	protected void createMenu(){
131
		MenuManager menuManager = new MenuManager();
132
		menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
133
		
134
		getSite().registerContextMenu(menuManager, viewer);
135

    
136
		// FIXME for some reason this is not working
137
		menuManager.add(showAllElementsAction);
138
		menuManager.add(hideAllElementsAction);
139
				
140
		Control control = viewer.getControl();
141
		Menu menu = menuManager.createContextMenu(control);
142
		
143
		control.setMenu(menu);	
144
	}
145

    
146
	/** {@inheritDoc} */
147
	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
148
		if(EditorUtil.getActiveEditor() == null){
149
			showEmptyPage();
150
			return;
151
		}
152
		
153
		if(part instanceof BulkEditor){
154
			showEmptyPage();
155
			return;
156
		}
157
		
158
		if(part instanceof AbstractGraphKeyEditor){
159
			showEmptyPage();
160
			return;
161
		}
162
		
163
		if(part instanceof DefinedTermEditor){
164
			showEmptyPage();
165
			return;
166
		}
167
		
168
		if(part instanceof MultiPageTaxonEditor){
169
			if(! part.equals(this.part)){
170
				IEditorInput input = ((IEditorPart) part).getEditorInput();
171
				featureNodeContainerCache.clear();
172
				showViewer(part, new StructuredSelection(input));
173
			}
174
			showViewer();
175
		}
176
	}
177
	
178
	/**
179
	 * 
180
	 * @author n.hoffmann
181
	 * @created May 28, 2010
182
	 * @version 1.0
183
	 */
184
	protected class ToggleDescriptionAction extends Action{
185
		private boolean expanded;
186
		
187
		public ToggleDescriptionAction(boolean expand){
188
			super(null, Action.AS_PUSH_BUTTON);
189
			expanded = expand;
190
			setImageAndTooltip();
191
		}
192
		
193
		private void setImageAndTooltip(){
194
			setImageDescriptor(new ImageDescriptor() {
195
				@Override
196
				public ImageData getImageData() {
197
					setText(expanded ? "Collapse All" : "Expand All");
198
					String resource = expanded ? ImageResources.COLLAPSE_ALL : ImageResources.EXPAND_ALL;
199
					return ImageResources.getImage(resource).getImageData();
200
				}
201
			});
202
			
203
			String toolTipText = expanded ? "Collapse all" : "Show all descriptive data";
204
			setToolTipText(toolTipText);
205
		}
206
		
207
		@Override
208
		public void run() {
209
			if(expanded){
210
				viewer.collapseAll();
211
			}else{
212
				viewer.expandAll();
213
			}
214
			setImageAndTooltip();
215
		}
216
	}
217

    
218
	/** {@inheritDoc} */
219
	@Override
220
	public boolean postOperation(CdmBase objectAffectedByOperation) {
221
		return super.postOperation(objectAffectedByOperation);
222
	}
223

    
224
	/** {@inheritDoc} */
225
	@Override
226
	public void changed(Object object) {
227
		for(FeatureNodeContainerTree containerTree : featureNodeContainerCache.values()){
228
			containerTree.buildTree();
229
		}
230
		viewer.refresh();
231
		
232
		if(object instanceof DescriptionElementBase){
233
			DescriptionElementBase descriptionElement = (DescriptionElementBase) object;
234
			DescriptionBase description = descriptionElement.getInDescription();
235
			FeatureNodeContainerTree containerTree = featureNodeContainerCache.get(description);
236
			
237
			FeatureNodeContainer featureNodeContainer = containerTree.getFeatureNodeContainerForDescriptionElement(descriptionElement);
238
			viewer.expandToLevel(featureNodeContainer, 1);
239
			
240
		}
241

    
242
		if(object != null){
243
			StructuredSelection selection = new StructuredSelection(object);
244
			viewer.setSelection(selection, true);
245
		}
246

    
247
		super.changed(object);
248
	}
249

    
250
	/** {@inheritDoc} */
251
	@Override
252
	public Viewer getViewer() {
253
		return viewer;
254
	}
255

    
256
	/**
257
	 * <p>onComplete</p>
258
	 *
259
	 * @return a boolean.
260
	 */
261
	public boolean onComplete() {
262
		return false;
263
	}
264
}
(6-6/7)