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 って事で…。
問題意識と、アイディアにツッコミ待ちです。
どうぞよしなに。