| /******************************************************************************* |
| * Copyright (c) 2000, 2018 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.refactoring.reorg; |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.dltk.internal.corext.refactoring.reorg.IConfirmQuery; |
| import org.eclipse.dltk.internal.corext.refactoring.reorg.IReorgQueries; |
| import org.eclipse.dltk.internal.ui.dialogs.ListDialog; |
| import org.eclipse.dltk.ui.ModelElementLabelProvider; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.jface.dialogs.MessageDialog; |
| import org.eclipse.jface.viewers.ArrayContentProvider; |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Shell; |
| |
| public class ReorgQueries implements IReorgQueries { |
| |
| private final Wizard fWizard; |
| private final Shell fShell; |
| |
| public ReorgQueries(Wizard wizard) { |
| Assert.isNotNull(wizard); |
| fWizard = wizard; |
| fShell = null; |
| } |
| |
| public ReorgQueries(Shell shell) { |
| Assert.isNotNull(shell); |
| fWizard = null; |
| fShell = shell; |
| } |
| |
| private Shell getShell() { |
| Assert.isTrue(fShell == null || fWizard == null); |
| Assert.isTrue(fShell != null || fWizard != null); |
| if (fWizard != null) { |
| return fWizard.getContainer().getShell(); |
| } |
| return fShell; |
| } |
| |
| @Override |
| public IConfirmQuery createYesYesToAllNoNoToAllQuery(String dialogTitle, |
| boolean allowCancel, int queryID) { |
| return new YesYesToAllNoNoToAllQuery(getShell(), allowCancel, |
| dialogTitle); |
| } |
| |
| @Override |
| public IConfirmQuery createYesNoQuery(String dialogTitle, |
| boolean allowCancel, int queryID) { |
| return new YesNoQuery(getShell(), allowCancel, dialogTitle); |
| } |
| |
| @Override |
| public IConfirmQuery createSkipQuery(String dialogTitle, int queryID) { |
| return new SkipQuery(getShell(), dialogTitle); |
| } |
| |
| private static class YesYesToAllNoNoToAllQuery implements IConfirmQuery { |
| private final boolean fAllowCancel; |
| private boolean fYesToAll = false; |
| private boolean fNoToAll = false; |
| private final Shell fShell; |
| private final String fDialogTitle; |
| |
| YesYesToAllNoNoToAllQuery(Shell parent, boolean allowCancel, |
| String dialogTitle) { |
| fShell = parent; |
| fDialogTitle = dialogTitle; |
| fAllowCancel = allowCancel; |
| } |
| |
| @Override |
| public boolean confirm(final String question) |
| throws OperationCanceledException { |
| if (fYesToAll) |
| return true; |
| |
| if (fNoToAll) |
| return false; |
| |
| final int[] result = new int[1]; |
| fShell.getDisplay().syncExec(createQueryRunnable(question, result)); |
| return getResult(result); |
| } |
| |
| @Override |
| public boolean confirm(String question, Object[] elements) |
| throws OperationCanceledException { |
| if (fYesToAll) |
| return true; |
| |
| if (fNoToAll) |
| return false; |
| |
| final int[] result = new int[1]; |
| fShell.getDisplay() |
| .syncExec(createQueryRunnable(question, elements, result)); |
| return getResult(result); |
| } |
| |
| private Runnable createQueryRunnable(final String question, |
| final int[] result) { |
| return new Runnable() { |
| @Override |
| public void run() { |
| int[] resultId = getResultIDs(); |
| |
| MessageDialog dialog = new MessageDialog(fShell, |
| fDialogTitle, null, question, |
| MessageDialog.QUESTION, getButtonLabels(), 0); |
| dialog.open(); |
| |
| if (dialog.getReturnCode() == -1) { // MessageDialog closed |
| // without choice => |
| // cancel | no |
| // see also |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400 |
| result[0] = fAllowCancel ? IDialogConstants.CANCEL_ID |
| : IDialogConstants.NO_ID; |
| } else { |
| result[0] = resultId[dialog.getReturnCode()]; |
| } |
| } |
| |
| private String[] getButtonLabels() { |
| if (YesYesToAllNoNoToAllQuery.this.fAllowCancel) { |
| return new String[] { IDialogConstants.YES_LABEL, |
| IDialogConstants.YES_TO_ALL_LABEL, |
| IDialogConstants.NO_LABEL, |
| IDialogConstants.NO_TO_ALL_LABEL, |
| IDialogConstants.CANCEL_LABEL }; |
| } |
| return new String[] { IDialogConstants.YES_LABEL, |
| IDialogConstants.YES_TO_ALL_LABEL, |
| IDialogConstants.NO_LABEL, |
| IDialogConstants.NO_TO_ALL_LABEL }; |
| } |
| |
| private int[] getResultIDs() { |
| if (YesYesToAllNoNoToAllQuery.this.fAllowCancel) { |
| return new int[] { IDialogConstants.YES_ID, |
| IDialogConstants.YES_TO_ALL_ID, |
| IDialogConstants.NO_ID, |
| IDialogConstants.NO_TO_ALL_ID, |
| IDialogConstants.CANCEL_ID }; |
| } |
| return new int[] { IDialogConstants.YES_ID, |
| IDialogConstants.YES_TO_ALL_ID, |
| IDialogConstants.NO_ID, |
| IDialogConstants.NO_TO_ALL_ID }; |
| } |
| }; |
| } |
| |
| private Runnable createQueryRunnable(final String question, |
| final Object[] elements, final int[] result) { |
| return () -> { |
| ListDialog dialog = new YesNoListDialog(fShell, true); |
| dialog.setAddCancelButton(false); |
| dialog.setBlockOnOpen(true); |
| dialog.setContentProvider(new ArrayContentProvider()); |
| dialog.setLabelProvider(new ModelElementLabelProvider()); |
| dialog.setTitle(fDialogTitle); |
| dialog.setMessage(question); |
| dialog.setInput(elements); |
| |
| dialog.open(); |
| result[0] = dialog.getReturnCode(); |
| }; |
| } |
| |
| private boolean getResult(int[] result) |
| throws OperationCanceledException { |
| switch (result[0]) { |
| case IDialogConstants.YES_TO_ALL_ID: |
| fYesToAll = true; |
| return true; |
| case IDialogConstants.YES_ID: |
| return true; |
| case IDialogConstants.CANCEL_ID: |
| throw new OperationCanceledException(); |
| case IDialogConstants.NO_ID: |
| return false; |
| case IDialogConstants.NO_TO_ALL_ID: |
| fNoToAll = true; |
| return false; |
| default: |
| Assert.isTrue(false); |
| return false; |
| } |
| } |
| } |
| |
| private static class YesNoQuery implements IConfirmQuery { |
| |
| private final Shell fShell; |
| private final String fDialogTitle; |
| private final boolean fAllowCancel; |
| |
| YesNoQuery(Shell parent, boolean allowCancel, String dialogTitle) { |
| fShell = parent; |
| fDialogTitle = dialogTitle; |
| fAllowCancel = allowCancel; |
| } |
| |
| @Override |
| public boolean confirm(String question) |
| throws OperationCanceledException { |
| final int[] result = new int[1]; |
| fShell.getDisplay().syncExec(createQueryRunnable(question, result)); |
| return getResult(result); |
| } |
| |
| @Override |
| public boolean confirm(String question, Object[] elements) |
| throws OperationCanceledException { |
| final int[] result = new int[1]; |
| fShell.getDisplay() |
| .syncExec(createQueryRunnable(question, elements, result)); |
| return getResult(result); |
| } |
| |
| private Runnable createQueryRunnable(final String question, |
| final int[] result) { |
| return new Runnable() { |
| @Override |
| public void run() { |
| MessageDialog dialog = new MessageDialog(fShell, |
| fDialogTitle, null, question, |
| MessageDialog.QUESTION, getButtonLabels(), 0); |
| dialog.open(); |
| |
| switch (dialog.getReturnCode()) { |
| case -1: // MessageDialog closed without choice => cancel | |
| // no |
| // see also |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400 |
| result[0] = fAllowCancel ? IDialogConstants.CANCEL_ID |
| : IDialogConstants.NO_ID; |
| break; |
| case 0: |
| result[0] = IDialogConstants.YES_ID; |
| break; |
| case 1: |
| result[0] = IDialogConstants.NO_ID; |
| break; |
| case 2: |
| if (fAllowCancel) |
| result[0] = IDialogConstants.CANCEL_ID; |
| else |
| Assert.isTrue(false); |
| break; |
| default: |
| Assert.isTrue(false); |
| break; |
| } |
| } |
| |
| private String[] getButtonLabels() { |
| if (fAllowCancel) { |
| return new String[] { IDialogConstants.YES_LABEL, |
| IDialogConstants.NO_LABEL, |
| IDialogConstants.CANCEL_LABEL }; |
| } |
| return new String[] { IDialogConstants.YES_LABEL, |
| IDialogConstants.NO_LABEL }; |
| } |
| }; |
| } |
| |
| private Runnable createQueryRunnable(final String question, |
| final Object[] elements, final int[] result) { |
| return () -> { |
| ListDialog dialog = new YesNoListDialog(fShell, false); |
| dialog.setAddCancelButton(false); |
| dialog.setBlockOnOpen(true); |
| dialog.setContentProvider(new ArrayContentProvider()); |
| dialog.setLabelProvider(new ModelElementLabelProvider()); |
| dialog.setTitle(fDialogTitle); |
| dialog.setMessage(question); |
| dialog.setInput(elements); |
| |
| dialog.open(); |
| result[0] = dialog.getReturnCode(); |
| }; |
| } |
| |
| private boolean getResult(int[] result) |
| throws OperationCanceledException { |
| switch (result[0]) { |
| case IDialogConstants.YES_ID: |
| return true; |
| case IDialogConstants.CANCEL_ID: |
| throw new OperationCanceledException(); |
| case IDialogConstants.NO_ID: |
| return false; |
| default: |
| Assert.isTrue(false); |
| return false; |
| } |
| } |
| } |
| |
| private static class SkipQuery implements IConfirmQuery { |
| |
| private final Shell fShell; |
| private final String fDialogTitle; |
| private boolean fSkipAll; |
| |
| SkipQuery(Shell parent, String dialogTitle) { |
| fShell = parent; |
| fDialogTitle = dialogTitle; |
| fSkipAll = false; |
| } |
| |
| @Override |
| public boolean confirm(String question) |
| throws OperationCanceledException { |
| if (fSkipAll) |
| return false; |
| final int[] result = new int[1]; |
| fShell.getDisplay().syncExec(createQueryRunnable(question, result)); |
| return getResult(result); |
| } |
| |
| @Override |
| public boolean confirm(String question, Object[] elements) |
| throws OperationCanceledException { |
| throw new UnsupportedOperationException( |
| "Not supported for skip queries"); //$NON-NLS-1$ |
| } |
| |
| private Runnable createQueryRunnable(final String question, |
| final int[] result) { |
| return new Runnable() { |
| @Override |
| public void run() { |
| MessageDialog dialog = new MessageDialog(fShell, |
| fDialogTitle, null, question, |
| MessageDialog.QUESTION, getButtonLabels(), 0); |
| dialog.open(); |
| |
| switch (dialog.getReturnCode()) { |
| case -1: // MessageDialog closed without choice => cancel | |
| // no |
| // see also |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=48400 |
| result[0] = IDialogConstants.CANCEL_ID; |
| break; |
| default: |
| result[0] = dialog.getReturnCode(); |
| } |
| } |
| |
| private String[] getButtonLabels() { |
| return new String[] { IDialogConstants.SKIP_LABEL, |
| ReorgMessages.ReorgQueries_skip_all, |
| IDialogConstants.CANCEL_LABEL }; |
| } |
| }; |
| } |
| |
| private boolean getResult(int[] result) |
| throws OperationCanceledException { |
| switch (result[0]) { |
| // skip button |
| case 0: |
| return false; |
| // skip all button |
| case 1: |
| fSkipAll = true; |
| return false; |
| // Cancel button |
| case 2: |
| throw new OperationCanceledException(); |
| default: |
| return false; |
| } |
| } |
| } |
| |
| private static final class YesNoListDialog extends ListDialog { |
| private final boolean fYesToAllNoToAll; |
| |
| private YesNoListDialog(Shell parent, boolean includeYesToAllNoToAll) { |
| super(parent, SWT.TITLE | SWT.BORDER | SWT.RESIZE |
| | SWT.APPLICATION_MODAL); |
| fYesToAllNoToAll = includeYesToAllNoToAll; |
| } |
| |
| @Override |
| protected void buttonPressed(int buttonId) { |
| super.buttonPressed(buttonId); |
| setReturnCode(buttonId); |
| close(); |
| } |
| |
| @Override |
| protected void createButtonsForButtonBar(Composite parent) { |
| createButton(parent, IDialogConstants.YES_ID, |
| IDialogConstants.YES_LABEL, true); |
| if (fYesToAllNoToAll) |
| createButton(parent, IDialogConstants.YES_TO_ALL_ID, |
| IDialogConstants.YES_TO_ALL_LABEL, false); |
| createButton(parent, IDialogConstants.NO_ID, |
| IDialogConstants.NO_LABEL, false); |
| if (fYesToAllNoToAll) |
| createButton(parent, IDialogConstants.NO_TO_ALL_ID, |
| IDialogConstants.NO_TO_ALL_LABEL, false); |
| createButton(parent, IDialogConstants.CANCEL_ID, |
| IDialogConstants.CANCEL_LABEL, false); |
| } |
| } |
| } |