2011-12-30 2 views
0

У меня есть команда и обработчик для нее. Событие execute обработчика должно получить значение для свойства, фактически выбранного в представлении свойств, и действовать на него, или быть отключенным, если не выбрано какое-либо свойство.Как сделать страницу свойств ссылкой поставщиком?

Я пробовал:

1) Установить поставщика выбора на то, которое обеспечивает выбор с точки зрения собственности. Что-то в этом случае просто PropertySheetViewer для моего PropertySheetPage, но я не могу установить его как поставщика выбора, потому что средство просмотра PropertySheetPage является закрытым и не имеет getter.

2) Переопределение метода CreateControl PropertySheetPage: этот метод создает элемент управления Tree для PropertySheetViewer. Выбор слушатель может быть установлен для этого элемента управления деревом, так что, может быть, я могу сделать мой обработчик команд реализовать SelectionListener ... Решение будет что-нибудь вроде:

В моем редакторе:

public Object getAdapter(@SuppressWarnings("rawtypes") Class type) { 
     if (type == IPropertySheetPage.class) { 
      PropertySheetPage page = new PropertySheetPage() { 
       @Override 
       public void createControl(Composite parent) { 
        super.createControl(parent); 

            IHandler handler = someWayToGetMyCmdHandler(); 
        ((org.eclipse.swt.widgets.Tree) getControl()) 
          .addSelectionListener(handler); 
       } 

      }; 
      IPropertySheetEntry entry = new UndoablePropertySheetEntry(
        getCommandStack()); 
      page.setRootEntry(entry); 
      return page; 
     } 

    return super.getAdapter(type); 
} 

И мой обработчик команд реализуя SelectionListener, как я сказал ... Проблема с этим подходом заключается в том, что я не могу найти способ получить ссылку на мой обработчик обработанной команды (someWayToGetMyCmdHandler() выше).

У кого-нибудь есть ключ к этому, или любой другой возможный подход к проблеме?

ответ

1

Там в handleEntrySelection(ISelection selection) метод PropertySheetPage, что вы могли бы переопределить, чтобы получать уведомления об изменениях выбора в средстве просмотра (хотя PropertySheetPage является @noextend).

Вторая часть (обновление обработчика) немного сложнее, чем обычно. Команды/обработчики обновляются автоматически при изменении выбора рабочего места (вам просто нужно реализовать setEnabled(Object evaluationContext)AbstractHandler). Но так как PropertySheetPage предназначен для изменения своего ввода при глобальном изменении выбора, тогда вам нужно найти какой-то пользовательский способ уведомления/обновления вашего обработчика.

Как я понимаю, в настоящее время невозможно расширить механизм обработки событий команды платформы с помощью настраиваемых переменных, поэтому вам просто нужно напрямую просмотреть свой обработчик, используя IHandlerService инструментария.

+0

Я добавил частное свойство «выбора» в моем обработчике команд и геттер/сеттер для него, чтобы как можно обычным образом уведомить/обновить обработчик, как вы намеревались. Я думаю, было бы интересно обновить ответ с информацией о том, как искать обработчик с помощью IHandlerService, могу ли я отредактировать ответ, чтобы добавить эту информацию? – roirodriguez

+0

@roirodriguez Вперед :) –

Смежные вопросы