/************************************************************************************* * Copyright (c) 2010-2013 Red Hat, Inc. 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: * JBoss by Red Hat - Initial implementation. ************************************************************************************/ package org.jboss.tools.runtime.ui.internal.wizard; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.browser.IWorkbenchBrowserSupport; import org.jboss.tools.foundation.core.jobs.DelegatingProgressMonitor; import org.jboss.tools.foundation.ui.xpl.taskwizard.IWizardHandle; import org.jboss.tools.foundation.ui.xpl.taskwizard.WizardFragment; import org.jboss.tools.runtime.core.extract.IOverwrite; import org.jboss.tools.runtime.core.internal.RuntimeExtensionManager; import org.jboss.tools.runtime.core.model.DownloadRuntime; import org.jboss.tools.runtime.core.model.IDownloadRuntimeWorkflowConstants; import org.jboss.tools.runtime.core.model.IRuntimeInstaller; import org.jboss.tools.runtime.core.util.internal.DownloadRuntimeOperationUtility; import org.jboss.tools.runtime.ui.RuntimeUIActivator; import org.jboss.tools.runtime.ui.internal.Messages; import org.jboss.tools.runtime.ui.wizard.DownloadRuntimesTaskWizard; /** * * @author snjeza * */ public class FinalizeRuntimeDownloadFragment extends WizardFragment { private static final String DELETE_ON_EXIT = "deleteOnExit"; //$NON-NLS-1$ private static final String JAVA_IO_TMPDIR = "java.io.tmpdir"; //$NON-NLS-1$ private static final String USER_HOME = "user.home"; //$NON-NLS-1$ private static final String DEFAULT_DIALOG_PATH = "defaultDialogPath"; //$NON-NLS-1$ private static final String DEFAULT_DESTINATION_PATH = "defaultDestinationPath"; //$NON-NLS-1$ private DownloadRuntime dlrt; private IDialogSettings dialogSettings; private Button deleteOnExit; private Text destinationPathText; private Text pathText; private String delete; private ControlDecoration decPathError_dne, decPathError_writable, decPathReq; private ControlDecoration destinationPathError_dne, destinationPathError_writable, destinationPathReq; private Link urlText; private Group warningComposite; private Label warningLabel; private Link warningLink; private Composite contents; private Composite pathComposite; private Shell shell; private IWizardHandle handle; public FinalizeRuntimeDownloadFragment() { dialogSettings = RuntimeUIActivator.getDefault().getDialogSettings(); } @Override public boolean hasComposite() { return true; } @Override public void enter() { DownloadRuntime tmp = getDownloadRuntimeFromTaskModel(); if( tmp != null && !tmp.equals(dlrt)) { dlrt = tmp; setDownloadRuntime(dlrt); } } private DownloadRuntime getDownloadRuntimeFromTaskModel() { return (DownloadRuntime)getTaskModel().getObject(DownloadRuntimesTaskWizard.DL_RUNTIME_PROP); } private boolean shouldSuppressCreation() { Object suppress = getTaskModel().getObject(DownloadRuntimesTaskWizard.SUPPRESS_RUNTIME_CREATION); if( suppress instanceof Boolean ) { return ((Boolean)suppress).booleanValue(); } return false; } private void setDescription() { if( getPage() == null ) return; getPage().setTitle(Messages.DownloadRuntimesSecondPage_Download_Runtime); if (getDownloadRuntimeFromTaskModel() != null) { getPage().setDescription("Download Runtime '" + getDownloadRuntimeFromTaskModel().getName() + "'");//$NON-NLS-1$ //$NON-NLS-2$ } else { getPage().setDescription("Download Runtime");//$NON-NLS-1$ } } @Override public Composite createComposite(Composite parent, IWizardHandle handle) { this.handle = handle; this.shell = parent.getShell(); contents = new Composite(parent, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); contents.setLayoutData(gd); contents.setLayout(new GridLayout(1, false)); pathComposite = createAndFillPathComposite(contents); setDownloadRuntime((DownloadRuntime)getTaskModel().getObject(DownloadRuntimesTaskWizard.DL_RUNTIME_PROP)); setDescription(); refresh(); return contents; } private Composite createAndFillPathComposite(Composite parent) { Composite pathComposite = new Composite(parent, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false); pathComposite.setLayoutData(gd); pathComposite.setLayout(new GridLayout(3, false)); Label urlLabel = new Label(pathComposite, SWT.NONE); urlLabel.setText(Messages.DownloadRuntimesSecondPage_URL); urlText = new Link(pathComposite, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, true, false); gd.horizontalSpan=2; urlText.setLayoutData(gd); urlText.addSelectionListener( new SelectionAdapter( ) { public void widgetSelected( SelectionEvent e ) { String t = e.text; String humanUrl = getDownloadRuntimeFromTaskModel().getHumanUrl(); if (humanUrl != null && t.contains(humanUrl)) { IWorkbenchBrowserSupport support = PlatformUI.getWorkbench() .getBrowserSupport(); try { URL url = new URL(humanUrl); support.getExternalBrowser().openURL(url); } catch (Exception e1) { RuntimeUIActivator.pluginLog().logError(e1); final String message = e1.getMessage(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.openError(getActiveShell(), "Error", message);//$NON-NLS-1$ } }); } } } } ); if( requiresManualDownload()) { // Do not make the remainder of the widgets return pathComposite; } Label pathLabel = new Label(pathComposite, SWT.NONE); pathLabel.setText(Messages.DownloadRuntimesSecondPage_Install_folder); pathText = new Text(pathComposite, SWT.BORDER); gd = new GridData(SWT.FILL, SWT.FILL, true, false); pathText.setLayoutData(gd); final String defaultPath = getDefaultPath(); pathText.setText(defaultPath); decPathError_dne = addDecoration(pathText, FieldDecorationRegistry.DEC_WARNING, Messages.DownloadRuntimesSecondPage_This_folder_does_not_exist); decPathError_writable = addDecoration(pathText, FieldDecorationRegistry.DEC_ERROR, Messages.DownloadRuntimesSecondPage_This_folder_not_writable); decPathReq = addDecoration(pathText, FieldDecorationRegistry.DEC_REQUIRED, Messages.DownloadRuntimesSecondPage_This_folder_is_required); pathText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { validate(); } }); Button browseButton = new Button(pathComposite, SWT.NONE); browseButton.setText(Messages.DownloadRuntimesSecondPage_Browse); browseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(shell); dialog.setMessage(Messages.DownloadRuntimesSecondPage_Select_install_folder); dialog.setFilterPath(pathText.getText()); final String path = dialog.open(); if (path == null) { return; } pathText.setText(path); } }); Label destinationLabel = new Label(pathComposite, SWT.NONE); destinationLabel.setText(Messages.DownloadRuntimesSecondPage_Download_folder); destinationPathText = new Text(pathComposite, SWT.BORDER); gd = new GridData(SWT.FILL, SWT.FILL, true, false); destinationPathText.setLayoutData(gd); String destinationPath = dialogSettings.get(DEFAULT_DESTINATION_PATH); destinationPathError_dne = addDecoration(destinationPathText, FieldDecorationRegistry.DEC_WARNING, Messages.DownloadRuntimesSecondPage_This_folder_does_not_exist); destinationPathError_writable = addDecoration(destinationPathText, FieldDecorationRegistry.DEC_ERROR, Messages.DownloadRuntimesSecondPage_This_folder_not_writable); destinationPathReq = addDecoration(destinationPathText, FieldDecorationRegistry.DEC_REQUIRED, Messages.DownloadRuntimesSecondPage_This_folder_is_required); if (destinationPath == null || destinationPath.isEmpty()) { destinationPath=System.getProperty(JAVA_IO_TMPDIR); } destinationPathText.setText(destinationPath); Button browseDestinationButton = new Button(pathComposite, SWT.NONE); browseDestinationButton.setText(Messages.DownloadRuntimesSecondPage_Browse); browseDestinationButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(shell); dialog.setMessage(Messages.DownloadRuntimesSecondPage_Select_ownload_folder); dialog.setFilterPath(destinationPathText.getText()); final String path = dialog.open(); if (path == null) { return; } destinationPathText.setText(path); } }); destinationPathText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { validate(); } }); deleteOnExit = new Button(pathComposite, SWT.CHECK); gd = new GridData(SWT.FILL, SWT.FILL, true, false); gd.horizontalSpan=3; deleteOnExit.setLayoutData(gd); deleteOnExit.setText(Messages.DownloadRuntimesSecondPage_Delete_archive_after_installing); delete = dialogSettings.get(DELETE_ON_EXIT); if (delete == null) { delete = Boolean.TRUE.toString(); } deleteOnExit.setSelection(new Boolean(delete)); deleteOnExit.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { delete = new Boolean(deleteOnExit.getSelection()).toString(); } }); return pathComposite; } private Group createWarningComposite(Composite parent) { warningComposite = new Group(parent, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false); //gd.horizontalSpan = 3; warningComposite.setLayoutData(gd); warningComposite.setLayout(new GridLayout(1, false)); warningComposite.setText(Messages.DownloadRuntimesSecondPage_Warning); warningLabel = new Label(warningComposite, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, true, false); warningLabel.setLayoutData(gd); warningLink = new Link(warningComposite, SWT.NONE); gd = new GridData(SWT.FILL, SWT.FILL, true, false); warningLink.setLayoutData(gd); warningLink.addSelectionListener( new SelectionAdapter( ) { public void widgetSelected( SelectionEvent e ) { String text = e.text; String humanUrl = getDownloadRuntimeFromTaskModel() == null ? null : getDownloadRuntimeFromTaskModel().getHumanUrl(); String linkUrl = null; if (humanUrl != null && "link".equals(text)) {//$NON-NLS-1$ linkUrl = humanUrl; } else if ("Show Details".equals(text)) {//$NON-NLS-1$ linkUrl = "http://www.redhat.com/jboss/";//$NON-NLS-1$ } if (linkUrl != null) { IWorkbenchBrowserSupport support = PlatformUI.getWorkbench() .getBrowserSupport(); try { URL url = new URL(linkUrl); support.getExternalBrowser().openURL(url); } catch (Exception e1) { RuntimeUIActivator.pluginLog().logError(e1); final String message = e1.getMessage(); Display.getDefault().syncExec(new Runnable() { @Override public void run() { MessageDialog.openError(getActiveShell(), "Error", message);//$NON-NLS-1$ } }); } } } } ); return warningComposite; } private String getDefaultPath() { String defaultPath = dialogSettings.get(DEFAULT_DIALOG_PATH); if (defaultPath == null || defaultPath.isEmpty()) { defaultPath=System.getProperty(USER_HOME); } return defaultPath; } private void showDecorations() { if( requiresManualDownload() ) return; String path = pathText == null || pathText.isDisposed() ? "" : pathText.getText(); String destination = destinationPathText == null || destinationPathText.isDisposed() ? "" : destinationPathText.getText(); // hide all decorations decPathError_dne.hide(); decPathError_writable.hide(); decPathReq.hide(); destinationPathError_dne.hide(); destinationPathError_writable.hide(); destinationPathReq.hide(); ArrayList<IStatus> all = new ArrayList<IStatus>(); if( path.isEmpty() ) { decPathReq.show(); all.add(new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Install_folder_is_required)); } if( destination.isEmpty() ) { destinationPathReq.show(); all.add(new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Download_folder_is_required)); } boolean pathExists = checkPathExists(path); boolean pathWritable = checkPathWritable(path); //, decPathError); boolean destExists = checkPathExists(destination); boolean destWritable = checkPathWritable(destination); //, destinationPathError); if( pathExists && !pathWritable ) { decPathError_writable.show(); decPathError_writable.setShowHover(true); all.add(new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Install_folder_not_writable)); } if( destExists && !destWritable ) { destinationPathError_writable.show(); destinationPathError_writable.setShowHover(true); all.add(new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Download_folder_not_writable)); } if (!pathExists) { decPathError_dne.show(); decPathError_dne.setShowHover(true); all.add(new Status(IStatus.INFO, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Install_folder_does_not_exist)); } if( !destExists) { destinationPathError_dne.show(); destinationPathError_dne.setShowHover(true); all.add(new Status(IStatus.INFO, RuntimeUIActivator.PLUGIN_ID, Messages.DownloadRuntimesSecondPage_Download_folder_does_not_exist)); } IStatus working = null; IStatus worstStatus = null; for(Iterator<IStatus> i = all.iterator(); i.hasNext(); ) { working = i.next(); if( worstStatus == null || working.getSeverity() > worstStatus.getSeverity() ) { worstStatus = working; } } int messageType = IWizardHandle.NONE; if( worstStatus != null ) { switch(worstStatus.getSeverity()) { case IStatus.OK: messageType = IWizardHandle.NONE; break; case IStatus.INFO: messageType = IWizardHandle.INFORMATION; break; case IStatus.WARNING: messageType = IWizardHandle.WARNING; break; case IStatus.ERROR: messageType = IWizardHandle.ERROR; break; } } handle.setMessage(worstStatus == null ? "" : worstStatus.getMessage(), messageType); setComplete(messageType != IWizardHandle.ERROR); handle.update(); } private boolean checkPathExists(String path) { if (path.isEmpty()) { return true; } return new File(path).exists(); } private boolean checkPathWritable(String path) { if (path.isEmpty()) { return true; } try { File file = File.createTempFile("temp", "txt", new File(path));//$NON-NLS-1$ //$NON-NLS-2$ file.deleteOnExit(); file.delete(); } catch (IOException e) { return false; } return true; } protected ControlDecoration addDecoration(Control control, String id, String description) { final ControlDecoration decPath = new ControlDecoration(control, SWT.TOP | SWT.LEFT); FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault(); FieldDecoration fd = registry.getFieldDecoration(id); decPath.setImage(fd.getImage()); fd.setDescription(description); decPath.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration( id).getImage()); decPath.setShowOnlyOnFocus(false); decPath.setShowHover(true); decPath.setDescriptionText(description); decPath.hide(); return decPath; } protected void validate() { handle.setMessage(null, IWizardHandle.NONE); showDecorations(); } private void refresh() { // Completely remove and then re-create the warning composite (??) if (contents != null && !contents.isDisposed()) { if( pathComposite != null ) { pathComposite.dispose(); pathComposite = null; } if (warningComposite != null) { warningComposite.dispose(); warningComposite = null; } contents.layout(true, true); contents.pack(); } DownloadRuntime downloadRuntime = getDownloadRuntimeFromTaskModel(); if (downloadRuntime != null) { boolean requireManualDownload = requiresManualDownload(); pathComposite = createAndFillPathComposite(contents); if (getDownloadUrl() != null) { urlText.setText(getDownloadUrl()); } else if (downloadRuntime.getHumanUrl() != null){ urlText.setText("<a>"+downloadRuntime.getHumanUrl().trim()+"</a>");//$NON-NLS-1$ //$NON-NLS-2$ } else { urlText.setText(""); //$NON-NLS-1$ } boolean isDisclaimer = downloadRuntime.isDisclaimer(); boolean showWarning = isDisclaimer || requireManualDownload; if (showWarning) { warningComposite = createWarningComposite(contents); if (isDisclaimer) { warningLabel.setText("This is a community project and, as such is not supported with an SLA.");//$NON-NLS-1$ warningLink.setText("If you're looking for fully supported, certified, enterprise middleware try JBoss Enterprise Middleware products. <a>Show Details</a>");//$NON-NLS-1$ } else if (requireManualDownload) { warningLabel.setText("This runtime is only available as manual download.");//$NON-NLS-1$ warningLink.setText("Please click on the download <a>link</a>.");//$NON-NLS-1$ } } } contents.getParent().layout(true, true); validate(); updateWidgetEnablementForDownloadRuntime(); } public void setDownloadRuntime(DownloadRuntime selectedRuntime) { setDescription(); if (contents != null && !contents.isDisposed()) { refresh(); if (selectedRuntime != null) { setComplete(true); } else { setComplete(true); } } else { setComplete(false); } handle.update(); } private void updateWidgetEnablementForDownloadRuntime() { DownloadRuntime downloadRuntime = getDownloadRuntimeFromTaskModel(); if( downloadRuntime == null ) return; if( !requiresManualDownload()) { boolean enabled = (getDownloadUrl() != null); deleteOnExit.setEnabled(enabled); destinationPathText.setEnabled(enabled); pathText.setEnabled(enabled); } } private boolean requiresManualDownload() { DownloadRuntime downloadRuntime = getDownloadRuntimeFromTaskModel(); if( downloadRuntime != null ) { boolean hasNoDlUrl = downloadRuntime.getUrl() == null && downloadRuntime.getHumanUrl() != null; if( hasNoDlUrl ) { String fromTaskModel = (String)getTaskModel().getObject(DownloadRuntimesTaskWizard.DL_RUNTIME_URL); // No authenticator UI has overridden this with a new / temporary URL if( fromTaskModel == null ) return true; } // Either the downloadruntime includes all needed information, or // the taskModel contains the information } return false; } private String getDownloadUrl() { DownloadRuntime downloadRuntime = getDownloadRuntimeFromTaskModel(); if( downloadRuntime != null ) { String dlUrl = downloadRuntime.getUrl(); if( dlUrl == null ) { return (String)getTaskModel().getObject(DownloadRuntimesTaskWizard.DL_RUNTIME_URL); } return dlUrl; } return null; } public void performFinish(final IProgressMonitor monitor) { Display.getDefault().syncExec(new Runnable() { public void run() { finishPage(monitor); } }); } public boolean finishPage(IProgressMonitor monitor) { if( requiresManualDownload() ) { // User is expected to have downloaded this on their own return true; } String selectedDirectory = pathText.getText(); String destinationDirectory = destinationPathText.getText(); boolean del = deleteOnExit.getSelection(); return downloadRuntime(selectedDirectory, destinationDirectory, del, monitor); } private void saveDialogSettings() { String systemTempDir = System.getProperty(JAVA_IO_TMPDIR); if( systemTempDir.equals(destinationPathText.getText())) { dialogSettings.put(DEFAULT_DESTINATION_PATH, (String)null); } else { dialogSettings.put(DEFAULT_DESTINATION_PATH, destinationPathText.getText()); } dialogSettings.put(DEFAULT_DIALOG_PATH, pathText.getText()); dialogSettings.put(DELETE_ON_EXIT, delete); } private boolean downloadRuntime(final String unzipDirectory, final String downloadDirectory, final boolean deleteOnExit, IProgressMonitor monitor) { saveDialogSettings(); final DownloadRuntime downloadRuntime = getDownloadRuntimeFromTaskModel(); final boolean suppressCreation = shouldSuppressCreation(); final DelegatingProgressMonitor delegatingMonitor = new DelegatingProgressMonitor(); getTaskModel().putObject(DownloadRuntimesTaskWizard.DOWNLOAD_JOB_DELEGATING_PROGRESS_MONITOR, delegatingMonitor); Job downloadJob = new Job("Download '" + downloadRuntime.getName()) {//$NON-NLS-1$ @Override public IStatus run(IProgressMonitor jobMonitor) { delegatingMonitor.add(jobMonitor); String installationMethod = downloadRuntime.getInstallationMethod(); IRuntimeInstaller installer = getInstaller(installationMethod); if( installer == null ) { // Show error and cancel return new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, "Unable to find an installer with id " + installationMethod); } delegatingMonitor.beginTask("Downloading and Installing Runtime", 100); IOverwrite ow = DownloadRuntimeOperationUIUtility.createOverwriteFileQuery(); getTaskModel().putObject(IDownloadRuntimeWorkflowConstants.OVERWRITE, ow); int firstStep = suppressCreation ? 99 : 95; IStatus ret = installer.installRuntime(downloadRuntime, unzipDirectory, downloadDirectory, deleteOnExit, getTaskModel(), new SubProgressMonitor(delegatingMonitor, firstStep)); if( !suppressCreation && ret.isOK()) { String updatedRuntimeRoot = (String)getTaskModel().getObject(DownloadRuntimesWizard.UNZIPPED_SERVER_HOME_DIRECTORY); if( updatedRuntimeRoot == null || !new File(updatedRuntimeRoot).exists()) { updatedRuntimeRoot = unzipDirectory; } if( updatedRuntimeRoot == null || !new File(updatedRuntimeRoot).exists()) { ret = new Status(IStatus.ERROR, RuntimeUIActivator.PLUGIN_ID, "No runtime found at path " + updatedRuntimeRoot); } else { ret = DownloadRuntimeOperationUIUtility.createRuntimes(updatedRuntimeRoot, new SubProgressMonitor(delegatingMonitor, 4)); } } if( delegatingMonitor.isCanceled()) return Status.CANCEL_STATUS; if( !ret.isOK() && ret.getSeverity() != IStatus.CANCEL) { openErrorMessage(ret.getMessage(), true); } return Status.OK_STATUS; } private IRuntimeInstaller getInstaller(String installerId) { return RuntimeExtensionManager.getDefault().getRuntimeInstaller(installerId); } }; downloadJob.setUser(false); downloadJob.schedule(1000); getTaskModel().putObject(DownloadRuntimesTaskWizard.DOWNLOAD_JOB, downloadJob); return true; } private Shell getActiveShell() { Display display = Display.getDefault(); if (display != null) { if (shell == null) return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); } return shell; } private static void openErrorMessage(final String msg, boolean log) { openErrorMessage( "Error", msg, log); //$NON-NLS-1$ } private static void openErrorMessage(final String msg) { openErrorMessage(msg, false); } private static void openWarningMessage(final String title, final String msg) { Display.getDefault().asyncExec(new Runnable() { public void run() { MessageDialog.openWarning(Display.getDefault() .getActiveShell(), title, msg); } }); } private static void openErrorMessage(final String title, final String msg, boolean log) { if( log ) RuntimeUIActivator.pluginLog().logError(msg); openErrorMessage("Error", msg); //$NON-NLS-1$ } private static void openErrorMessage(final String title, final String msg) { Display.getDefault().asyncExec(new Runnable() { public void run() { Shell s = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); MessageDialog.openError(s, title, msg); } }); } }