/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.eclipse.utils.ui; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.ebayopensource.turmeric.eclipse.exception.core.SOAPartNotFoundException; import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; 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.jface.resource.JFaceResources; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.help.IWorkbenchHelpSystem; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.progress.IProgressService; import org.eclipse.ui.progress.UIJob; /** * Standard Utility class for UI operations. Most of these will be used form * wizards, editors and views. * * @author smathew * */ public class UIUtil { /** * Progress service. * * @return the i progress service */ public static IProgressService progressService() { return getWorkbench().getProgressService(); } /** * Gets the workbench. * * @return the workbench */ public static IWorkbench getWorkbench() { return PlatformUI.getWorkbench(); } /** * Gets the help system. * * @return the help system */ public static IWorkbenchHelpSystem getHelpSystem() { return getWorkbench().getHelpSystem(); } /** * Display. * * @return the display */ public static Display display() { if (Display.getCurrent() != null) return Display.getCurrent(); return Display.getDefault(); } /** * @author yayu * * @param <T> */ public static interface IRunnable<T> { public T run(); } /** * File dialog. * * @param title the title * @param filterExtensions the filter extensions * @return the string */ public static String fileDialog(final String title, final String... filterExtensions) { final FileDialog dialog = new FileDialog(getActiveShell(), SWT.OPEN); dialog.setText(title); dialog.setFilterExtensions(filterExtensions); return dialog.open(); } /** * File dialog. * * @param title the title * @param sourceFile the source file * @param filterExtensions the filter extensions * @return the string */ public static String fileDialog(final String title, File sourceFile, final String... filterExtensions) { boolean isFile = sourceFile.isFile(); boolean exist = sourceFile.exists(); String fileName = ""; if(isFile == true && exist == true){ fileName = sourceFile.getName(); } return fileDialog(title, fileName, sourceFile, filterExtensions); } /** * File dialog. * * @param title the title * @param filterName the filter name * @param sourceFile the source file * @param filterExtensions the filter extensions * @return the string */ public static String fileDialog(final String title, String filterName, File sourceFile, final String... filterExtensions) { final FileDialog dialog = new FileDialog(getActiveShell(), SWT.OPEN); boolean isFile = sourceFile.isFile(); boolean exist = sourceFile.exists(); String filePath = ""; if (isFile == true && exist == true) { filePath = sourceFile.getParent(); } else if (isFile == false) { filePath = sourceFile.getPath(); } dialog.setText(title); dialog.setFilterExtensions(filterExtensions); dialog.setFilterPath(filePath); dialog.setFilterNames(new String[] { filterName }); return dialog.open(); } /** * Gets the active shell. * * @return the active shell */ public static Shell getActiveShell() { return getActiveWorkBenchWindow().getShell(); } /** * Gets the active work bench window. * * @return the active work bench window */ public static IWorkbenchWindow getActiveWorkBenchWindow() { final IWorkbench workbench = PlatformUI.getWorkbench(); final WorkBenchWindowWrapper windowWrapper = new WorkBenchWindowWrapper(); workbench.getDisplay().syncExec(new Runnable() { @Override public void run() { IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); windowWrapper.setWorkbenchWindow(window); if (window == null) { if (workbench.getWorkbenchWindowCount() > 0) { window = workbench.getWorkbenchWindows()[0]; windowWrapper.setWorkbenchWindow(window); } } } }); return windowWrapper.getWorkbenchWindow(); } /** * This dialogs open up a modal file dialog The modal behaviour is on * application level. * * @param title the title * @param filterExtensions the filter extensions * @return the string */ public static String modalFileDialog(final String title, final String... filterExtensions) { final FileDialog dialog = new FileDialog(getActiveShell(), SWT.OPEN | SWT.APPLICATION_MODAL); dialog.setText(title); dialog.setFilterExtensions(filterExtensions); return dialog.open(); } /** * Directory dialog. * * @param title the title * @param filterPath the filter path * @return the string */ public static String directoryDialog(final String title, final String filterPath) { final DirectoryDialog dialog = new DirectoryDialog(getActiveShell(), SWT.PUSH); dialog.setText(title); if (StringUtils.isNotBlank(filterPath)) dialog.setFilterPath(filterPath); return dialog.open(); } /** * Run job in ui dialog. * * @param <J> the generic type * @param job the job * @return the j */ public static <J extends Job> J runJobInUIDialog(J job) { getWorkbench().getProgressService() .showInDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell(), job); return job; } /** * Open property page. * * @param adaptable the adaptable * @param pageID the page id */ public static void openPropertyPage(final IAdaptable adaptable, final String pageID) { final Runnable runnable = new Runnable() { @Override public void run() { PreferencesUtil.createPropertyDialogOn( PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell(), adaptable, pageID, null, null) .open(); } }; Display.getCurrent().asyncExec(runnable); } /** * Open choice dialog. * * @param title the title * @param message the message * @param type the type * @param yesLabel the yes label * @param noLabel the no label * @return true, if successful */ public static boolean openChoiceDialog(final String title, final String message, final int type, final String yesLabel, final String noLabel) { final boolean[] returnValue = new boolean[1]; final Runnable runnable = new Runnable() { @Override public void run() { MessageDialog dialog = new MessageDialog(getWorkbench() .getActiveWorkbenchWindow().getShell(), "eBay SOA Plugin: " + title, null, message, type, new String[] { yesLabel, noLabel }, 0); dialog.setBlockOnOpen(true); returnValue[0] = dialog.open() == Window.OK; } }; Display.getCurrent().syncExec(runnable); return returnValue[0]; } /** * Open choice dialog. * * @param title the title * @param message the message * @param type the type * @return true, if successful */ public static boolean openChoiceDialog(final String title, final String message, final int type) { final boolean[] returnValue = new boolean[1]; final Runnable runnable = new Runnable() { @Override public void run() { MessageDialog dialog = new MessageDialog(getWorkbench() .getActiveWorkbenchWindow().getShell(), "eBay SOA Plugin: " + title, null, message, type, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0); dialog.setBlockOnOpen(true); returnValue[0] = dialog.open() == Window.OK; } }; Display.getCurrent().syncExec(runnable); return returnValue[0]; } /** * Gets the detailed exception stack trace. * * @param exception the exception * @return the detailed exception stack trace */ public static IStatus getDetailedExceptionStackTrace(final Throwable exception) { IStatus status = null; if (exception instanceof CoreException) { status = ((CoreException) exception).getStatus(); } else { final String reason; if (exception.getCause() != null) { reason = exception.getCause().getLocalizedMessage(); } else { reason = exception.getLocalizedMessage(); } MultiStatus multiStatus = new MultiStatus( Activator.PLUGIN_ID, 1, StringUtils .defaultString(reason), null); status = multiStatus; String stackTrace = ExceptionUtils.getStackTrace(exception); BufferedReader br = new BufferedReader(new StringReader( stackTrace)); String line = null; try { while ((line = br.readLine()) != null) { multiStatus.merge(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 1, line, null)); } } catch (IOException ioex) { ioex.printStackTrace(); } finally { IOUtils.closeQuietly(br); } } return status; } /** * open the error dialog and display error stacktrace. * * @param parent the parent shell of the dialog, or <code>null</code> if none * @param dialogTitle the title to use for this dialog, or <code>null</code> to * indicate that the default title should be used,default is * "Problem Occurred" * @param message the message to show in this dialog, or <code>null</code> to * indicate that the exception's message should be shown as the * primary message * @param exception the exception used to display stackTrace ,or <code>null</code> * to indicate that the exception is not available,only * errorMessage will be shown. */ public static void showErrorDialog(final Shell parent, final String dialogTitle, final String message, final Throwable exception) { final Runnable runnable = new Runnable() { @Override public void run() { IStatus status = null; if (exception == null) { showErrorDialog(parent, "", dialogTitle, message); return; } if (exception instanceof CoreException) { status = ((CoreException) exception).getStatus(); } else { final String reason; if (exception.getCause() != null) { reason = exception.getCause().getLocalizedMessage(); } else { reason = exception.getLocalizedMessage(); } MultiStatus multiStatus = new MultiStatus( Activator.PLUGIN_ID, 1, StringUtils .defaultString(reason), null); status = multiStatus; String stackTrace = ExceptionUtils.getStackTrace(exception); BufferedReader br = new BufferedReader(new StringReader( stackTrace)); String line = null; try { while ((line = br.readLine()) != null) { multiStatus.merge(new Status(IStatus.ERROR, Activator.PLUGIN_ID, 1, line, null)); } } catch (IOException ioex) { ioex.printStackTrace(); } finally { IOUtils.closeQuietly(br); } } String finalMessage = message; if (StringUtils.isBlank(message)) { // The message is blank, try to have a message for it. finalMessage = StringUtils.isNotBlank(exception .getLocalizedMessage()) ? exception .getLocalizedMessage() : exception.toString(); } SOAErrorDialog.openError(parent, dialogTitle, finalMessage, status, IStatus.ERROR | IStatus.WARNING); } }; if (Display.getCurrent() == null) { // not running in a UI thread. new UIJob("Error Occured") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { runnable.run(); return Status.OK_STATUS; } }.schedule(); } else { runnable.run(); } } /** * Show error dialog. * * @param dialogTitle the title to use for this dialog, or <code>null</code> to * indicate that the default title should be used,default is * "Problem Occurred" * @param exception the exception */ public static void showErrorDialog(String dialogTitle, Throwable exception) { showErrorDialog(null, dialogTitle, null, exception); } /** * Show error dialog. * * @param dialogTitle the dialog title * @param message the message * @param exception the exception */ public static void showErrorDialog(String dialogTitle, String message, Throwable exception) { showErrorDialog(null, dialogTitle, message, exception); } /** * This will use the default shell, and the dialog titiel will be "Problem * Occurred". * * @param exception the exception */ public static void showErrorDialog(Throwable exception) { showErrorDialog(null, null, null, exception); } /** * Show error dialog. * * @param shell the shell * @param title the title * @param message the message */ public static void showErrorDialog(Shell shell, String title, String message) { StringWriter msg = new StringWriter(); if (message != null) { msg.write(message); msg.write("\n\n"); //$NON-NLS-1$ } MessageDialog.openError(shell, title, msg.toString()); } /** * Show error dialog. * * @param shell the shell * @param title the title * @param status the status * @return the int */ public static int showErrorDialog(Shell shell, String title, IStatus status) { return showErrorDialog(shell, title, status.getMessage(), status); } /** * Show error dialog. * * @param shell the shell * @param title the title * @param message the message * @param status the status * @param needLineBreak the need line break * @param needLineTitle the need line title * @param needCancelButton the need cancel button * @param changeButtonLabel the change button label * @return the int */ public static int showErrorDialog(Shell shell, String title, String message, IStatus status, boolean needLineBreak, boolean needLineTitle, boolean needCancelButton, boolean changeButtonLabel) { return SOAErrorDialog.openError(shell, title, message, status, IStatus.ERROR | IStatus.WARNING, needLineBreak, needLineTitle, needCancelButton, changeButtonLabel); } /** * Show error dialog. * * @param shell the shell * @param title the title * @param message the message * @param status the status * @return the int */ public static int showErrorDialog(Shell shell, String title, String message, IStatus status) { return SOAErrorDialog.openError(shell, title, message, status, IStatus.ERROR | IStatus.WARNING); } /** * Show error dialog. * * @param shell the shell * @param exceptionMessage the exception message * @param title the title * @param message the message */ public static void showErrorDialog(Shell shell, String exceptionMessage, String title, String message) { StringWriter msg = new StringWriter(); if (message != null) { msg.write(message); msg.write("\n\n"); //$NON-NLS-1$ } if (exceptionMessage == null || exceptionMessage.length() == 0){ // bug http://quickbugstage.arch.ebay.com/show_bug.cgi?id=16775 // in fact there is no more details // msg.write("See error log for more details."); } else{ msg.write(exceptionMessage); } MessageDialog.openError(shell, title, msg.toString()); } /** * Show error dialog in new thread. * * @param shell the shell * @param title the title * @param message the message */ public static void showErrorDialogInNewThread(Shell shell, String title, final String message) { final Shell parent = shell != null ? shell : getActiveShell(); final String dialogTitle = StringUtils.isNotBlank(title) ? title : "Error"; if (StringUtils.isNotBlank(message)) { new UIJob("Opening Error Dialog") { @Override public IStatus runInUIThread(IProgressMonitor monitor) { MessageDialog.openError(parent, dialogTitle, message); return Status.OK_STATUS; } }.schedule(); } } /** * Returns a width hint for a button control. * * @param button * the button * @return the width hint */ public static int getButtonWidthHint(Button button) { button.setFont(JFaceResources.getDialogFont()); Font font = button.getFont(); GC gc = new GC(font.getDevice()); gc.setFont(font); int widthHint = Dialog.convertHorizontalDLUsToPixels(gc .getFontMetrics(), IDialogConstants.BUTTON_WIDTH); gc.dispose(); return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); } /** * Sets width and height hint for the button control. <b>Note:</b> This is * a NOP if the button's layout data is not an instance of * <code>GridData</code>. * * @param button * the button for which to set the dimension hint */ public static void setButtonWidthHint(Button button) { Assert.isNotNull(button); setButtonWidthHint(button, getButtonWidthHint(button)); } private static void setButtonWidthHint(Button button, int widthHint) { Assert.isNotNull(button); Object gd = button.getLayoutData(); if (gd == null) { gd = new GridData(); button.setLayoutData(gd); } if (gd instanceof GridData) { ((GridData) gd).widthHint = widthHint; ((GridData) gd).horizontalAlignment = GridData.FILL; } } /** * make buttons with equal widthHint. * * @param buttons the new equal width hint for buttons */ public static void setEqualWidthHintForButtons(Button... buttons) { int max = 0; int curButtonWidthHint = 0; for (Button button : buttons) { curButtonWidthHint = getButtonWidthHint(button); max = Math.max(max, curButtonWidthHint); } for (Button button2 : buttons) { setButtonWidthHint(button2, max); } } /** * Sync exec. * * @param <T> the generic type * @param name the name * @param runnable the runnable * @return the t */ public static <T> T syncExec(String name, final IRunnable<T> runnable) { if (Thread.currentThread() == display().getThread()) return runnable.run(); return UIRunner.syncExec(name, runnable); } /** * The Class UIRunner. * * @param <T> the generic type */ public static final class UIRunner<T> extends UIJob { private enum Sync { SYNC, ASYNC } /** * Sync exec. * * @param <U> the generic type * @param name the name * @param runner the runner * @return the u */ public static final <U> U syncExec(String name, IRunnable<U> runner) { checkNull(runner); return doExec(new UIRunner<U>(name, runner), Sync.SYNC); } /** * Async exec. * * @param <U> the generic type * @param name the name * @param runner the runner * @return the u */ public static final <U> U asyncExec(String name, IRunnable<U> runner) { checkNull(runner); return doExec(new UIRunner<U>(name, runner), Sync.ASYNC); } /** * Sync exec. * * @param <U> the generic type * @param name the name * @param runner the runner * @return the u */ public static final <U> U syncExec(String name, Runnable runner) { checkNull(runner); return doExec(new UIRunner<U>(name, runner), Sync.SYNC); } /** * Async exec. * * @param <U> the generic type * @param name the name * @param runner the runner * @return the u */ public static final <U> U asyncExec(String name, Runnable runner) { checkNull(runner); return doExec(new UIRunner<U>(name, runner), Sync.ASYNC); } private static void checkNull(Object o) { if (null == o) { throw new IllegalArgumentException("null runner"); } } private static final <U> U doExec(UIRunner<U> runner, Sync sync) { if (sync == Sync.ASYNC) { runner.asyncExec(); } else { runner.syncExec(); } return runner.returnValue(); } private static String nonNullName(String name) { return null == name ? DEFAULT_NAME : name; } private static final String DEFAULT_NAME = "UIUtil"; private final Runnable runnable; private final IRunnable<T> irunner; private T returnValue; /** * Instantiates a new uI runner. * * @param name the name * @param irunner the irunner */ public UIRunner(String name, IRunnable<T> irunner) { super(nonNullName(name)); this.irunner = irunner; this.runnable = null; } /** * Instantiates a new uI runner. * * @param name the name * @param runnable the runnable */ public UIRunner(String name, Runnable runnable) { super(nonNullName(name)); this.runnable = runnable; this.irunner = null; } /** * Do run. */ protected void doRun() { if (null != runnable) { runnable.run(); } else if (null != irunner) { returnValue = irunner.run(); } } /** * Sync exec. */ public void syncExec() { if ((runnable == null) && (irunner == null)) { return; } final Display display = display(); if (Thread.currentThread() == display.getThread()) { doRun(); return; } final List<T> sink = new ArrayList<T>(); final Runnable wrapper = new Runnable() { @Override public void run() { syncExec(); sink.add(returnValue); } }; display.syncExec(wrapper); returnValue = sink.size() > 0 ? sink.get(0) : null; } /** * Async exec. */ public void asyncExec() { if ((runnable == null) && (irunner == null)) { return; } final Display display = display(); if (Thread.currentThread() == display.getThread()) { doRun(); return; } final List<T> sink = new ArrayList<T>(); final Runnable wrapper = new Runnable() { @Override public void run() { asyncExec(); sink.add(returnValue); } }; display.asyncExec(wrapper); returnValue = sink.size() > 0 ? sink.get(0) : null; } /* (non-Javadoc) * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus runInUIThread(IProgressMonitor monitor) { IStatus result = Status.OK_STATUS; try { if (null != runnable) { runnable.run(); } else if (null != irunner) { returnValue = irunner.run(); } } catch (Exception e) { result = EclipseMessageUtils.createErrorStatus(null, e); } catch (Error e) { result = EclipseMessageUtils.createErrorStatus(null, e); } return result; } /** * Return value. * * @return the t */ public T returnValue() { return returnValue; } /* (non-Javadoc) * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object) */ @Override public boolean belongsTo(final Object family) { return UIUtil.belongsTo(family); } } /** * Belongs to. * * @param family the family * @return true, if successful */ public static boolean belongsTo(final Object family) { return ResourcesPlugin.FAMILY_MANUAL_BUILD.equals(family) || ResourcesPlugin.FAMILY_AUTO_BUILD.equals(family) || ResourcesPlugin.FAMILY_AUTO_REFRESH.equals(family) || "org.eclipse.jst.j2ee.refactor.component".equals(family) || "EAR Libraries Update Job".equals(family); } private static class WorkBenchWindowWrapper { private IWorkbenchWindow workbenchWindow; public IWorkbenchWindow getWorkbenchWindow() { return workbenchWindow; } public void setWorkbenchWindow(IWorkbenchWindow workbenchWindow) { this.workbenchWindow = workbenchWindow; } } private static class WorkBenchPageWrapper { private IWorkbenchPage workbenchPage = null; public IWorkbenchPage getWorkbenchPage() { return workbenchPage; } public void setWorkbenchPage(IWorkbenchPage workbenchPage) { this.workbenchPage = workbenchPage; } } private static class EditorWrapper { private IEditorPart editorPart = null; public IEditorPart getEditorPart() { return editorPart; } public void setEditorPart(IEditorPart editorPart) { this.editorPart = editorPart; } } /** * Gets the active page. * * @return the active page */ public static IWorkbenchPage getActivePage() { final IWorkbenchWindow workbenchWindow = getActiveWorkBenchWindow(); final IWorkbench workbench = PlatformUI.getWorkbench(); final WorkBenchPageWrapper workBenchPageWrapper = new WorkBenchPageWrapper(); if (workbenchWindow != null) { workbench.getDisplay().syncExec(new Runnable() { @Override public void run() { IWorkbenchPage workbenchPage = workbenchWindow .getActivePage(); workBenchPageWrapper.setWorkbenchPage(workbenchPage); if (workbenchPage == null) { if (workbenchWindow.getPages() != null && workbenchWindow.getPages().length > 0) { workbenchPage = workbenchWindow.getPages()[0]; workBenchPageWrapper .setWorkbenchPage(workbenchPage); } } } }); } return workBenchPageWrapper.getWorkbenchPage(); } /** * Gets the active editor. * * @return the active editor */ public static IEditorPart getActiveEditor() { final IWorkbenchPage activePage = getActivePage(); final IWorkbench workbench = PlatformUI.getWorkbench(); final EditorWrapper editorWrapper = new EditorWrapper(); if (activePage != null) { workbench.getDisplay().syncExec(new Runnable() { @Override public void run() { IEditorPart editorPart = activePage.getActiveEditor(); editorWrapper.setEditorPart(editorPart); if (editorPart == null) { if (activePage.getEditorReferences() != null && activePage.getEditorReferences().length > 0) { editorPart = activePage.getEditorReferences()[0] .getEditor(true); editorWrapper.setEditorPart(editorPart); } } } }); } return editorWrapper.getEditorPart(); } /** * returns the parent project of the file opened in the active editor. * * @return - the parent project of the editors file * @throws SOAPartNotFoundException * if the editor is not active or if the editors input is not * FileEditorInput */ public static IProject getActiveEditorsProject() throws SOAPartNotFoundException { if (getActiveEditor() == null || !(getActiveEditor().getEditorInput() instanceof FileEditorInput)) throw new SOAPartNotFoundException( "The active editor does not exist or is not a File editor."); return ((FileEditorInput) getActiveEditor().getEditorInput()).getFile() .getProject(); } /** * The Interface ISOAControlDecorator. */ public static interface ISOAControlDecorator { /** * Adds the control decoration. * * @param control the control * @param controlDecoration the control decoration */ public void addControlDecoration(Control control, ControlDecoration controlDecoration); } /** * decorate control with tooltip. * * @param decorator the decorator * @param control the control * @param tooltip the tooltip * @return the control decoration */ public static ControlDecoration decorateControl(ISOAControlDecorator decorator, final Control control, final String tooltip) { ControlDecoration controlDecoration = null; if (control != null && StringUtils.isNotBlank(tooltip)) { control.setToolTipText(tooltip); controlDecoration = new ControlDecoration(control, SWT.LEFT | SWT.TOP); controlDecoration.setShowOnlyOnFocus(true); controlDecoration.setDescriptionText(tooltip); FieldDecoration fieldDecoration = FieldDecorationRegistry .getDefault().getFieldDecoration( FieldDecorationRegistry.DEC_INFORMATION); controlDecoration.setImage(fieldDecoration.getImage()); if (decorator != null) { decorator.addControlDecoration(control, controlDecoration); } } return controlDecoration; } /** * Gets the status line manager. * * @return the status line manager */ public static IStatusLineManager getStatusLineManager() { IWorkbenchPage page = getActivePage(); IWorkbenchPart part = page.getActivePart(); IWorkbenchPartSite site = part.getSite(); if (site instanceof IViewSite) { IViewSite vSite = ( IViewSite ) site; IActionBars actionBars = vSite.getActionBars(); if( actionBars == null ) { return null; } return actionBars.getStatusLineManager(); } return null; } }