blob: 4c783211619705cf74f4f93382e0e404d1e3535f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 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
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 472654
* Friederike Schertel <friederike@schertel.org> - Bug 478336
*******************************************************************************/
package org.eclipse.ui.internal.menus;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IRegistryChangeEvent;
import org.eclipse.core.runtime.Platform;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
import org.eclipse.e4.ui.model.application.ui.menu.MTrimContribution;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
import org.eclipse.ui.internal.services.RegistryPersistence;
/**
* <p>
* A static class for accessing the registry.
* </p>
* <p>
* This class is not intended for use outside of the
* <code>org.eclipse.ui.workbench</code> plug-in.
* </p>
*
* @since 3.2
*/
final public class MenuPersistence extends RegistryPersistence {
private MApplication application;
private IEclipseContext appContext;
private ArrayList<MenuAdditionCacheEntry> cacheEntries = new ArrayList<>();
private ArrayList<MMenuContribution> menuContributions = new ArrayList<>();
private ArrayList<MToolBarContribution> toolBarContributions = new ArrayList<>();
private ArrayList<MTrimContribution> trimContributions = new ArrayList<>();
private final Comparator<IConfigurationElement> comparer = (c1, c2) -> c1.getContributor().getName().compareToIgnoreCase(c2.getContributor().getName());
private Pattern contributorFilter;
/**
* @param application
* @param appContext
*/
public MenuPersistence(MApplication application, IEclipseContext appContext) {
this.application = application;
this.appContext = appContext;
}
public MenuPersistence(MApplication application, IEclipseContext appContext, String filterRegex) {
this(application, appContext);
contributorFilter = Pattern.compile(filterRegex);
}
@Override
public void dispose() {
ControlContributionRegistry.clear();
application.getMenuContributions().removeAll(menuContributions);
application.getToolBarContributions().removeAll(toolBarContributions);
application.getTrimContributions().removeAll(trimContributions);
menuContributions.clear();
cacheEntries.clear();
super.dispose();
}
@Override
protected boolean isChangeImportant(IRegistryChangeEvent event) {
return false;
}
public void reRead() {
read();
}
@Override
protected final void read() {
super.read();
readAdditions();
ArrayList<MMenuContribution> tmp = new ArrayList<>(menuContributions);
menuContributions.clear();
ContributionsAnalyzer.mergeContributions(tmp, menuContributions);
application.getMenuContributions().addAll(menuContributions);
ArrayList<MToolBarContribution> tmpToolbar = new ArrayList<>(
toolBarContributions);
toolBarContributions.clear();
ContributionsAnalyzer.mergeToolBarContributions(tmpToolbar, toolBarContributions);
application.getToolBarContributions().addAll(toolBarContributions);
ArrayList<MTrimContribution> tmpTrim = new ArrayList<>(trimContributions);
trimContributions.clear();
ContributionsAnalyzer.mergeTrimContributions(tmpTrim, trimContributions);
application.getTrimContributions().addAll(trimContributions);
}
private void readAdditions() {
final IExtensionRegistry registry = Platform.getExtensionRegistry();
ArrayList<IConfigurationElement> configElements = new ArrayList<>();
// Create a cache entry for every menu addition;
for (IConfigurationElement configElement : registry.getConfigurationElementsFor(EXTENSION_MENUS)) {
if (PL_MENU_CONTRIBUTION.equals(configElement.getName())) {
if (contributorFilter == null
|| contributorFilter.matcher(
configElement.getContributor().getName()).matches()) {
configElements.add(configElement);
}
}
}
Collections.sort(configElements, comparer);
Iterator<IConfigurationElement> i = configElements.iterator();
while (i.hasNext()) {
final IConfigurationElement configElement = i.next();
if (isProgramaticContribution(configElement)) {
MenuFactoryGenerator gen = new MenuFactoryGenerator(application, appContext,
configElement,
configElement.getAttribute(IWorkbenchRegistryConstants.TAG_LOCATION_URI));
gen.mergeIntoModel(menuContributions, toolBarContributions, trimContributions);
} else {
MenuAdditionCacheEntry menuContribution = new MenuAdditionCacheEntry(application,
appContext, configElement,
configElement.getAttribute(IWorkbenchRegistryConstants.TAG_LOCATION_URI),
configElement.getNamespaceIdentifier());
cacheEntries.add(menuContribution);
menuContribution.mergeIntoModel(menuContributions, toolBarContributions,
trimContributions);
}
}
}
private boolean isProgramaticContribution(IConfigurationElement menuAddition) {
return menuAddition.getAttribute(IWorkbenchRegistryConstants.ATT_CLASS) != null;
}
}