å‘已有的TreeViewerå’ŒTableViewerä¸Šæ·»åŠ ç¼–è¾‘åŠŸèƒ½ï¼Œå¯ä»¥ä½¿ç”¨CellEditorå’ŒCellModifierã€?/p>
CellEditor定义了æŸä¸ªåˆ—被编辑时昄¡¤ºçš„外观,它å¯ä»¥æ˜¯æ–‡æœ¬æ¡†ã€ä¸‹æ‹‰åˆ—表框或å•选框åQŒä¹Ÿå¯ä»¥è‡ªå·±å®šä¹‰ã€?/p>
通常使用的CellEditorçš„å¾cÕd°±æ˜¯ï¼šCheckboxCellEditorã€ComboBoxCellEditorå’ŒTextCellEditorã€?br />CellEditor一般用数组æ¥ä¿å˜ï¼Œå¦‚æžœæŸä¸ªåˆ—ä¸éœ€è¦ç¼–辑,则寞®†è¯¥åˆ—çš„CellEditorè®¾äØ“nullã€?br />当CellEditor的数¾l„定义完åŽï¼Œå›_¯åˆ©ç”¨setCellEditors(CellEditor[] editors)æ–ÒŽ³•ž®†è¯¥æ•°ç»„讄¡½®åˆ°å¯¹åº”çš„TreeViewer或TableViewerä¸åŽ»ã€‚ä¾‹å¦‚ï¼š
    CellEditor[] cellEditorsÂ
=
Â
new
 CellEditor[
5
];
    cellEditors[
0
]Â
=
Â
new
 TextCellEditor(tableViewer.getTable());
    cellEditors[
1
]Â
=
Â
null
;
    cellEditors[
2
]Â
=
Â
new
 ComboBoxCellEditor(tableViewer.getTable(),Â
new
 String[]{
"
first
"
,Â
"
second
"
,Â
"
third
"
,Â
"
forth
"
});
    cellEditors[
3
]Â
=
Â
new
 CheckboxCellEditor(tableViewer.getTable());
    cellEditors[
4
]Â
=
Â
new
 CustomizedTextCellEditor(tableViewer.getTable());
    tableViewer.setCellEditors(cellEditors);
å…¶ä¸CustomizedTextCellEditor是自定义的CellEditoråQŒé¿å…了讄¡½®valueæ—‰™€ æˆçš„空指针异常ã€?br />

protected class CustomizedTextCellEditor extends TextCellEditor
{

    public CustomizedTextCellEditor(Composite parent)
{
        super(parent);
    }

