/******************************************************************************* * Copyright (c) 2012, 2014 Tilera 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: * William R. Swanson (Tilera Corporation) * Xavier Raynaud (Kalray) - Bug 431690 *******************************************************************************/ package org.eclipse.cdt.visualizer.ui.util; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; //--------------------------------------------------------------------------- // GUIUtils //--------------------------------------------------------------------------- /** * Assorted high-level UI utilities. */ public class GUIUtils { // --- display methods --- /** Gets current SWT display. */ static public Display getDisplay() { Display display= Display.getCurrent(); if (display == null) { display= Display.getDefault(); } return display; } // --- delayed execution methods --- /** Posts the specified runnable for execution by the UI thread. * Nonblocking, returns immediately. */ static public void exec(Runnable runnable) { Display display = getDisplay(); exec(display, runnable, false); } /** Posts the specified runnable for execution by the UI thread. * Nonblocking, returns immediately. */ static public void exec(Runnable runnable, boolean blocking) { Display display = getDisplay(); exec(display, runnable, blocking); } /** Posts the specified runnable for execution by the UI thread. * If blocking is true, waits for completion, otherwise returns immediately. */ static public void execAndWait(Runnable runnable) { Display display = getDisplay(); exec(display, runnable, true); } /** Posts the specified runnable for execution by the UI thread. * If blocking is true, waits for completion, otherwise returns immediately. */ static protected void exec(Display display, Runnable runnable, boolean blocking) { if (display != null && runnable != null) { if (blocking) { display.syncExec(runnable); } else { display.asyncExec(runnable); } } } // --- drawing methods --- /** Draws transparent text, with the default alignment (top/left). */ static public void drawText(GC gc, String text, int x, int y) { gc.drawText(text, x, y, SWT.DRAW_TRANSPARENT); } /** Draws transparent text, with the default alignment (top/left). * @since 1.1*/ static public void drawText(GC gc, String text, Rectangle clip, int x, int y) { Rectangle oldClip = gc.getClipping(); gc.setClipping(clip); drawText(gc, text, x, y); gc.setClipping(oldClip); } /** Draws transparent text, with the specified alignments. */ static public void drawTextAligned(GC gc, String text, int x, int y, boolean left, boolean top) { if (left && top) { gc.drawText(text, x, y, SWT.DRAW_TRANSPARENT); } else { Point te = gc.textExtent(text); int dx = left ? 0 : te.x; int dy = top ? 0 : te.y; gc.drawText(text, x - dx, y - dy, SWT.DRAW_TRANSPARENT); } } /** Draws transparent text, with the specified alignments. * @since 1.1*/ static public void drawTextAligned(GC gc, String text, Rectangle clip, int x, int y, boolean left, boolean top) { Rectangle oldClip = gc.getClipping(); gc.setClipping(clip); drawTextAligned(gc, text, x, y, left, top); gc.setClipping(oldClip); } /** Draws transparent text, centered on the specified point. */ static public void drawTextCentered(GC gc, String text, int x, int y) { Point te = gc.textExtent(text); // Rounding produces less "jumpy" display when graphics are resized. gc.drawText(text, x - (int) Math.round(te.x / 2.0), y - (int) Math.round(te.y / 2.0), SWT.DRAW_TRANSPARENT); } /** Draws transparent text, centered on the specified point. * @since 1.1*/ static public void drawTextCentered(GC gc, String text, Rectangle clip, int x, int y) { Rectangle oldClip = gc.getClipping(); gc.setClipping(clip); drawTextCentered(gc, text, x, y); gc.setClipping(oldClip); } // --- graphic methods --- /** Shrinks rectangle by specified margin on all edges. */ public static void inset(Rectangle rect, int margin) { rect.x += margin; rect.y += margin; rect.width -= margin * 2; if (rect.width < 0) rect.width = 0; rect.height -= margin * 2; if (rect.height < 0) rect.height = 0; } }