org.csstudio.trends.databrowser2.propsheet.AxesTableHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.trends.databrowser2.propsheet.AxesTableHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Oak Ridge National Laboratory.
 * 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
 ******************************************************************************/
package org.csstudio.trends.databrowser2.propsheet;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.csstudio.swt.rtplot.undo.UndoableActionManager;
import org.csstudio.trends.databrowser2.Activator;
import org.csstudio.trends.databrowser2.Messages;
import org.csstudio.trends.databrowser2.model.ArchiveRescale;
import org.csstudio.trends.databrowser2.model.AxisConfig;
import org.csstudio.trends.databrowser2.model.Model;
import org.csstudio.trends.databrowser2.model.ModelListener;
import org.csstudio.trends.databrowser2.model.ModelListenerAdapter;
import org.csstudio.trends.databrowser2.ui.TableHelper;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbenchActionConstants;

/** Helper for a 'Axes' TableViewer that handles the Model's axes.
 *  Each 'row' in the table is an AxisConfig.
 *  @author Kay Kasemir
 */
public class AxesTableHandler implements IStructuredContentProvider {
    final private LocalResourceManager color_registry;
    final private UndoableActionManager operations_manager;
    final private TableViewer axes_table;
    private volatile Model model;
    private volatile AxisConfig[] axes = new AxisConfig[0];

    /** Listen to model changes regarding axes.
     *  Ignore configuration of individual items.
     */
    final private ModelListener model_listener = new ModelListenerAdapter() {
        @Override
        public void changedAxis(final Optional<AxisConfig> axis) {
            if (axis.isPresent())
                axes_table.refresh(axis.get());
            else { // Force total refresh
                getModelAxisCopy(model);
                axes_table.refresh();
            }
        }
    };

    /** Initialize
     *  @param parent
     *  @param table_layout
     *  @param operations_manager
     */
    public AxesTableHandler(final Composite parent, final TableColumnLayout table_layout,
            final UndoableActionManager operations_manager) {
        color_registry = new LocalResourceManager(JFaceResources.getResources(), parent);
        this.operations_manager = operations_manager;

        axes_table = new TableViewer(parent,
                SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL);
        final Table table = axes_table.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        createColumns(table_layout);

        axes_table.setContentProvider(this);

        createContextMenu();
    }

    /** @return TableViewer for the axes table */
    TableViewer getAxesTable() {
        return axes_table;
    }

