diff options
author | Arthur Daussy | 2014-03-20 13:02:05 +0000 |
---|---|---|
committer | Axel Richard | 2014-03-31 16:53:00 +0000 |
commit | b90eb542179909786520502d6586451fa88dc2a7 (patch) | |
tree | f2324f811f31ebf3b082abbb260d84ad381a2236 | |
parent | 54e2b5480202ca3ba7018648f317064417871835 (diff) | |
download | org.eclipse.emf.compare-b90eb542179909786520502d6586451fa88dc2a7.tar.gz org.eclipse.emf.compare-b90eb542179909786520502d6586451fa88dc2a7.tar.xz org.eclipse.emf.compare-b90eb542179909786520502d6586451fa88dc2a7.zip |
[430682] Preference page for Model Resolving mechanism
Create preference page for customization of the model resolving
mechanism.
Bug: 430682
Change-Id: I79b2ceca5f79af917201dbf5b8d3120e94e42992
Signed-off-by: Arthur Daussy <arthur.daussy@obeo.fr>
7 files changed, 296 insertions, 5 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/plugin.properties b/plugins/org.eclipse.emf.compare.ide.ui/plugin.properties index bc1155304..94666fb46 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/plugin.properties +++ b/plugins/org.eclipse.emf.compare.ide.ui/plugin.properties @@ -24,4 +24,4 @@ compare.with.label = Compare With resolver.logicalmodelresolver.label = Resolve descendants resolver.logicalmodelresolver.description = Resolve all resources referenced by the current resource. resolver.projectresolver.label = Resolve in project -resolver.projectresolver.description = Resolve resources referenced by the current resource and all resources referencing to the current resource within its containing project.
\ No newline at end of file +resolver.projectresolver.description = Resolve resources referenced by the current resource and all resources referencing the current resource within its containing project. diff --git a/plugins/org.eclipse.emf.compare.ide.ui/plugin.xml b/plugins/org.eclipse.emf.compare.ide.ui/plugin.xml index 919590cf3..d9866e5db 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/plugin.xml +++ b/plugins/org.eclipse.emf.compare.ide.ui/plugin.xml @@ -252,4 +252,13 @@ ranking="1"> </resolver> </extension> + <extension + point="org.eclipse.ui.preferencePages"> + <page + category="org.eclipse.emf.compare.rcp.ui.preferencePage.global" + class="org.eclipse.emf.compare.ide.ui.internal.preferences.ModelResolutionPreferencePage" + id="org.eclipse.emf.compare.ide.ui.preferencepage.resolvers" + name="Resolution strategy"> + </page> + </extension> </plugin> diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java index 5edc7b804..a134c1a27 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/EMFCompareIDEUIPlugin.java @@ -207,4 +207,13 @@ public class EMFCompareIDEUIPlugin extends AbstractUIPlugin { getLog().log(new Status(severity, PLUGIN_ID, message)); } + /** + * Return the model resolver manager. + * + * @return + */ + public ModelResolverManager getModelResolverManager() { + return modelResolverManager; + } + } diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties index 2478caf72..d0644276a 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties @@ -42,4 +42,11 @@ redo.menu.item.text = Merge CompareSelfWithAncestor = Cannot run a comparison between an object and one of its ancestors. wait.viewer.desc = Please wait for the comparison computation to finish... -wait.viewer.title = Please wait...
\ No newline at end of file +wait.viewer.title = Please wait... + +ModelResolutionPreferencePage.forcedresolver.default.value.label = Default +ModelResolutionPreferencePage.forcedresolver.default.value.description = Use default resolver. +ModelResolutionPreferencePage.introduction.label = Choose the default model resolver for EMF Compare: +ModelResolutionPreferencePage.description.label = Description +ModelResolutionPreferencePage.enable.resolution.checkbox = Enable model resolution + diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverManager.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverManager.java index 2b2b63e74..b5e14a6e3 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverManager.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverManager.java @@ -139,7 +139,7 @@ public class ModelResolverManager { * * @return True if the resolving mechanism is disabled. */ - public boolean isResolvingEnable() { + public boolean isResolutionEnable() { return Boolean.valueOf(preferenceStore.get(DISABLE_RESOLVING_PREF_KEY, Boolean.TRUE.toString())) .booleanValue(); } @@ -149,7 +149,7 @@ public class ModelResolverManager { * * @param isEnabled */ - public void setResolving(boolean isEnabled) { + public void setResolution(boolean isEnabled) { if (isEnabled) { preferenceStore.remove(DISABLE_RESOLVING_PREF_KEY); } else { diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverRegistryImpl.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverRegistryImpl.java index 79038eb00..38187565b 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverRegistryImpl.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/logical/ModelResolverRegistryImpl.java @@ -46,7 +46,7 @@ public final class ModelResolverRegistryImpl implements IModelResolverRegistry { * @see org.eclipse.emf.compare.ide.ui.internal.logical.IModelResolverRegistry#getBestResolverFor(org.eclipse.core.resources.IStorage) */ public IModelResolver getBestResolverFor(IStorage sourceStorage) { - if (!resolverManager.isResolvingEnable()) { + if (!resolverManager.isResolutionEnable()) { return noResolvingResolver; } ModelResolverDescriptor resolver = resolverManager.getUserSelectedResolver(); diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/preferences/ModelResolutionPreferencePage.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/preferences/ModelResolutionPreferencePage.java new file mode 100644 index 000000000..d190f0cef --- /dev/null +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/preferences/ModelResolutionPreferencePage.java @@ -0,0 +1,266 @@ +/******************************************************************************* + * Copyright (c) 2014 Obeo. + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.emf.compare.ide.ui.internal.preferences; + +import com.google.common.collect.Lists; + +import java.util.ArrayList; +import java.util.Collections; + +import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIMessages; +import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin; +import org.eclipse.emf.compare.ide.ui.internal.logical.ModelResolverDescriptor; +import org.eclipse.emf.compare.ide.ui.internal.logical.ModelResolverManager; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +/** + * Preference page for "Model resolution" preference. + * + * @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a> + */ +public class ModelResolutionPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { + + /** Label for default value of "forced resolver" preference. */ + private static final String DEFAULT_LABEL_VALUE = EMFCompareIDEUIMessages + .getString("ModelResolutionPreferencePage.forcedresolver.default.value.label"); //$NON-NLS-1$ + + /** Description for default value of "forced resolver" preference. */ + private static final String DEFAULT_DESCRIPTION_VALUE = EMFCompareIDEUIMessages + .getString("ModelResolutionPreferencePage.forcedresolver.default.value.description"); //$NON-NLS-1$ + + /** Index for default value of "forced resolver" preference. */ + private static final int DEFAULT_VALUE_INDEX = 0; + + /** {@link ModelResolverManager} */ + private final ModelResolverManager modelResolverManager = EMFCompareIDEUIPlugin.getDefault() + .getModelResolverManager(); + + /** User selected resolver. This should be null if the default strategy is chosen. */ + private ModelResolverDescriptor userSelectedResolver; + + /** Is set to true if the "Model resolution" should be enabled. */ + private boolean isEnabled; + + private Button enableModelResolutionButton; + + /** + * List of element that need to be enabled or disabled depending on state of + * {@link ModelResolutionPreferencePage#isEnabled} + */ + private ArrayList<Control> activableElements; + + /** Forced resolver combo chooser. */ + private Combo resolverCombo; + + /** Label displaying the description of {@link ModelResolutionPreferencePage#userSelectedResolver} */ + private Label descriptionLabel; + + /** + * {@inheritDoc} + */ + @Override + protected Control createContents(Composite parent) { + activableElements = Lists.newArrayList(); + // Init data value + isEnabled = modelResolverManager.isResolutionEnable(); + userSelectedResolver = modelResolverManager.getUserSelectedResolver(); + + Composite mainContainer = new Composite(parent, SWT.NONE); + mainContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + mainContainer.setLayout(new GridLayout(1, false)); + + createEnablementCheckBox(mainContainer); + + Composite resolutionStrategyComposite = createModelResolverComposite(mainContainer); + + createCombo(resolutionStrategyComposite); + + createDescription(resolutionStrategyComposite); + + updateDescription(); + updateWidgetEnablement(); + + return mainContainer; + } + + /** + * Create main composite for the preferences. + * + * @param mainContainer + * @return {@link Composite} + */ + private Composite createModelResolverComposite(Composite mainContainer) { + Composite resolutionStrategyComposite = new Composite(mainContainer, SWT.BORDER); + GridLayout groupLayout = new GridLayout(2, false); + resolutionStrategyComposite.setLayout(groupLayout); + resolutionStrategyComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + Label introductionLabel = new Label(resolutionStrategyComposite, SWT.NONE); + GridData introLabelData = new GridData(SWT.BEGINNING, SWT.CENTER, false, false); + introLabelData.horizontalSpan = 2; + introductionLabel.setLayoutData(introLabelData); + introductionLabel.setText(EMFCompareIDEUIMessages + .getString("ModelResolutionPreferencePage.introduction.label")); //$NON-NLS-1$ + activableElements.add(introductionLabel); + return resolutionStrategyComposite; + } + + /** + * Enable/Disable all widget from activableElements depending on the state of isEnabled. + */ + private void updateWidgetEnablement() { + enableModelResolutionButton.setSelection(isEnabled); + for (Control controlToDisable : activableElements) { + if (!controlToDisable.isDisposed()) { + controlToDisable.setEnabled(isEnabled); + } + } + } + + /** + * Update the description field using {@link ModelResolutionPreferencePage#userSelectedResolver} as input. + */ + private void updateDescription() { + if (descriptionLabel != null && !descriptionLabel.isDisposed()) { + if (userSelectedResolver != null) { + descriptionLabel.setText(userSelectedResolver.getDescription()); + } else { + descriptionLabel.setText(DEFAULT_DESCRIPTION_VALUE); + } + } + } + + /** + * Create the description field. + * + * @param resolutionStrategyComposite + */ + private void createDescription(Composite resolutionStrategyComposite) { + Group descriptionGroup = new Group(resolutionStrategyComposite, SWT.NONE); + descriptionGroup.setText(EMFCompareIDEUIMessages + .getString("ModelResolutionPreferencePage.description.label")); //$NON-NLS-1$ + GridData groupLayoutData = new GridData(SWT.FILL, SWT.TOP, true, false); + descriptionGroup.setLayoutData(groupLayoutData); + GridLayout descriptionGroupLayout = new GridLayout(1, false); + activableElements.add(descriptionGroup); + + descriptionGroup.setLayout(descriptionGroupLayout); + descriptionLabel = new Label(descriptionGroup, SWT.WRAP); + GridData descriptionLayoutData = new GridData(SWT.FILL, SWT.TOP, true, true); + descriptionLayoutData.minimumHeight = 50; + descriptionLayoutData.minimumWidth = 500; + descriptionLabel.setLayoutData(descriptionLayoutData); + activableElements.add(descriptionLabel); + + } + + /** + * Create the checkbox in charge of enabling/disabling the model resolution mechanism. + * + * @param resolutionStrategyComposite + */ + private void createEnablementCheckBox(Composite resolutionStrategyComposite) { + enableModelResolutionButton = new Button(resolutionStrategyComposite, SWT.CHECK); + enableModelResolutionButton.setText(EMFCompareIDEUIMessages + .getString("ModelResolutionPreferencePage.enable.resolution.checkbox")); //$NON-NLS-1$ + enableModelResolutionButton.setSelection(isEnabled); + GridData checkBoxGridData = new GridData(SWT.FILL, SWT.TOP, true, false); + enableModelResolutionButton.setLayoutData(checkBoxGridData); + enableModelResolutionButton.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + isEnabled = enableModelResolutionButton.getSelection(); + updateWidgetEnablement(); + } + + }); + } + + /** + * Create the combo used to choose {@link ModelResolutionPreferencePage#userSelectedResolver} + * + * @param resolutionStrategyComposite + */ + private void createCombo(Composite resolutionStrategyComposite) { + ArrayList<ModelResolverDescriptor> resolvers = Lists.newArrayList(modelResolverManager + .getAllResolver()); + Collections.sort(resolvers); + String[] comboLabels = new String[resolvers.size() + 1]; + final ModelResolverDescriptor[] comboValues = new ModelResolverDescriptor[resolvers.size() + 1]; + + int forcedResolverInitialValueIndex = 0; + + comboLabels[DEFAULT_VALUE_INDEX] = DEFAULT_LABEL_VALUE; + comboValues[DEFAULT_VALUE_INDEX] = null; + + for (int index = 1; index <= resolvers.size(); index++) { + ModelResolverDescriptor modelResolverDescriptor = resolvers.get(index - 1); + comboLabels[index] = modelResolverDescriptor.getLabel(); + comboValues[index] = modelResolverDescriptor; + if (userSelectedResolver == modelResolverDescriptor) { + forcedResolverInitialValueIndex = index; + } + } + resolverCombo = new Combo(resolutionStrategyComposite, SWT.DROP_DOWN); + resolverCombo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); + resolverCombo.setItems(comboLabels); + resolverCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + + int selectionIndex = resolverCombo.getSelectionIndex(); + if (DEFAULT_VALUE_INDEX == selectionIndex) { + userSelectedResolver = null; + } else { + String currentValue = comboValues[selectionIndex].getId(); + userSelectedResolver = modelResolverManager.getDescriptor(currentValue); + } + updateDescription(); + } + }); + resolverCombo.select(forcedResolverInitialValueIndex); + activableElements.add(resolverCombo); + } + + @Override + public boolean performOk() { + modelResolverManager.setForcedResolver(userSelectedResolver); + modelResolverManager.setResolution(isEnabled); + return super.performOk(); + } + + @Override + protected void performDefaults() { + userSelectedResolver = null; + resolverCombo.select(DEFAULT_VALUE_INDEX); + isEnabled = true; + updateDescription(); + updateWidgetEnablement(); + super.performDefaults(); + } + + public void init(IWorkbench workbench) { + } +} |