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