/*******************************************************************************
* Copyright (c) 2007 DSource.org 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:
* Bruno Medeiros - initial implementation
*******************************************************************************/
package melnorme.util.swt;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Resource;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import melnorme.utilbox.status.Severity;
import melnorme.utilbox.status.StatusLevel;
/**
* Miscelleanous SWT utilities.
*/
public class SWTUtil {
/** @return true if a control can be used: is neither null, nor disposed. */
public static boolean isOkToUse(Control control) {
return control != null && !control.isDisposed();
}
public static void setEnabledIfOk(Control control, boolean enabled) {
if(isOkToUse(control)) {
control.setEnabled(enabled);
}
}
public static <T extends Resource> T dispose(T resource) {
if(resource != null) {
resource.dispose();
}
return null;
}
/**
* Returns the standard display to be used. The method first checks, if
* the thread calling this method has an associated disaply. If so, this
* display is returned. Otherwise the method returns the default display.
*/
public static Display getStandardDisplay() {
Display display = Display.getCurrent();
if (display == null)
display = Display.getDefault();
return display;
}
public static boolean isUIThread() {
return Display.getCurrent() != null;
}
/** Sets the enable state of the composite's children, recursively. */
public static void recursiveSetEnabled(Composite composite, boolean enabled) {
for(Control control : composite.getChildren() ) {
if(control instanceof Composite) {
recursiveSetEnabled((Composite) control, enabled);
}
control.setEnabled(enabled);
}
}
/** Runs the runnable in the SWT thread.
* (Simply runs the runnable if the current thread is the UI thread,
* otherwise calls the runnable in asyncexec.) */
public static void runInSWTThread(Runnable runnable) {
if(Display.getCurrent() == null) {
Display.getDefault().asyncExec(runnable);
} else {
runnable.run();
}
}
/** Show an info (OK button) MsgBox with given title and message. */
public static int showInfoMsgBox(Shell shell, String title, String message) {
MessageBox messageBox = new MessageBox(shell, SWT.OK);
messageBox.setText(title);
messageBox.setMessage(message);
return messageBox.open();
}
/**
* Post {@link Control#setFocus()} on the UI thread, if current thread not UI thread.
*/
public static void post_setFocus(final Text control) {
if(!isOkToUse(control)) {
return;
}
Display display = control.getDisplay();
if(display == Display.getCurrent()) {
control.setFocus();
} else {
display.asyncExec(new Runnable() {
@Override
public void run() {
if(!control.isDisposed()) {
control.setFocus();
}
}
});
}
}
public static int statusLevelToMessageDialogKing(StatusLevel statusLevel) {
switch (statusLevel) {
case ERROR: return MessageDialog.ERROR;
case WARNING: return MessageDialog.WARNING;
case INFO: return MessageDialog.INFORMATION;
case OK: return MessageDialog.OK;
}
throw assertFail();
}
public static Image getSWTImageForStatusLevel(StatusLevel statusLevel2) {
return getSystemImage(getSystemImageCode(statusLevel2));
}
public static int getSystemImageCode(StatusLevel statusLevel) {
switch (statusLevel) {
case ERROR: return SWT.ICON_ERROR;
case WARNING: return SWT.ICON_WARNING;
case INFO: return SWT.ICON_INFORMATION;
case OK: return SWT.ICON_WORKING;
}
throw assertFail();
}
public static Image getImageForSeverity(Severity severity) {
switch (severity) {
case ERROR: return getSystemImage(SWT.ICON_ERROR);
case WARNING: return getSystemImage(SWT.ICON_WARNING);
case INFO: return getSystemImage(SWT.ICON_INFORMATION);
}
throw assertFail();
}
public static Image getSystemImage(final int imageID) {
return Display.getCurrent().getSystemImage(imageID);
}
}