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