3207029946f188c2725c276dfef390b30104870c
[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.runtime.IProgressMonitor;
18 import org.eclipse.core.runtime.IStatus;
19 import org.eclipse.core.runtime.Status;
20 import org.eclipse.core.runtime.jobs.Job;
21 import org.eclipse.jface.action.GroupMarker;
22 import org.eclipse.jface.action.MenuManager;
23 import org.eclipse.jface.viewers.StructuredViewer;
24 import org.eclipse.jface.viewers.TableViewer;
25 import org.eclipse.jface.viewers.TableViewerColumn;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.events.SelectionAdapter;
28 import org.eclipse.swt.events.SelectionEvent;
29 import org.eclipse.swt.layout.FillLayout;
30 import org.eclipse.swt.widgets.Composite;
31 import org.eclipse.swt.widgets.Control;
32 import org.eclipse.swt.widgets.Display;
33 import org.eclipse.swt.widgets.Menu;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableColumn;
36 import org.eclipse.ui.IMemento;
37 import org.eclipse.ui.IWorkbenchActionConstants;
38 import org.eclipse.ui.part.ViewPart;
39 import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
40
41 import eu.etaxonomy.cdm.config.ICdmSource;
42 import eu.etaxonomy.taxeditor.Messages;
43 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
44 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
45 import eu.etaxonomy.taxeditor.model.IContextListener;
46 import eu.etaxonomy.taxeditor.store.CdmStore;
47
48 /**
49 * <p>CdmDataSourceViewPart class.</p>
50 *
51 * @author n.hoffmann
52 * @created 14.04.2009
53 * @version 1.0
54 */
55 public class CdmDataSourceViewPart extends ViewPart{
56
57 private static final Logger logger = Logger.getLogger(CdmDataSourceViewPart.class);
58
59 private class ContextListener extends ContextListenerAdapter{
60 /* (non-Javadoc)
61 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
62 */
63 @Override
64 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
65 monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
66 viewer.refresh();
67 }
68
69 /* (non-Javadoc)
70 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
71 */
72 @Override
73 public void contextStop(IMemento memento, IProgressMonitor monitor) {
74 monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
75 viewer.refresh();
76 }
77
78 /* (non-Javadoc)
79 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
80 */
81 @Override
82 public void contextStart(IMemento memento, IProgressMonitor monitor) {
83 monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
84 viewer.refresh();
85 }
86 }
87
88 private class DataSourceJob extends Job{
89
90 private final List<ICdmSource> cdmSources;
91
92 /**
93 * @param name
94 */
95 public DataSourceJob(String title, List<ICdmSource> cdmSources) {
96 super(title);
97 this.cdmSources = cdmSources;
98 }
99
100 /* (non-Javadoc)
101 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
102 */
103 @Override
104 public IStatus run(final IProgressMonitor monitor) {
105 try{
106 logger.debug("Begin of eclipse core runtime Job to Retrieve datasources"); //$NON-NLS-1$
107 monitor.beginTask("Retrieving datasources", cdmSources.size() + 1); //$NON-NLS-1$
108
109 final List<CdmMetaDataAwareDataSourceContainer> containers = new ArrayList<CdmMetaDataAwareDataSourceContainer>();
110
111 for(ICdmSource cdmSource : cdmSources){
112 containers.add(new CdmMetaDataAwareDataSourceContainer(cdmSource));
113 }
114
115 Display.getDefault().asyncExec(new Runnable() {
116
117 @Override
118 public void run() {
119 viewer.setInput(containers);
120 }
121 });
122 monitor.worked(1);
123
124 for(final CdmMetaDataAwareDataSourceContainer container : containers){
125 if(logger.isDebugEnabled()) {
126 logger.debug(" #" + container.hashCode() + " : next DataSourceContainer"); //$NON-NLS-1$ //$NON-NLS-2$
127 }
128 container.getMetaDataFromDataSource();
129 if(logger.isDebugEnabled())
130 {
131 logger.debug(" #" + container.hashCode() + " : metadata retrieved, creating new runnable ..."); //$NON-NLS-1$ //$NON-NLS-2$
132 }
133 Display.getDefault().asyncExec(new Runnable() {
134
135 @Override
136 public void run() {
137 if(logger.isDebugEnabled())
138 {
139 logger.debug(" #" + container.hashCode() + " starting sub thread to update ..."); //$NON-NLS-1$ //$NON-NLS-2$
140 }
141 viewer.update(container, null);
142 if(logger.isDebugEnabled())
143 {
144 logger.debug(" #" + container.hashCode() + " end of sub thread to update ..."); //$NON-NLS-1$ //$NON-NLS-2$
145 }
146 }
147 });
148 if(logger.isDebugEnabled())
149 {
150 logger.debug(" #" + container.hashCode() + " done"); //$NON-NLS-1$ //$NON-NLS-2$
151 }
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"; //$NON-NLS-1$
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 refresh();
217 }
218
219
220 // This will create the columns for the table
221 private void createColumns(TableViewer viewer) {
222 Table table = viewer.getTable();
223 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};
224 int[] bounds = { 24, 200, 100, 50 , 80, 120, 50, 100, 100, 50, 300};
225
226 for (int i = 0; i < titles.length; i++) {
227 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
228 column.getColumn().setText(titles[i]);
229 column.getColumn().setWidth(bounds[i]);
230 column.getColumn().setResizable(true);
231 column.getColumn().setMoveable(true);
232 column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
233 if(i == 1){
234 table.setSortColumn(column.getColumn());
235 }
236 }
237 table.setHeaderVisible(true);
238 table.setLinesVisible(true);
239 table.setSortDirection(SWT.UP);
240
241 }
242
243 /**
244 * <p>refresh</p>
245 */
246 public void refresh(){
247 getService().schedule(new DataSourceJob(Messages.CdmDataSourceViewPart_1, CdmDataSourceRepository.getAll()), Job.LONG);
248 }
249
250 /** {@inheritDoc} */
251 @Override
252 public void dispose() {
253 CdmStore.getContextManager().removeContextListener(contextListener);
254 super.dispose();
255 }
256
257 /** {@inheritDoc} */
258 @Override
259 public void setFocus() {
260 viewer.getControl().setFocus();
261 }
262
263
264 /* (non-Javadoc)
265 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
266 */
267 /** {@inheritDoc} */
268 @Override
269 public void showBusy(boolean busy) {
270 super.showBusy(busy);
271 // viewer.getTable().setEnabled(!busy);
272 if(busy){
273 partNameCache = getPartName();
274 setPartName(Messages.CdmDataSourceViewPart_1);
275 }else{
276 if(partNameCache != null){
277 setPartName(partNameCache);
278 }
279 }
280 }
281
282 /**
283 * <p>Getter for the field <code>viewer</code>.</p>
284 *
285 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
286 */
287 public StructuredViewer getViewer() {
288 return viewer;
289 }
290
291 /**
292 * <p>Getter for the field <code>service</code>.</p>
293 *
294 * @return the service
295 */
296 public IWorkbenchSiteProgressService getService() {
297 return service;
298 }
299
300 private SelectionAdapter getSelectionAdapter(final TableColumn column,
301 final int index) {
302 SelectionAdapter selectionAdapter = new SelectionAdapter() {
303 @Override
304 public void widgetSelected(SelectionEvent e) {
305 comparator.setColumn(index);
306 int dir = viewer.getTable().getSortDirection();
307 if (viewer.getTable().getSortColumn() == column) {
308 dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
309 } else {
310 dir = SWT.DOWN;
311 }
312 viewer.getTable().setSortDirection(dir);
313 viewer.getTable().setSortColumn(column);
314 viewer.refresh();
315 }
316 };
317 return selectionAdapter;
318 }
319
320 }