00f19ba0aff81ea00f64752c3580c9e1adf8b7ba
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / view / datasource / CdmDataSourceViewPart.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.view.datasource;
12
13 import java.util.ArrayList;
14 import java.util.List;
15
16 import org.eclipse.core.commands.Command;
17 import org.eclipse.core.commands.ExecutionException;
18 import org.eclipse.core.commands.NotEnabledException;
19 import org.eclipse.core.commands.NotHandledException;
20 import org.eclipse.core.commands.common.NotDefinedException;
21 import org.eclipse.core.runtime.IProgressMonitor;
22 import org.eclipse.core.runtime.IStatus;
23 import org.eclipse.core.runtime.Status;
24 import org.eclipse.core.runtime.jobs.Job;
25 import org.eclipse.jface.action.GroupMarker;
26 import org.eclipse.jface.action.MenuManager;
27 import org.eclipse.jface.viewers.DoubleClickEvent;
28 import org.eclipse.jface.viewers.IDoubleClickListener;
29 import org.eclipse.jface.viewers.StructuredSelection;
30 import org.eclipse.jface.viewers.StructuredViewer;
31 import org.eclipse.jface.viewers.TableViewer;
32 import org.eclipse.jface.viewers.TableViewerColumn;
33 import org.eclipse.swt.SWT;
34 import org.eclipse.swt.events.SelectionAdapter;
35 import org.eclipse.swt.events.SelectionEvent;
36 import org.eclipse.swt.layout.FillLayout;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.swt.widgets.Control;
39 import org.eclipse.swt.widgets.Display;
40 import org.eclipse.swt.widgets.Menu;
41 import org.eclipse.swt.widgets.Table;
42 import org.eclipse.swt.widgets.TableColumn;
43 import org.eclipse.ui.IMemento;
44 import org.eclipse.ui.IWorkbenchActionConstants;
45 import org.eclipse.ui.commands.ICommandService;
46 import org.eclipse.ui.handlers.IHandlerService;
47 import org.eclipse.ui.part.ViewPart;
48 import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
49
50 import eu.etaxonomy.cdm.database.ICdmDataSource;
51 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
52 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
53 import eu.etaxonomy.taxeditor.model.IContextListener;
54 import eu.etaxonomy.taxeditor.store.CdmStore;
55 import eu.etaxonomy.taxeditor.store.StoreUtil;
56
57 /**
58 * <p>CdmDataSourceViewPart class.</p>
59 *
60 * @author n.hoffmann
61 * @created 14.04.2009
62 * @version 1.0
63 */
64 public class CdmDataSourceViewPart extends ViewPart{
65
66 private class ContextListener extends ContextListenerAdapter{
67 /* (non-Javadoc)
68 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
69 */
70 @Override
71 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
72 monitor.subTask("Refreshing Datasource View");
73 viewer.refresh();
74 }
75
76 /* (non-Javadoc)
77 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
78 */
79 @Override
80 public void contextStop(IMemento memento, IProgressMonitor monitor) {
81 monitor.subTask("Refreshing Datasource View");
82 viewer.refresh();
83 }
84
85 /* (non-Javadoc)
86 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
87 */
88 @Override
89 public void contextStart(IMemento memento, IProgressMonitor monitor) {
90 monitor.subTask("Refreshing Datasource View");
91 viewer.refresh();
92 }
93 }
94
95 private class DataSourceJob extends Job{
96
97 private List<ICdmDataSource> dataSources;
98
99 /**
100 * @param name
101 */
102 public DataSourceJob(String title, List<ICdmDataSource> dataSources) {
103 super(title);
104 this.dataSources = dataSources;
105 }
106
107 /* (non-Javadoc)
108 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
109 */
110 @Override
111 public IStatus run(final IProgressMonitor monitor) {
112 try{
113 monitor.beginTask("Retrieving datasources", dataSources.size() + 1);
114
115 List<ICdmDataSource> dataSources = CdmDataSourceRepository.getAll();
116
117 final List<CdmMetaDataAwareDataSourceContainer> containers = new ArrayList<CdmMetaDataAwareDataSourceContainer>();
118
119 for(ICdmDataSource dataSource : dataSources){
120 containers.add(new CdmMetaDataAwareDataSourceContainer(dataSource));
121 }
122
123 Display.getDefault().asyncExec(new Runnable() {
124
125 @Override
126 public void run() {
127 viewer.setInput(containers);
128 }
129 });
130 monitor.worked(1);
131
132 for(final CdmMetaDataAwareDataSourceContainer container : containers){
133
134 container.getMetaDataFromDataSource();
135 Display.getDefault().asyncExec(new Runnable() {
136
137 @Override
138 public void run() {
139 viewer.update(container, null);
140 }
141 });
142 monitor.worked(1);
143 }
144
145 }finally{
146 monitor.done();
147 }
148 return Status.OK_STATUS;
149 }
150 }
151
152 /** Constant <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code> */
153 public static String ID = "eu.etaxonomy.taxeditor.view.datasource";
154
155 private TableViewer viewer;
156
157 private String partNameCache;
158
159 private IWorkbenchSiteProgressService service;
160
161 private IContextListener contextListener;
162
163 private CdmDataSourceViewerComparator comparator;
164
165 /**
166 * <p>Constructor for CdmDataSourceViewPart.</p>
167 */
168 public CdmDataSourceViewPart(){
169 }
170
171 /** {@inheritDoc} */
172 @Override
173 public void createPartControl(Composite parent) {
174 service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
175 contextListener = new ContextListener();
176 CdmStore.getContextManager().addContextListener(contextListener);
177
178 // Create top composite
179 FillLayout fillLayout = new FillLayout();
180 fillLayout.marginWidth = 0;
181 fillLayout.marginHeight = 0;
182 fillLayout.type = SWT.VERTICAL;
183 parent.setLayout(fillLayout);
184
185 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
186 | SWT.V_SCROLL | SWT.FULL_SELECTION);
187 getSite().setSelectionProvider(viewer);
188
189 createColumns(viewer);
190
191 viewer.setContentProvider(new CdmDataSourceContentProvider());
192 viewer.setLabelProvider(new CdmDataSourceLabelProvider());
193 comparator = new CdmDataSourceViewerComparator();
194 viewer.setComparator(comparator);
195
196
197 // register context menu
198 MenuManager menuMgr = new MenuManager();
199 menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
200 getSite().registerContextMenu(menuMgr, viewer);
201
202 Control control = viewer.getControl();
203 Menu menu = menuMgr.createContextMenu(control);
204 control.setMenu(menu);
205
206 // connect on doubleclick
207 viewer.addDoubleClickListener(new IDoubleClickListener() {
208
209 public void doubleClick(DoubleClickEvent event) {
210 if (event.getSelection() instanceof StructuredSelection) {
211
212 Object element = ((StructuredSelection) event
213 .getSelection()).getFirstElement();
214 if (element instanceof CdmMetaDataAwareDataSourceContainer) {
215 String commandId = "eu.etaxonomy.taxeditor.store.datasource.change";
216
217 ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
218
219 Command command = commandService.getCommand(commandId);
220 if(command.isEnabled()) {
221
222 IHandlerService handlerService = (IHandlerService) StoreUtil.getService(IHandlerService.class);
223
224 try {
225 handlerService.executeCommand(commandId, null);
226 } catch (ExecutionException e) {
227 StoreUtil.error(this.getClass(), e);
228 } catch (NotDefinedException e) {
229 StoreUtil.error(this.getClass(), e);
230 } catch (NotEnabledException e) {
231 StoreUtil.error(this.getClass(), e);
232 } catch (NotHandledException e) {
233 StoreUtil.error(this.getClass(), e);
234 }
235 }
236 }
237 }
238 }
239 });
240
241 refresh();
242 }
243
244
245 // This will create the columns for the table
246 private void createColumns(TableViewer viewer) {
247 Table table = viewer.getTable();
248 String[] titles = {"Connected", "Name", "Server", "Up", "Type", "Database", "Nomenclatural Code", "Created", "CDM Version", "Compatible", "Notes"};
249 int[] bounds = { 24, 200, 100, 50 , 80, 120, 50, 100, 100, 50, 300};
250
251 for (int i = 0; i < titles.length; i++) {
252 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
253 column.getColumn().setText(titles[i]);
254 column.getColumn().setWidth(bounds[i]);
255 column.getColumn().setResizable(true);
256 column.getColumn().setMoveable(true);
257 column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
258 if(i == 1){
259 table.setSortColumn(column.getColumn());
260 }
261 }
262 table.setHeaderVisible(true);
263 table.setLinesVisible(true);
264 table.setSortDirection(SWT.UP);
265
266 }
267
268 /**
269 * <p>refresh</p>
270 */
271 public void refresh(){
272 getService().schedule(new DataSourceJob("Loading datasources", CdmDataSourceRepository.getAll()), Job.LONG);
273 }
274
275 /** {@inheritDoc} */
276 @Override
277 public void dispose() {
278 CdmStore.getContextManager().removeContextListener(contextListener);
279 super.dispose();
280 }
281
282 /** {@inheritDoc} */
283 @Override
284 public void setFocus() {
285 viewer.getControl().setFocus();
286 }
287
288
289 /* (non-Javadoc)
290 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
291 */
292 /** {@inheritDoc} */
293 @Override
294 public void showBusy(boolean busy) {
295 super.showBusy(busy);
296 // viewer.getTable().setEnabled(!busy);
297 if(busy){
298 partNameCache = getPartName();
299 setPartName("Loading datasources");
300 }else{
301 if(partNameCache != null){
302 setPartName(partNameCache);
303 }
304 }
305 }
306
307 /**
308 * <p>Getter for the field <code>viewer</code>.</p>
309 *
310 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
311 */
312 public StructuredViewer getViewer() {
313 return viewer;
314 }
315
316 /**
317 * <p>Getter for the field <code>service</code>.</p>
318 *
319 * @return the service
320 */
321 public IWorkbenchSiteProgressService getService() {
322 return service;
323 }
324
325 private SelectionAdapter getSelectionAdapter(final TableColumn column,
326 final int index) {
327 SelectionAdapter selectionAdapter = new SelectionAdapter() {
328 @Override
329 public void widgetSelected(SelectionEvent e) {
330 comparator.setColumn(index);
331 int dir = viewer.getTable().getSortDirection();
332 if (viewer.getTable().getSortColumn() == column) {
333 dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
334 } else {
335 dir = SWT.DOWN;
336 }
337 viewer.getTable().setSortDirection(dir);
338 viewer.getTable().setSortColumn(column);
339 viewer.refresh();
340 }
341 };
342 return selectionAdapter;
343 }
344
345 }