ref #9189: move datasource to webapp
[taxeditor.git] / eu.etaxonomy.taxeditor.webapp / src / main / java / eu / etaxonomy / taxeditor / webapp / view / datasource / e4 / CdmDataSourceViewPartE4.java
diff --git a/eu.etaxonomy.taxeditor.webapp/src/main/java/eu/etaxonomy/taxeditor/webapp/view/datasource/e4/CdmDataSourceViewPartE4.java b/eu.etaxonomy.taxeditor.webapp/src/main/java/eu/etaxonomy/taxeditor/webapp/view/datasource/e4/CdmDataSourceViewPartE4.java
new file mode 100644 (file)
index 0000000..90cb53e
--- /dev/null
@@ -0,0 +1,289 @@
+/**
+* Copyright (C) 2007 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+
+package eu.etaxonomy.taxeditor.webapp.view.datasource.e4;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.e4.ui.di.UIEventTopic;
+import org.eclipse.e4.ui.di.UISynchronize;
+import org.eclipse.e4.ui.services.EMenuService;
+import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.IMemento;
+
+import eu.etaxonomy.cdm.config.ICdmSource;
+import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
+import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
+import eu.etaxonomy.taxeditor.model.IContextListener;
+import eu.etaxonomy.taxeditor.store.CdmStore;
+import eu.etaxonomy.taxeditor.webapp.datasource.common.CdmDataSourceRepository;
+import eu.etaxonomy.taxeditor.webapp.l10n.Messages;
+import eu.etaxonomy.taxeditor.webapp.view.datasource.CdmDataSourceContentProvider;
+import eu.etaxonomy.taxeditor.webapp.view.datasource.CdmDataSourceLabelProvider;
+import eu.etaxonomy.taxeditor.webapp.view.datasource.CdmDataSourceViewerComparator;
+import eu.etaxonomy.taxeditor.webapp.view.datasource.CdmMetaDataAwareDataSourceContainer;
+
+/**
+ * @author pplitzner
+ * @date 22.08.2017
+ */
+public class CdmDataSourceViewPartE4 {
+
+    @Inject
+    private UISynchronize sync;
+
+    private static final Logger logger = Logger.getLogger(CdmDataSourceViewPartE4.class);
+
+       private class ContextListener extends ContextListenerAdapter{
+               @Override
+               public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
+                       monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
+                       viewer.refresh();
+               }
+
+               @Override
+               public void contextStop(IMemento memento, IProgressMonitor monitor) {
+                       monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
+                       viewer.refresh();
+               }
+
+               @Override
+               public void contextStart(IMemento memento, IProgressMonitor monitor) {
+                       monitor.subTask("Refreshing Datasource View"); //$NON-NLS-1$
+                       viewer.refresh();
+               }
+       }
+
+       private class DataSourceJob extends Job{
+
+               private final List<ICdmSource> cdmSources;
+
+               public DataSourceJob(String title, List<ICdmSource> cdmSources) {
+                       super(title);
+                       this.cdmSources = cdmSources;
+               }
+
+               @Override
+               public IStatus run(final IProgressMonitor monitor) {
+                       try{
+                               logger.debug("Begin of eclipse core runtime Job to Retrieve datasources"); //$NON-NLS-1$
+                               monitor.beginTask("Retrieving datasources", cdmSources.size() + 1);                      //$NON-NLS-1$
+
+                               final List<CdmMetaDataAwareDataSourceContainer> containers = new ArrayList<CdmMetaDataAwareDataSourceContainer>();
+
+                               for(ICdmSource cdmSource : cdmSources){
+                                       containers.add(new CdmMetaDataAwareDataSourceContainer(cdmSource));
+                               }
+
+                               sync.asyncExec(()->viewer.setInput(containers));
+
+                               monitor.worked(1);
+
+                               for(final CdmMetaDataAwareDataSourceContainer container : containers){
+                                       if(logger.isDebugEnabled()) {
+                        logger.debug("  #" + container.hashCode() + " : next DataSourceContainer");                                             //$NON-NLS-1$ //$NON-NLS-2$
+                    }
+                                       container.getMetaDataFromDataSource();
+                                       if(logger.isDebugEnabled())
+                     {
+                        logger.debug("  #" + container.hashCode() + " : metadata retrieved, creating new runnable ...");        //$NON-NLS-1$ //$NON-NLS-2$
+                    }
+                                       sync.asyncExec(new Runnable() {
+
+                                               @Override
+                                               public void run() {
+                                                       if(logger.isDebugEnabled())
+                             {
+                                logger.debug("  #" + container.hashCode() + " starting sub thread to update ...");      //$NON-NLS-1$ //$NON-NLS-2$
+                            }
+                                                       viewer.update(container, null);
+                                                       if(logger.isDebugEnabled())
+                             {
+                                logger.debug("  #" + container.hashCode() + " end of sub thread to update ...");        //$NON-NLS-1$ //$NON-NLS-2$
+                            }
+                                               }
+                                       });
+                                       if(logger.isDebugEnabled())
+                     {
+                        logger.debug("  #" + container.hashCode() + " done");   //$NON-NLS-1$ //$NON-NLS-2$
+                    }
+                                       monitor.worked(1);
+                               }
+
+                       }finally{
+                               monitor.done();
+                       }
+                       return Status.OK_STATUS;
+               }
+       }
+
+       private TableViewer viewer;
+
+       //FIXME E4 migrate
+//     private IWorkbenchSiteProgressService service;
+
+       private IContextListener contextListener;
+
+       private CdmDataSourceViewerComparator comparator;
+
+       public CdmDataSourceViewPartE4(){
+       }
+
+    private ISelectionChangedListener selectionChangedListener;
+
+    @Inject
+    private ESelectionService selService;
+
+    @PostConstruct
+    public void create(Composite parent, EMenuService menuService) {
+//             service = getSite().getAdapter(IWorkbenchSiteProgressService.class);
+               contextListener = new ContextListener();
+               CdmStore.getContextManager().addContextListener(contextListener);
+
+               // Create top composite
+               FillLayout fillLayout = new FillLayout();
+               fillLayout.marginWidth = 0;
+               fillLayout.marginHeight = 0;
+               fillLayout.type = SWT.VERTICAL;
+               parent.setLayout(fillLayout);
+
+               viewer = new TableViewer(parent, SWT.H_SCROLL
+                                                                                               | SWT.V_SCROLL | SWT.FULL_SELECTION);
+
+               createColumns(viewer);
+
+               viewer.setContentProvider(new CdmDataSourceContentProvider());
+               viewer.setLabelProvider(new CdmDataSourceLabelProvider());
+               comparator = new CdmDataSourceViewerComparator();
+               viewer.setComparator(comparator);
+
+        // Propagate selection from viewer
+        selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
+        viewer.addSelectionChangedListener(selectionChangedListener);
+
+        //create context menu
+        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.datasourceview");
+
+               refresh();
+       }
+
+
+       // This will create the columns for the table
+       private void createColumns(TableViewer viewer) {
+               Table table = viewer.getTable();
+               String[] titles = {Messages.CdmDataSourceViewPart_12, Messages.CdmDataSourceViewPart_11, Messages.CdmDataSourceViewPart_10, Messages.CdmDataSourceViewPart_9, Messages.CdmDataSourceViewPart_8, Messages.CdmDataSourceViewPart_7, Messages.CdmDataSourceViewPart_5, Messages.CdmDataSourceViewPart_4, Messages.CdmDataSourceViewPart_3, Messages.CdmDataSourceViewPart_2};
+               int[] bounds = { 24, 200, 100, 50 , 80, 120, 100, 100, 50, 300};
+
+               for (int i = 0; i < titles.length; i++) {
+                       TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+                       column.getColumn().setText(titles[i]);
+                       column.getColumn().setWidth(bounds[i]);
+                       column.getColumn().setResizable(true);
+                       column.getColumn().setMoveable(true);
+                       column.getColumn().addSelectionListener(getSelectionAdapter(column.getColumn(), i));
+                       if(i == 1){
+                               table.setSortColumn(column.getColumn());
+                       }
+               }
+               table.setHeaderVisible(true);
+               table.setLinesVisible(true);
+               table.setSortDirection(SWT.UP);
+       }
+
+    @Inject
+    @Optional
+    private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_DATASOURCE)boolean refresh){
+        if(refresh){
+            refresh();
+        }
+    }
+
+       public void refresh(){
+               DataSourceJob dataSourceJob = new DataSourceJob(Messages.CdmDataSourceViewPart_1, CdmDataSourceRepository.getAll());
+               dataSourceJob.schedule();
+       }
+
+       @PreDestroy
+       public void dispose() {
+               CdmStore.getContextManager().removeContextListener(contextListener);
+       }
+
+       @Focus
+       public void setFocus() {
+           if (viewer.getControl() != null && !viewer.getControl().isDisposed()) {
+            viewer.getControl().setFocus();
+        }
+       }
+
+       //FIXME E4 migrate
+//     @Override
+//     public void showBusy(boolean busy) {
+//             super.showBusy(busy);
+////           viewer.getTable().setEnabled(!busy);
+//             if(busy){
+//                     partNameCache = getPartName();
+//                     setPartName(Messages.CdmDataSourceViewPart_1);
+//             }else{
+//                     if(partNameCache != null){
+//                             setPartName(partNameCache);
+//                     }
+//             }
+//     }
+
+       public StructuredViewer getViewer() {
+               return viewer;
+       }
+
+//     public IWorkbenchSiteProgressService getService() {
+//             return service;
+//     }
+
+       private SelectionAdapter getSelectionAdapter(final TableColumn column,
+                       final int index) {
+               SelectionAdapter selectionAdapter = new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               comparator.setColumn(index);
+                               int dir = viewer.getTable().getSortDirection();
+                               if (viewer.getTable().getSortColumn() == column) {
+                                       dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
+                               } else {
+                                       dir = SWT.DOWN;
+                               }
+                               viewer.getTable().setSortDirection(dir);
+                               viewer.getTable().setSortColumn(column);
+                               viewer.refresh();
+                       }
+               };
+               return selectionAdapter;
+       }
+}