org.jboss.tools.central.editors.SoftwarePage.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.tools.central.editors.SoftwarePage.java

Source

/*************************************************************************************
 * Copyright (c) 2008-2011 Red Hat, Inc. and others.
 * 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
 * 
 * Contributors:
 *     JBoss by Red Hat - Initial implementation.
 ************************************************************************************/
package org.jboss.tools.central.editors;

import java.lang.reflect.InvocationTargetException;
import java.util.Dictionary;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
import org.eclipse.mylyn.internal.discovery.core.model.DiscoveryConnector;
import org.eclipse.mylyn.internal.discovery.ui.DiscoveryUi;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.part.PageBook;
import org.jboss.tools.central.JBossCentralActivator;
import org.jboss.tools.central.editors.xpl.DiscoveryViewer;
import org.jboss.tools.central.jobs.RefreshDiscoveryJob;
import org.jboss.tools.project.examples.ProjectExamplesActivator;

/**
 * 
 * @author snjeza
 *
 */
public class SoftwarePage extends AbstractJBossCentralPage implements IRunnableContext {

    public static final String ID = ID_PREFIX + "SoftwarePage";

    private static final String ICON_INSTALL = "/icons/repository-submit.gif";

    private Dictionary<Object, Object> environment;
    private ScrolledForm form;
    private IProgressMonitor monitor;
    private PageBook pageBook;
    private Composite loadingComposite;
    private Composite featureComposite;
    private DiscoveryViewer discoveryViewer;
    private RefreshJobChangeListener refreshJobChangeListener;
    private InstallAction installAction;

    private Button installButton;

    private ToolBarManager toolBarManager;

    public SoftwarePage(FormEditor editor) {
        super(editor, ID, "Software/Update");
        monitor = new DelegatingProgressMonitor();
    }

    @Override
    protected void createFormContent(IManagedForm managedForm) {
        FormToolkit toolkit = managedForm.getToolkit();
        form = managedForm.getForm();

        Composite body = form.getBody();
        GridLayout gridLayout = new GridLayout(1, true);
        gridLayout.horizontalSpacing = 7;
        body.setLayout(gridLayout);
        toolkit.paintBordersFor(body);

        Composite left = createComposite(toolkit, body);
        createFeaturesSection(toolkit, left);
        toolkit.paintBordersFor(left);

        //Composite right = createComposite(toolkit, body);
        //Section toInstall = createSection(toolkit, right, "To install", ExpandableComposite.TITLE_BAR|ExpandableComposite.TWISTIE|ExpandableComposite.EXPANDED);

        //toolkit.paintBordersFor(right);

        super.createFormContent(managedForm);

    }

