org.eclipse.oomph.launches.EarlyStartup.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.oomph.launches.EarlyStartup.java

Source

/*
 * Copyright (c) 2016 Eike Stepper (Berlin, Germany) 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.oomph.launches;

import org.eclipse.oomph.util.PropertiesUtil;
import org.eclipse.oomph.util.ReflectUtil;

import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IDecorationContext;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IStartup;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import java.lang.reflect.Constructor;

/**
 * @author Eike Stepper
 */
public class EarlyStartup implements IStartup {
    private static final boolean DECORATE = PropertiesUtil
            .isProperty("org.eclipse.oomph.launches.TestElementLabelDecorator");

    private static final String JUNIT_PART_NAME = "org.eclipse.jdt.junit.ResultView";

    private final IWindowListener windowListener = new IWindowListener() {
        public void windowOpened(IWorkbenchWindow window) {
            window.addPageListener(pageListener);
        }

        public void windowClosed(IWorkbenchWindow window) {
            window.removePageListener(pageListener);
        }

        public void windowActivated(IWorkbenchWindow window) {
            // Ignore.
        }

        public void windowDeactivated(IWorkbenchWindow window) {
            // Ignore.
        }
    };

    private final IPageListener pageListener = new IPageListener() {
        public void pageOpened(IWorkbenchPage page) {
            page.addPartListener(partListener);
        }

        public void pageClosed(IWorkbenchPage page) {
            page.removePartListener(partListener);
        }

        public void pageActivated(IWorkbenchPage page) {
            // Ignore.
        }
    };

    private final IPartListener partListener = new IPartListener() {
        public void partOpened(IWorkbenchPart part) {
            try {
                if (JUNIT_PART_NAME.equals(part.getSite().getId())) {
                    handleJUnitView(part);
                }
            } catch (Throwable ex) {
                ex.printStackTrace();
            }
        }

        public void partClosed(IWorkbenchPart part) {
            // Ignore.
        }

        public void partActivated(IWorkbenchPart part) {
            // Ignore.
        }

        public void partDeactivated(IWorkbenchPart part) {
            // Ignore.
        }

        public void partBroughtToTop(IWorkbenchPart part) {
            // Ignore.
        }
    };

    public void earlyStartup() {
        if (DECORATE) {
            try {
                IWorkbench workbench = PlatformUI.getWorkbench();

                for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) {
                    for (IWorkbenchPage page : window.getPages()) {
                        for (IViewReference viewReference : page.getViewReferences()) {
                            if (JUNIT_PART_NAME.equals(viewReference.getId())) {
                                final IWorkbenchPart part = viewReference.getView(true);
                                if (part != null) {
                                    workbench.getDisplay().syncExec(new Runnable() {
                                        public void run() {
                                            handleJUnitView(part);
                                        }
                                    });
                                }
                            }
                        }

                        page.addPartListener(partListener);
                    }

                    window.addPageListener(pageListener);
                }

                workbench.addWindowListener(windowListener);
            } catch (Throwable ex) {
                ex.printStackTrace();
            }
        }
    }

    private void handleJUnitView(IWorkbenchPart part) {
        try {
            Object fTestViewer = ReflectUtil.getValue("fTestViewer", part);
            TreeViewer fTreeViewer = ReflectUtil.getValue("fTreeViewer", fTestViewer);
            IStyledLabelProvider fTreeLabelProvider = ReflectUtil.getValue("fTreeLabelProvider", fTestViewer);
            IBaseLabelProvider labelProvider = fTreeViewer.getLabelProvider();

            Constructor<? extends IBaseLabelProvider> constructor = ReflectUtil.getConstructor(
                    labelProvider.getClass(), IStyledLabelProvider.class, ILabelDecorator.class,
                    IDecorationContext.class);
            labelProvider = ReflectUtil.newInstance(constructor, fTreeLabelProvider,
                    new TestElementLabelDecorator(), null);
            fTreeViewer.setLabelProvider(labelProvider);
        } catch (Throwable ex) {
            ex.printStackTrace();
        }
    }
}