3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.view
.datasource
;
13 import java
.util
.ArrayList
;
14 import java
.util
.List
;
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
;
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
;
61 * <p>CdmDataSourceViewPart class.</p>
67 public class CdmDataSourceViewPart
extends ViewPart
{
69 private static final Logger logger
= Logger
.getLogger(CdmDataSourceViewPart
.class);
71 private class ContextListener
extends ContextListenerAdapter
{
73 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
76 public void contextAboutToStop(IMemento memento
, IProgressMonitor monitor
) {
77 monitor
.subTask("Refreshing Datasource View");
82 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
85 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
86 monitor
.subTask("Refreshing Datasource View");
91 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
94 public void contextStart(IMemento memento
, IProgressMonitor monitor
) {
95 monitor
.subTask("Refreshing Datasource View");
100 private class DataSourceJob
extends Job
{
102 private List
<ICdmSource
> cdmSources
;
107 public DataSourceJob(String title
, List
<ICdmSource
> cdmSources
) {
109 this.cdmSources
= cdmSources
;
113 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
116 public IStatus
run(final IProgressMonitor monitor
) {
118 logger
.debug("Begin of eclipse core runtime Job to Retrieve datasources");
119 monitor
.beginTask("Retrieving datasources", cdmSources
.size() + 1);
121 final List
<CdmMetaDataAwareDataSourceContainer
> containers
= new ArrayList
<CdmMetaDataAwareDataSourceContainer
>();
123 for(ICdmSource cdmSource
: cdmSources
){
124 containers
.add(new CdmMetaDataAwareDataSourceContainer(cdmSource
));
127 Display
.getDefault().asyncExec(new Runnable() {
131 viewer
.setInput(containers
);
136 for(final CdmMetaDataAwareDataSourceContainer container
: containers
){
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() {
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 ...");
151 if(logger
.isDebugEnabled()) logger
.debug(" #" + container
.hashCode() + " done");
158 return Status
.OK_STATUS
;
162 /** Constant <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code> */
163 public static String ID
= "eu.etaxonomy.taxeditor.view.datasource";
165 private TableViewer viewer
;
167 private String partNameCache
;
169 private IWorkbenchSiteProgressService service
;
171 private IContextListener contextListener
;
173 private CdmDataSourceViewerComparator comparator
;
176 * <p>Constructor for CdmDataSourceViewPart.</p>
178 public CdmDataSourceViewPart(){
183 public void createPartControl(Composite parent
) {
184 service
= (IWorkbenchSiteProgressService
) getSite().getAdapter(IWorkbenchSiteProgressService
.class);
185 contextListener
= new ContextListener();
186 CdmStore
.getContextManager().addContextListener(contextListener
);
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
);
195 viewer
= new TableViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
196 | SWT
.V_SCROLL
| SWT
.FULL_SELECTION
);
197 getSite().setSelectionProvider(viewer
);
199 createColumns(viewer
);
201 viewer
.setContentProvider(new CdmDataSourceContentProvider());
202 viewer
.setLabelProvider(new CdmDataSourceLabelProvider());
203 comparator
= new CdmDataSourceViewerComparator();
204 viewer
.setComparator(comparator
);
207 // register context menu
208 MenuManager menuMgr
= new MenuManager();
209 menuMgr
.add(new GroupMarker(IWorkbenchActionConstants
.MB_ADDITIONS
));
210 getSite().registerContextMenu(menuMgr
, viewer
);
212 Control control
= viewer
.getControl();
213 Menu menu
= menuMgr
.createContextMenu(control
);
214 control
.setMenu(menu
);
216 // connect on doubleclick
217 viewer
.addDoubleClickListener(new IDoubleClickListener() {
219 public void doubleClick(DoubleClickEvent event
) {
220 if (event
.getSelection() instanceof StructuredSelection
) {
222 Object element
= ((StructuredSelection
) event
223 .getSelection()).getFirstElement();
224 if (element
instanceof CdmMetaDataAwareDataSourceContainer
) {
225 String commandId
= "eu.etaxonomy.taxeditor.store.datasource.change";
227 ICommandService commandService
= (ICommandService
)getSite().getService(ICommandService
.class);
229 Command command
= commandService
.getCommand(commandId
);
230 if(command
.isEnabled()) {
232 IHandlerService handlerService
= (IHandlerService
) StoreUtil
.getService(IHandlerService
.class);
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
);
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};
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
));
269 table
.setSortColumn(column
.getColumn());
272 table
.setHeaderVisible(true);
273 table
.setLinesVisible(true);
274 table
.setSortDirection(SWT
.UP
);
281 public void refresh(){
282 getService().schedule(new DataSourceJob("Loading datasources", CdmDataSourceRepository
.getAll()), Job
.LONG
);
287 public void dispose() {
288 CdmStore
.getContextManager().removeContextListener(contextListener
);
294 public void setFocus() {
295 viewer
.getControl().setFocus();
300 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
304 public void showBusy(boolean busy
) {
305 super.showBusy(busy
);
306 // viewer.getTable().setEnabled(!busy);
308 partNameCache
= getPartName();
309 setPartName("Loading datasources");
311 if(partNameCache
!= null){
312 setPartName(partNameCache
);
318 * <p>Getter for the field <code>viewer</code>.</p>
320 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
322 public StructuredViewer
getViewer() {
327 * <p>Getter for the field <code>service</code>.</p>
329 * @return the service
331 public IWorkbenchSiteProgressService
getService() {
335 private SelectionAdapter
getSelectionAdapter(final TableColumn column
,
337 SelectionAdapter selectionAdapter
= new SelectionAdapter() {
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
;
347 viewer
.getTable().setSortDirection(dir
);
348 viewer
.getTable().setSortColumn(column
);
352 return selectionAdapter
;