Project

General

Profile

Download (10 KB) Statistics
| Branch: | Tag: | Revision:
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.Menu;
40
import org.eclipse.swt.widgets.Table;
41
import org.eclipse.swt.widgets.TableColumn;
42
import org.eclipse.ui.IMemento;
43
import org.eclipse.ui.IWorkbenchActionConstants;
44
import org.eclipse.ui.commands.ICommandService;
45
import org.eclipse.ui.handlers.IHandlerService;
46
import org.eclipse.ui.part.ViewPart;
47
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
48

    
49
import eu.etaxonomy.cdm.database.ICdmDataSource;
50
import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
51
import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
52
import eu.etaxonomy.taxeditor.model.IContextListener;
53
import eu.etaxonomy.taxeditor.store.CdmStore;
54
import eu.etaxonomy.taxeditor.store.StoreUtil;
55
import eu.etaxonomy.taxeditor.store.singlesource.widget.DisplayProxy;
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());
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, CdmDataSourceViewPart.this));
121
					monitor.worked(1);
122
				}
123
				
124
				DisplayProxy.getDefault().asyncExec(new Runnable() {
125
					
126
					@Override
127
					public void run() {
128
						viewer.setInput(containers);
129
					}
130
				});				
131
//				viewer.setInput(containers);
132
				
133
			}finally{
134
				monitor.done();
135
			}
136
			return Status.OK_STATUS;
137
		}
138
	}
139
	
140
	/** Constant <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code> */
141
	public static String ID = "eu.etaxonomy.taxeditor.view.datasource";
142
	
143
	private TableViewer viewer;
144

    
145
	private String partNameCache;
146

    
147
	private IWorkbenchSiteProgressService service;
148
	
149
	private IContextListener contextListener;
150

    
151
	private CdmDataSourceViewerComparator comparator;
152
	
153
	/**
154
	 * <p>Constructor for CdmDataSourceViewPart.</p>
155
	 */
156
	public CdmDataSourceViewPart(){
157
	}
158
	
159
	/** {@inheritDoc} */
160
	@Override
161
	public void createPartControl(Composite parent) {
162
		service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
163
		contextListener = new ContextListener();
164
		CdmStore.getContextManager().addContextListener(contextListener);
165
		
166
		// Create top composite
167
		FillLayout fillLayout = new FillLayout();
168
		fillLayout.marginWidth = 0;
169
		fillLayout.marginHeight = 0;
170
		fillLayout.type = SWT.VERTICAL;	
171
		parent.setLayout(fillLayout);
172
		
173
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
174
												| SWT.V_SCROLL | SWT.FULL_SELECTION);
175
		getSite().setSelectionProvider(viewer);
176
		
177
		createColumns(viewer);
178
		
179
		viewer.setContentProvider(new CdmDataSourceContentProvider());
180
		viewer.setLabelProvider(new CdmDataSourceLabelProvider());
181
		comparator = new CdmDataSourceViewerComparator();
182
		viewer.setComparator(comparator);
183
		
184
		
185
		// register context menu
186
		MenuManager menuMgr = new MenuManager();
187
		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
188
		getSite().registerContextMenu(menuMgr, viewer);
189

    
190
		Control control = viewer.getControl();
191
		Menu menu = menuMgr.createContextMenu(control);
192
		control.setMenu(menu);	
193
		
194
		// connect on doubleclick
195
		viewer.addDoubleClickListener(new IDoubleClickListener() {
196

    
197
			public void doubleClick(DoubleClickEvent event) {
198
				if (event.getSelection() instanceof StructuredSelection) {
199
					
200
					Object element = ((StructuredSelection) event
201
							.getSelection()).getFirstElement();
202
					if (element instanceof CdmMetaDataAwareDataSourceContainer) {
203
						String commandId = "eu.etaxonomy.taxeditor.store.datasource.change";
204
						
205
						ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
206
						
207
						Command command = commandService.getCommand(commandId); 
208
						if(command.isEnabled()) {
209
						
210
							IHandlerService handlerService = (IHandlerService) StoreUtil.getService(IHandlerService.class);
211
							
212
							try {
213
								handlerService.executeCommand(commandId, null);
214
							} catch (ExecutionException e) {
215
								StoreUtil.error(this.getClass(), e);
216
							} catch (NotDefinedException e) {
217
								StoreUtil.error(this.getClass(), e);
218
							} catch (NotEnabledException e) {
219
								StoreUtil.error(this.getClass(), e);
220
							} catch (NotHandledException e) {
221
								StoreUtil.error(this.getClass(), e);
222
							}
223
						}
224
					}
225
				}
226
			}
227
		});
