Подтверждение множественного удаления — Eclipse GMF

Я хотел показать пользователю диалоговое окно подтверждения удаления при удалении объектов из Eclipse GMF. Я переопределил createDeleteSemanticCommand в политике редактирования роли компонента для конкретной EditPart, чтобы включить диалоговое окно подтверждения удаления. Ниже приведены фрагменты кода, которые я сделал.

/////// СООТВЕТСТВУЮЩИЙ КЛАСС ЧАСТИ EDIT, где установлена ​​политика редактирования

protected void createDefaultEditPolicies() {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new 
            ComponentRoleEditPolicy()); 

/////// СООТВЕТСТВУЮЩИЙ КЛАСС EDITPOLICY, в котором выполняются настраиваемые диалоговые операции удаления (ComponentRoleEditPolicy)

protected Command createDeleteSemanticCommand(GroupRequest deleteRequest)
{
if(deleteRequest instanceof GroupRequestViaKeyboard) {
     if(deleteDialog(foo.getName())) 
            {
                return super.createDeleteSemanticCommand(deleteRequest);
            } 
            else {
                return UnexecutableCommand.INSTANCE;
            }
       }
return UnexecutableCommand.INSTANCE;
}

////// УДАЛИТЬ СПОСОБ ПОДТВЕРЖДЕНИЯ

public static boolean deleteDialog(String name) {
    Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
    boolean delete = MessageDialog.openConfirm(shell, "Delete", "Are you sure you want to delete "
    + name + " ?");
    return delete;
}

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

Спасибо.


person Logan    schedule 18.02.2013    source источник
comment
Не уверен, как это сделать правильно, но вот очень уродливое решение: после первого удаления вы можете установить какой-нибудь статический логический флаг doNotAskAgain и сбросить его через долю секунды, используя какой-то поток.   -  person tobias_k    schedule 18.02.2013
comment
Да, это отлично работает через потоки и прочее. Но есть ли какой-либо конкретный API-интерфейс eclipse gmf, чтобы включить диалоговое окно подтверждения удаления для элемента (ов). Любая помощь по этому поводу?   -  person Logan    schedule 19.02.2013
comment
По-прежнему нет «правильного» решения, но вы также можете обойтись без потоков, просто запомнив метку времени последнего удаления и проверив, когда было выполнено последнее удаление, прежде чем показывать диалог...   -  person tobias_k    schedule 19.02.2013


Ответы (1)


Вот решение, которому я следовал, чтобы решить проблему.

В специально сгенерированном классе DeleteAction переопределите следующие методы.

// confirm dialog for rightclicking and selecting "Delete from Model"
@Override
public void runWithEvent(Event event) {
    if(deleteDialog("the selected element(s)"))
        super.runWithEvent(event);
}
// Confirm dialog for pressing delete key. 
@Override
public void run() {
    if(deleteDialog("the selected element(s)")) {
        super.run();
    }
}

чтобы добавить действие клавиши удаления, в сгенерированном классе XXXDiagramEditor,

// In the generated configureGraphicalViewer() - Change to @Generated NOT
KeyHandler keyHandler = getDiagramGraphicalViewer().getKeyHandler();
keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), new DeleteElementAction(this)/*Custom generated delete action*/);
getDiagramGraphicalViewer().setKeyHandler(keyHandler);

После добавления этих кодов все заработало как часы. Он запросит диалоговое окно подтверждения, когда мы нажмем «Удалить» (даже после выбора любого количества элементов) и выполнит необходимые операции. Также, когда мы щелкаем правой кнопкой мыши и выбираем «Удалить из модели», это работает. Также нам не нужна политика редактирования роли компонента. Я удалил его из installEditPolicy() [также из файла editPolicy].

person Logan    schedule 21.02.2013