gov.redhawk.explorer.wizard.SelectDomainPage.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.explorer.wizard.SelectDomainPage.java

Source

/*******************************************************************************
 * This file is protected by Copyright. 
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 *
 * This file is part of REDHAWK IDE.
 *
 * All rights reserved.  This program and the accompanying materials are made available under 
 * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at 
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package gov.redhawk.explorer.wizard;

import gov.redhawk.explorer.Activator;
import gov.redhawk.model.sca.DomainConnectionException;
import gov.redhawk.model.sca.DomainConnectionState;
import gov.redhawk.model.sca.RefreshDepth;
import gov.redhawk.model.sca.ScaDomainManager;
import gov.redhawk.model.sca.ScaDomainManagerRegistry;
import gov.redhawk.model.sca.ScaWaveform;
import gov.redhawk.model.sca.commands.ScaModelCommand;
import gov.redhawk.model.sca.provider.ScaItemProviderAdapterFactory;
import gov.redhawk.model.sca.provider.ScaWaveformsContainerItemProvider;
import gov.redhawk.sca.ScaPlugin;
import gov.redhawk.sca.ui.parts.FormFilteredTree;
import gov.redhawk.sca.ui.preferences.DomainEntryWizard;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.statushandlers.StatusManager;

public class SelectDomainPage extends WizardPage {
    private FormFilteredTree domainList = null;
    private ComposedAdapterFactory adapterFactory;
    private final StartupWizard parent;
    private ScaDomainManager mgr;
    private MyPatternFilter patternFilter;

    public SelectDomainPage(final String pageName, final StartupWizard parent) {
        super(pageName);
        setTitle(pageName);
        setDescription("Select the Domain to connect and click 'Next'.");
        setPageComplete(false);
        this.parent = parent;
    }

    @Override
    public void createControl(final Composite parent) {
        final Composite container = new Composite(parent, SWT.NULL);
        final GridLayout layout = new GridLayout(3, false);
        container.setLayout(layout);

        this.patternFilter = new MyPatternFilter();
        this.domainList = new FormFilteredTree(container, SWT.SINGLE | SWT.V_SCROLL, this.patternFilter);
        this.domainList.setBackground(container.getBackground());
        this.domainList.setLayoutData(
                GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).span(2, 1).create());
        this.domainList.getViewer().setContentProvider(new AdapterFactoryContentProvider(getAdapterFactory()));
        this.domainList.getViewer().setLabelProvider(new AdapterFactoryLabelProvider(getAdapterFactory()) {
            @Override
            public String getText(final Object object) {
                String text = super.getText(object);
                if (object instanceof ScaDomainManager) {
                    text += " (" + ((ScaDomainManager) object).getState().getLiteral().toUpperCase() + ")";
                }
                return text;
            }
        });
        this.domainList.getViewer().setFilters(createDomainViewerFilter());
        this.domainList.getViewer().setInput(ScaPlugin.getDefault().getDomainManagerRegistry());
        this.domainList.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                boolean domainSelected = false;
                boolean appsRunning = false;
                final StructuredSelection selection = (StructuredSelection) event.getSelection();
                if (!selection.isEmpty() && selection.getFirstElement() instanceof ScaDomainManager) {
                    if (connect(selection)) {
                        domainSelected = true;
                        try {
                            appsRunning = SelectDomainPage.this.mgr.applications().length > 0;
                        } catch (final Exception e) {
                            // PASS - You can connect to a domain that isn't up but is in the NameService
                        }
                    }
                }
                SelectDomainPage.this.setPageComplete(domainSelected);
                SelectDomainPage.this.parent.appsRunning(appsRunning);
            }
        });

        final Composite buttonBox = new Composite(container, SWT.NULL);
        buttonBox.setLayoutData(
                GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL).grab(false, true).create());
        final GridLayout l = new GridLayout();
        l.marginWidth = 0;
        buttonBox.setLayout(l);
        final Button newButton = new Button(buttonBox, SWT.PUSH);
        newButton.setText(" New... ");
        newButton.setLayoutData(GridDataFactory.fillDefaults().create());
        newButton.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetDefaultSelected(final SelectionEvent e) {
                widgetSelected(e);
            }

            @Override
            public void widgetSelected(final SelectionEvent e) {
                final ScaDomainManagerRegistry registry = ScaPlugin.getDefault().getDomainManagerRegistry();
                final DomainEntryWizard wizard = new DomainEntryWizard();
                wizard.setShowExtraSettings(false);
                wizard.setRegistry(registry);
                wizard.setWindowTitle("Add Domain Manager");
                final WizardDialog dialog = new WizardDialog(getShell(), wizard);
                if (dialog.open() == IStatus.OK) {
                    final Map<String, String> connectionProperties = Collections
                            .singletonMap(ScaDomainManager.NAMING_SERVICE_PROP, wizard.getNameServiceInitRef());
                    ScaModelCommand.execute(registry, new ScaModelCommand() {
                        @Override
                        public void execute() {
                            registry.createDomain(wizard.getDomainName(), false, connectionProperties);
                        }
                    });
                }
            }
        });

        setControl(container);
    }

    public boolean connect(final StructuredSelection selection) {
        final IStatus[] status = new IStatus[1];
        status[0] = null;
        this.mgr = (ScaDomainManager) selection.getFirstElement();
        try {
            getContainer().run(true, true, new IRunnableWithProgress() {
                @Override
                public void run(final IProgressMonitor monitor)
                        throws InvocationTargetException, InterruptedException {
                    monitor.beginTask("Connecting to the domain", 2);
                    try {
                        if (SelectDomainPage.this.mgr.getState()
                                .getValue() != DomainConnectionState.CONNECTED_VALUE) {
                            SelectDomainPage.this.mgr.connect(new NullProgressMonitor(), RefreshDepth.CHILDREN);
                        }
                    } catch (final DomainConnectionException e) {
                        status[0] = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                                "Unable to connect to Domain: " + SelectDomainPage.this.mgr.getName());
                    }
                    monitor.worked(1);

                    monitor.done();
                }
            });
        } catch (final InvocationTargetException e) {
            status[0] = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                    "Unable to connect to Domain: " + this.mgr.getName());
        } catch (final InterruptedException e) {
            status[0] = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                    "Unable to connect to Domain: " + this.mgr.getName());
        }
        if (status[0] != null) {
            setErrorMessage("Unable to connect to Domain: " + this.mgr.getName());
            this.domainList.getViewer().setSelection(new StructuredSelection());
            StatusManager.getManager().handle(status[0]);
        } else {
            setErrorMessage(null);
            if (this.mgr.getState().getValue() == DomainConnectionState.CONNECTED_VALUE) {
                setPageComplete(true);
                getContainer().updateButtons();
            }
        }

        this.domainList.getViewer().refresh();

        return (status[0] == null);
    }

    /**
     * Gets the adapter factory.
     * 
     * @return the adapter factory
     */
    private AdapterFactory getAdapterFactory() {
        if (this.adapterFactory == null) {
            this.adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);

            this.adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
            this.adapterFactory.addAdapterFactory(new ScaItemProviderAdapterFactory());
            this.adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
        }
        return this.adapterFactory;
    }

    /**
     * Creates the domain viewer filter.
     * 
     * @return the viewer filter[]
     */
    private ViewerFilter[] createDomainViewerFilter() {
        return new ViewerFilter[] { new ViewerFilter() {
            @Override
            public Object[] filter(final Viewer viewer, final Object parent, final Object[] elements) {
                final List<Object> elems = new ArrayList<Object>();
                for (final Object obj : elements) {
                    ScaDomainManager dommgr = null;
                    String name = "";
                    if (obj instanceof ScaDomainManager) {
                        dommgr = (ScaDomainManager) obj;
                        name = dommgr.getName();
                    } else if (obj instanceof ScaWaveform) {
                        dommgr = (ScaDomainManager) ((ScaWaveform) obj).eContainer();
                        name = ((ScaWaveform) obj).getName();
                    } else if (obj instanceof ScaWaveformsContainerItemProvider) {
                        dommgr = (ScaDomainManager) ((ScaWaveformsContainerItemProvider) obj).getTarget();
                        name = dommgr.getName();
                    }
                    if ((dommgr != null) && SelectDomainPage.this.patternFilter.wordMatches(name)) {
                        elems.add(obj);
                    }
                }

                return elems.toArray();
            }

            @Override
            public boolean select(final Viewer viewer, final Object parentElement, final Object element) {
                return element instanceof ScaDomainManager || element instanceof ScaWaveform
                        || element instanceof ScaWaveformsContainerItemProvider;
            }
        } };
    }

    /**
     * This returns the selected Domain Manager
     * 
     * @return the Domain Manager to connect to
     */
    public ScaDomainManager getDomainManager() {
        return (ScaDomainManager) ((StructuredSelection) this.domainList.getViewer().getSelection())
                .getFirstElement();
    }

    private class MyPatternFilter extends PatternFilter {
        @Override
        public boolean wordMatches(final String text) {
            return super.wordMatches(text);
        }
    }
}