TableViewerを編集可能にするAPIってイマイチ。
イマイチな理由は、
ITableLabelProviderとCellEditorとICellModifierの対応関係が超微妙。
一方で、indexベースに処理するのに、一方でStringのpropertyとかいう、
論理名ベースで処理するってどういう事?
あ〜、何?表示は、別々だけど、
更新処理は同じ…みたいなアクロバティックな真似をしたいってのに対応する為?
っつうか、配列の宣言ちと間違っただけで、まるでまともに動く気配が無いんですが。
ちょっと、僕には理解出来ない感じの柔軟性なので、
と言う訳で、カッとなって柔軟性を大幅に削り、
コーディングし易い様なのを作ってしまいました。
if 〜 else や switch 〜 case を前提としたAPIとは断固戦いマス。
public interface ColumnDescriptor { public String getName(); public CellEditor getCellEditor(); public String getText(Object element); public Image getImage(Object element); public Object getValue(Object element); public void setValue(Object element, Object value); public boolean canModify(); } public class TableProvider extends LabelProvider implements ITableLabelProvider, ICellModifier { private ArrayMap columnDescs; private TableViewer viewer; public TableProvider(TableViewer viewer, ColumnDescriptor[] cds) { this.viewer = viewer; this.columnDescs = new ArrayMap(cds.length); List keys = new ArrayList(cds.length); List editors = new ArrayList(cds.length); for (int i = 0; i < cds.length; i++) { ColumnDescriptor cd = cds[i]; this.columnDescs.put(cd.getName(), cd); keys.add(cd.getName()); editors.add(cd.getCellEditor()); } this.viewer.setColumnProperties((String[]) keys.toArray(new String[keys .size()])); this.viewer.setCellEditors((CellEditor[]) editors .toArray(new CellEditor[editors.size()])); this.viewer.setCellModifier(this); } protected ColumnDescriptor getDescriptor(String name) { return (ColumnDescriptor) this.columnDescs.get(name); } protected ColumnDescriptor getDescriptor(int index) { return (ColumnDescriptor) this.columnDescs.get(index); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, * int) */ public Image getColumnImage(Object element, int columnIndex) { ColumnDescriptor cd = getDescriptor(columnIndex); return cd != null ? cd.getImage(element) : null; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, * int) */ public String getColumnText(Object element, int columnIndex) { ColumnDescriptor cd = getDescriptor(columnIndex); return cd != null ? cd.getText(element) : ""; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, * java.lang.String) */ public boolean canModify(Object element, String property) { ColumnDescriptor cd = getDescriptor(property); return cd != null ? cd.canModify() : false; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, * java.lang.String) */ public Object getValue(Object element, String property) { ColumnDescriptor cd = getDescriptor(property); return cd != null ? cd.getValue(element) : null; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, * java.lang.String, java.lang.Object) */ public void modify(Object element, String property, Object value) { if (element instanceof Item) { element = ((Item) element).getData(); } ColumnDescriptor cd = getDescriptor(property); if (cd != null) { cd.setValue(element, value); this.viewer.update(element, new String[] { property }); } } }
ちなみに、
コーディングしただけで、動かしてもいません。
本日中に動かしマス。今は、Public Preview って事で…。
問題意識と、アイディアにツッコミ待ちです。
どうぞよしなに。