org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2009 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.java.ui;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.context.core.ContextCore;
import org.eclipse.mylyn.context.ui.IContextUiStartup;
import org.eclipse.mylyn.internal.java.ui.editor.ActiveFoldingListener;
import org.eclipse.mylyn.internal.java.ui.editor.BreakpointEditorTracker;
import org.eclipse.mylyn.monitor.ui.MonitorUi;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.progress.UIJob;
import org.osgi.framework.BundleContext;

/**
 * @author Mik Kersten
 * @author Steffen Pingel
 */
public class JavaUiBridgePlugin extends AbstractUIPlugin {

    public static final String ID_PLUGIN = "org.eclipse.mylyn.java.ui"; //$NON-NLS-1$

    public static final String AUTO_FOLDING_ENABLED = "org.eclipse.mylyn.context.ui.editor.folding.enabled"; //$NON-NLS-1$

    private static JavaUiBridgePlugin INSTANCE;

    private ActiveFoldingEditorTracker editorTracker;

    private TypeHistoryManager typeHistoryManager;

    private LandmarkMarkerManager landmarkMarkerManager;

    private JavaEditingMonitor javaEditingMonitor;

    private InterestUpdateDeltaListener javaElementChangeListener;

    private BreakpointEditorTracker breakpointEditorTracker;

    private static final String MYLYN_PREVIOUS_RUN = "org.eclipse.mylyn.ui.first.run.0_4_9"; //$NON-NLS-1$

    private static final String MYLYN_RUN_COUNT_3_1 = "org.eclipse.mylyn.java.ui.run.count.3_1_0"; //$NON-NLS-1$

    private static final String MYLYN_RUN_COUNT_3_10 = "org.eclipse.mylyn.java.ui.run.count.3_10_0"; //$NON-NLS-1$

    private static final String NUM_COMPUTERS_PREF_KEY = "content_assist_number_of_computers"; //$NON-NLS-1$

    public JavaUiBridgePlugin() {
    }

    /**
     * Startup order is critical.
     */
    @Override
    public void start(BundleContext context) throws Exception {
        super.start(context);
        INSTANCE = this;

        IPreferenceStore javaPrefs = JavaPlugin.getDefault().getPreferenceStore();
        // NOTE: moved out of wizard and first task activation to avoid bug 194766
        int count = getPreferenceStore().getInt(MYLYN_RUN_COUNT_3_1);
        if (count < 1) {
            getPreferenceStore().setValue(MYLYN_RUN_COUNT_3_1, count + 1);

            // Mylyn 3.1 removes 2 computers, migrate JDT setting on first run to avoid prevent JDT from displaying a warning dialog 
            if (count == 0 && getPreferenceStore().contains(MYLYN_PREVIOUS_RUN)) {
                changeProcessorCount(javaPrefs, -2);
            }

            // try installing Task-Focused content assist twice
            new UIJob("Initialize Content Assist") { //$NON-NLS-1$
                @Override
                public IStatus runInUIThread(IProgressMonitor monitor) {
                    IPreferenceStore store = JavaPlugin.getDefault().getPreferenceStore();
                    JavaUiUtil.installContentAssist(store, true);
                    return Status.OK_STATUS;
                }
            }.schedule();
        }

        int count_3_10 = getPreferenceStore().getInt(MYLYN_RUN_COUNT_3_10);
        if (count_3_10 < 1) {
            getPreferenceStore().setValue(MYLYN_RUN_COUNT_3_10, count_3_10 + 1);

            // check that the PDE bridge is installed and we are migrating from a previous version
            if (Platform.getBundle("org.eclipse.mylyn.pde.ui") != null && count > 0) { //$NON-NLS-1$
                // Mylyn 3.10 removes 1 computer for PDE API Tooling
                changeProcessorCount(javaPrefs, -1);
            }
        }

        // the Task-Focused category should be disabled if the user reverts to the default 
        String defaultValue = javaPrefs.getDefaultString(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES);
        javaPrefs.setDefault(PreferenceConstants.CODEASSIST_EXCLUDED_CATEGORIES,
                defaultValue + JavaUiUtil.ASSIST_MYLYN_ALL + JavaUiUtil.SEPARATOR_CODEASSIST);
    }

