Package org.eclipse.ui.internal

Source Code of org.eclipse.ui.internal.ExtensionEventHandler

/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation 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:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

package org.eclipse.ui.internal;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionDelta;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.IRegistryChangeListener;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.eclipse.ui.internal.themes.ColorDefinition;
import org.eclipse.ui.internal.themes.FontDefinition;
import org.eclipse.ui.internal.themes.ThemeElementHelper;
import org.eclipse.ui.internal.themes.ThemeRegistry;
import org.eclipse.ui.internal.themes.ThemeRegistryReader;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;

class ExtensionEventHandler implements IRegistryChangeListener {
   
    private Workbench workbench;

    private List changeList = new ArrayList(10);

    public ExtensionEventHandler(Workbench workbench) {
        this.workbench = workbench;
    }

    public void registryChanged(IRegistryChangeEvent event) {
        try {
            IExtensionDelta delta[] = event
                    .getExtensionDeltas(WorkbenchPlugin.PI_WORKBENCH);
            IExtension ext;
            IExtensionPoint extPt;
            IWorkbenchWindow[] win = PlatformUI.getWorkbench()
                    .getWorkbenchWindows();
            if (win.length == 0) {
        return;
      }
            Display display = win[0].getShell().getDisplay();
            if (display == null) {
        return;
      }
            ArrayList appearList = new ArrayList(5);
            ArrayList revokeList = new ArrayList(5);
            String id = null;
            int numPerspectives = 0;
            int numActionSetPartAssoc = 0;

            // push action sets and perspectives to the top because incoming
            // actionSetPartAssociations and perspectiveExtensions may depend upon
            // them for their bindings.   
            for (int i = 0; i < delta.length; i++) {
                id = delta[i].getExtensionPoint().getSimpleIdentifier();
                if (delta[i].getKind() == IExtensionDelta.ADDED) {
                    if (id.equals(IWorkbenchRegistryConstants.PL_ACTION_SETS)) {
            appearList.add(0, delta[i]);
          } else if (!id.equals(IWorkbenchRegistryConstants.PL_PERSPECTIVES)
                            && !id.equals(IWorkbenchRegistryConstants.PL_VIEWS)
                            && !id.equals(IWorkbenchRegistryConstants.PL_ACTION_SETS)) {
            appearList.add(appearList.size() - numPerspectives,
                                delta[i]);
          }
                } else {
                    if (delta[i].getKind() == IExtensionDelta.REMOVED) {
                        if (id
                                .equals(IWorkbenchRegistryConstants.PL_ACTION_SET_PART_ASSOCIATIONS)) {
                            revokeList.add(0, delta[i]);
                            numActionSetPartAssoc++;
                        } else if (id
                                .equals(IWorkbenchRegistryConstants.PL_PERSPECTIVES)) {
              revokeList.add(numActionSetPartAssoc, delta[i]);
            } else {
              revokeList.add(delta[i]);
            }
                    }
                }
            }
            Iterator iter = appearList.iterator();
            IExtensionDelta extDelta = null;
            while (iter.hasNext()) {
                extDelta = (IExtensionDelta) iter.next();
                extPt = extDelta.getExtensionPoint();
                ext = extDelta.getExtension();
                asyncAppear(display, extPt, ext);
            }
            // Suspend support for removing a plug-in until this is more stable
            //    iter = revokeList.iterator();
            //    while(iter.hasNext()) {
            //      extDelta = (IExtensionDelta) iter.next();
            //      extPt = extDelta.getExtensionPoint();
            //      ext = extDelta.getExtension();
            //      asyncRevoke(display, extPt, ext);
            //    }

            resetCurrentPerspective(display);
        } finally {
            //ensure the list is cleared for the next pass through
            changeList.clear();
        }

    }

    private void asyncAppear(Display display, final IExtensionPoint extpt,
            final IExtension ext) {
        Runnable run = new Runnable() {
            public void run() {
                appear(extpt, ext);
            }
        };
        display.syncExec(run);
    }
   
    private void appear(IExtensionPoint extPt, IExtension ext) {
        String name = extPt.getSimpleIdentifier();
        if (name.equalsIgnoreCase(IWorkbenchRegistryConstants.PL_FONT_DEFINITIONS)) {
            loadFontDefinitions(ext);
            return;
        }
        if (name.equalsIgnoreCase(IWorkbenchRegistryConstants.PL_THEMES)) {
            loadThemes(ext);
            return;
        }
    }

    /**
     * @param ext
     */
    private void loadFontDefinitions(IExtension ext) {
        ThemeRegistryReader reader = new ThemeRegistryReader();
        reader.setRegistry((ThemeRegistry) WorkbenchPlugin.getDefault()
                .getThemeRegistry());
        IConfigurationElement[] elements = ext.getConfigurationElements();
        for (int i = 0; i < elements.length; i++) {
      reader.readElement(elements[i]);
    }

        Collection fonts = reader.getFontDefinitions();
        FontDefinition[] fontDefs = (FontDefinition[]) fonts
                .toArray(new FontDefinition[fonts.size()]);
        ThemeElementHelper.populateRegistry(workbench.getThemeManager()
        .getTheme(IThemeManager.DEFAULT_THEME), fontDefs, PrefUtil
        .getInternalPreferenceStore());
    }

    //TODO: confirm
    private void loadThemes(IExtension ext) {
        ThemeRegistryReader reader = new ThemeRegistryReader();
        ThemeRegistry registry = (ThemeRegistry) WorkbenchPlugin.getDefault()
                .getThemeRegistry();
        reader.setRegistry(registry);
        IConfigurationElement[] elements = ext.getConfigurationElements();
        for (int i = 0; i < elements.length; i++) {
      reader.readElement(elements[i]);
    }

        Collection colors = reader.getColorDefinitions();
        ColorDefinition[] colorDefs = (ColorDefinition[]) colors
                .toArray(new ColorDefinition[colors.size()]);

        ITheme theme = workbench.getThemeManager().getTheme(
                IThemeManager.DEFAULT_THEME);
        ThemeElementHelper.populateRegistry(theme, colorDefs, PrefUtil
        .getInternalPreferenceStore());

        Collection fonts = reader.getFontDefinitions();
        FontDefinition[] fontDefs = (FontDefinition[]) fonts
                .toArray(new FontDefinition[fonts.size()]);
        ThemeElementHelper.populateRegistry(theme, fontDefs, PrefUtil
        .getInternalPreferenceStore());

        Map data = reader.getData();
        registry.addData(data);
    }

    private void resetCurrentPerspective(Display display) {
        if (changeList.isEmpty()) {
      return;
    }

        final StringBuffer message = new StringBuffer(
                ExtensionEventHandlerMessages.ExtensionEventHandler_following_changes);

        for (Iterator i = changeList.iterator(); i.hasNext();) {
            message.append(i.next());
        }

        message.append(ExtensionEventHandlerMessages.ExtensionEventHandler_need_to_reset);

        display.asyncExec(new Runnable() {
            public void run() {
                Shell parentShell = null;
                IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
                if (window == null) {
                    if (workbench.getWorkbenchWindowCount() == 0) {
            return;
          }
                    window = workbench.getWorkbenchWindows()[0];
                }

                parentShell = window.getShell();

                if (MessageDialog
                        .openQuestion(
                                parentShell,
                                ExtensionEventHandlerMessages.ExtensionEventHandler_reset_perspective, message.toString())) {
                    IWorkbenchPage page = window.getActivePage();
                    if (page == null) {
            return;
          }
                    page.resetPerspective();
                }
            }
        });

    }
}
TOP

Related Classes of org.eclipse.ui.internal.ExtensionEventHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.