/******************************************************************************* * Copyright (c) 2012 Google, Inc. * 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: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.runtime.swt.internal; import java.util.concurrent.Callable; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.SWTException; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.TableTreeItem; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.widgets.Caret; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import com.windowtester.runtime.internal.concurrent.VoidCallable; import com.windowtester.runtime.swt.internal.widgets.DisplayReference; import com.windowtester.runtime.swt.internal.widgets.SWTUIException; /** * SWT utility methods. */ @SuppressWarnings("deprecation") public class SWTUtils { public static <T> T safeExec(Callable<T> callable, T defaultValue) { try { return callable.call(); } catch (SWTError error){ if (!SWTUtils.isDisposed(error)){ throw error; } } catch (SWTException ex){ if (!SWTUtils.isDisposed(ex)){ throw ex; } } catch (SWTUIException uie){ if (!SWTUtils.isDisposedException(uie.getCause())) throw uie; } catch (Exception e) { throw new SWTUIException(e); } return defaultValue; } public static void safeExec(VoidCallable callable) { try { callable.call(); } catch (SWTError error){ if (!SWTUtils.isDisposed(error)){ throw error; } } catch (SWTException ex){ if (!SWTUtils.isDisposed(ex)){ throw ex; } } catch (SWTUIException uie){ if (!SWTUtils.isDisposedException(uie.getCause())) throw uie; } catch (Exception e) { throw new SWTUIException(e); } } public static boolean isUIThread(Display display) { return display.getThread() == Thread.currentThread(); } public static boolean invalidDisplay(Display display) { return (display == null) || display.isDisposed(); } public static boolean isDisposed(SWTError e) { return e.code == SWT.ERROR_WIDGET_DISPOSED; } public static boolean isDisposed(SWTException e) { return e.code == SWT.ERROR_WIDGET_DISPOSED; } /** * Given this widget, find its control. * * @param w * @return */ public static Control getControl(final Widget c) { if (c instanceof Control) return (Control)c; return DisplayReference.getDefault().execute(new Callable<Control>() { public Control call() { if (c instanceof Caret) return ((Caret)c).getParent(); if (c instanceof Menu) return ((Menu) c).getParent(); if (c instanceof ScrollBar) return ((ScrollBar) c).getParent(); if (c instanceof CoolItem) return ((CoolItem) c).getParent(); if (c instanceof CTabItem) return ((CTabItem) c).getParent(); if (c instanceof TabItem) return ((TabItem) c).getParent(); if (c instanceof TableColumn) return ((TableColumn) c).getParent(); if (c instanceof TableTreeItem) return ((TableTreeItem) c).getParent(); if (c instanceof MenuItem) { return ((MenuItem) c).getParent().getParent(); } // if (c instanceof TrayItem) // return ((TrayItem) c) ??? if (c instanceof TabItem) return ((TabItem) c).getParent(); if (c instanceof TableColumn) return ((TableColumn) c).getParent(); if (c instanceof TableItem) return ((TableItem) c).getParent(); if (c instanceof ToolItem) return ((ToolItem) c).getParent(); if (c instanceof TreeItem) return ((TreeItem) c).getParent(); if (c instanceof DragSource) return ((DragSource) c).getControl().getParent(); if (c instanceof DropTarget) return ((DropTarget) c).getControl().getParent(); return null; } }); } public static boolean isDisposedException(Throwable e) { if (e instanceof SWTError) return isDisposed((SWTError) e); if (e instanceof SWTException) return isDisposed((SWTException) e); if (e instanceof SWTUIException) return isDisposedException(e.getCause()); return false; } }