Merge branch 'develop' into remoting-4.0
[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.Messages;
53 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
54 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
55 import eu.etaxonomy.taxeditor.model.IContextListener;
56 import eu.etaxonomy.taxeditor.model.MessagingUtils;
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"); //$NON-NLS-1$
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"); //$NON-NLS-1$
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"); //$NON-NLS-1$
96 viewer.refresh();
97 }
98 }
99
100 private class DataSourceJob extends Job{
101
102 private final 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"); //$NON-NLS-1$
119 monitor.beginTask("Retrieving datasources", cdmSources.size() + 1); //$NON-NLS-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 if(logger.isDebugEnabled()) {
138 logger.debug(" #" + container.hashCode() + " : next DataSourceContainer"); //$NON-NLS-1$ //$NON-NLS-2$
139 }
140 container.getMetaDataFromDataSource();
141 if(logger.isDebugEnabled())
142 {
143 logger.debug(" #" + container.hashCode() + " : metadata retrieved, creating new runnable ..."); //$NON-NLS-1$ //$NON-NLS-2$
144 }
145 Display.getDefault().asyncExec(new Runnable() {
146
147 @Override
148 public void run() {
149 if(logger.isDebugEnabled())
150 {
151 logger.debug(" #" + container.hashCode() + " starting sub thread to update ..."); //$NON-NLS-1$ //$NON-NLS-2$
152 }
153 viewer.update(container, null);
154 if(logger.isDebugEnabled())
155 {
156 logger.debug(" #" + container.hashCode() + " end of sub thread to update ..."); //$NON-NLS-1$ //$NON-NLS-2$
157 }
158 }
159 });
160 if(logger.isDebugEnabled())
161 {
162 logger.debug(" #" + container.hashCode() + " done"); //$NON-NLS-1$ //$NON-NLS-2$
163 }
164 monitor.worked(1);
165 }
166
167 }finally{
168 monitor.done();
169 }
170 return Status.OK_STATUS;
171 }
172 }
173
174 /** Constant <code>ID="eu.etaxonomy.taxeditor.store.datasource"{trunked}</code> */
175 public static String ID = "eu.etaxonomy.taxeditor.view.datasource"; //$NON-NLS-1$
176
177 private TableViewer viewer;
178
179 private String partNameCache;
180
181 private IWorkbenchSiteProgressService service;
182
183 private IContextListener contextListener;
184
185 private CdmDataSourceViewerComparator comparator;
186
187 /**
188 * <p>Constructor for CdmDataSourceViewPart.</p>
189 */
190 public CdmDataSourceViewPart(){
191 }
192
193 /** {@inheritDoc} */
194 @Override
195 public void createPartControl(Composite parent) {
196 service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
197 contextListener = new ContextListener();
198 CdmStore.getContextManager().addContextListener(contextListener);
199
200 // Create top composite
201 FillLayout fillLayout = new FillLayout();
202 fillLayout.marginWidth = 0;
203 fillLayout.marginHeight = 0;
204 fillLayout.type = SWT.VERTICAL;
205 parent.setLayout(fillLayout);
206
207 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
208 | SWT.V_SCROLL | SWT.FULL_SELECTION);
209 getSite().setSelectionProvider(viewer);
210
211 createColumns(viewer);
212
213 viewer.setContentProvider(new CdmDataSourceContentProvider());
214 viewer.setLabelProvider(new CdmDataSourceLabelProvider());
215 comparator = new CdmDataSourceViewerComparator();
216 viewer.setComparator(comparator);
217
218
219 // register context menu
220 MenuManager menuMgr = new MenuManager();
221 menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
222 getSite().registerContextMenu(menuMgr, viewer);
223
224 Control control = viewer.getControl();
225 Menu menu = menuMgr.createContextMenu(control);
226 control.setMenu(menu);
227
228 // connect on doubleclick
229 viewer.addDoubleClickListener(new IDoubleClickListener() {
230
231 @Override
232 public void doubleClick(DoubleClickEvent event) {
233 if (event.getSelection() instanceof StructuredSelection) {
234
235 Object element = ((StructuredSelection) event
236 .getSelection()).getFirstElement();
237 if (element instanceof CdmMetaDataAwareDataSourceContainer) {
238 String commandId = "eu.etaxonomy.taxeditor.store.datasource.change"; //$NON-NLS-1$
239
240 ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
241
242 Command command = commandService.getCommand(commandId);
243 if(command.isEnabled()) {
244
245 IHandlerService handlerService = (IHandlerService) StoreUtil.getService(IHandlerService.class);
246
247 try {
248 handlerService.executeCommand(commandId, null);
249 } catch (ExecutionException e) {
250 MessagingUtils.error(this.getClass(), e);
251 } catch (NotDefinedException e) {
252 MessagingUtils.error(this.getClass(), e);
253 } catch (NotEnabledException e) {
254 MessagingUtils.error(this.getClass(), e);
255 } catch (NotHandledException e) {
256 MessagingUtils.error(this.getClass(), e);
257 }
258 }
259 }
260 }
261 }
262 });
263
264 refresh();
265 }
266
267
268 // This will create the columns for the table
269 private void createColumns(TableViewer viewer) {
270 Table table = viewer.getTable();
271 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};
272 int[] bounds = { 24, 200, 100, 50 , 80, 120, 50, 100, 100, 50, 300};
273
274 for (int i = 0; i < titles.length; i++) {
275 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
276 column.getColumn().setText(titles[i]);
277 column.getColumn().setWidth(bounds[i]);
278 column.getColumn().setResizable(true);
279 column.getColumn().setMoveable(true);
280 column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
281 if(i == 1){
282 table.setSortColumn(column.getColumn());
283 }
284 }
285 table.setHeaderVisible(true);
286 table.setLinesVisible(true);
287 table.setSortDirection(SWT.UP);
288
289 }
290
291 /**
292 * <p>refresh</p>
293 */
294 public void refresh(){
295 getService().schedule(new DataSourceJob(Messages.CdmDataSourceViewPart_1, CdmDataSourceRepository.getAll()), Job.LONG);
296 }
297
298 /** {@inheritDoc} */
299 @Override
300 public void dispose() {
301 CdmStore.getContextManager().removeContextListener(contextListener);
302 super.dispose();
303 }
304
305 /** {@inheritDoc} */
306 @Override
307 public void setFocus() {
308 viewer.getControl().setFocus();
309 }
310
311
312 /* (non-Javadoc)
313 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
314 */
315 /** {@inheritDoc} */
316 @Override
317 public void showBusy(boolean busy) {
318 super.showBusy(busy);
319 // viewer.getTable().setEnabled(!busy);
320 if(busy){
321 partNameCache = getPartName();
322 setPartName(Messages.CdmDataSourceViewPart_1);
323 }else{
324 if(partNameCache != null){
325 setPartName(partNameCache);
326 }
327 }
328 }
329
330 /**
331 * <p>Getter for the field <code>viewer</code>.</p>
332 *
333 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
334 */
335 public StructuredViewer getViewer() {
336 return viewer;
337 }
338
339 /**
340 * <p>Getter for the field <code>service</code>.</p>
341 *
342 * @return the service
343 */
344 public IWorkbenchSiteProgressService getService() {
345 return service;
346 }
347
348 private SelectionAdapter getSelectionAdapter(final TableColumn column,
349 final int index) {
350 SelectionAdapter selectionAdapter = new SelectionAdapter() {
351 @Override
352 public void widgetSelected(SelectionEvent e) {
353 comparator.setColumn(index);
354 int dir = viewer.getTable().getSortDirection();
355 if (viewer.getTable().getSortColumn() == column) {
356 dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
357 } else {
358 dir = SWT.DOWN;
359 }
360 viewer.getTable().setSortDirection(dir);
361 viewer.getTable().setSortColumn(column);
362 viewer.refresh();
363 }
364 };
365 return selectionAdapter;
366 }
367
368 }