| /** |
| * 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 v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * 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); |
| } |
| } |
| } |
| } |
| } |