b912c7d97873c12f1da9b37d84531810ddb6821e
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / descriptive / DescriptiveViewPart.java
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.IAction;
19 import org.eclipse.jface.action.IToolBarManager;
20 import org.eclipse.jface.action.MenuManager;
21 import org.eclipse.jface.resource.ImageDescriptor;
22 import org.eclipse.jface.viewers.ISelection;
23 import org.eclipse.jface.viewers.IStructuredSelection;
24 import org.eclipse.jface.viewers.ITreeContentProvider;
25 import org.eclipse.jface.viewers.StructuredSelection;
26 import org.eclipse.jface.viewers.TreeNode;
27 import org.eclipse.jface.viewers.TreeViewer;
28 import org.eclipse.jface.viewers.Viewer;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.dnd.DND;
31 import org.eclipse.swt.dnd.Transfer;
32 import org.eclipse.swt.graphics.ImageData;
33 import org.eclipse.swt.widgets.Composite;
34 import org.eclipse.swt.widgets.Control;
35 import org.eclipse.swt.widgets.Menu;
36 import org.eclipse.swt.widgets.Tree;
37 import org.eclipse.ui.IWorkbenchActionConstants;
38 import org.eclipse.ui.IWorkbenchPart;
39
40 import eu.etaxonomy.cdm.model.common.CdmBase;
41 import eu.etaxonomy.cdm.model.description.DescriptionBase;
42 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
43 import eu.etaxonomy.cdm.model.description.IDescribable;
44 import eu.etaxonomy.taxeditor.editor.EditorUtil;
45 import eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView;
46 import eu.etaxonomy.taxeditor.model.AbstractUtility;
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.IPartContentHasFactualData;
51 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
52 import eu.etaxonomy.taxeditor.model.ImageResources;
53 import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
54 import eu.etaxonomy.taxeditor.view.detail.DetailsViewPart;
55 import eu.etaxonomy.taxeditor.view.supplementaldata.SupplementalDataViewPart;
56
57 /**
58 * <p>DescriptiveViewPart class.</p>
59 *
60 * @author n.hoffmann
61 * @created Jun 9, 2010
62 * @version 1.0
63 */
64 public class DescriptiveViewPart extends AbstractCdmEditorViewPart implements IPartContentHasDetails, IPartContentHasSupplementalData {
65
66 /** Constant <code>ID="eu.etaxonomy.taxeditor.editor.view.desc"{trunked}</code> */
67 public static final String ID = "eu.etaxonomy.taxeditor.editor.view.descriptive";
68
69 protected TreeViewer viewer;
70
71 /**
72 * Maps {@link FeatureNodeContainerTree} to their corresponding {@link TaxonDescritpion}.<br>
73 * This serves as input for the {@link ITreeContentProvider} of the {@link TreeViewer}
74 */
75 protected Map<DescriptionBase<?>, FeatureNodeContainerTree> featureNodeContainerCache = new HashMap<DescriptionBase<?>, FeatureNodeContainerTree>();
76
77 protected ToggleDescriptionAction showAllElementsAction;
78
79 protected ToggleDescriptionAction hideAllElementsAction;
80
81 protected int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
82
83 /** {@inheritDoc} */
84 @Override
85 public void createViewer(Composite parent) {
86 viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL
87 | SWT.V_SCROLL | SWT.FULL_SELECTION));
88 viewer.setContentProvider(new DescriptiveContentProvider(featureNodeContainerCache));
89 viewer.setLabelProvider(new DescriptiveLabelProvider());
90 viewer.setSorter(new DescriptiveViewerSorter());
91 viewer.setAutoExpandLevel(2);
92 Transfer[] transfers = new Transfer[] { DescriptionElementTransfer.getInstance() };
93 viewer.addDragSupport(dndOperations, transfers, new DescriptionElementDragListener(
94 this));
95 viewer.addDropSupport(dndOperations, transfers,
96 new DescriptionElementDropAdapter(viewer));
97
98 // Propagate selection from viewer
99 getSite().setSelectionProvider(viewer);
100
101 showAllElementsAction = new ToggleDescriptionAction(false);
102 hideAllElementsAction = new ToggleDescriptionAction(true);
103
104 // Add context menu to tree
105 createMenu();
106
107 createToolbar();
108
109 // set initial input
110 // if(getEditor() != null){
111 // viewer.setInput(getEditor().getEditorInput());
112 // }
113 }
114
115 /* (non-Javadoc)
116 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection()
117 */
118 /** {@inheritDoc} */
119 @Override
120 protected ISelection getInitialSelection() {
121 if(getEditor() != null){
122 return new StructuredSelection(getEditor().getEditorInput());
123 }
124
125 return super.getInitialSelection();
126 }
127
128 protected void createToolbar() {
129 IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
130 toolBarManager.add(showAllElementsAction);
131 toolBarManager.add(hideAllElementsAction);
132 }
133
134 /*
135 * TODO add to the views menu
136 */
137 protected void createMenu(){
138 MenuManager menuManager = new MenuManager();
139 menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
140
141 getSite().registerContextMenu(menuManager, viewer);
142
143 // FIXME for some reason this is not working
144 menuManager.add(showAllElementsAction);
145 menuManager.add(hideAllElementsAction);
146
147 Control control = viewer.getControl();
148 Menu menu = menuManager.createContextMenu(control);
149
150 control.setMenu(menu);
151 }
152
153 /** {@inheritDoc} */
154 @Override
155 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
156 if(AbstractUtility.getActiveEditor() == null){
157 showEmptyPage();
158 return;
159 }
160
161 if(part == this){
162 return;
163 }
164 if(part instanceof DetailsViewPart || part instanceof SupplementalDataViewPart){
165 // do not show empty page as these views are also used to edit the description selected in this view
166 return;
167 }
168 // unpackage TreeNode of DerivateView
169 else if(part instanceof DerivateView){
170 TreeNode treeNodeOfSelection = EditorUtil.getTreeNodeOfSelection(selection);
171 if(treeNodeOfSelection!=null){
172 selection = new StructuredSelection(treeNodeOfSelection.getValue());
173 }
174 }
175
176 if(selection instanceof IStructuredSelection
177 && ((IStructuredSelection) selection).getFirstElement() instanceof IDescribable<?>
178 && part instanceof IPartContentHasFactualData){
179 featureNodeContainerCache.clear();
180 showViewer(part, (IStructuredSelection) selection);
181 return;
182 }
183 else{
184 showEmptyPage();
185 }
186 }
187
188 /**
189 *
190 * @author n.hoffmann
191 * @created May 28, 2010
192 * @version 1.0
193 */
194 protected class ToggleDescriptionAction extends Action{
195 private final boolean expanded;
196
197 public ToggleDescriptionAction(boolean expand){
198 super(null, IAction.AS_PUSH_BUTTON);
199 expanded = expand;
200 setImageAndTooltip();
201 }
202
203 private void setImageAndTooltip(){
204 setImageDescriptor(new ImageDescriptor() {
205 @Override
206 public ImageData getImageData() {
207 setText(expanded ? "Collapse All" : "Expand All");
208 String resource = expanded ? ImageResources.COLLAPSE_ALL : ImageResources.EXPAND_ALL;
209 return ImageResources.getImage(resource).getImageData();
210 }
211 });
212
213 String toolTipText = expanded ? "Collapse all" : "Show all factual data";
214 setToolTipText(toolTipText);
215 }
216
217 @Override
218 public void run() {
219 if(expanded){
220 viewer.collapseAll();
221 }else{
222 viewer.expandAll();
223 }
224 setImageAndTooltip();
225 }
226 }
227
228 /** {@inheritDoc} */
229 @Override
230 public boolean postOperation(CdmBase objectAffectedByOperation) {
231 return super.postOperation(objectAffectedByOperation);
232 }
233
234 /** {@inheritDoc} */
235 @Override
236 public void changed(Object object) {
237 for(FeatureNodeContainerTree containerTree : featureNodeContainerCache.values()){
238 containerTree.buildTree();
239 }
240 viewer.refresh();
241
242 if(object instanceof DescriptionElementBase){
243 DescriptionElementBase descriptionElement = (DescriptionElementBase) object;
244 DescriptionBase description = descriptionElement.getInDescription();
245 FeatureNodeContainerTree containerTree = featureNodeContainerCache.get(description);
246
247 FeatureNodeContainer featureNodeContainer = containerTree.getFeatureNodeContainerForDescriptionElement(descriptionElement);
248 viewer.expandToLevel(featureNodeContainer, 1);
249
250 }
251
252 if(object != null){
253 StructuredSelection selection = new StructuredSelection(object);
254 viewer.setSelection(selection, true);
255 }
256
257 super.changed(object);
258 }
259
260 /** {@inheritDoc} */
261 @Override
262 public Viewer getViewer() {
263 return viewer;
264 }
265
266 /**
267 * <p>onComplete</p>
268 *
269 * @return a boolean.
270 */
271 @Override
272 public boolean onComplete() {
273 return false;
274 }
275 }