    /** Create table columns: Auto-sizable, with label provider and editor
     *  @param table_layout
     */
    private void createColumns(TableColumnLayout table_layout) {
        TableViewerColumn col;

        // Visible? Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisVisibility, 45, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isVisible())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isVisible();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setVisible(((Boolean) value).booleanValue());
                if (((Boolean) value).booleanValue()) {
                    if (axis.isAutoScale())
                        model.setArchiveRescale(ArchiveRescale.NONE);
                }
                command.rememberNewConfig();
            }
        });

        // Axis Name Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.ValueAxisName, 100, 100);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                cell.setText(axis.getName());
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).getName();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final String name = value.toString().trim();
                if (name.equals(axis.getName()))
                    return;
                final ChangeAxisConfigCommand config = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setName(name);
                config.rememberNewConfig();
            }
        });

        // Use Axis Name ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.UseAxisName, 95, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isUsingAxisName())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isUsingAxisName();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.useAxisName(((Boolean) value).booleanValue());
                command.rememberNewConfig();
            }
        });

        // Use Trace Names ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.UseTraceNames, 110, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isUsingTraceNames())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isUsingTraceNames();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.useTraceNames(((Boolean) value).booleanValue());
                command.rememberNewConfig();
            }
        });

        // Show Grid? ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.Grid, 50, 5);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isGridVisible())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isGridVisible();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setGridVisible(((Boolean) value).booleanValue());
                command.rememberNewConfig();
            }
        });

        // Use Right Side? ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisOnRight, 80, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isOnRight())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isOnRight();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setOnRight(((Boolean) value).booleanValue());
                command.rememberNewConfig();
            }
        });

        // Color Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.Color, 40, 5);
        col.setLabelProvider(new ColorCellLabelProvider<AxisConfig>() {
            @Override
            protected Color getColor(final AxisConfig axis) {
                return color_registry.createColor(axis.getColor());
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new RGBCellEditor(axes_table.getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).getColor();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setColor((RGB) value);
                command.rememberNewConfig();
            }
        });

        // Minimum value Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisMin, 70, 50);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                cell.setText(Double.toString(axis.getMin()));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected Object getValue(final Object element) {
                return Double.toString(((AxisConfig) element).getMin());
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                try {
                    final AxisConfig axis = (AxisConfig) element;
                    final double limit = Double.parseDouble(value.toString().trim());
                    if (limit == axis.getMin())
                        return;
                    final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                    axis.setRange(limit, axis.getMax());
                    command.rememberNewConfig();
                } catch (NumberFormatException ex) {
                    // NOP, leave as is
                }
            }
        });

        // Maximum value Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisMax, 70, 50);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                cell.setText(Double.toString(axis.getMax()));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected Object getValue(final Object element) {
                return Double.toString(((AxisConfig) element).getMax());
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                try {
                    final AxisConfig axis = (AxisConfig) element;
                    final double limit = Double.parseDouble(value.toString().trim());
                    if (limit == axis.getMax())
                        return;
                    final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                    axis.setRange(axis.getMin(), limit);
                    command.rememberNewConfig();
                } catch (NumberFormatException ex) {
                    // NOP, leave as is
                }
            }
        });

        // Auto scale Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AutoScale, 80, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isAutoScale())
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_CHECKED));
                else
                    cell.setImage(Activator.getDefault().getImage(Activator.ICON_UNCHECKED));
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isAutoScale();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setAutoScale(((Boolean) value).booleanValue());
                if (((Boolean) value).booleanValue() && axis.isVisible())
                    model.setArchiveRescale(ArchiveRescale.NONE);
                command.rememberNewConfig();
            }
        });

        // Log scale Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.LinLogScaleType, 80, 10);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                if (axis.isLogScale())
                    cell.setText(Messages.LogScale);
                else
                    cell.setText(Messages.LinacScale);
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new CheckboxCellEditor(((TableViewer) getViewer()).getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).isLogScale();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setLogScale(((Boolean) value).booleanValue());
                command.rememberNewConfig();
            }
        });

        // Label Font Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisLabelFont, 40, 5);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                cell.setText(axis.getLabelFont().toString());
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new FontCellEditor(axes_table.getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).getLabelFont();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setLabelFont((FontData) value);
                command.rememberNewConfig();
            }
        });

        // Scale Font Column ----------
        col = TableHelper.createColumn(table_layout, axes_table, Messages.AxisScaleFont, 40, 5);
        col.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(final ViewerCell cell) {
                final AxisConfig axis = (AxisConfig) cell.getElement();
                cell.setText(axis.getScaleFont().toString());
            }
        });
        col.setEditingSupport(new EditSupportBase(axes_table) {
            @Override
            protected CellEditor getCellEditor(final Object element) {
                return new FontCellEditor(axes_table.getTable());
            }

            @Override
            protected Object getValue(final Object element) {
                return ((AxisConfig) element).getScaleFont();
            }

            @Override
            protected void setValue(final Object element, final Object value) {
                final AxisConfig axis = (AxisConfig) element;
                final ChangeAxisConfigCommand command = new ChangeAxisConfigCommand(operations_manager, axis);
                axis.setScaleFont((FontData) value);
                command.rememberNewConfig();
            }
        });

    }

    /** Add context menu to axes_table */
    private void createContextMenu() {
        final MenuManager menu = new MenuManager();
        menu.setRemoveAllWhenShown(true);
        menu.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                menu.add(new AddAxisAction(operations_manager, model));
                if (!axes_table.getSelection().isEmpty())
                    menu.add(new DeleteAxesAction(operations_manager, axes_table, model));
                if (model.getEmptyAxis() != null)
                    menu.add(new RemoveUnusedAxesAction(operations_manager, model));
                menu.add(new Separator());
                menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
            }
        });
        final Table table = axes_table.getTable();
        table.setMenu(menu.createContextMenu(table));
    }

    /** {@inheritDoc} */
    @Override
    public void inputChanged(final Viewer viewer, final Object old_model, final Object new_model) {
        if (old_model != null)
            ((Model) old_model).removeListener(model_listener);

        model = (Model) new_model;
        if (model != null)
            model.addListener(model_listener);
        getModelAxisCopy(model);
    }

    private void getModelAxisCopy(final Model model) {
        if (model == null) {
            axes = new AxisConfig[0];
            return;
        }
        final List<AxisConfig> new_axes = new ArrayList<>();
        for (AxisConfig axis : model.getAxes())
            new_axes.add(axis);
        axes = new_axes.toArray(new AxisConfig[new_axes.size()]);
    }

    /** {@inheritDoc} */
    @Override
    public Object[] getElements(final Object inputElement) {
        return axes;
    }

    /** {@inheritDoc} */
    @Override
    public void dispose() {
        // NOP
    }
}