    protected void doSetValue(Object value)Â
{
        if(value == null)
            return;
        super.doSetValue(value);
    }       Â
}
CellEditor负责外观åQŒå®ƒå¯¹è¦¾~–辑的模型信æ¯ä¸€æ— 所知。所以jfaceä¸å¼•入了ICellModifier接å£åQŒå°†model与CellEditorè”系在一赗÷€‚äØ“äº†ç¡®å®šåœ¨CellModifierä¸çš„列,需è¦å®šä¹‰columnPropertiesçš„String[]数组åQŒç”¨ä»¥åŒºåˆ†ä¸åŒåˆ—对应的ä¸åŒå±žæ€§ã€‚ä‹É用setColumnProperties(String[] columnProperties)讄¡½®è¯¥å±žæ€§é›†ã€?/p>
ICellModifierå®šä¹‰äº†ä¸‰ä¸ªæŽ¥å£æ–¹æ³•:
public boolean canModify(Object element, String property);
该方法判æ–何时该列å¯ä»¥è¢«¾~–辑。其ä¸element是对应的model。返回trueè¡¨ç¤ºæ¤æ—¶è¯¥åˆ—å¯ä»¥è¢«ç¼–辑ã€?/p>
public Object getValue(Object element, String property);
该方法一般在activateCellEditor()时调用,用于讑֮šCellEditorçš„åˆå§‹å€¹{€‚å…¶ä¸element是对应的modelã€?/p>
æ¤å¤„虽然å¯ä»¥˜q”回Object¾cÕdž‹çš„引用,但是使用旉™œ€ž®å¿ƒåQŒç‰¹å®šçš„CellEditor仅接å—特定类型的Value。比如:
TextCellEditor对应String¾cÕdž‹çš„ValueåQ?br />ComboBoxCellEditor对应Integer¾cÕdž‹çš„ValueåQ?br />CheckBoxCellEditor对应Boolean¾cÕdž‹çš„ValueåQ?br />若返回了ä¸é€‚åˆçš„Value对象åQŒåˆ™ä¼šæŠ›å‡ºAssertionFailedExceptionã€?/p>
public void modify(Object element, String property, Object value);
该方法执行ä¿å˜ä¿®æ”V€‚一般在saveEditorValue之类的方法ä¸è°ƒç”¨ã€‚æ¤å¤„çš„elementä¸å†æ˜¯modelåQŒè€Œæ˜¯Item¾cÕdž‹çš„引用。å–用对应的模型åQŒéœ€è¦ä‹Éç”?(Item) element).getData()æ–ÒŽ³•。一般æ¤å¤„çš„valueå€û|¼Œä¹Ÿå°±æ˜¯å½“å‰CellEditorçš„Valueå€û|¼Œä½¿ç”¨CellEditor.getValue()得到。å¦å¤–,在执行完更改åŽï¼Œéœ€è¦åˆ·æ–°å¯¹åº”çš„TableViewer或TreeVieweråQŒä‹Éåšå‡ºçš„æ›´æ–°å¯è§ã€?br />
org.eclipse.debug.internal.ui.elements.adapters.DefaultVariableCellModifier是ICellModifier的一个完整实玎ͼš
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.DefaultLabelProvider;
import org.eclipse.debug.internal.ui.VariableValueEditorManager;
import org.eclipse.debug.ui.actions.IVariableValueEditor;
import org.eclipse.jface.viewers.ICellModifier;


/**Â *//**
 * @since 3.2
 *
 */

public class DefaultVariableCellModifier implements ICellModifierÂ
{
   Â

    /**//* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
     */

    public boolean canModify(Object element, String property)Â
{

        if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property))Â
{

            if (element instanceof IVariable)Â
{
                return ((IVariable) element).supportsValueModification();
            }
        }
        return false;
    }


    /**//* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
     */

    public Object getValue(Object element, String property)Â
{

        if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property))Â
{

            if (element instanceof IVariable)Â
{
                IVariable variable = (IVariable) element;

                tryÂ
{
                    return DefaultLabelProvider.escapeSpecialChars(variable.getValue().getValueString());

                } catch (DebugException e)Â
{
                    DebugUIPlugin.log(e);
                }
            }
        }
        return 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)Â
{
        Object oldValue = getValue(element, property);

        if (!value.equals(oldValue))Â
{

            if (VariableColumnPresentation.COLUMN_VARIABLE_VALUE.equals(property))Â
{

                if (element instanceof IVariable)Â
{
                    IVariable variable = (IVariable) element;
                    IVariableValueEditor editor = VariableValueEditorManager.getDefault().getVariableValueEditor(variable.getModelIdentifier());

                    if (value instanceof String)Â
{
                        value = DefaultLabelProvider.encodeEsacpedChars((String)value);
                    }

                    if (editor != null)Â
{

                        if  (editor.saveVariable(variable, (String) value, DebugUIPlugin.getShell()))Â
{
                            return;
                        }
                    }

                    tryÂ
{
                        variable.setValue((String) value);

                    } catch (DebugException e)Â
{
                        DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), Messages.VariableColumnPresentation_4, Messages.VariableColumnPresentation_5, e.getStatus());
                    }
                }
            }
        }
    }

}
]]>