org.mwc.debrief.core.Startup.java Source code

Java tutorial

Introduction

Here is the source code for org.mwc.debrief.core.Startup.java

Source

/*
 *    Debrief - the Open Source Maritime Analysis Application
 *    http://debrief.info
 *
 *    (C) 2000-2014, PlanetMayo Ltd
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the Eclipse Public License v1.0
 *    (http://www.eclipse.org/legal/epl-v10.html)
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 */
package org.mwc.debrief.core;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveRegistry;
import org.eclipse.ui.IStartup;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.WorkbenchPart;
import org.eclipse.ui.views.contentoutline.ContentOutline;
import org.eclipse.ui.views.navigator.ResourceNavigator;
import org.eclipse.ui.views.properties.PropertySheet;

@SuppressWarnings("deprecation")
public class Startup implements IStartup {

    private IPartListener partListener = new IPartListener() {

        @Override
        public void partOpened(IWorkbenchPart part) {
            if (part instanceof ContentOutline || part instanceof PropertySheet
                    || part instanceof ResourceNavigator) {
                changeIcon(part);
            }
        }

        @Override
        public void partDeactivated(IWorkbenchPart part) {
        }

        @Override
        public void partClosed(IWorkbenchPart part) {
        }

        @Override
        public void partBroughtToTop(IWorkbenchPart part) {
        }

        @Override
        public void partActivated(IWorkbenchPart part) {
        }
    };
    private static Image outlineImage, propertiesImage, navigatorImage;

    @Override
    public void earlyStartup() {
        removePerspective();
        removePreferencePages();
        new ResetPerspective().resetPerspective();
        ;
        if (DebriefPlugin.getDefault().getCreateProject()) {
            new CreateDebriefProject().createStartProject();
        }
        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
                page.addPartListener(partListener);
                IViewPart view = page.findView(IPageLayout.ID_OUTLINE);
                if (view instanceof ContentOutline) {
                    changeIcon(view);
                }
                view = page.findView(IPageLayout.ID_PROP_SHEET);
                if (view instanceof PropertySheet) {
                    changeIcon(view);
                }
                view = page.findView(IPageLayout.ID_RES_NAV);
                if (view instanceof ResourceNavigator) {
                    changeIcon(view);
                }
            }
        });
    }

    protected void changeIcon(IWorkbenchPart part) {
        try {
            Class<?> clazz = WorkbenchPart.class;
            Method method = clazz.getDeclaredMethod("setTitleImage", new Class[] { Image.class });
            method.setAccessible(true);
            Image image = null;
            if (part instanceof ContentOutline) {
                if (outlineImage == null) {
                    ImageDescriptor descriptor = DebriefPlugin.getImageDescriptor("icons/16/outline.png");
                    outlineImage = JFaceResources.getResources().createImageWithDefault(descriptor);
                }
                image = outlineImage;
            }
            if (part instanceof PropertySheet) {
                if (propertiesImage == null) {
                    ImageDescriptor descriptor = DebriefPlugin.getImageDescriptor("icons/16/properties.png");
                    propertiesImage = JFaceResources.getResources().createImageWithDefault(descriptor);
                }
                image = propertiesImage;
            }
            if (part instanceof ResourceNavigator) {
                if (navigatorImage == null) {
                    ImageDescriptor descriptor = DebriefPlugin.getImageDescriptor("icons/16/navigator.png");
                    navigatorImage = JFaceResources.getResources().createImageWithDefault(descriptor);
                }
                image = navigatorImage;
            }
            if (image != null) {
                method.invoke(part, new Object[] { image });
            }
        } catch (Exception e) {
            IStatus status = new Status(IStatus.INFO, DebriefPlugin.PLUGIN_NAME,
                    "Can't change the icon of the Outline view", e);
            DebriefPlugin.getDefault().getLog().log(status);
        }
    }

    private void removePreferencePages() {
        PreferenceManager preferenceManager = PlatformUI.getWorkbench().getPreferenceManager();
        if (preferenceManager == null) {
            return;
        }
        preferenceManager.remove("org.eclipse.debug.ui.DebugPreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.LaunchingPreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.ViewManagementPreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.ConsolePreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.StringVariablePreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.PerspectivePreferencePage");
        preferenceManager.remove("org.eclipse.debug.ui.LaunchConfigurations");
        preferenceManager.remove("org.eclipse.debug.ui.LaunchDelegatesPreferencePage");
        preferenceManager.remove("org.eclipse.team.ui.TeamPreferences");
        preferenceManager.remove("org.eclipse.wst.xml.ui.propertyPage.project.validation");
    }

    private void removePerspective() {
        IPerspectiveRegistry registry = PlatformUI.getWorkbench().getPerspectiveRegistry();
        if (registry == null) {
            return;
        }
        List<IPerspectiveDescriptor> descriptors = new ArrayList<IPerspectiveDescriptor>();

        addDescriptor(registry, descriptors, "org.eclipse.debug.ui.DebugPerspective");
        addDescriptor(registry, descriptors, "org.eclipse.team.ui.TeamSynchronizingPerspective");

        // FIXME this method doesn't work on Eclipse E4 (Juno/Kepler)
        if (registry instanceof IExtensionChangeHandler && !descriptors.isEmpty()) {
            IExtensionChangeHandler handler = (IExtensionChangeHandler) registry;
            handler.removeExtension(null, descriptors.toArray());
        }
    }

    private void addDescriptor(IPerspectiveRegistry registry, List<IPerspectiveDescriptor> descriptors, String id) {
        IPerspectiveDescriptor perspectiveDescriptor = registry.findPerspectiveWithId(id);
        if (perspectiveDescriptor != null) {
            descriptors.add(perspectiveDescriptor);
        }
    }

}