e7adbef7065a77732385d7ca7435ed291cdc38c6
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiontree / DescriptionMasterDetailsBlock.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.editor.descriptiontree;
5
6 import org.apache.log4j.Logger;
7 import org.eclipse.jface.action.Action;
8 import org.eclipse.jface.action.MenuManager;
9 import org.eclipse.jface.action.ToolBarManager;
10 import org.eclipse.jface.viewers.ISelection;
11 import org.eclipse.jface.viewers.ISelectionChangedListener;
12 import org.eclipse.jface.viewers.SelectionChangedEvent;
13 import org.eclipse.jface.viewers.TreePath;
14 import org.eclipse.jface.viewers.TreeSelection;
15 import org.eclipse.jface.viewers.TreeViewer;
16 import org.eclipse.jface.viewers.Viewer;
17 import org.eclipse.jface.viewers.ViewerComparator;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.layout.GridData;
20 import org.eclipse.swt.layout.GridLayout;
21 import org.eclipse.swt.widgets.Composite;
22 import org.eclipse.swt.widgets.Control;
23 import org.eclipse.swt.widgets.Menu;
24 import org.eclipse.swt.widgets.Tree;
25 import org.eclipse.ui.IEditorPart;
26 import org.eclipse.ui.PlatformUI;
27 import org.eclipse.ui.forms.DetailsPart;
28 import org.eclipse.ui.forms.IDetailsPage;
29 import org.eclipse.ui.forms.IDetailsPageProvider;
30 import org.eclipse.ui.forms.IManagedForm;
31 import org.eclipse.ui.forms.MasterDetailsBlock;
32 import org.eclipse.ui.forms.SectionPart;
33 import org.eclipse.ui.forms.editor.FormPage;
34 import org.eclipse.ui.forms.widgets.FormToolkit;
35 import org.eclipse.ui.forms.widgets.Section;
36
37 import eu.etaxonomy.cdm.model.description.CommonTaxonName;
38 import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
39 import eu.etaxonomy.cdm.model.description.Distribution;
40 import eu.etaxonomy.cdm.model.description.Feature;
41 import eu.etaxonomy.cdm.model.description.TaxonDescription;
42 import eu.etaxonomy.cdm.model.description.TaxonInteraction;
43 import eu.etaxonomy.cdm.model.description.TextData;
44 import eu.etaxonomy.cdm.model.media.ImageFile;
45 import eu.etaxonomy.cdm.model.taxon.Taxon;
46 import eu.etaxonomy.taxeditor.editor.TaxonEditorInput;
47 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.CommonNameDetailsPage;
48 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.DistributionDetailsPage;
49 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.DistributionMapDetailsPage;
50 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.ImageDetailsPage;
51 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.LabelDetailsPage;
52 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.TaxonInteractionDetailsPage;
53 import eu.etaxonomy.taxeditor.editor.descriptiontree.detailpage.TextDataDetailsPage;
54 import eu.etaxonomy.taxeditor.model.ImagesHelper;
55
56 /**
57 * @author p.ciardelli
58 *
59 */
60 public class DescriptionMasterDetailsBlock extends MasterDetailsBlock {
61 private static final Logger logger = Logger
62 .getLogger(DescriptionMasterDetailsBlock.class);
63
64 private FormPage page;
65
66 private TreeViewer descriptionViewer;
67
68 private IDescriptiveInformationProvider descriptiveInformationProvider = new DescriptiveInformationProvider();
69
70 public DescriptionMasterDetailsBlock(FormPage page) {
71 this.page = page;
72 }
73
74 /* (non-Javadoc)
75 * @see org.eclipse.ui.forms.MasterDetailsBlock#createMasterPart(org.eclipse.ui.forms.IManagedForm, org.eclipse.swt.widgets.Composite)
76 */
77 protected void createMasterPart(final IManagedForm managedForm,
78 Composite parent) {
79 FormToolkit toolkit = managedForm.getToolkit();
80 Section section = toolkit.createSection(parent, Section.TITLE_BAR);
81
82 section.setText("Description Tree");
83 section.marginWidth = 10;
84 section.marginHeight = 5;
85 Composite client = toolkit.createComposite(section, SWT.WRAP);
86 GridLayout layout = new GridLayout();
87 layout.marginWidth = 2;
88 layout.marginHeight = 2;
89 client.setLayout(layout);
90
91
92 section.setTextClient(createMasterSectionToolbar(section));
93
94 Tree tree = toolkit.createTree(client, SWT.NULL);
95 GridData gd = new GridData(GridData.FILL_BOTH);
96 gd.heightHint = 20;
97 gd.widthHint = 100;
98 tree.setLayoutData(gd);
99 toolkit.paintBordersFor(client);
100 section.setClient(client);
101 final SectionPart spart = new SectionPart(section);
102 managedForm.addPart(spart);
103
104 descriptionViewer = new TreeViewer(tree);
105 descriptionViewer.addSelectionChangedListener(new ISelectionChangedListener() {
106 private ISelection lastSelection;
107
108 public void selectionChanged(SelectionChangedEvent event) {
109 if (lastSelection != null) {
110 // Update label of last selection
111 Object item;
112 TreePath[] paths = ((TreeSelection) lastSelection).getPaths();
113 if (paths.length > 0) {
114 item = ((TreeSelection) lastSelection).getPaths()[0].getLastSegment();
115 descriptionViewer.update(item, null);
116 }
117 }
118 managedForm.fireSelectionChanged(spart, event.getSelection());
119 lastSelection = event.getSelection();
120 }
121 });
122
123 descriptionViewer.setAutoExpandLevel(2); // Show descriptions and features
124 descriptionViewer.setContentProvider(new DescriptionContentProvider(descriptiveInformationProvider));
125 descriptionViewer.setLabelProvider(new DescriptionLabelProvider());
126 descriptionViewer.setInput(page.getEditor().getEditorInput());
127 descriptionViewer.setComparator(new ViewerComparator() {
128 /* (non-Javadoc)
129 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
130 */
131 @Override
132 public int compare(Viewer viewer, Object e1, Object e2) {
133 if (e1 instanceof ImageFile && e2 instanceof ImageFile) {
134 return 0;
135 }
136 return super.compare(viewer, e1, e2);
137 }
138 });
139
140 // Set tree as page's selection provider
141 page.getSite().setSelectionProvider(descriptionViewer);
142
143 // Add context menu to tree
144 MenuManager menuMgr = new MenuManager();
145 page.getSite().registerContextMenu(page.getId(), menuMgr, descriptionViewer);
146 Menu menu = menuMgr.createContextMenu(descriptionViewer.getControl());
147 descriptionViewer.getControl().setMenu(menu);
148 }
149
150 /**
151 * @return
152 */
153 private Control createMasterSectionToolbar(Section section) {
154 ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
155 // IMenuService menuService = (IMenuService) EditorUtil.getService(IMenuService.class);
156 // menuService.populateContributionManager(toolBarManager, "toolbar:de.md.contributions.sectionToolbar");
157
158 Action displayAllDescriptions = new Action("displayAll", Action.AS_PUSH_BUTTON){
159 /* (non-Javadoc)
160 * @see org.eclipse.jface.action.Action#run()
161 */
162 @Override
163 public void run() {
164 descriptionViewer.expandAll();
165 }
166 };
167 displayAllDescriptions.setToolTipText("Show all descriptive data");
168 toolBarManager.add(displayAllDescriptions);
169
170 Action collapseAllDescriptions = new Action("collapseAll", Action.AS_PUSH_BUTTON){
171 /* (non-Javadoc)
172 * @see org.eclipse.jface.action.Action#run()
173 */
174 @Override
175 public void run() {
176 descriptionViewer.collapseAll();
177 }
178 };
179 collapseAllDescriptions.setToolTipText("Collapse all");
180 toolBarManager.add(collapseAllDescriptions);
181
182 return toolBarManager.createControl(section);
183 }
184
185
186 /* (non-Javadoc)
187 * @see org.eclipse.ui.forms.MasterDetailsBlock#registerPages(org.eclipse.ui.forms.DetailsPart)
188 */
189 protected void registerPages(DetailsPart detailsPart) {
190 detailsPart.registerPage(ImageFile.class, new ImageDetailsPage());
191 detailsPart.setPageProvider(new PageProvider());
192 }
193
194 /**
195 * @param objectAffectedByOperation
196 */
197 public synchronized void refreshTree(Object revealObject) {
198 descriptionViewer.refresh(true);
199
200 Object[] segments = null;
201 if (revealObject instanceof DescriptionElementBase) {
202 DescriptionElementBase element = (DescriptionElementBase) revealObject;
203 TaxonDescriptionFeature tdf = descriptiveInformationProvider.getDescriptionFeature(element);
204
205 segments = new Object[3];
206 segments[0] = element.getInDescription();
207 segments[1] = tdf;
208 segments[2] = element;
209 }
210 if (revealObject instanceof ImageFile) {
211 ImageFile image = (ImageFile) revealObject;
212 DescriptionElementBase element = ImagesHelper.findImageElement(image, getTaxon());
213
214 segments = new Object[3];
215 segments[0] = element.getInDescription();
216 segments[1] = element;
217 segments[2] = image;
218 }
219 if (revealObject instanceof TaxonDescription) {
220 TaxonDescription description = (TaxonDescription) revealObject;
221 segments = new Object[] {(TaxonDescription) revealObject};
222 }
223 if (segments != null) {
224 TreePath treePath = new TreePath(segments);
225 descriptionViewer.setSelection(new TreeSelection(treePath), true);
226 }
227 }
228
229 /**
230 * @return
231 */
232 private Taxon getTaxon() {
233 IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
234 if (editor != null && editor.getEditorInput() instanceof TaxonEditorInput) {
235 return ((TaxonEditorInput) editor.getEditorInput()).getTaxon();
236 }
237 return null;
238 }
239
240 /**
241 * @author p.ciardelli
242 */
243 class PageProvider implements IDetailsPageProvider {
244
245 private final static String IMAGE_GALLERY_ELEMENT = "isImageGalleryElement";
246 private final static String IMAGE_GALLERY_DESCRIPTION = "isImageGalleryDescription";
247
248 /* (non-Javadoc)
249 * @see org.eclipse.ui.forms.IDetailsPageProvider#getPage(java.lang.Object)
250 */
251 public IDetailsPage getPage(Object key) {
252
253 // Descriptions
254 if (IMAGE_GALLERY_DESCRIPTION.equals(key)) {
255 return new LabelDetailsPage("Image Gallery Details", "Edit image gallery's label:");
256 }
257 if (TaxonDescription.class.equals(key)) {
258 return new LabelDetailsPage("Description Details", "Edit description's label:");
259 }
260
261 // Features
262 if (Feature.DISTRIBUTION().equals(key)) {
263 return new DistributionMapDetailsPage();
264 }
265
266 // Description elements
267 if (IMAGE_GALLERY_ELEMENT.equals(key)) {
268 return new LabelDetailsPage("Image List Details", "Edit ordered image list's label:");
269 }
270 if (CommonTaxonName.class.equals(key)) {
271 return new CommonNameDetailsPage();
272 }
273 if (Distribution.class.equals(key)) {
274 return new DistributionDetailsPage();
275 }
276 if(TaxonInteraction.class.equals(key)){
277 return new TaxonInteractionDetailsPage();
278 }
279 if (TextData.class.equals(key)) {
280 return new TextDataDetailsPage();
281 }
282 return null;
283 }
284
285 /* (non-Javadoc)
286 * @see org.eclipse.ui.forms.IDetailsPageProvider#getPageKey(java.lang.Object)
287 */
288 public Object getPageKey(Object object) {
289
290 // Descriptions
291 if (object instanceof TaxonDescription) {
292 if (((TaxonDescription) object).isImageGallery()) {
293 return IMAGE_GALLERY_DESCRIPTION;
294 }
295 }
296
297 // Features
298 if (object instanceof TaxonDescriptionFeature) {
299 return ((TaxonDescriptionFeature) object).getFeature();
300 }
301
302 // Description elements
303 if (object instanceof DescriptionElementBase) {
304 TaxonDescription description = (TaxonDescription) ((DescriptionElementBase) object).getInDescription();
305 if (description != null && description.isImageGallery()) {
306 return IMAGE_GALLERY_ELEMENT;
307 }
308 }
309 return object.getClass();
310 }
311 }
312
313 /* (non-Javadoc)
314 * @see org.eclipse.ui.forms.MasterDetailsBlock#createToolBarActions(org.eclipse.ui.forms.IManagedForm)
315 */
316 @Override
317 protected void createToolBarActions(IManagedForm managedForm) {
318 // TODO Auto-generated method stub
319
320 }
321 }