org.eclipse.ui.internal.ExtensionEventHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of workbench Show documentation
Show all versions of workbench Show documentation
This plug-in contains the bulk of the Workbench implementation, and depends on JFace, SWT, and Core Runtime. It cannot be used independently from org.eclipse.ui. Workbench client plug-ins should not depend directly on this plug-in.
The newest version!
/*******************************************************************************
* 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();
}
}
});
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy