34afe6bb9e57404ac6dd27f3337460ebbef0e809
[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 info.bioinfweb.commons.bio.biojava3.alignment.SimpleAlignment;
14 import info.bioinfweb.commons.bio.biojava3.alignment.template.Alignment;
15 import info.bioinfweb.commons.bio.biojava3.core.sequence.compound.AlignmentAmbiguityNucleotideCompoundSet;
16 import info.bioinfweb.libralign.AlignmentArea;
17 import info.bioinfweb.libralign.dataarea.implementations.ConsensusSequenceArea;
18 import info.bioinfweb.libralign.pherogram.BioJavaPherogramProvider;
19 import info.bioinfweb.libralign.pherogram.PherogramFormats.QualityOutputType;
20 import info.bioinfweb.libralign.pherogram.PherogramHeadingView;
21 import info.bioinfweb.libralign.pherogram.PherogramTraceCurveView;
22 import info.bioinfweb.libralign.sequenceprovider.implementations.BioJavaSequenceDataProvider;
23 import info.bioinfweb.libralign.sequenceprovider.tokenset.BioJavaTokenSet;
24
25 import java.io.File;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import org.apache.log4j.Logger;
31 import org.biojava.bio.chromatogram.ChromatogramFactory;
32 import org.biojava.bio.chromatogram.UnsupportedChromatogramFormatException;
33 import org.biojava3.core.sequence.DNASequence;
34 import org.biojava3.core.sequence.compound.NucleotideCompound;
35 import org.eclipse.core.runtime.IProgressMonitor;
36 import org.eclipse.core.runtime.IStatus;
37 import org.eclipse.core.runtime.Status;
38 import org.eclipse.core.runtime.jobs.Job;
39 import org.eclipse.jface.viewers.StructuredViewer;
40 import org.eclipse.jface.viewers.TableViewer;
41 import org.eclipse.jface.viewers.TableViewerColumn;
42 import org.eclipse.swt.SWT;
43 import org.eclipse.swt.custom.ScrolledComposite;
44 import org.eclipse.swt.events.SelectionAdapter;
45 import org.eclipse.swt.events.SelectionEvent;
46 import org.eclipse.swt.layout.FillLayout;
47 import org.eclipse.swt.widgets.Composite;
48 import org.eclipse.swt.widgets.Display;
49 import org.eclipse.swt.widgets.Table;
50 import org.eclipse.swt.widgets.TableColumn;
51 import org.eclipse.ui.IMemento;
52 import org.eclipse.ui.part.ViewPart;
53 import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
54
55 import eu.etaxonomy.cdm.config.ICdmSource;
56 import eu.etaxonomy.taxeditor.datasource.CdmDataSourceRepository;
57 import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
58 import eu.etaxonomy.taxeditor.model.IContextListener;
59 import eu.etaxonomy.taxeditor.store.CdmStore;
60
61 /**
62 * <p>CdmDataSourceViewPart class.</p>
63 *
64 * @author n.hoffmann
65 * @created 14.04.2009
66 * @version 1.0
67 */
68 public class CdmDataSourceViewPart extends ViewPart{
69
70 private static final Logger logger = Logger.getLogger(CdmDataSourceViewPart.class);
71
72 private class ContextListener extends ContextListenerAdapter{
73 /* (non-Javadoc)
74 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
75 */
76 @Override
77 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
78 monitor.subTask("Refreshing Datasource View");
79 viewer.refresh();
80 }
81
82 /* (non-Javadoc)
83 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
84 */
85 @Override
86 public void contextStop(IMemento memento, IProgressMonitor monitor) {
87 monitor.subTask("Refreshing Datasource View");
88 viewer.refresh();
89 }
90
91 /* (non-Javadoc)
92 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
93 */
94 @Override
95 public void contextStart(IMemento memento, IProgressMonitor monitor) {
96 monitor.subTask("Refreshing Datasource View");
97 viewer.refresh();
98 }
99 }
100
101 private class DataSourceJob extends Job{
102
103 private final List<ICdmSource> cdmSources;
104
105 /**
106 * @param name
107 */
108 public DataSourceJob(String title, List<ICdmSource> cdmSources) {
109 super(title);
110 this.cdmSources = cdmSources;
111 }
112
113 /* (non-Javadoc)
114 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
115 */
116 @Override
117 public IStatus run(final IProgressMonitor monitor) {
118 try{
119 logger.debug("Begin of eclipse core runtime Job to Retrieve datasources");
120 monitor.beginTask("Retrieving datasources", cdmSources.size() + 1);
121
122 final List<CdmMetaDataAwareDataSourceContainer> containers = new ArrayList<CdmMetaDataAwareDataSourceContainer>();
123
124 for(ICdmSource cdmSource : cdmSources){
125 containers.add(new CdmMetaDataAwareDataSourceContainer(cdmSource));
126 }
127
128 Display.getDefault().asyncExec(new Runnable() {
129
130 @Override
131 public void run() {
132 viewer.setInput(containers);
133 }
134 });
135 monitor.worked(1);
136
137 for(final CdmMetaDataAwareDataSourceContainer container : containers){
138
139
140 if(logger.isDebugEnabled()) {
141 logger.debug(" #" + container.hashCode() + " : next DataSourceContainer");
142 }
143 container.getMetaDataFromDataSource();
144 if(logger.isDebugEnabled()) {
145 logger.debug(" #" + container.hashCode() + " : metadata retrieved, creating new runnable ...");
146 }
147 Display.getDefault().asyncExec(new Runnable() {
148
149 @Override
150 public void run() {
151 if(logger.isDebugEnabled()) {
152 logger.debug(" #" + container.hashCode() + " starting sub thread to update ...");
153 }
154 viewer.update(container, null);
155 if(logger.isDebugEnabled()) {
156 logger.debug(" #" + container.hashCode() + " end of sub thread to update ...");
157 }
158 }
159 });
160 if(logger.isDebugEnabled()) {
161 logger.debug(" #" + container.hashCode() + " done");
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";
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 private void librAlignInit(Composite parent){
193 ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
194 scrolledComposite.setExpandHorizontal(true);
195 scrolledComposite.setExpandVertical(true);
196
197 Alignment<DNASequence, NucleotideCompound> alignment =
198 new SimpleAlignment<DNASequence, NucleotideCompound>();
199 alignment.add("Sequence 1", new DNASequence("ATCGTAGATCGTAGATCGTAGATCGTAGATCGTAGATCGTAGATCGTAG"));
200 alignment.add("Sequence 2", new DNASequence("AT-GTTG"));
201 alignment.add("Sequence 3", new DNASequence("AT-GTAG"));
202
203 BioJavaSequenceDataProvider<DNASequence, NucleotideCompound> sequenceProvider =
204 new BioJavaSequenceDataProvider<DNASequence, NucleotideCompound>(
205 new BioJavaTokenSet<NucleotideCompound>(
206 AlignmentAmbiguityNucleotideCompoundSet.getAlignmentAmbiguityNucleotideCompoundSet()),
207 alignment);
208
209 AlignmentArea result = new AlignmentArea();
210 result.setSequenceProvider(sequenceProvider, false);
211 result.getDataAreas().getBottomAreas().add(new ConsensusSequenceArea(result));
212
213 // Composite alignmentWidget = result.createSWTWidget(scrolledComposite, SWT.NONE);
214 // scrolledComposite.setContent(alignmentWidget);
215 // scrolledComposite.setMinSize(alignmentWidget.computeSize(SWT.DEFAULT, SWT.DEFAULT));
216
217 //+++ConsensusSequenceArea
218 ConsensusSequenceArea consensusSequenceArea = new ConsensusSequenceArea(result);
219 Composite consensusWidget = consensusSequenceArea.createSWTWidget(scrolledComposite, SWT.NONE);
220 scrolledComposite.setContent(consensusWidget);
221
222
223 //+++PherogramTraceCurveView+++
224 PherogramTraceCurveView pherogramView = new PherogramTraceCurveView();
225 // pherogramView.setProvider(new BioJavaPherogramProvider(ChromatogramFactory.create(
226 // new File("data\\pherograms\\Test_pel1PCR_Pel2Wdhg_PCR-7-A_1.ab1"))));
227 try {
228 pherogramView.setProvider(new BioJavaPherogramProvider(ChromatogramFactory.create(
229 new File("/home/pplitzner/svn/branch/taxeditor-3.4/eu.etaxonomy.taxeditor.store/lib/jfreechart-1.0.17/lib/A10001_GM106-petD_F.scf"))));
230 } catch (UnsupportedChromatogramFormatException e) {
231 // TODO Auto-generated catch block
232 e.printStackTrace();
233 } catch (IOException e) {
234 // TODO Auto-generated catch block
235 e.printStackTrace();
236 }
237 pherogramView.setHorizontalScale(1);
238 pherogramView.setVerticalScale(100);
239 pherogramView.getFormats().setQualityOutputType(QualityOutputType.ALL);
240 pherogramView.getFormats().setShowProbabilityValues(true);
241
242 // Composite pherogramWidget = pherogramView.createSWTWidget(scrolledComposite, SWT.NONE);
243 // scrolledComposite.setContent(pherogramWidget);
244 // scrolledComposite.setMinSize(pherogramWidget.computeSize(SWT.DEFAULT, SWT.DEFAULT));
245
246 //+++Pherogramm Heading View+++
247 PherogramHeadingView pherogramHeadingView = new PherogramHeadingView(pherogramView);
248 // Composite pherogramHeadingWidget = pherogramHeadingView.createSWTWidget(scrolledComposite, SWT.NONE);
249 // scrolledComposite.setContent(pherogramHeadingWidget);
250 // scrolledComposite.setMinSize(pherogramHeadingWidget.computeSize(SWT.DEFAULT, SWT.DEFAULT));
251
252 }
253
254 /** {@inheritDoc} */
255 @Override
256 public void createPartControl(Composite parent) {
257 service = (IWorkbenchSiteProgressService) getSite().getAdapter(IWorkbenchSiteProgressService.class);
258 contextListener = new ContextListener();
259 CdmStore.getContextManager().addContextListener(contextListener);
260
261 // Create top composite
262 FillLayout fillLayout = new FillLayout();
263 fillLayout.marginWidth = 0;
264 fillLayout.marginHeight = 0;
265 fillLayout.type = SWT.VERTICAL;
266 parent.setLayout(fillLayout);
267
268 librAlignInit(parent);
269
270
271 // viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
272 // | SWT.V_SCROLL | SWT.FULL_SELECTION);
273 // getSite().setSelectionProvider(viewer);
274 //
275 // createColumns(viewer);
276 //
277 // viewer.setContentProvider(new CdmDataSourceContentProvider());
278 // viewer.setLabelProvider(new CdmDataSourceLabelProvider());
279 // comparator = new CdmDataSourceViewerComparator();
280 // viewer.setComparator(comparator);
281 //
282 //
283 // // register context menu
284 // MenuManager menuMgr = new MenuManager();
285 // menuMgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
286 // getSite().registerContextMenu(menuMgr, viewer);
287 //
288 // Control control = viewer.getControl();
289 // Menu menu = menuMgr.createContextMenu(control);
290 // control.setMenu(menu);
291 //
292 // // connect on doubleclick
293 // viewer.addDoubleClickListener(new IDoubleClickListener() {
294 //
295 // @Override
296 // public void doubleClick(DoubleClickEvent event) {
297 // if (event.getSelection() instanceof StructuredSelection) {
298 //
299 // Object element = ((StructuredSelection) event
300 // .getSelection()).getFirstElement();
301 // if (element instanceof CdmMetaDataAwareDataSourceContainer) {
302 // String commandId = "eu.etaxonomy.taxeditor.store.datasource.change";
303 //
304 // ICommandService commandService = (ICommandService)getSite().getService(ICommandService.class);
305 //
306 // Command command = commandService.getCommand(commandId);
307 // if(command.isEnabled()) {
308 //
309 // IHandlerService handlerService = (IHandlerService) AbstractUtility.getService(IHandlerService.class);
310 //
311 // try {
312 // handlerService.executeCommand(commandId, null);
313 // } catch (ExecutionException e) {
314 // AbstractUtility.error(this.getClass(), e);
315 // } catch (NotDefinedException e) {
316 // AbstractUtility.error(this.getClass(), e);
317 // } catch (NotEnabledException e) {
318 // AbstractUtility.error(this.getClass(), e);
319 // } catch (NotHandledException e) {
320 // AbstractUtility.error(this.getClass(), e);
321 // }
322 // }
323 // }
324 // }
325 // }
326 // });
327 //
328 // refresh();
329 }
330
331
332 // This will create the columns for the table
333 private void createColumns(TableViewer viewer) {
334 Table table = viewer.getTable();
335 String[] titles = {"Connected", "Name", "Server", "Up", "Type", "Database", "Nomenclatural Code", "Created", "CDM Version", "Compatible", "Notes"};
336 int[] bounds = { 24, 200, 100, 50 , 80, 120, 50, 100, 100, 50, 300};
337
338 for (int i = 0; i < titles.length; i++) {
339 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
340 column.getColumn().setText(titles[i]);
341 column.getColumn().setWidth(bounds[i]);
342 column.getColumn().setResizable(true);
343 column.getColumn().setMoveable(true);
344 column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
345 if(i == 1){
346 table.setSortColumn(column.getColumn());
347 }
348 }
349 table.setHeaderVisible(true);
350 table.setLinesVisible(true);
351 table.setSortDirection(SWT.UP);
352
353 }
354
355 /**
356 * <p>refresh</p>
357 */
358 public void refresh(){
359 getService().schedule(new DataSourceJob("Loading datasources", CdmDataSourceRepository.getAll()), Job.LONG);
360 }
361
362 /** {@inheritDoc} */
363 @Override
364 public void dispose() {
365 CdmStore.getContextManager().removeContextListener(contextListener);
366 super.dispose();
367 }
368
369 /** {@inheritDoc} */
370 @Override
371 public void setFocus() {
372 // viewer.getControl().setFocus();
373 }
374
375
376 /* (non-Javadoc)
377 * @see org.eclipse.ui.part.WorkbenchPart#showBusy(boolean)
378 */
379 /** {@inheritDoc} */
380 @Override
381 public void showBusy(boolean busy) {
382 super.showBusy(busy);
383 // viewer.getTable().setEnabled(!busy);
384 if(busy){
385 partNameCache = getPartName();
386 setPartName("Loading datasources");
387 }else{
388 if(partNameCache != null){
389 setPartName(partNameCache);
390 }
391 }
392 }
393
394 /**
395 * <p>Getter for the field <code>viewer</code>.</p>
396 *
397 * @return a {@link org.eclipse.jface.viewers.StructuredViewer} object.
398 */
399 public StructuredViewer getViewer() {
400 return viewer;
401 }
402
403 /**
404 * <p>Getter for the field <code>service</code>.</p>
405 *
406 * @return the service
407 */
408 public IWorkbenchSiteProgressService getService() {
409 return service;
410 }
411
412 private SelectionAdapter getSelectionAdapter(final TableColumn column,
413 final int index) {
414 SelectionAdapter selectionAdapter = new SelectionAdapter() {
415 @Override
416 public void widgetSelected(SelectionEvent e) {
417 comparator.setColumn(index);
418 int dir = viewer.getTable().getSortDirection();
419 if (viewer.getTable().getSortColumn() == column) {
420 dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
421 } else {
422 dir = SWT.DOWN;
423 }
424 viewer.getTable().setSortDirection(dir);
425 viewer.getTable().setSortColumn(column);
426 viewer.refresh();
427 }
428 };
429 return selectionAdapter;
430 }
431
432 }