org.goko.controller.grbl.v08.element.PropertyTable.java Source code

Java tutorial

Introduction

Here is the source code for org.goko.controller.grbl.v08.element.PropertyTable.java

Source

/*
 *
 *   Goko
 *   Copyright (C) 2013  PsyKo
 *
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.goko.controller.grbl.v08.element;

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

import org.apache.commons.collections.CollectionUtils;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeColumn;
import org.goko.controller.grbl.v08.element.model.MultichoiceProperty;
import org.goko.controller.grbl.v08.element.model.Property;

/**
 * Custom property table
 *
 * @author PsyKo
 *
 */
public class PropertyTable extends TreeViewer {

    /**
     * Constructor
     * @param parent
     * @param style
     */
    public PropertyTable(Composite parent, int style) {
        super(parent, SWT.FULL_SELECTION | style);
        init();
        fakeInput();
    }

    public void setPropertyInput() {

    }

    private void fakeInput() {
        List<Property> tst = new ArrayList<Property>();

        tst.add(new MultichoiceProperty("$", "$a (x, step/mm)", "80", "", "true", "false"));
        tst.add(new Property<String>("$0", "$0 (x, step/mm)", "80", false));
        tst.add(new Property<String>("$1", "$1 (y, step/mm)", "23", false));
        tst.add(new Property<String>("$2", "$2 (z, step/mm)", "12", false));
        tst.add(new Property<String>("$3", "$3 (step pulse, usec)", "25", false));
        tst.add(new Property<String>("$4", "$4 (default feed, mm/min)", "1200", false));
        tst.add(new Property<String>("$5", "$5 (default seek, mm/min)", "120", false));
        tst.add(new Property<String>("$6", "$6 (step port invert mask)", "", false));
        tst.add(new Property<String>("$7", "$7 (step idle delay, msec)", "", false));
        tst.add(new Property<String>("$8", "$8 (acceleration, mm/sec^2)", "", false));
        tst.add(new Property<String>("$9", "$9 (junction deviation, mm)", "", false));
        tst.add(new Property<String>("$10", "$10  (arc, mm/segment)", "", false));
        tst.add(new Property<String>("$11", "$11 (n-arc correction, int)", "", false));
        tst.add(new Property<String>("$12", "$12 (n-decimals, int)", "", false));
        tst.add(new Property<String>("$13", "$13 (report inches, bool)", "", false));
        tst.add(new Property<String>("$14", "$14 (auto start, bool)", "", false));
        Property<String> invertGroup = new Property<String>("$15", "$15 (invert step enable, bool)", "", true);
        invertGroup.addChild(new MultichoiceProperty("$15x", "X axis", "Normal", "Normal", "Reversed"));
        invertGroup.addChild(new MultichoiceProperty("$15y", "Y axis", "Normal", "Normal", "Reversed"));
        invertGroup.addChild(new MultichoiceProperty("$15z", "Z axis", "Normal", "Normal", "Reversed"));
        tst.add(invertGroup);
        tst.add(new MultichoiceProperty("$16", "$16 (hard limits, bool)", "Enabled", "Enabled", "Disabled"));
        tst.add(new Property<String>("$17", "$17 (homing cycle, bool)", "", false));
        tst.add(new Property<String>("$18", "$18 (homing dir invert mask, int:00000000)", "", false));
        tst.add(new Property<String>("$19", "$19 (homing feed, mm/min)", "", false));
        tst.add(new Property<String>("$20", "$20 (homing seek, mm/min)", "", false));
        tst.add(new Property<String>("$21", "$21 (homing debounce, msec)", "", false));
        tst.add(new Property<String>("$22", "$22 (homing pull-off, mm)", "", false));

        setInput(tst.toArray(new Property[] {}));

    }

    private void init() {
        setContentProvider(new PropertyTreeContentProvider());

        TreeViewerColumn colLabel = createTableViewerColumn("Property", 120, 1);
        colLabel.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof Property<?>) {
                    return ((Property<?>) element).getLabel();
                }
                return super.getText(element);
            }
        });

        TreeViewerColumn colValue = createTableViewerColumn("Value", 120, 1);
        colValue.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof Property<?>) {
                    return ((Property<?>) element).getValue();
                }
                return super.getText(element);
            }

        });
        colValue.setEditingSupport(new PropertyCellEditor(this));

    }

    private TreeViewerColumn createTableViewerColumn(String title, int width, final int colNumber) {
        final TreeViewerColumn viewerColumn = new TreeViewerColumn(this, SWT.NONE);
        final TreeColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setWidth(width);
        column.setResizable(true);
        column.setMoveable(true);
        return viewerColumn;
    }
}

class PropertyCellEditor extends EditingSupport {
    TreeViewer treeViewer;

    public PropertyCellEditor(TreeViewer viewer) {
        super(viewer);
        treeViewer = viewer;
    }

    @Override
    protected CellEditor getCellEditor(Object element) {
        if (element instanceof MultichoiceProperty) {
            return new ComboBoxCellEditor(treeViewer.getTree(), ((MultichoiceProperty) element).getChoicesArray(),
                    SWT.READ_ONLY);
        } else {
            return new TextCellEditor(treeViewer.getTree());
        }

    }

    @Override
    protected boolean canEdit(Object element) {
        if (element instanceof Property) {
            return !((Property) element).isReadOnly();
        }
        return false;
    }

    @Override
    protected Object getValue(Object element) {
        if (element instanceof MultichoiceProperty) {
            return ((MultichoiceProperty) element).getSelectedIndex();
        } else if (element instanceof Property) {
            return ((Property) element).getValue();
        }
        return null;
    }

    @Override
    protected void setValue(Object element, Object value) {
        if (element instanceof MultichoiceProperty) {
            ((MultichoiceProperty) element).setSelectedIndex((Integer) value);

        } else if (element instanceof Property) {
            ((Property) element).setValue(value);
        }

        treeViewer.update(element, null);
    }

}

class PropertyTreeContentProvider implements ITreeContentProvider {

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        // TODO Auto-generated method stub

    }

    @Override
    public Object[] getElements(Object inputElement) {
        return (Property[]) inputElement;
    }

    @Override
    public Object[] getChildren(Object parentElement) {
        return ((Property<?>) parentElement).getChildren().toArray();
    }

    @Override
    public Object getParent(Object element) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean hasChildren(Object element) {
        return CollectionUtils.isNotEmpty(((Property<?>) element).getChildren());
    }

}