blob: a11a9d7da1ae6d5d52edbcfca70352dfadacd083 [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.vaaclipse.ui.preferences.addon;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.internal.preferences.PreferencesService;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.contributions.IContributionFactory;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.MContribution;
import org.eclipse.osbp.vaaclipse.ui.preferences.addon.internal.util.PrefHelper;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.BooleanFieldEditor;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.FieldEditor;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.IntegerFieldEditor;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.PreferencesCategory;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.PreferencesPage;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.ScaleFieldEditor;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.metadata.PreferencesFactory;
import org.eclipse.osbp.vaaclipse.ui.preferences.model.util.PreferencesSwitch;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.service.prefs.Preferences;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import e4modelextension.VaaclipseApplication;
/**
* @author rushan
*
*/
public class PreferencesAddon {
@Inject
MApplication app;
@Inject
IEclipseContext context;
Map<String, Bundle> bundlesByName = new HashMap<>();
Logger logger = LoggerFactory.getLogger(PreferencesAddon.class);
@SuppressWarnings("restriction")
IPreferencesService equinoxPrefService = PreferencesService.getDefault();
IEclipsePreferences root = equinoxPrefService.getRootNode();
private PreferencesAuthorization authService;
private VaaclipseApplication vaaApp;
@PostConstruct
void init() {
vaaApp = (VaaclipseApplication) app;
context.set(VaaclipseApplication.class, vaaApp);
BundleContext bundleContext = FrameworkUtil.getBundle(
PreferencesAddon.class).getBundleContext();
obtainPreferencesAuthService(bundleContext);
for (Bundle b : bundleContext.getBundles()) {
bundlesByName.put(b.getSymbolicName(), b);
}
for (PreferencesCategory c : vaaApp.getPreferencesCategories()) {
setupPreferences(c, "");
}
for (PreferencesPage page : vaaApp.getPreferencesPages()) {
setTypedDefaultValues(page);
initContributions(page);
}
logger.info("Preferences adon activated");
}
private void setupPreferences(PreferencesCategory category,
String currentPath) {
String catPath = currentPath + "/" + category.getId();
if (category.getPage() != null) {
for (FieldEditor<?> editor : category.getPage().getChildren()) {
Bundle bundle = bundlesByName.get(editor.getBundle());
if (bundle != null) {
String absolutePreferencePath = PrefHelper
.toEquinoxPreferencePath(bundle, catPath);
Preferences pref = root.node(absolutePreferencePath);
editor.setPreferences(pref);
editor.setEquinoxPath(absolutePreferencePath);
} else {
logger.warn("Could not find bundle {} for editor {}",
editor.getBundle(), editor);
}
}
}
for (PreferencesCategory childCat : category.getChildCategories()) {
setupPreferences(childCat, catPath);
}
}
private void obtainPreferencesAuthService(BundleContext bundleContext) {
ServiceReference<PreferencesAuthorization> ref = bundleContext
.getServiceReference(PreferencesAuthorization.class);
if (ref != null) {
authService = bundleContext.getService(ref);
context.set(PreferencesAuthorization.class, authService);
}
ServiceReference<PreferencesFactory> prefFactoryRef = bundleContext
.getServiceReference(PreferencesFactory.class);
if (prefFactoryRef != null) {
PreferencesFactory service = bundleContext
.getService(prefFactoryRef);
context.set(PreferencesFactory.class, service);
}
}
private void setTypedDefaultValues(PreferencesPage page) {
for (FieldEditor<?> ed : page.getChildren()) {
FieldEditor<Object> editor = (FieldEditor<Object>) ed;
PreferencesSwitch<?> sw = new PreferencesSwitch() {
@Override
public Object caseBooleanFieldEditor(BooleanFieldEditor object) {
if (object.getDefaultValue() == null)
return false;
return Boolean.valueOf(object.getDefaultValue());
}
@Override
public Object caseScaleFieldEditor(ScaleFieldEditor object) {
if (object.getDefaultValue() == null)
return 0;
return Integer.valueOf(object.getDefaultValue());
}
@Override
public Object caseIntegerFieldEditor(IntegerFieldEditor object) {
if (object.getDefaultValue() == null)
return 0;
return Integer.valueOf(object.getDefaultValue());
}
};
Object converted = sw.doSwitch(editor);
if (converted == null) {
converted = editor.getDefaultValue();
if (converted == null)
converted = "";
}
editor.setDefaultValueTyped(converted);
editor.setDefaultValue(converted.toString());
}
}
@SuppressWarnings("restriction")
private void initContributions(PreferencesPage page) {
for (FieldEditor<?> ed : page.getChildren()) {
if (ed instanceof MContribution) {
MContribution editorWithContribution = (MContribution) ed;
String contributorURI = editorWithContribution
.getContributionURI();
if (contributorURI != null) {
IEclipseContext childContext = context.createChild();
PrefHelper.populateInterfaces(
(FieldEditor<?>) editorWithContribution,
childContext, editorWithContribution.getClass()
.getInterfaces());
IContributionFactory contributionFactory = (IContributionFactory) childContext
.get(IContributionFactory.class.getName());
Object editorContribution = contributionFactory.create(
contributorURI, childContext);
editorWithContribution.setObject(editorContribution);
}
}
}
}
}