net.karlmartens.ui.viewer.TimeSeriesTableValueEditingSupport.java Source code

Java tutorial

Introduction

Here is the source code for net.karlmartens.ui.viewer.TimeSeriesTableValueEditingSupport.java

Source

/**
 *   Copyright 2011 Karl Martens
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *       
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 *   net.karlmartens.ui, is a library of UI widgets
 */
package net.karlmartens.ui.viewer;

import java.text.NumberFormat;
import java.text.ParseException;

import net.karlmartens.ui.widget.TableItem;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;

class TimeSeriesTableValueEditingSupport extends EditingSupport {

    private final TimeSeriesTableViewer _viewer;
    private TextCellEditor _cellEditor;

    TimeSeriesTableValueEditingSupport(TimeSeriesTableViewer viewer) {
        super(viewer);
        _viewer = viewer;
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        if (_cellEditor == null) {
            _cellEditor = new TextCellEditor((Composite) _viewer.getControl(), SWT.SINGLE | SWT.RIGHT);
        }
        return _cellEditor;
    }

    @Override
    protected boolean canEdit(Object element) {
        final TimeSeriesEditingSupport editingSupport = _viewer.getEditingSupport();
        if (editingSupport == null)
            return false;

        return editingSupport.canEdit(element);
    }

    @Override
    protected Object getValue(Object element) {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void setValue(Object element, Object value) {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void initializeCellEditorValue(CellEditor cellEditor, ViewerCell cell) {
        cellEditor.setValue("");

        final TimeSeriesEditingSupport editingSupport = _viewer.getEditingSupport();
        if (editingSupport == null)
            return;

        final TimeSeriesContentProvider cp = (TimeSeriesContentProvider) _viewer.getContentProvider();
        if (cp == null)
            return;

        final double value = cp.getValue(cell.getElement(), computePeriodIndex(cell));
        final NumberFormat format = getEditingNumberFormat(editingSupport);
        cellEditor.setValue(format.format(value));
    }

    @Override
    protected void saveCellEditorValue(CellEditor cellEditor, ViewerCell cell) {
        final TimeSeriesEditingSupport editingSupport = _viewer.getEditingSupport();
        if (editingSupport == null)
            return;

        final TimeSeriesContentProvider cp = (TimeSeriesContentProvider) _viewer.getContentProvider();
        if (cp == null)
            return;

        final String source = (String) cellEditor.getValue();
        if (source == null || source.trim().length() == 0) {
            update(cell, 0.0);
            return;
        }

        try {
            final NumberFormat format = getEditingNumberFormat(editingSupport);
            final Number n = format.parse(source);
            update(cell, n.doubleValue());
        } catch (ParseException e) {
            // ignore
        }
    }

    private void update(ViewerCell cell, double value) {
        _viewer.getEditingSupport().setValue(cell.getElement(), computePeriodIndex(cell), value);
        final TableItem item = (TableItem) cell.getItem();
        item.setText(cell.getColumnIndex(), _viewer.getNumberFormat().format(value));
        _viewer.getControl().redraw();
    }

    private int computePeriodIndex(ViewerCell cell) {
        return cell.getColumnIndex() - _viewer.getControl().getFixedColumnCount();
    }

    private static NumberFormat getEditingNumberFormat(TimeSeriesEditingSupport editingSupport) {
        NumberFormat format = editingSupport.getNumberFormat();
        if (format != null)
            return format;

        return NumberFormat.getNumberInstance();
    }
}