--- /dev/null
+/**
+* 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;
+ }
+}