228
		
229
		refresh();
230
	}
231

    
232
	
233
	// This will create the columns for the table
234
	private void createColumns(TableViewer viewer) {
235
		Table table = viewer.getTable();
236
		String[] titles = {"Connected", "Name", "Server", "Type", "Database", "Nomenclatural Code", "Up", "Created", "CDM Version", "Compatible", "Notes"};
237
		int[] bounds = { 24, 200, 100, 100 , 200, 120, 50, 100, 100, 50, 300};
238

    
239
		for (int i = 0; i < titles.length; i++) {
240
			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
241
			column.getColumn().setText(titles[i]);
242
			column.getColumn().setWidth(bounds[i]);
243
			column.getColumn().setResizable(true);
244
			column.getColumn().setMoveable(true);
245
			column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
246
			if(i == 1){
247
				table.setSortColumn(column.getColumn());
248
			}
249
		}
250
		table.setHeaderVisible(true);
251
		table.setLinesVisible(true);
252
		table.setSortDirection(SWT.UP);
253
		
254
	}
255
	
256
	/**
257
	 * <p>refresh</p>
258
	 */
259
	public void refresh(){		
260
		getService().schedule(new DataSourceJob("Loading datasources", CdmDataSourceRepository.getAll()), Job.SHORT);
261
	}
262

    
263
	/** {@inheritDoc} */
264
	@Override
265
	public void dispose() {
266
		CdmStore.getContextManager().removeContextListener(contextListener);
267
		super.dispose();
268
	}
269

    
270
	/** {@inheritDoc} */
271
	@Override
272
	public void setFocus() {
273
		viewer.getControl().setFocus();
274
	}
275

    
276
	
277
	/* (non-Javadoc)
278
	 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
279
	 */
280
	/** {@inheritDoc} */
281
	@Override
282
	public void showBusy(boolean busy) {
283
		super.showBusy(busy);
284
//		viewer.getTable().setEnabled(!busy);
285
		if(busy){
286
			partNameCache = getPartName();
287
			setPartName("Loading datasources");
288
		}else{
289
			if(partNameCache != null){
290
				setPartName(partNameCache);
291
			}
292
		}
293
	}
294

    
295
	/**
296
	 * <p>Getter for the field <code>viewer</code>.</p>
297
	 *
298
	 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
299
	 */
300
	public StructuredViewer getViewer() {
301
		return viewer;
302
	}
303

    
304
	/**
305
	 * <p>Getter for the field <code>service</code>.</p>
306
	 *
307
	 * @return the service
308
	 */
309
	public IWorkbenchSiteProgressService getService() {
310
		return service;
311
	}
312
	
313
	private SelectionAdapter getSelectionAdapter(final TableColumn column,
314
			final int index) {
315
		SelectionAdapter selectionAdapter = new SelectionAdapter() {
316
			@Override
317
			public void widgetSelected(SelectionEvent e) {
318
				comparator.setColumn(index);
319
				int dir = viewer.getTable().getSortDirection();
320
				if (viewer.getTable().getSortColumn() == column) {
321
					dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
322
				} else {
323
					dir = SWT.DOWN;
324
				}
325
				viewer.getTable().setSortDirection(dir);
326
				viewer.getTable().setSortColumn(column);
327
				viewer.refresh();
328
			}
329
		};
330
		return selectionAdapter;
331
	}
332

    
333
}
(3-3/5)