Java tutorial
/* * * 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()); } }