AT: committing changes to the TaxEditor Post second round of code review
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / uses / UsesViewPart.java
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 package eu.etaxonomy.taxeditor.editor.view.uses;
10
11 import java.util.HashMap;
12 import java.util.Map;
13
14 import org.eclipse.jface.action.Action;
15 import org.eclipse.jface.action.GroupMarker;
16 import org.eclipse.jface.action.IToolBarManager;
17 import org.eclipse.jface.action.MenuManager;
18 import org.eclipse.jface.resource.ImageDescriptor;
19 import org.eclipse.jface.viewers.ISelection;
20 import org.eclipse.jface.viewers.StructuredSelection;
21 import org.eclipse.jface.viewers.TreeViewer;
22 import org.eclipse.jface.viewers.Viewer;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.dnd.DND;
25 import org.eclipse.swt.dnd.Transfer;
26 import org.eclipse.swt.graphics.ImageData;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Control;
29 import org.eclipse.swt.widgets.Menu;
30 import org.eclipse.swt.widgets.Tree;
31 import org.eclipse.ui.IEditorInput;
32 import org.eclipse.ui.IEditorPart;
33 import org.eclipse.ui.IWorkbenchActionConstants;
34 import org.eclipse.ui.IWorkbenchPart;
35
36 import eu.etaxonomy.cdm.model.common.CdmBase;
37 import eu.etaxonomy.cdm.model.description.DescriptionBase;
38 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
39 import eu.etaxonomy.cdm.model.description.TaxonDescription;
40 import eu.etaxonomy.taxeditor.bulkeditor.BulkEditor;
41 import eu.etaxonomy.taxeditor.editor.EditorUtil;
42 import eu.etaxonomy.taxeditor.editor.MultiPageTaxonEditor;
43 import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermEditor;
44 import eu.etaxonomy.taxeditor.editor.key.AbstractGraphKeyEditor;
45 import eu.etaxonomy.taxeditor.editor.view.descriptive.DescriptionElementTransfer;
46 import eu.etaxonomy.taxeditor.model.FeatureNodeContainer;
47 import eu.etaxonomy.taxeditor.model.FeatureNodeContainerTree;
48 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
49 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
50 import eu.etaxonomy.taxeditor.model.ImageResources;
51 import eu.etaxonomy.taxeditor.view.AbstractCdmEditorViewPart;
52
53
54 /**
55 * The Class create a speific Use View to keep the taxonomic view clean
56 * @author a.theys
57 * @created mar 13, 2012
58 * @version 1.0
59 */
60 public class UsesViewPart extends AbstractCdmEditorViewPart implements IPartContentHasDetails, IPartContentHasSupplementalData {
61
62 public static final String ID = "eu.etaxonomy.taxeditor.editor.view.uses";
63 private TreeViewer viewer;
64 private Map<TaxonDescription, FeatureNodeContainerTree> featureNodeContainerCache = new HashMap<TaxonDescription, FeatureNodeContainerTree>();
65 private ToggleDescriptionAction showAllElementsAction;
66 private ToggleDescriptionAction hideAllElementsAction;
67
68 private int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
69
70
71 /** {@inheritDoc} */
72 @Override
73 public void createViewer(Composite parent) {
74
75 viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL
76 | SWT.V_SCROLL | SWT.FULL_SELECTION));
77 viewer.setContentProvider(new UsesContentProvider(featureNodeContainerCache));
78 viewer.setLabelProvider(new UsesLabelProvider());
79 viewer.setAutoExpandLevel(2);
80
81
82
83 Transfer[] transfers = new Transfer[] { DescriptionElementTransfer.getInstance() };
84 /*viewer.addDragSupport(dndOperations, transfers, new DescriptionElementDragListener(
85 this));
86 viewer.addDropSupport(dndOperations, transfers,
87 new DescriptionElementDropAdapter(viewer));*/
88
89 // Propagate selection from viewer
90 getSite().setSelectionProvider(viewer);
91
92 showAllElementsAction = new ToggleDescriptionAction(false);
93 hideAllElementsAction = new ToggleDescriptionAction(true);
94
95 // Add context menu to tree
96 createMenu();
97
98 createToolbar();
99
100 }
101
102
103 /* (non-Javadoc)
104 * @see eu.etaxonomy.taxeditor.model.AbstractCdmViewPart#getInitialSelection()
105 */
106 /** {@inheritDoc} */
107 @Override
108 protected ISelection getInitialSelection() {
109 if(getEditor() != null){
110 return new StructuredSelection(getEditor().getEditorInput());
111 }
112
113 return super.getInitialSelection();
114 }
115
116 private void createToolbar() {
117 IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
118 toolBarManager.add(showAllElementsAction);
119 toolBarManager.add(hideAllElementsAction);
120 }
121
122
123 private void createMenu(){
124 MenuManager menuManager = new MenuManager();
125 menuManager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
126
127 getSite().registerContextMenu(menuManager, viewer);
128
129 // FIXME for some reason this is not working
130 menuManager.add(showAllElementsAction);
131 menuManager.add(hideAllElementsAction);
132
133 Control control = viewer.getControl();
134 Menu menu = menuManager.createContextMenu(control);
135
136 control.setMenu(menu);
137 }
138
139
140
141 @Override
142 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
143 if(EditorUtil.getActiveEditor() == null){
144 showEmptyPage();
145 return;
146 }
147
148 if(part instanceof BulkEditor){
149 showEmptyPage();
150 return;
151 }
152
153 if(part instanceof AbstractGraphKeyEditor){
154 showEmptyPage();
155 return;
156 }
157
158 if(part instanceof DefinedTermEditor){
159 showEmptyPage();
160 return;
161 }
162
163 if(part instanceof MultiPageTaxonEditor){
164 if(! part.equals(this.part)){
165 //TaxonEditorInput input = (TaxonEditorInput)((IEditorPart) part).getEditorInput();
166 IEditorInput input = ((IEditorPart) part).getEditorInput();
167 featureNodeContainerCache.clear();
168 //showViewer(part, new StructuredSelection(CdmStore.getService(IDescriptionService.class).listTaxonDescriptions(input.getTaxonNode().getTaxon(), null, null, null, null, null, null)));
169 showViewer(part, new StructuredSelection(input));
170 }
171 showViewer();
172 }
173
174 }
175
176
177 private class ToggleDescriptionAction extends Action{
178 private boolean expanded;
179
180 public ToggleDescriptionAction(boolean expand){
181 super(null, Action.AS_PUSH_BUTTON);
182 expanded = expand;
183 setImageAndTooltip();
184 }
185
186 private void setImageAndTooltip(){
187 setImageDescriptor(new ImageDescriptor() {
188 @Override
189 public ImageData getImageData() {
190 setText(expanded ? "Collapse All" : "Expand All");
191 String resource = expanded ? ImageResources.COLLAPSE_ALL : ImageResources.EXPAND_ALL;
192 return ImageResources.getImage(resource).getImageData();
193 }
194 });
195
196 String toolTipText = expanded ? "Collapse all" : "Show all descriptive data";
197 setToolTipText(toolTipText);
198 }
199
200 @Override
201 public void run() {
202 if(expanded){
203 viewer.collapseAll();
204 }else{
205 viewer.expandAll();
206 }
207 setImageAndTooltip();
208 }
209 }
210
211 /** {@inheritDoc} */
212 @Override
213 public boolean postOperation(CdmBase objectAffectedByOperation) {
214 viewer.refresh();
215 return super.postOperation(objectAffectedByOperation);
216 }
217
218 /** {@inheritDoc} */
219 @Override
220 public void changed(Object object) {
221 for(FeatureNodeContainerTree containerTree : featureNodeContainerCache.values()){
222 containerTree.buildTree();
223 }
224 viewer.refresh();
225
226 if(object instanceof DescriptionElementBase){
227 DescriptionElementBase descriptionElement = (DescriptionElementBase) object;
228 DescriptionBase description = descriptionElement.getInDescription();
229 FeatureNodeContainerTree containerTree = featureNodeContainerCache.get(description);
230
231 FeatureNodeContainer featureNodeContainer = containerTree.getFeatureNodeContainerForDescriptionElement(descriptionElement);
232 viewer.expandToLevel(featureNodeContainer, 1);
233
234 }
235
236 if(object != null){
237 StructuredSelection selection = new StructuredSelection(object);
238 viewer.setSelection(selection, true);
239 }
240
241 super.changed(object);
242 }
243
244
245 /** {@inheritDoc} */
246 @Override
247 public Viewer getViewer() {
248 return viewer;
249 }
250
251 /**
252 * <p>onComplete</p>
253 *
254 * @return a boolean.
255 */
256 @Override
257 public boolean onComplete() {
258 return false;
259 }
260
261 }