/******************************************************************************* * Copyright (c) 2010 Oak Ridge National Laboratory. * 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 ******************************************************************************/ package org.csstudio.ui.util.swt.stringtable; import java.util.Arrays; import java.util.List; import org.csstudio.ui.util.swt.stringtable.StringTableEditor.CellEditorType; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.widgets.Table; /** Editor for table with multiple columns (List<String[]>) * @author Xihui Chen */ class StringMultiColumnsEditor extends EditingSupport { final private TableViewer table_viewer; final private int columnNo; final private int numOfColumns; private CellEditorType cellEditorType; private Object cellEditorData; public StringMultiColumnsEditor(final TableViewer viewer, final int numOfColumns, final int columnNo, final CellEditorType cellEditorType, final Object cellData) { super(viewer); this.table_viewer = viewer; this.columnNo = columnNo; this.numOfColumns = numOfColumns; this.cellEditorType = cellEditorType; this.cellEditorData = cellData; if(cellEditorType == CellEditorType.CHECKBOX){ if(cellEditorData==null || !(cellEditorData instanceof String[]) || ((String[])cellEditorData).length<2) cellEditorData = new String[]{"Yes", "No"}; } } @Override protected boolean canEdit(Object element) { return true; } @Override protected CellEditor getCellEditor(Object element) { final Table parent = (Table) getViewer().getControl(); switch (cellEditorType) { case CHECKBOX: return new CheckboxCellEditor(parent){ @Override protected Object doGetValue() { return (Boolean) super.doGetValue()?((String[])cellEditorData)[1]:((String[])cellEditorData)[0]; } @Override protected void doSetValue(Object value) { if(value.toString().toLowerCase().equals(((String[])cellEditorData)[1].toLowerCase())) super.doSetValue(true); else super.doSetValue(false); } }; case DROPDOWN: return new ComboBoxCellEditor(parent, (String[])cellEditorData,SWT.NONE){ @Override protected Object doGetValue() { return ((CCombo)getControl()).getText(); } @Override protected void doSetValue(Object value) { ((CCombo)getControl()).setText(value.toString()); } }; default: return new TextCellEditor(parent); } } @SuppressWarnings("unchecked") @Override protected Object getValue(Object element) { if (element == StringTableContentProvider.ADD_ELEMENT) return ""; //$NON-NLS-1$ final int index = ((Integer)element).intValue(); final List<String[]> items = (List<String[]>) table_viewer.getInput(); if (columnNo < items.get(index).length) return items.get(index)[columnNo]; else return ""; } @SuppressWarnings("unchecked") @Override protected void setValue(Object element, Object value) { final List<String[]> items = (List<String[]>) table_viewer.getInput(); String[] rowData; if (element == StringTableContentProvider.ADD_ELEMENT) { rowData = new String[numOfColumns]; Arrays.fill(rowData, ""); //$NON-NLS-1$ rowData[columnNo] = value.toString(); items.add(rowData); getViewer().refresh(); return; } // else final int index = ((Integer)element).intValue(); rowData = items.get(index); if (columnNo >= rowData.length) { String [] newRowData = new String[columnNo + 1]; int i = 0; for (; i<rowData.length; i++) { newRowData[i] = rowData[i]; } for (; i<newRowData.length; i++) { newRowData[i] = ""; } rowData = newRowData; } rowData[columnNo] = value.toString(); items.set(index, rowData); getViewer().refresh(element); } }