- added context menu entry for editing classifications
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / CdmViewerChooser.java
1 // $Id$
2 /**
3 * Copyright (C) 2015 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 package eu.etaxonomy.taxeditor.view;
11
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Map.Entry;
15
16 import org.eclipse.core.commands.ExecutionEvent;
17 import org.eclipse.core.runtime.CoreException;
18 import org.eclipse.core.runtime.IConfigurationElement;
19 import org.eclipse.core.runtime.IExtensionRegistry;
20 import org.eclipse.core.runtime.IStatus;
21 import org.eclipse.core.runtime.Platform;
22 import org.eclipse.core.runtime.Status;
23 import org.eclipse.jface.dialogs.PopupDialog;
24 import org.eclipse.jface.viewers.ArrayContentProvider;
25 import org.eclipse.jface.viewers.ILabelProvider;
26 import org.eclipse.jface.viewers.ILabelProviderListener;
27 import org.eclipse.jface.viewers.ISelection;
28 import org.eclipse.jface.viewers.ISelectionChangedListener;
29 import org.eclipse.jface.viewers.IStructuredSelection;
30 import org.eclipse.jface.viewers.SelectionChangedEvent;
31 import org.eclipse.jface.viewers.TableViewer;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.graphics.Image;
34 import org.eclipse.swt.widgets.Composite;
35 import org.eclipse.swt.widgets.Control;
36 import org.eclipse.swt.widgets.Shell;
37 import org.eclipse.swt.widgets.Table;
38
39 import eu.etaxonomy.taxeditor.model.MessagingUtils;
40 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
41
42 /**
43 * This class provides the possibility to choose from a list of possible viewers
44 * which can be opened for a given input in a popup dialog.
45 *
46 * @author pplitzner
47 * @date Feb 23, 2015
48 *
49 */
50 public class CdmViewerChooser extends PopupDialog implements ISelectionChangedListener, ILabelProvider{
51
52 private Object input;
53 private Map<Entry<Class<?>, String>, ICdmViewer> nameViewerMap;
54 private ExecutionEvent executionEvent;
55
56 public CdmViewerChooser(Shell parentShell) {
57 this(parentShell, SWT.RESIZE | SWT.ON_TOP, true, false, false, false, false, "Open in ...",
58 "Clicking will open the selected viewer");
59 }
60
61 public CdmViewerChooser(Shell parent, int shellStyle, boolean takeFocusOnOpen, boolean persistSize,
62 boolean persistLocation, boolean showDialogMenu, boolean showPersistActions, String titleText,
63 String infoText) {
64 super(parent, shellStyle, takeFocusOnOpen, persistSize, persistLocation, showDialogMenu, showPersistActions,
65 titleText, infoText);
66 }
67
68 /**
69 * Opens a popup dialog with all possible viewers for the given input.
70 * @param input the input for which the viewers are listed
71 * @param event the {@link ExecutionEvent} if invoked via command/handler
72 */
73 public void chooseViewer(Object input, ExecutionEvent event){
74 this.input = input;
75 this.executionEvent = event;
76 this.nameViewerMap = new HashMap<Entry<Class<?>, String>, ICdmViewer>();
77
78 IExtensionRegistry reg = Platform.getExtensionRegistry();
79 IConfigurationElement[] extensions = reg
80 .getConfigurationElementsFor("eu.etaxonomy.taxeditor.store.cdmViewer");
81 for (IConfigurationElement configElement : extensions) {
82 try {
83 Object object = configElement.createExecutableExtension("class");
84 if(object instanceof ICdmViewer){
85 ICdmViewer cdmViewer = (ICdmViewer)object;
86 Map<Class<?>, String> viewerClasses = cdmViewer.getViewerClasses(input);
87 for (Entry<Class<?>, String> entry : viewerClasses.entrySet()) {
88 nameViewerMap.put(entry, cdmViewer);
89 }
90 }
91 else{
92 MessagingUtils.error(CdmViewerChooser.class, new Status(IStatus.ERROR, TaxeditorStorePlugin.PLUGIN_ID, "Could not load cdmViewer extension"));
93 }
94 } catch (CoreException e) {
95 MessagingUtils.error(CdmViewerChooser.class, "Could not load cdmViewer extension", e);
96 }
97 }
98 //if only one editor is available then open it
99 if(nameViewerMap.size()==1){
100 Entry<Class<?>, String> next = nameViewerMap.keySet().iterator().next();
101 ICdmViewer cdmViewer = nameViewerMap.get(next);
102 cdmViewer.show(input, next.getKey(), event);
103 }
104 else{
105 if(nameViewerMap.isEmpty()){
106 this.setInfoText("No viewers registered for this input");
107 }
108 this.open();
109 }
110 }
111
112 /* (non-Javadoc)
113 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
114 */
115 @Override
116 protected Control createDialogArea(Composite parent) {
117 TableViewer viewer = new TableViewer(new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
118 viewer.setContentProvider(new ArrayContentProvider());
119 viewer.setLabelProvider(this);
120 viewer.addSelectionChangedListener(this);
121 viewer.setInput(nameViewerMap.keySet());
122 return parent;
123 }
124
125 /* (non-Javadoc)
126 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
127 */
128 @Override
129 public void selectionChanged(SelectionChangedEvent event) {
130 ISelection selection = event.getSelection();
131 if(selection instanceof IStructuredSelection){
132 Object firstElement = ((IStructuredSelection) selection).getFirstElement();
133 if(nameViewerMap.containsKey(firstElement)){
134 Entry<Class<?>, String> entry = (Entry<Class<?>, String>)firstElement;
135 ICdmViewer cdmViewer = nameViewerMap.get(entry);
136 cdmViewer.show(input, entry.getKey(), this.executionEvent);
137 this.close();
138 }
139 }
140 }
141
142 /* (non-Javadoc)
143 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
144 */
145 @Override
146 public String getText(Object element) {
147 String text = null;
148 if(nameViewerMap.containsKey(element)){
149 Entry<Class<?>, String> entry = (Entry<Class<?>, String>) element;
150 text = entry.getValue();
151 }
152 return text;
153 }
154
155 /* (non-Javadoc)
156 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
157 */
158 @Override
159 public void addListener(ILabelProviderListener listener) {
160 // TODO Auto-generated method stub
161
162 }
163
164 /* (non-Javadoc)
165 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
166 */
167 @Override
168 public void dispose() {
169 // TODO Auto-generated method stub
170
171 }
172
173 /* (non-Javadoc)
174 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
175 */
176 @Override
177 public boolean isLabelProperty(Object element, String property) {
178 // TODO Auto-generated method stub
179 return false;
180 }
181
182 /* (non-Javadoc)
183 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
184 */
185 @Override
186 public void removeListener(ILabelProviderListener listener) {
187 // TODO Auto-generated method stub
188
189 }
190
191 /* (non-Javadoc)
192 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
193 */
194 @Override
195 public Image getImage(Object element) {
196 // TODO Auto-generated method stub
197 return null;
198 }
199
200 }