2013-12-20 3 views
0

У меня есть ObservableList элементов модели. Элемент модели включен для привязки свойств (сеттер запускает событие с измененным свойством). Список - это поставщик контента для TableViewer, который позволяет редактировать ячейки. Я также намерен добавить способ добавления новых строк (элементов модели) через TableViewer, чтобы количество элементов в списке могло меняться со временем.Как я могу наблюдать измененное состояние элементов модели в ObservableList?

До сих пор так хорошо.

Поскольку все это находится в редакторе затмения, я хотел бы знать, когда модель будет изменена. Мне просто нужно одно измененное событие из любого измененного элемента модели, чтобы установить «грязный» редактор. Наверное, я мог бы приложить какой-то слушатель к каждому объекту элемента списка, но мне интересно, есть ли у него умный способ.

ответ

0

Я думаю, что у меня может быть решение. Следующий класс является встроенным текстовым редактором. Изменения в компоненте модели (все экземпляры) собираются с использованием слушателя, добавленного в doCreateElementObservable. Мой редактор eclipse просто должен добавить своего «собственного слушателя изменений», чтобы он был информирован.

public class InlineEditingSupport extends ObservableValueEditingSupport 
{ 
    private CellEditor cellEditor; 
    private String property; 
    private DataBindingContext dbc; 

    IChangeListener changeListener = new IChangeListener() 
    { 
     @Override 
     public void handleChange(ChangeEvent event) 
     { 
      for (ITableEditorChangeListener listener : listenersChange) 
      { 
       listener.changed(); 
      } 
     } 
    }; 

    public InlineEditingSupport(ColumnViewer viewer, DataBindingContext dbc, String property) 
    { 
     super(viewer, dbc); 
     cellEditor = new TextCellEditor((Composite) viewer.getControl()); 
       this.property = property; 
       this.dbc = dbc; 
    } 

    protected CellEditor getCellEditor(Object element) 
    { 
     return cellEditor; 
    } 

    @Override 
    protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor) 
    { 
     return SWTObservables.observeText(cellEditor.getControl(), SWT.Modify); 
    } 

    @Override 
    protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell) 
    { 
     IObservableValue value = BeansObservables.observeValue(element, property); 
     value.addChangeListener(changeListener); // ADD THIS LINE TO GET CHANGE EVENTS 
     return value; 
    } 

    private List<ITableEditorChangeListener> listenersChange = new ArrayList<ITableEditorChangeListener>(); 

    public void addChangeListener(ITableEditorChangeListener listener) 
    { 
     listenersChange.remove(listener); 
     listenersChange.add(listener); 
    } 

    public void removeChangeListener(ITableEditorChangeListener listener) 
    { 
     listenersChange.remove(listener); 
    } 
} 
Смежные вопросы