/* * Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.csstudio.sds.ui.internal.preferences; import java.util.ArrayList; import java.util.Dictionary; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.csstudio.sds.internal.preferences.PreferenceConstants; import org.csstudio.sds.internal.preferences.WidgetSelectionStringConverter; import org.csstudio.sds.model.WidgetModelFactoryService; import org.csstudio.sds.ui.SdsUiPlugin; import org.csstudio.ui.util.CustomMediaFactory; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.preference.ColorFieldEditor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IntegerFieldEditor; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; /** * A preference page to set the options for the display editors. * * @author Kai Meyer */ public final class WidgetOptionPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { /** * The {@link org.eclipse.jface.viewers.TreeViewer} to show the available widgets. */ private CheckboxTreeViewer _viewer; private ColorFieldEditor _cfeColor; private IntegerFieldEditor _ifeLine; /** * Constructor. */ public WidgetOptionPreferencePage() { super(); this.setMessage("Choose the widgets you want to use in the SDS"); } /** * Constructor. * @param title The title for this page */ public WidgetOptionPreferencePage(final String title) { super(title); this.setMessage("Choose the widgets you want to use in the SDS"); } /** * Constructor. * @param title The title for this page * @param image The image for this page */ public WidgetOptionPreferencePage(final String title, final ImageDescriptor image) { super(title, image); this.setMessage("Choose the widgets you want to use in the SDS"); } /** * * (@inheritDoc) */ @Override public void init(final IWorkbench workbench) { // nothing to do } /** * {@inheritDoc} */ @Override protected Control createContents(final Composite parent) { final Composite mainComposite = new Composite(parent, SWT.NONE); mainComposite.setLayout(new GridLayout(1, false)); Label label = new Label(mainComposite, SWT.WRAP); label.setText("Registered widgets:"); label.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,false)); _viewer = new CheckboxTreeViewer(mainComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK); final GridData gridData = new GridData(SWT.FILL,SWT.FILL,false,true); gridData.widthHint = 300; _viewer.getTree().setLayoutData(gridData); WidgetContentProvider contentProvider = new WidgetContentProvider(); _viewer.setContentProvider(contentProvider); _viewer.setLabelProvider(new WidgetLabelProvider()); _viewer.getTree().addSelectionListener(new TreeCheckSelectionListener()); _viewer.setInput(WidgetModelFactoryService.getInstance()); label = new Label(mainComposite, SWT.WRAP); label.setText("Changing these settings requires a re-opening of all active SDS-editors."); label.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,false)); _viewer.expandAll(); final String widgets = this.getPreferenceStore().getString(PreferenceConstants.PROP_DESELECTED_WIDGETS); selectItems(contentProvider, widgets); _viewer.collapseAll(); Label label2 = new Label(mainComposite, SWT.SEPARATOR | SWT.HORIZONTAL); label2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); createCrossWidgetPart(mainComposite); return mainComposite; } /** * @param mainComposite */ private void createCrossWidgetPart(final Composite mainComposite) { Composite color = new Composite(mainComposite, SWT.NONE); color.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); color.setLayout(new GridLayout(1, false)); _cfeColor = new ColorFieldEditor("Widget Cross Color","Widget Cross Color", color); _cfeColor.setPreferenceName(PreferenceConstants.PROP_CROSSED_WIDGET_COLOR); _cfeColor.setPreferenceStore(getPreferenceStore()); _cfeColor.load(); _cfeColor.getColorSelector().addListener(new IPropertyChangeListener(){ @Override public void propertyChange(final PropertyChangeEvent event) { _cfeColor.getColorSelector().setColorValue((RGB) event.getNewValue()); } }); _ifeLine = new IntegerFieldEditor("Widget Cross Line width", "Widget Cross Line width", color); _ifeLine.setPreferenceName(PreferenceConstants.PROP_CROSSED_WIDGET_LINE_WIDTH); _ifeLine.setPreferenceStore(getPreferenceStore()); _ifeLine.setValidRange(0, 9); _ifeLine.load(); } /** * Sets the initial selection of the tree. * @param contentProvider The ContentProvider of the Tree * @param widgetsExcluded The string, which contains all not selected widget-IDs */ private void selectItems(final WidgetContentProvider contentProvider, final String widgetsExcluded) { final List<String> widgetIds = WidgetSelectionStringConverter.createStringListFromString(widgetsExcluded); for (PluginTreeElement plugin : contentProvider.getElements()) { boolean allChecked = true; boolean oneChecked = false; for (WidgetTreeElement widget : plugin.getElements()) { if ( !widgetIds.contains(widget.getId()) ) { oneChecked = true; _viewer.setChecked(widget, true); } else { allChecked = false; _viewer.setChecked(widget, false); } } _viewer.setGrayed(plugin, !allChecked); _viewer.setChecked(plugin, oneChecked); } } /** * {@inheritDoc} */ @Override public boolean performOk() { final String storedString = WidgetSelectionStringConverter.createStringFromStringList(getNotCheckedWidgets()); this.getPreferenceStore().putValue(PreferenceConstants.PROP_DESELECTED_WIDGETS, storedString); _cfeColor.store(); _ifeLine.store(); return super.performOk(); } /** * {@inheritDoc} */ @Override protected IPreferenceStore doGetPreferenceStore() { return SdsUiPlugin.getCorePreferenceStore(); } /** * Returns all not selected widgets. * @return A list of the widget-IDs */ private List<String> getNotCheckedWidgets() { final List<String> result = new LinkedList<String>(); _viewer.expandAll(); Object[] elements = _viewer.getExpandedElements(); for (Object current : elements) { if (current instanceof PluginTreeElement) { PluginTreeElement plugin = (PluginTreeElement) current; for (WidgetTreeElement widget : plugin.getElements()) { if (!_viewer.getChecked(widget)) { result.add(widget.getId()); } } } } return result; } /** * The {@link ITreeContentProvider} for the tree. * @author Kai Meyer * */ private final class WidgetContentProvider implements ITreeContentProvider { private PluginTreeElement[] _elements; /** * {@inheritDoc} */ @Override public Object[] getChildren(final Object parentElement) { if (parentElement instanceof PluginTreeElement) { return ((PluginTreeElement) parentElement).getElements(); } return null; } /** * {@inheritDoc} */ @Override public Object getParent(final Object element) { return null; } /** * {@inheritDoc} */ @Override public boolean hasChildren(final Object element) { if (element instanceof PluginTreeElement) { return ((PluginTreeElement) element).hasWidgets(); } return false; } /** * {@inheritDoc} */ @Override public Object[] getElements(final Object inputElement) { return _elements; } /** * {@inheritDoc} */ @Override public void dispose() { } /** * {@inheritDoc} */ @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { if (newInput instanceof WidgetModelFactoryService) { WidgetModelFactoryService service = (WidgetModelFactoryService)newInput; List<PluginTreeElement> elements = new ArrayList<PluginTreeElement>(); for (String pluginId : service.getAllContributingPluginIds()) { PluginTreeElement treeElement = new PluginTreeElement(pluginId); final Set<String> widgetIdsOfPlugin = service.getWidgetIdsOfPlugin(pluginId); for (String widgetId : widgetIdsOfPlugin) { String name = service.getName(widgetId); String iconPath = service.getIcon(widgetId); treeElement.addWidget(new WidgetTreeElement(widgetId, name, iconPath, pluginId)); } elements.add(treeElement); } _elements = elements.toArray(new PluginTreeElement[elements.size()]); } } public PluginTreeElement[] getElements() { return _elements; } } /** * The {@link LabelProvider} for the tree. * @author Kai Meyer * */ private final class WidgetLabelProvider extends LabelProvider { /** * {@inheritDoc} */ @Override public Image getImage(final Object element) { if (element instanceof WidgetTreeElement) { WidgetTreeElement widgetTreeElement = (WidgetTreeElement) element; String iconPath = widgetTreeElement.getIconPath(); if (iconPath!=null) { final String pluginId = widgetTreeElement.getPluginId(); return CustomMediaFactory.getInstance().getImageFromPlugin(pluginId, iconPath); } } return super.getImage(element); } /** * {@inheritDoc} */ @Override public String getText(final Object element) { if (element instanceof WidgetTreeElement) { return ((WidgetTreeElement) element).getName(); } if (element instanceof PluginTreeElement) { String typeId = ((PluginTreeElement)element).getId(); try { Dictionary<String, String> headers = Platform.getBundle(typeId).getHeaders(); StringBuffer resultBuffer = new StringBuffer(headers.get("Bundle-Name").toString()); resultBuffer.append(" ("); resultBuffer.append(typeId); resultBuffer.append(")"); return resultBuffer.toString(); } catch (Exception e) { e.printStackTrace(); // do nothing } return typeId; } return super.getText(element); } } /** * * @author Kai Meyer * @author $Author: jhatje $ * @version $Revision: 1.8 $ * @since 14.04.2010 */ private class PluginTreeElement { private final List<WidgetTreeElement> _widgets; private final String _id; public PluginTreeElement(final String id) { _id = id; _widgets = new ArrayList<WidgetTreeElement>(); } public void addWidget(final WidgetTreeElement element) { _widgets.add(element); } public WidgetTreeElement[] getElements() { return _widgets.toArray(new WidgetTreeElement[_widgets.size()]); } public boolean hasWidgets() { return !_widgets.isEmpty(); } public String getId() { return _id; } } /** * * * @author Kai Meyer * @author $Author: jhatje $ * @version $Revision: 1.8 $ * @since 14.04.2010 */ private class WidgetTreeElement { private final String _name; private final String _id; private final String _iconPath; private final String _pluginId; public WidgetTreeElement(final String id, final String name, final String iconPath, final String pluginId) { _id = id; _name = name; _iconPath = iconPath; _pluginId = pluginId; } public String getName() { return _name; } public String getIconPath() { return _iconPath; } public String getId() { return _id; } public String getPluginId() { return _pluginId; } } }