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