Каковы предпочтительные способы взаимодействия действий с представлениями? - PullRequest
1 голос
/ 11 сентября 2009

Все, Я создал плагин с помощью мастера «создать плагин с видом», который создал просмотрщик дерева. Мастер создает Действия непосредственно в представлении, и, следовательно, все части представления являются видимыми для действий. Это хорошо для простых плагинов, но не для «реальных» плагинов, особенно если вам нужна привязка ключей.

Мой вопрос таков: каков «предпочтительный» способ взаимодействия представлений и действий друг с другом, когда действия не являются классами в представлении?

Например: у меня есть это дерево просмотра. Пользователь выбирает различные элементы в дереве, а затем щелкает правой кнопкой мыши, и появляется меню с моим действием в нем. Пользователь щелкает пункт меню. Это затем запускает мое действие.

A) Как Действие получает «данные» выбора в этой программе просмотра дерева, то есть базовые объекты, составляющие дерево

б) Когда Действие запускается, я хочу, чтобы он взял каждый выбранный элемент, выполнил некоторую операцию, а затем обновил базовый объект, а также изменил видимый внешний вид дерева в результате операции, которую я выполнил ... то есть я хочу, чтобы действие сообщалось древовидной программе просмотра. Возможно, я хочу изменить значок элемента выбранного элемента, например. Кроме того, когда начинается действие, я хочу, чтобы оно взаимодействовало не только с древовидным представлением, но и с другими видимыми элементами представления ... возможно, ему следует отключить определенные кнопки, которые в противном случае были бы видны, когда действие не выполняется, и затем, когда действие завершает свою задачу, я хочу, чтобы оно сообщило обратно представлению, чтобы обновить кнопки и, возможно, увеличить счетчики в некоторой метке.

в) Кроме того, когда дерево обновляется в результате действия, выполняющего какую-либо операцию, я бы хотел, чтобы другой зритель в том же виде ответил. Например, может быть, есть TableViewer в виде, под деревом, и его работа состоит в том, чтобы показывать некоторые детали выбранных элементов в древовидном представлении. Таким образом, действие выполняется, оно работает со всеми выбранными элементами в дереве; он обновляет эти элементы, а когда он обновляет эти элементы, средство просмотра таблиц «детали» обновляется в результате появления новых данных в объектах средства просмотра дерева.

В настоящее время у меня есть что-то похожее на эту работу, но я знаю, что мой подход неверен. Действия являются отдельными классами, но я создаю их новый экземпляр в представлении, передавая представление в конструктор Action и предоставляя методы получения и установки для представления, которое Action вызывает напрямую. Кроме того, поскольку я не делаю ничего этого с plugin.xml, я не получаю настраиваемую привязку клавиш .... только жестко закодированные привязки клавиш, которые я добавил в представление.

Суть в том, что я хочу по-настоящему научиться «правильному способу» делать это в Eclipse, а не просто «как это работает». Примеры МОЖЕТ приветствоваться!

Спасибо.

1 Ответ

0 голосов
/ 11 сентября 2009

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

Вот фрагмент того, что у меня есть, надеюсь, это поможет.

public class SubmitEditorActionDelegate implements IEditorActionDelegate { 
private IEditorPart targetEditor;

private ISelection selection;

/*
 * (non-Javadoc)
 * 
 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction,
 *      org.eclipse.ui.IEditorPart)
 */
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
    this.targetEditor = targetEditor;
}
/*
 * (non-Javadoc)
 * 
 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
 *      org.eclipse.jface.viewers.ISelection)
 */
public void selectionChanged(IAction action, ISelection selection) {
    logger.fine("selectionChanged" + selection +"action ="+action);
    if (selection != null && (selection instanceof ITextSelection)){ 
        this.selection = selection;
    }else {
        this.selection=null;
    }           

}

public void run(IAction action) {
    if (targetEditor != null && targetEditor instanceof ProgramEditor) {
        ProgramEditor editor = (ProgramEditor) targetEditor;

        IDocumentProvider docProvider = editor.getDocumentProvider();
        IEditorInput input = editor.getEditorInput();

            String selectedText=((ITextSelection) selection).getText();
            }
     }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...