    protected void createFeaturesSection(FormToolkit toolkit, Composite parent) {
        final Section features = toolkit.createSection(parent,
                ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
        features.setText("Features Available");
        features.setLayout(new GridLayout());
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.widthHint = 350;
        //gd.heightHint = 100;
        features.setLayoutData(gd);

        createFeaturesToolbar(toolkit, features);

        featureComposite = toolkit.createComposite(features);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        featureComposite.setLayoutData(gd);
        featureComposite.setLayout(new GridLayout());

        pageBook = new PageBook(featureComposite, SWT.NONE);
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        pageBook.setLayoutData(gd);

        discoveryViewer = new DiscoveryViewer(getSite(), this);
        discoveryViewer.setShowConnectorDescriptorKindFilter(false);
        discoveryViewer.setShowInstalledFilterEnabled(true);
        discoveryViewer.setDirectoryUrl(
                ProjectExamplesActivator.getDefault().getConfigurator().getJBossDiscoveryDirectory());
        discoveryViewer.createControl(pageBook);
        discoveryViewer.setEnvironment(getEnvironment());
        discoveryViewer.addFilter(new ViewerFilter() {

            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                DiscoveryConnector connector = (DiscoveryConnector) element;
                //System.out.println(connector.getId());
                if (connector.getId().equals("org.eclipse.mylyn.discovery.tests.connectorDescriptor1")
                        || connector.getId().equals("org.eclipse.mylyn.discovery.test1")
                        || connector.getId().equals("org.eclipse.mylyn.discovery.2tests")
                        || connector.getId().equals("org.eclipse.mylyn.trac")) {
                    //System.out.println("filtered " + connector.getId());
                    return false;
                }
                return true;
            }
        });

        Control discoveryControl = discoveryViewer.getControl();
        adapt(toolkit, discoveryControl);
        if (discoveryControl instanceof Composite) {
            ((Composite) discoveryControl).setLayout(new GridLayout());
        }
        gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        discoveryControl.setLayoutData(gd);

        loadingComposite = createLoadingComposite(toolkit, pageBook);

        form.addControlListener(new ControlAdapter() {

            @Override
            public void controlResized(ControlEvent e) {
                GridData gridData = (GridData) featureComposite.getLayoutData();
                Point size = form.getSize();
                gridData.heightHint = size.y - 25;
                gridData.widthHint = size.x - 25;
                gridData.grabExcessVerticalSpace = true;

                gridData = (GridData) features.getLayoutData();
                gridData.heightHint = size.y - 20;
                gridData.widthHint = size.x - 20;
                gridData.grabExcessVerticalSpace = false;
                form.reflow(true);
                form.redraw();
            }
        });

        installButton = toolkit.createButton(featureComposite, "Install", SWT.PUSH);
        installButton.setEnabled(false);
        installButton.setImage(JBossCentralActivator.getDefault().getImage(ICON_INSTALL));
        installButton.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                installAction.run();
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent e) {

            }
        });
        discoveryViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                installAction.setEnabled(discoveryViewer.getInstallableConnectors().size() > 0);
                installButton.setEnabled(discoveryViewer.getInstallableConnectors().size() > 0);
            }
        });
        features.setClient(featureComposite);
        showLoading();
        pageBook.pack(true);

        RefreshDiscoveryJob refreshDiscoveryJob = RefreshDiscoveryJob.INSTANCE;
        refreshJobChangeListener = new RefreshJobChangeListener();
        refreshDiscoveryJob.addJobChangeListener(refreshJobChangeListener);
        refreshDiscoveryJob.schedule();

    }

    private Dictionary<Object, Object> getEnvironment() {
        if (environment == null) {
            environment = JBossCentralActivator.getEnvironment();
        }
        return environment;
    }

    private void createFeaturesToolbar(FormToolkit toolkit, Section section) {
        Composite headerComposite = toolkit.createComposite(section, SWT.NONE);
        RowLayout rowLayout = new RowLayout();
        rowLayout.marginTop = 0;
        rowLayout.marginBottom = 0;
        headerComposite.setLayout(rowLayout);
        headerComposite.setBackground(null);

        toolBarManager = new ToolBarManager(SWT.FLAT | SWT.HORIZONTAL);
        toolBarManager.createControl(headerComposite);

        installAction = new InstallAction();
        installAction.setEnabled(false);
        toolBarManager.add(installAction);

        toolBarManager.add(new CheckForUpdatesAction());

        CommandContributionItem item = JBossCentralActivator.createContributionItem(getSite(),
                "org.jboss.tools.central.refreshDiscovery");
        toolBarManager.add(item);

        toolBarManager.update(true);

        section.setTextClient(headerComposite);
    }

    private void adapt(FormToolkit toolkit, Control control) {
        toolkit.adapt(control, true, true);
        if (control instanceof Composite) {
            Control[] children = ((Composite) control).getChildren();
            for (Control c : children) {
                adapt(toolkit, c);
            }
        }
    }

    @Override
    public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable)
            throws InvocationTargetException, InterruptedException {
        ModalContext.run(runnable, fork, monitor, getDisplay());
    }

    public boolean showLoading() {
        if (pageBook.isDisposed()) {
            return false;
        }
        Display display = getDisplay();
        display.syncExec(new Runnable() {

            @Override
            public void run() {
                pageBook.showPage(loadingComposite);
                setBusyIndicator(loadingComposite, true);
                form.reflow(true);
                form.redraw();
            }
        });
        return true;
    }

    public boolean refresh() {
        if (pageBook == null || pageBook.isDisposed() || discoveryViewer == null
                || discoveryViewer.getControl() == null) {
            return false;
        }
        Display display = getDisplay();
        display.syncExec(new Runnable() {

            @Override
            public void run() {
                pageBook.showPage(discoveryViewer.getControl());
                form.reflow(true);
                form.redraw();
            }
        });

        return true;
    }

    @Override
    public void dispose() {
        if (refreshJobChangeListener != null) {
            RefreshDiscoveryJob.INSTANCE.removeJobChangeListener(refreshJobChangeListener);
            refreshJobChangeListener = null;
        }
        if (toolBarManager != null) {
            toolBarManager.dispose();
            toolBarManager = null;
        }
        super.dispose();
    }

    public DiscoveryViewer getDiscoveryViewer() {
        return discoveryViewer;
    }

    private class RefreshJobChangeListener implements IJobChangeListener {

        @Override
        public void aboutToRun(IJobChangeEvent event) {

        }

        @Override
        public void awake(IJobChangeEvent event) {

        }

        @Override
        public void done(IJobChangeEvent event) {
            Display.getDefault().asyncExec(new Runnable() {

                @Override
                public void run() {
                    setBusyIndicator(loadingComposite, false);
                    refresh();
                }
            });

        }

        @Override
        public void running(IJobChangeEvent event) {

        }

        @Override
        public void scheduled(IJobChangeEvent event) {
            showLoading();
        }

        @Override
        public void sleeping(IJobChangeEvent event) {

        }

    }

    private class InstallAction extends Action {

        public InstallAction() {
            super("Install",
                    JBossCentralActivator.imageDescriptorFromPlugin(JBossCentralActivator.PLUGIN_ID, ICON_INSTALL));
        }

        @Override
        public void run() {
            Display display = Display.getCurrent();
            Shell shell = display.getActiveShell();
            Cursor cursor = shell == null ? null : shell.getCursor();
            try {
                if (shell != null) {
                    shell.setCursor(display.getSystemCursor(SWT.CURSOR_WAIT));
                }
                setEnabled(false);
                if (installButton != null) {
                    installButton.setEnabled(false);
                }
                DiscoveryUi.install(discoveryViewer.getInstallableConnectors(), SoftwarePage.this);
            } finally {
                if (shell != null) {
                    shell.setCursor(cursor);
                }
                setEnabled(true);
                if (installButton != null) {
                    installButton.setEnabled(true);
                }
            }
        }

    }

    private class CheckForUpdatesAction extends Action {

        public CheckForUpdatesAction() {
            super("Check for Updates", JBossCentralActivator
                    .imageDescriptorFromPlugin(JBossCentralActivator.PLUGIN_ID, "/icons/update.gif"));
        }

        @Override
        public void run() {
            IHandlerService handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
            try {
                setEnabled(false);
                handlerService.executeCommand("org.eclipse.equinox.p2.ui.sdk.update", new Event());
            } catch (Exception e) {
                JBossCentralActivator.log(e);
            } finally {
                setEnabled(true);
            }
        }

    }

}