| /******************************************************************************* |
| * 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 { |
| // RAP [bm]: replaced namespace |
| IExtensionDelta delta[] = event |
| .getExtensionDeltas(PlatformUI.PLUGIN_EXTENSION_NAME_SPACE); |
| IExtension ext; |
| IExtensionPoint extPt; |
| // RAP [rh] fix for bug 290920 |
| // IWorkbenchWindow[] win = PlatformUI.getWorkbench() |
| // .getWorkbenchWindows(); |
| IWorkbenchWindow[] win = workbench.getWorkbenchWindows(); |
| // End of fix |
| 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; |
| } |
| // RAP [if]: need session aware messages |
| final StringBuffer message = new StringBuffer( |
| // ExtensionEventHandlerMessages.ExtensionEventHandler_following_changes); |
| ExtensionEventHandlerMessages.get().ExtensionEventHandler_following_changes); |
| |
| for (Iterator i = changeList.iterator(); i.hasNext();) { |
| message.append(i.next()); |
| } |
| |
| // message.append(ExtensionEventHandlerMessages.ExtensionEventHandler_need_to_reset); |
| message.append(ExtensionEventHandlerMessages.get().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())) { |
| ExtensionEventHandlerMessages.get().ExtensionEventHandler_reset_perspective, message.toString())) { |
| IWorkbenchPage page = window.getActivePage(); |
| if (page == null) { |
| return; |
| } |
| page.resetPerspective(); |
| } |
| } |
| }); |
| |
| } |
| } |