    public void changeProcessorCount(IPreferenceStore javaPrefs, int delta) {
        if (javaPrefs.contains(NUM_COMPUTERS_PREF_KEY)) {
            int lastNumberOfComputers = javaPrefs.getInt(NUM_COMPUTERS_PREF_KEY);
            if (lastNumberOfComputers > 0) {
                javaPrefs.putValue(NUM_COMPUTERS_PREF_KEY, Integer.toString(lastNumberOfComputers + delta));
            }
        }
    }

    private void lazyStart() {
        landmarkMarkerManager = new LandmarkMarkerManager();
        ContextCore.getContextManager().addListener(landmarkMarkerManager);

        javaEditingMonitor = new JavaEditingMonitor();
        MonitorUi.getSelectionMonitors().add(javaEditingMonitor);
        installEditorTracker(PlatformUI.getWorkbench());

        javaElementChangeListener = new InterestUpdateDeltaListener();
        JavaCore.addElementChangedListener(javaElementChangeListener);

        try {
            typeHistoryManager = new TypeHistoryManager();
            ContextCore.getContextManager().addListener(typeHistoryManager);
        } catch (Throwable t) {
            // FIXME review error message
            StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
                    "Could not install type history manager: incompatible Eclipse version", t)); //$NON-NLS-1$
        }

        breakpointEditorTracker = new BreakpointEditorTracker();
        breakpointEditorTracker.install(PlatformUI.getWorkbench());
    }

    private void lazyStop() {
        if (typeHistoryManager != null) {
            ContextCore.getContextManager().removeListener(typeHistoryManager);
        }
        if (landmarkMarkerManager != null) {
            ContextCore.getContextManager().removeListener(landmarkMarkerManager);
        }
        if (javaEditingMonitor != null) {
            MonitorUi.getSelectionMonitors().remove(javaEditingMonitor);
        }
        if (javaElementChangeListener != null) {
            JavaCore.removeElementChangedListener(javaElementChangeListener);
        }
        if (breakpointEditorTracker != null) {
            breakpointEditorTracker.dispose(PlatformUI.getWorkbench());
        }
        // TODO: uninstall editor tracker
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        lazyStop();

        super.stop(context);
        INSTANCE = null;
    }

    private void installEditorTracker(IWorkbench workbench) {
        editorTracker = new ActiveFoldingEditorTracker();
        editorTracker.install(workbench);

        // update editors that are already opened
        for (IWorkbenchWindow w : PlatformUI.getWorkbench().getWorkbenchWindows()) {
            IWorkbenchPage page = w.getActivePage();
            if (page != null) {
                IEditorReference[] references = page.getEditorReferences();
                for (IEditorReference reference : references) {
                    IEditorPart part = reference.getEditor(false);
                    if (part != null && part instanceof JavaEditor) {
                        JavaEditor editor = (JavaEditor) part;
                        editorTracker.registerEditor(editor);
                        ActiveFoldingListener.resetProjection(editor);
                    }
                }
            }
        }
    }

    /**
     * Returns the shared instance.
     */
    public static JavaUiBridgePlugin getDefault() {
        return INSTANCE;
    }

    /**
     * Returns an image descriptor for the image file at the given plug-in relative path.
     * 
     * @param path
     *            the path
     * @return the image descriptor
     */
    public static ImageDescriptor getImageDescriptor(String path) {
        return AbstractUIPlugin.imageDescriptorFromPlugin(ID_PLUGIN, path);
    }

    /**
     * For testing.
     */
    public ActiveFoldingEditorTracker getEditorTracker() {
        return editorTracker;
    }

    public static class JavaUiBridgeStartup implements IContextUiStartup {

        public void lazyStartup() {
            JavaUiBridgePlugin.getDefault().lazyStart();
        }

    }

}