
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 org.eclipse.ui.workbench Show documentation
Show all versions of org.eclipse.ui.workbench Show documentation
This is org.eclipse.ui.workbench jar used by Scout SDK
/*******************************************************************************
* Copyright (c) 2004, 2010 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;
}
@Override
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() {
@Override
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() {
@Override
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