Project

General

Profile

Download (11.7 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.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.ContextListenerAdapter;
54
import eu.etaxonomy.taxeditor.model.IContextListener;
55
import eu.etaxonomy.taxeditor.model.MessagingUtils;
56
import eu.etaxonomy.taxeditor.store.CdmStore;
57
import eu.etaxonomy.taxeditor.store.StoreUtil;
58

    
59
/**
60
 * <p>CdmDataSourceViewPart class.</p>
61
 *
62
 * @author n.hoffmann
63
 * @created 14.04.2009
64
 * @version 1.0
65
 */
66
public class CdmDataSourceViewPart extends ViewPart{
67

    
68
    private static final Logger logger = Logger.getLogger(CdmDataSourceViewPart.class);
69

    
70
	private class ContextListener extends ContextListenerAdapter{
71
		/* (non-Javadoc)
72
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
73
		 */
74
		@Override
75
		public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
76
			monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
77
			viewer.refresh();
78
		}
79

    
80
		/* (non-Javadoc)
81
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
82
		 */
83
		@Override
84
		public void contextStop(IMemento memento, IProgressMonitor monitor) {
85
			monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
86
			viewer.refresh();
87
		}
88

    
89
		/* (non-Javadoc)
90
		 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
91
		 */
92
		@Override
93
		public void contextStart(IMemento memento, IProgressMonitor monitor) {
94
			monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
95
			viewer.refresh();
96
		}
97
	}
98

    
99
	private class DataSourceJob extends Job{
100

    
101
		private final List<ICdmSource> cdmSources;
102

    
103
		/**
104
		 * @param name
105
		 */
106
		public DataSourceJob(String title, List<ICdmSource> cdmSources) {
107
			super(title);
108
			this.cdmSources = cdmSources;
109
		}
110

    
111
		/* (non-Javadoc)
112
		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
113
		 */
114
		@Override
115
		public IStatus run(final IProgressMonitor monitor) {
116
			try{
117
				logger.debug("Begin of eclipse core runtime Job to Retrieve datasources"); //$NON-NLS-1$
118
				monitor.beginTask("Retrieving datasources", cdmSources.size() + 1);			 //$NON-NLS-1$
119

    
120
				final List<CdmMetaDataAwareDataSourceContainer> containers = new ArrayList<CdmMetaDataAwareDataSourceContainer>();
121

    
122
				for(ICdmSource cdmSource : cdmSources){
123
					containers.add(new CdmMetaDataAwareDataSourceContainer(cdmSource));
124
				}
125

    
126
				Display.getDefault().asyncExec(new Runnable() {
127

    
128
					@Override
129
					public void run() {
130
						viewer.setInput(containers);
131
					}
132
				});
133
				monitor.worked(1);
134

    
135
				for(final CdmMetaDataAwareDataSourceContainer container : containers){
136
					if(logger.isDebugEnabled()) {
137
                        logger.debug("  #" + container.hashCode() + " : next DataSourceContainer");						 //$NON-NLS-1$ //$NON-NLS-2$
138
                    }
139
					container.getMetaDataFromDataSource();
140
					if(logger.isDebugEnabled())
141
                     {
142
                        logger.debug("  #" + container.hashCode() + " : metadata retrieved, creating new runnable ...");	 //$NON-NLS-1$ //$NON-NLS-2$
143
                    }
144
					Display.getDefault().asyncExec(new Runnable() {
145

    
146
						@Override
147
						public void run() {
148
							if(logger.isDebugEnabled())
149
                             {
150
                                logger.debug("  #" + container.hashCode() + " starting sub thread to update ...");	 //$NON-NLS-1$ //$NON-NLS-2$
151
                            }
152
							viewer.update(container, null);
153
							if(logger.isDebugEnabled())
154
                             {
155
                                logger.debug("  #" + container.hashCode() + " end of sub thread to update ...");	 //$NON-NLS-1$ //$NON-NLS-2$
156
                            }
157
						}
158
					});
159
					if(logger.isDebugEnabled())
160
                     {
161
                        logger.debug("  #" + container.hashCode() + " done");	 //$NON-NLS-1$ //$NON-NLS-2$
162
                    }
163
					monitor.worked(1);
164
				}
165

    
166
			}finally{
167
				monitor.done();
168
			}
169
			return Status.OK_STATUS;
170
		}
171
	}
172

    
173
	/** Constant <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code> */
174
	public static String ID = "eu.etaxonomy.taxeditor.view.datasource"; //$NON-NLS-1$
175

    
176
	private TableViewer viewer;
177

    
178
	private String partNameCache;
179

    
180
	private IWorkbenchSiteProgressService service;
181

    
182
	private IContextListener contextListener;
183

    
184
	private CdmDataSourceViewerComparator comparator;
185

    
186
	/**
187
	 * <p>Constructor for CdmDataSourceViewPart.</p>
188
	 */
189
	public CdmDataSourceViewPart(){
190
	}
191

    
192
	/** {@inheritDoc} */
193
	@Override
194
	public void createPartControl(Composite parent) {
195
		service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
196
		contextListener = new ContextListener();
197
		CdmStore.getContextManager().addContextListener(contextListener);
198

    
199
		// Create top composite
200
		FillLayout fillLayout = new FillLayout();
201
		fillLayout.marginWidth = 0;
202
		fillLayout.marginHeight = 0;
203
		fillLayout.type = SWT.VERTICAL;
204
		parent.setLayout(fillLayout);
205

    
206
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
207
												| SWT.V_SCROLL | SWT.FULL_SELECTION);
208
		getSite().setSelectionProvider(viewer);
209

    
210
		createColumns(viewer);
211

    
212
		viewer.setContentProvider(new CdmDataSourceContentProvider());
213
		viewer.setLabelProvider(new CdmDataSourceLabelProvider());
214
		comparator = new CdmDataSourceViewerComparator();
215
		viewer.setComparator(comparator);
216

    
217

    
218
		// register context menu
219
		MenuManager menuMgr = new MenuManager();
220
		menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
221
		getSite().registerContextMenu(menuMgr, viewer);
222

    
223
		Control control = viewer.getControl();
224
		Menu menu = menuMgr.createContextMenu(control);
225
		control.setMenu(menu);
226

    
227
		// connect on doubleclick
228
		viewer.addDoubleClickListener(new IDoubleClickListener() {
229

    
230
			@Override
231
            public void doubleClick(DoubleClickEvent event) {
232
				if (event.getSelection() instanceof StructuredSelection) {
233

    
234
					Object element = ((StructuredSelection) event
235
							.getSelection()).getFirstElement();
236
					if (element instanceof CdmMetaDataAwareDataSourceContainer) {
237
						String commandId = "eu.etaxonomy.taxeditor.store.datasource.change"; //$NON-NLS-1$
238

    
239
						ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
240

    
241
						Command command = commandService.getCommand(commandId);
242
						if(command.isEnabled()) {
243

    
244
							IHandlerService handlerService = (IHandlerService) StoreUtil.getService(IHandlerService.class);
245

    
246
							try {
247
								handlerService.executeCommand(commandId, null);
248
							} catch (ExecutionException e) {
249
								MessagingUtils.error(this.getClass(), e);
250
							} catch (NotDefinedException e) {
251
								MessagingUtils.error(this.getClass(), e);
252
							} catch (NotEnabledException e) {
253
								MessagingUtils.error(this.getClass(), e);
254
							} catch (NotHandledException e) {
255
								MessagingUtils.error(this.getClass(), e);
256
							}
257
						}
258
					}
259
				}
260
			}
261
		});
262

    
263
		refresh();
264
	}
