com.arm.cmsis.pack.installer.ui.CpInstallerPlugInUI.java Source code

Java tutorial

Introduction

Here is the source code for com.arm.cmsis.pack.installer.ui.CpInstallerPlugInUI.java

Source

/*******************************************************************************
 * Copyright (c) 2015 ARM Ltd. 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:
 * Eclipse Project - generation from template
 * ARM Ltd and ARM Germany GmbH - application-specific implementation
 *******************************************************************************/
package com.arm.cmsis.pack.installer.ui;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.services.IEvaluationService;
import org.osgi.framework.BundleContext;

import com.arm.cmsis.pack.CpPlugIn;
import com.arm.cmsis.pack.ICpPackInstaller;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.installer.ui.perspectives.PackManagerPerspective;

/**
 * The activator class controls the plug-in life cycle
 */
public class CpInstallerPlugInUI extends AbstractUIPlugin {

    // The plug-in ID
    public static final String PLUGIN_ID = "com.arm.cmsis.pack.installer.ui"; //$NON-NLS-1$

    // The shared instance
    private static CpInstallerPlugInUI plugin;

    private IWorkbenchListener workbenchListener = null;

    private IPerspectiveListener perspectiveListener = null;

    static List<ViewPart> viewParts;

    static boolean isOnline;

    volatile static Timer timer = null;
    boolean timerStarted = false;

    /**
     * The constructor
     */
    public CpInstallerPlugInUI() {
    }

    @Override
    public void start(BundleContext context) throws Exception {
        super.start(context);
        plugin = this;
        viewParts = new LinkedList<>();
        registerPerspectiveListener();
        registerWorkbenchListener();
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        plugin = null;
        if (timer != null) {
            timer.cancel();
        }
        IWorkbench wb = PlatformUI.getWorkbench();
        if (wb != null) {
            if (workbenchListener != null) {
                wb.removeWorkbenchListener(workbenchListener);
            }
            if (wb.getActiveWorkbenchWindow() != null && perspectiveListener != null) {
                wb.getActiveWorkbenchWindow().removePerspectiveListener(perspectiveListener);
            }
        }
        workbenchListener = null;
        perspectiveListener = null;
        viewParts.clear();
        viewParts = null;
        super.stop(context);
    }

    /**
     * Returns the shared instance
     *
     * @return the shared instance
     */
    public static CpInstallerPlugInUI getDefault() {
        return plugin;
    }

    private void registerWorkbenchListener() {
        IWorkbench wb = PlatformUI.getWorkbench();
        if (wb == null) {
            return;
        }
        final ICpPackInstaller packInstaller = CpPlugIn.getPackManager().getPackInstaller();
        workbenchListener = new IWorkbenchListener() {
            @Override
            public boolean preShutdown(IWorkbench workbench, boolean forced) {
                if (packInstaller.isBusy()) {
                    boolean exit = MessageDialog.openQuestion(Display.getDefault().getActiveShell(),
                            Messages.CpInstallerPlugInUI_ExitEclipse,
                            Messages.CpInstallerPlugInUI_ExitEclipseMessage);
                    if (exit) {
                        packInstaller.reset();
                        try {
                            Thread.sleep(500); // wait for the cancel
                        } catch (InterruptedException e) {
                            // ignore the exception
                        }
                    }
                    return exit;
                }
                return true;
            }

            @Override
            public void postShutdown(IWorkbench workbench) {
                // does nothing
            }
        };
        wb.addWorkbenchListener(workbenchListener);
    }

    private void registerPerspectiveListener() {
        IWorkbench wb = PlatformUI.getWorkbench();
        if (wb == null || wb.getActiveWorkbenchWindow() == null) {
            return;
        }

        perspectiveListener = new IPerspectiveListener() {
            @Override
            public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
                    String changeId) {
                if ("viewShow".equals(changeId)) { //$NON-NLS-1$
                    setTimerTask(page, perspective);
                } else { // viewHide
                    if (timer != null) {
                        timer.cancel();
                        timer = null;
                    }
                }
            }

            @Override
            public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
                setTimerTask(page, perspective);
            }
        };
        wb.getActiveWorkbenchWindow().addPerspectiveListener(perspectiveListener);
    }

    void setTimerTask(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
        if (PackManagerPerspective.ID.equals(page.getPerspective().getId())) {
            page.setEditorAreaVisible(false);
            if (!timerStarted) {
                startUpdatingStatusLine();
                timerStarted = true;
            }
        } else {
            if (timer != null) {
                timer.cancel();
                timer = null;
            }
            timerStarted = false;
        }
    }

    public static boolean isOnline() {
        return isOnline;
    }

    void startUpdatingStatusLine() {
        if (timer == null) {
            timer = new Timer();
        } else if (timerStarted) {
            return;
        }
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                Socket socket = new Socket();
                InetSocketAddress addr = new InetSocketAddress(CmsisConstants.REPO_KEILWEB, 80);
                try {
                    socket.connect(addr, 2000);
                    if (!socket.isClosed() && socket.isConnected()) {
                        updateStatusLineAndButton(true);
                    }
                } catch (Exception e) {
                    updateStatusLineAndButton(false);
                } finally {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, 0, 5000);
    }

    synchronized public static void registerViewPart(ViewPart viewPart) {
        viewParts.add(viewPart);
    }

    void updateStatusLineAndButton(boolean online) {
        final boolean connectionStateChanged = isOnline != online;
        if (!connectionStateChanged) {
            return;
        }
        isOnline = online;
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                IEvaluationService evaludationService = (IEvaluationService) PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow().getService(IEvaluationService.class);
                evaludationService.requestEvaluation("com.arm.cmsis.pack.installer.ui.onlineTest"); //$NON-NLS-1$

                Iterator<ViewPart> iter = viewParts.iterator();
                while (iter.hasNext()) {
                    ViewPart viewPart = iter.next();
                    IStatusLineManager mgr = viewPart.getViewSite().getActionBars().getStatusLineManager();
                    if (online) {
                        mgr.setErrorMessage(null);
                        mgr.setMessage(Messages.CpInstallerPlugInUI_ONLINE);
                    } else {
                        mgr.setErrorMessage(Messages.CpInstallerPlugInUI_OFFLINE);
                    }
                    Viewer viewer = (Viewer) viewPart.getAdapter(Viewer.class);
                    if (connectionStateChanged && viewer != null && !viewer.getControl().isDisposed()) {
                        viewer.refresh();
                    }
                }
            }
        });
    }

}