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