/* * Copyright (c) 2013 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.ui.service.instance.sample.internal; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import eu.esdihumboldt.hale.common.core.io.Value; import eu.esdihumboldt.hale.ui.common.AttributeEditor; import eu.esdihumboldt.hale.ui.service.instance.sample.Sampler; import eu.esdihumboldt.hale.ui.service.project.ProjectService; /** * Preference page for instance view settings. * * @author Simon Templer */ public class InstanceViewPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { /** * The preference page ID as registered in the extension point. */ public static final String ID = "eu.esdihumboldt.hale.ui.preferences.instanceview"; private final Map<String, Value> samplerSettings = new HashMap<>(); private Button enabled; private AttributeEditor<Value> currentEditor; private Sampler currentSampler; private ComboViewer samplers; private Group samplerGroup; private Button occurringValuesComplete; private boolean ov_changed = false; private boolean changed = false; private final IPropertyChangeListener editorListener = new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (AttributeEditor.VALUE.equals(event.getProperty())) { changed = true; } } }; @Override protected Control createContents(Composite parent) { ProjectService ps = PlatformUI.getWorkbench().getService(ProjectService.class); Composite page = new Composite(parent, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(1).applyTo(page); GridDataFactory.fillDefaults().grab(true, true).applyTo(page); // current sampler settings samplerSettings.clear(); for (Entry<String, Sampler> entry : InstanceViewPreferences.SAMPLERS.entrySet()) { Value settings = ps.getConfigurationService() .getProperty(InstanceViewPreferences.KEY_SETTINGS_PREFIX + entry.getKey()); if (settings.isEmpty()) { settings = entry.getValue().getDefaultSettings(); } samplerSettings.put(entry.getKey(), settings); } // sampler group samplerGroup = new Group(page, SWT.NONE); samplerGroup.setText("Instance sampling"); GridDataFactory.fillDefaults().grab(true, false).applyTo(samplerGroup); GridLayoutFactory.swtDefaults().applyTo(samplerGroup); // enabled button enabled = new Button(samplerGroup, SWT.CHECK); enabled.setText("Use a sub-set of the imported source data as specified below:"); enabled.setSelection(ps.getConfigurationService().getBoolean( InstanceViewPreferences.KEY_ENABLED, InstanceViewPreferences.ENABLED_DEFAULT)); enabled.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { changed = true; } }); // sampler selector samplers = new ComboViewer(samplerGroup); samplers.setContentProvider(ArrayContentProvider.getInstance()); samplers.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Sampler) { return ((Sampler) element).getDisplayName(Value.NULL); } return super.getText(element); } }); GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false); samplers.setInput(InstanceViewPreferences.SAMPLERS.values()); samplers.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection.isEmpty()) { updateEditor(null); } else { if (selection instanceof IStructuredSelection) { updateEditor( (Sampler) ((IStructuredSelection) selection).getFirstElement()); } } changed = true; } }); // restore the selected sampler String samplerId = ps.getConfigurationService().get(InstanceViewPreferences.KEY_SAMPLER, InstanceViewPreferences.SAMPLER_FIRST); Sampler selectedSampler = InstanceViewPreferences.SAMPLERS.get(samplerId); if (selectedSampler != null) { samplers.setSelection(new StructuredSelection(selectedSampler)); changed = false; } // occurring values group Group ovGroup = new Group(page, SWT.NONE); ovGroup.setText("Occurring values"); GridDataFactory.fillDefaults().grab(true, false).applyTo(ovGroup); GridLayoutFactory.swtDefaults().applyTo(ovGroup); // occurring values button occurringValuesComplete = new Button(ovGroup, SWT.CHECK); occurringValuesComplete.setText( "Always use complete source data to determine occurring values (ignore sampling)"); occurringValuesComplete.setSelection(ps.getConfigurationService().getBoolean( InstanceViewPreferences.KEY_OCCURRING_VALUES_USE_EXTERNAL, InstanceViewPreferences.OCCURRING_VALUES_EXTERNAL_DEFAULT)); occurringValuesComplete.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ov_changed = true; } }); return page; } /** * Update the sampler editor. * * @param newSampler the new selected sampler */ protected void updateEditor(Sampler newSampler) { if (currentEditor != null) { // store value for current sampler Value setting = currentEditor.getValue(); samplerSettings.put(InstanceViewPreferences.SAMPLERS.inverse().get(currentSampler), setting); // dispose current editor currentEditor.setPropertyChangeListener(null); currentEditor.getControl().dispose(); } if (newSampler != null) { // create the editor currentEditor = newSampler.createEditor(samplerGroup); if (currentEditor != null) { // set the editor value currentEditor.setValue(samplerSettings .get(InstanceViewPreferences.SAMPLERS.inverse().get(newSampler))); currentEditor.setPropertyChangeListener(editorListener); } } else { currentEditor = null; } currentSampler = newSampler; // updated and re-layout controls samplerGroup.layout(true); } @Override protected void performDefaults() { super.performDefaults(); // update the enabled button with the default enabled.setSelection(InstanceViewPreferences.ENABLED_DEFAULT); // update the settings map with default values for (Entry<String, Sampler> entry : InstanceViewPreferences.SAMPLERS.entrySet()) { samplerSettings.put(entry.getKey(), entry.getValue().getDefaultSettings()); } // update the current editor if (currentEditor != null) { // set the editor value currentEditor.setValue(samplerSettings .get(InstanceViewPreferences.SAMPLERS.inverse().get(currentSampler))); } // select the default sampler Sampler selectedSampler = InstanceViewPreferences.SAMPLERS .get(InstanceViewPreferences.SAMPLER_FIRST); if (selectedSampler != null) { samplers.setSelection(new StructuredSelection(selectedSampler)); } else { samplers.setSelection(StructuredSelection.EMPTY); } changed = true; // update the occurring values button with the default occurringValuesComplete .setSelection(InstanceViewPreferences.OCCURRING_VALUES_EXTERNAL_DEFAULT); ov_changed = true; } @Override public boolean performOk() { ProjectService ps = PlatformUI.getWorkbench().getService(ProjectService.class); if (changed) { if (!MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Reload source data", "Applying the new settings will result in the source data being reloaded.")) { return false; } // save the enabled state ps.getConfigurationService().setBoolean(InstanceViewPreferences.KEY_ENABLED, enabled.getSelection()); // store the current editor value in the map if (currentEditor != null) { // store value for current sampler Value setting = currentEditor.getValue(); samplerSettings.put(InstanceViewPreferences.SAMPLERS.inverse().get(currentSampler), setting); } // store the map in the configuration for (Entry<String, Value> entry : samplerSettings.entrySet()) { ps.getConfigurationService().setProperty( InstanceViewPreferences.KEY_SETTINGS_PREFIX + entry.getKey(), entry.getValue()); } // store the selected sampler Sampler selectedSampler = null; if (!samplers.getSelection().isEmpty()) { selectedSampler = (Sampler) ((IStructuredSelection) samplers.getSelection()) .getFirstElement(); } if (selectedSampler != null) { ps.getConfigurationService().set(InstanceViewPreferences.KEY_SAMPLER, InstanceViewPreferences.SAMPLERS.inverse().get(selectedSampler)); } // reload the data ps.reloadSourceData(); changed = false; } if (ov_changed) { ps.getConfigurationService().setBoolean( InstanceViewPreferences.KEY_OCCURRING_VALUES_USE_EXTERNAL, occurringValuesComplete.getSelection()); ov_changed = false; } return true; } @Override public void init(IWorkbench workbench) { // nothing to do } }