/******************************************************************************* * Copyright (c) 2015 ARM Ltd. and others * 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 * * Contributors: * ARM Ltd and ARM Germany GmbH - Initial API and implementation *******************************************************************************/ package com.arm.cmsis.pack.ui.tree; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CellEditor.LayoutData; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * This class implements editing possibilities for table cell, e.g. check box, * combo box, etc. In case of combo a combo box cell Editor is return, in case * of check box, a check box control is returned. */ public class AdvisedEditingSupport extends EditingSupport { TextCellEditor textCellEditor = null; CheckboxCellEditor checkboxCellEditor = null; int columnIndex; IColumnAdvisor columnAdvisor = null; public AdvisedEditingSupport(ColumnViewer treeViewer, IColumnAdvisor columnAdvisor, int columnIndex) { super(treeViewer); this.columnIndex = columnIndex; this.columnAdvisor = columnAdvisor; } @Override protected CellEditor getCellEditor(final Object element) { Composite composite = (Composite) getViewer().getControl(); switch (columnAdvisor.getCellControlType(element, columnIndex)) { case SPIN: SpinnerCellEditor sce = new SpinnerCellEditor(composite); sce.getSpinner().setMinimum(columnAdvisor.getMinCount(element, columnIndex)); sce.getSpinner().setMaximum(columnAdvisor.getMaxCount(element, columnIndex)); sce.getSpinner().setBase(columnAdvisor.getItemBase(element, columnIndex)); long spinStep = columnAdvisor.getSpinStep(element, columnIndex); sce.getSpinner().setIncrement(spinStep); //sce.getSpinner().setPageIncrement(spinStep*columnAdvisor.getItemBase(element, columnIndex)); sce.getSpinner().setSelection(columnAdvisor.getCurrentSelectedIndex(element, columnIndex)); return sce; case MENU: MenuCellEditor mce = new MenuCellEditor(composite); return mce; case CHECK: return new CheckboxCellEditor(composite); case TEXT: return new TextCellEditor(composite); case COMBO: final ComboBoxCellEditor cellEditor = new ComboBoxCellEditor(composite, columnAdvisor.getStringArray(element, columnIndex), SWT.READ_ONLY) { @Override public LayoutData getLayoutData() { LayoutData ld = super.getLayoutData(); ld.minimumWidth = 20; return ld; } }; Control control = cellEditor.getControl(); final CCombo combo = (CCombo) control; LayoutData ld = cellEditor.getLayoutData(); ld.grabHorizontal = true; ld.horizontalAlignment = SWT.RIGHT; ld.verticalAlignment = SWT.CENTER; combo.setLayoutData(ld); combo.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { Integer newVal = new Integer(combo.getSelectionIndex()); setValue(element, newVal); } }); return cellEditor; default: break; } return null; } @Override protected Object getValue(Object element) { switch (columnAdvisor.getCellControlType(element, columnIndex)) { case SPIN: return columnAdvisor.getCurrentSelectedIndex(element, columnIndex); case CHECK: return new Boolean(columnAdvisor.getCheck(element, columnIndex)); case COMBO: return columnAdvisor.getCurrentSelectedIndex(element, columnIndex); case MENU: return columnAdvisor.getMenu(element, columnIndex); case TEXT: return columnAdvisor.getString(element, columnIndex); default: break; } return null; } @Override protected void setValue(Object element, Object value) { switch (columnAdvisor.getCellControlType(element, columnIndex)) { case SPIN: if (value instanceof String) { String valStr = (String) value; if (valStr.isEmpty()) { return; } int base = columnAdvisor.getItemBase(element, columnIndex); switch (base) { case 16: case 2: valStr = valStr.substring(2); break; case 8: valStr = valStr.substring(1); break; default: break; } long newVal = columnAdvisor.getMinCount(element, columnIndex); try { newVal = Long.parseLong(valStr, base); } catch (NumberFormatException e) { } columnAdvisor.setCurrentSelectedIndex(element, columnIndex, newVal); } break; case CHECK: if (value instanceof Boolean) { boolean newVal = ((Boolean) value == true); columnAdvisor.setCheck(element, columnIndex, newVal); } break; case MENU: if (value instanceof String) { columnAdvisor.setString(element, columnIndex, (String) value); } break; case COMBO: if (value instanceof Integer) { int newVal = ((Integer) value).intValue(); columnAdvisor.setCurrentSelectedIndex(element, columnIndex, newVal); } break; case TEXT: if (value instanceof String) { columnAdvisor.setString(element, columnIndex, (String) value); } default: break; } } @Override protected boolean canEdit(Object element) { boolean editable = columnAdvisor.canEdit(element, columnIndex); return editable; } }