//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 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 // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.ui.actions; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.edit.provider.IItemLabelProvider; import org.eclipse.epf.authoring.ui.wizards.NewConfigurationWizard; import org.eclipse.epf.common.ui.util.ErrorDialogNoReason; import org.eclipse.epf.common.ui.util.MsgBox; import org.eclipse.epf.library.edit.command.IUserInteractionHandler; import org.eclipse.epf.library.edit.command.MethodElementCreateChildCommand; import org.eclipse.epf.library.edit.command.UserInput; import org.eclipse.epf.library.ui.LibraryUIPlugin; import org.eclipse.epf.library.ui.dialogs.UncancelableListSelectionDialog; import org.eclipse.epf.library.ui.dialogs.UserInputsDialog; import org.eclipse.epf.library.ui.providers.DelegateLabelProvider; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; /** * Implements handling of user interaction during command execution * * @author Phong Nguyen Le * @since 1.0 */ public class UserInteractionHandler implements IUserInteractionHandler { private Shell shell; private IMessenger messenger = new IMessenger() { /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String, * java.lang.String) */ public void showWarning(final String title, final String msg) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayWarning(title, msg); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayWarning( title, msg); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String, * java.lang.String, org.eclipse.core.runtime.IStatus) */ public void showError(final String title, final String msg, final IStatus status) { if (status == null) { showError(title, msg); } else { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayError(title, msg, status); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayError( title, msg, status); } } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String, * java.lang.String, java.lang.String, java.lang.Exception) */ public void showError(final String title, final String msg, final String reason, final Exception exception) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayError(title, msg, reason, exception); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayError(title, msg, reason, exception); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showWarning(java.lang.String, * java.lang.String, java.lang.String) */ public void showWarning(final String title, final String msg, final String reason) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayWarning(title, msg, reason); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayWarning( title, msg, reason); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String, * java.lang.String) */ public void showError(final String title, final String msg) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayError(title, msg); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayError(title, msg); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showInfo(java.lang.String, * java.lang.String) */ public void showInfo(final String title, final String msg) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayInfo(title, msg); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayInfo(title, msg); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler.IMessenger#showError(java.lang.String, * java.lang.String, java.lang.String, java.lang.String, * java.lang.Exception) */ public void showError(final String title, final String msg, final String reason, final String details, final Exception exception) { if (Display.getCurrent() == null) { // current thread is not a user-interface thread // Display.getDefault().syncExec(new Runnable() { public void run() { LibraryUIPlugin.getDefault().getMsgDialog() .displayError(title, msg, reason, details, exception); } }); } else { LibraryUIPlugin.getDefault().getMsgDialog().displayError(title, msg, reason, details, exception); } } }; public UserInteractionHandler() { } /** * @param shell * the shell to set */ public void setShell(Shell shell) { this.shell = shell; } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#getUIContext() */ public Object getUIContext() { if (shell == null) { return MsgBox.getDefaultShell(); } return shell; } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#select(java.util.List, * org.eclipse.jface.viewers.ILabelProvider, boolean, java.util.List, * java.lang.String, java.lang.String) */ public List select(List objectsToSelect, final IItemLabelProvider labelProvider, boolean multiple, List intitialSelection, String title, String msg) { ILabelProvider lp = new DelegateLabelProvider(labelProvider); if (multiple) { IStructuredContentProvider contentProvider = new ArrayContentProvider(); UncancelableListSelectionDialog dlg = new UncancelableListSelectionDialog( shell, objectsToSelect, contentProvider, lp, msg); dlg.setTitle(title); dlg.setBlockOnOpen(true); dlg.open(); Object objs[] = dlg.getResult(); if (objs == null) { return null; } else { if (objs.length == 0) { return Collections.EMPTY_LIST; } return Arrays.asList(objs); } } else { ElementListSelectionDialog dlg = new ElementListSelectionDialog( shell, lp); dlg.setBlockOnOpen(true); dlg.setElements(objectsToSelect.toArray()); dlg.setMultipleSelection(false); dlg.setMessage(msg); dlg.setTitle(title); dlg.setFilter(null); if (dlg.open() == Dialog.CANCEL) { return null; } Object obj = dlg.getFirstResult(); return Collections.singletonList(obj); } } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#selectOne(int[], * java.lang.String, java.lang.String) */ public int selectOne(int[] actions, String title, String msg, IStatus status) { final String[] buttonLabels = new String[actions.length]; for (int i = 0; i < actions.length; i++) { buttonLabels[i] = getActionText(actions[i]); } Image image = null; try { shell = LibraryUIPlugin.getDefault().getWorkbench().getDisplay() .getActiveShell(); image = shell.getImage(); } catch (Exception e) { } if (status == null) { MessageDialog msgDlg = new MessageDialog(shell, title, image, msg, MessageDialog.QUESTION, buttonLabels, 0); int id = msgDlg.open(); return actions[id]; } else { ErrorDialogNoReason dlg = new ErrorDialogNoReason(shell, title, msg, status, IStatus.OK | IStatus.INFO | IStatus.WARNING | IStatus.ERROR) { protected void createButtonsForButtonBar(Composite parent) { // create OK and Details buttons for (int i = 0; i < buttonLabels.length; i++) { String label = buttonLabels[i]; createButton(parent, i, label, i == 0); } if (shouldShowDetailsButton()) { detailsButton = createButton(parent, IDialogConstants.DETAILS_ID, IDialogConstants.SHOW_DETAILS_LABEL, false); } } /* * (non-Javadoc) * * @see org.eclipse.epf.common.serviceability.ErrorDialogNoReason#buttonPressed(int) */ protected void buttonPressed(int id) { if (id == IDialogConstants.DETAILS_ID) { super.buttonPressed(id); } else { setReturnCode(id); close(); } } }; int id = dlg.open(); return actions[id]; } } /** * Return action text * * @param action * @return Action text - either ABORT, CANCEL, OK, RETRY */ public static String getActionText(int action) { switch (action) { case IUserInteractionHandler.ACTION_ABORT: return IDialogConstants.ABORT_LABEL; case IUserInteractionHandler.ACTION_CANCEL: return IDialogConstants.CANCEL_LABEL; case IUserInteractionHandler.ACTION_OK: return IDialogConstants.OK_LABEL; case IUserInteractionHandler.ACTION_RETRY: return IDialogConstants.RETRY_LABEL; case IUserInteractionHandler.ACTION_YES: return IDialogConstants.YES_LABEL; case IUserInteractionHandler.ACTION_NO: return IDialogConstants.NO_LABEL; default: break; } return null; } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#getMessenger() */ public IMessenger getMessenger() { return messenger; } /* * @see org.eclipse.epf.library.edit.command.IUserInteractionHandler#requestInput(java.lang.String, * java.lang.String, java.util.List) */ public boolean requestInput(final String title, final String msg, final List userInputs) { if (userInputs == null || userInputs.size() == 0) return false; if (Display.getCurrent() == null) { // current thread is not a user-interface thread // final boolean retHolder[] = new boolean[1]; Display.getDefault().syncExec(new Runnable() { public void run() { retHolder[0] = doRequestInput(title, msg, userInputs); } }); return retHolder[0]; } else { return doRequestInput(title, msg, userInputs); } } private boolean doRequestInput(String title, String msg, List userInputs) { final UserInput userInput = (UserInput) userInputs.get(0); if (userInput.getContext() instanceof MethodElementCreateChildCommand) { MethodElementCreateChildCommand cmd = (MethodElementCreateChildCommand) userInput .getContext(); if (cmd.getFeature() == UmaPackage.eINSTANCE .getMethodLibrary_PredefinedConfigurations()) { NewConfigurationWizard wizard = new NewConfigurationWizard(); wizard.init(PlatformUI.getWorkbench(), null); wizard.setMethodConfiguration((MethodConfiguration) cmd.getChild()); WizardDialog dialog = new WizardDialog(Display.getCurrent() .getActiveShell(), wizard); dialog.create(); if (dialog.open() == Window.OK) { userInput.setInput(wizard.getMethodConfiguration().getName()); return true; } else { return false; } } } if(userInputs.size() == 1 && userInput.getType() == UserInput.TEXT && userInput.getLabel() == null) { // user InputDialog for this case until we fix this dialog box // IInputValidator validator = userInput.getValidator() != null ? new IInputValidator() { public String isValid(String newText) { return userInput.getValidator().isValid(newText); } } : null; InputDialog dlg = new InputDialog(PlatformUI .getWorkbench().getDisplay().getActiveShell(), title, msg, (String)userInput.getInput(), validator); if(dlg.open() == Window.OK) { userInput.setInput(dlg.getValue()); return true; } return false; } UserInputsDialog dialog = new UserInputsDialog(PlatformUI .getWorkbench().getDisplay().getActiveShell(), userInputs, title, msg); dialog.setBlockOnOpen(true); dialog.open(); return dialog.getResult(); } }