265

    
266

    
267
	// This will create the columns for the table
268
	private void createColumns(TableViewer viewer) {
269
		Table table = viewer.getTable();
270
		String[] titles = {Messages.CdmDataSourceViewPart_12, Messages.CdmDataSourceViewPart_11, Messages.CdmDataSourceViewPart_10, Messages.CdmDataSourceViewPart_9, Messages.CdmDataSourceViewPart_8, Messages.CdmDataSourceViewPart_7, Messages.CdmDataSourceViewPart_6, Messages.CdmDataSourceViewPart_5, Messages.CdmDataSourceViewPart_4, Messages.CdmDataSourceViewPart_3, Messages.CdmDataSourceViewPart_2};
271
		int[] bounds = { 24, 200, 100, 50 , 80, 120, 50, 100, 100, 50, 300};
272

    
273
		for (int i = 0; i < titles.length; i++) {
274
			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
275
			column.getColumn().setText(titles[i]);
276
			column.getColumn().setWidth(bounds[i]);
277
			column.getColumn().setResizable(true);
278
			column.getColumn().setMoveable(true);
279
			column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
280
			if(i == 1){
281
				table.setSortColumn(column.getColumn());
282
			}
283
		}
284
		table.setHeaderVisible(true);
285
		table.setLinesVisible(true);
286
		table.setSortDirection(SWT.UP);
287

    
288
	}
289

    
290
	/**
291
	 * <p>refresh</p>
292
	 */
293
	public void refresh(){
294
		getService().schedule(new DataSourceJob(Messages.CdmDataSourceViewPart_1, CdmDataSourceRepository.getAll()), Job.LONG);
295
	}
296

    
297
	/** {@inheritDoc} */
298
	@Override
299
	public void dispose() {
300
		CdmStore.getContextManager().removeContextListener(contextListener);
301
		super.dispose();
302
	}
303

    
304
	/** {@inheritDoc} */
305
	@Override
306
	public void setFocus() {
307
		viewer.getControl().setFocus();
308
	}
309

    
310

    
311
	/* (non-Javadoc)
312
	 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
313
	 */
314
	/** {@inheritDoc} */
315
	@Override
316
	public void showBusy(boolean busy) {
317
		super.showBusy(busy);
318
//		viewer.getTable().setEnabled(!busy);
319
		if(busy){
320
			partNameCache = getPartName();
321
			setPartName(Messages.CdmDataSourceViewPart_1);
322
		}else{
323
			if(partNameCache != null){
324
				setPartName(partNameCache);
325
			}
326
		}
327
	}
328

    
329
	/**
330
	 * <p>Getter for the field <code>viewer</code>.</p>
331
	 *
332
	 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
333
	 */
334
	public StructuredViewer getViewer() {
335
		return viewer;
336
	}
337

    
338
	/**
339
	 * <p>Getter for the field <code>service</code>.</p>
340
	 *
341
	 * @return the service
342
	 */
343
	public IWorkbenchSiteProgressService getService() {
344
		return service;
345
	}
346

    
347
	private SelectionAdapter getSelectionAdapter(final TableColumn column,
348
			final int index) {
349
		SelectionAdapter selectionAdapter = new SelectionAdapter() {
350
			@Override
351
			public void widgetSelected(SelectionEvent e) {
352
				comparator.setColumn(index);
353
				int dir = viewer.getTable().getSortDirection();
354
				if (viewer.getTable().getSortColumn() == column) {
355
					dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
356
				} else {
357
					dir = SWT.DOWN;
358
				}
359
				viewer.getTable().setSortDirection(dir);
360
				viewer.getTable().setSortColumn(column);
361
				viewer.refresh();
362
			}
363
		};
364
		return selectionAdapter;
365
	}
366

    
367
}
(3-3/6)