Java tutorial
/* * (c) Copyright 2004 by Heng Yuan * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * ITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ package cookxml.cookswt.util; import java.util.HashMap; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; /** * SWT useful utilities. * * @since CookSwt 1.0 * @author Heng Yuan */ public class SwtUtils { /** * automatically dispose Color resource */ public static boolean autoDisposeColor = true; /** * automatically dispose Font resource */ public static boolean autoDisposeFont = true; /** * automatically dispose Image resource */ public static boolean autoDisposeImage = true; /** * automatically dispose Image resource */ public static boolean autoDisposeCursor = true; /** * This is a table of system colors that cannot be disposed. */ private static HashMap s_systemColorTable; /** * This is a table of system cursors that cannot be disposed. */ private static HashMap s_systemCursorTable; /** * This is a table of system images that cannot be disposed. */ private static HashMap s_systemImageTable; /** * Setup the system color table for the given device. * * @param device the display device. */ private static void setupSystemColorTable(Device device) { HashMap colorTable = new HashMap(); for (int i = 0; i <= 35; ++i) { Color c = device.getSystemColor(i); colorTable.put(c, c); } s_systemColorTable = colorTable; } /** * Setup the system cursor table for the given device. * * @param display the display device. */ private static void setupSystemCursorTable(Display display) { HashMap cursorTable = new HashMap(); for (int i = 0; i <= 21; ++i) { Cursor c = display.getSystemCursor(i); cursorTable.put(c, c); } s_systemCursorTable = cursorTable; } /** * Setup the system cursor table for the given device. * * @param display the display device. */ private static void setupSystemImageTable(Display display) { HashMap imageTable = new HashMap(); Image image; image = display.getSystemImage(SWT.ICON_ERROR); imageTable.put(image, image); image = display.getSystemImage(SWT.ICON_INFORMATION); imageTable.put(image, image); image = display.getSystemImage(SWT.ICON_QUESTION); imageTable.put(image, image); image = display.getSystemImage(SWT.ICON_WARNING); imageTable.put(image, image); image = display.getSystemImage(SWT.ICON_WORKING); imageTable.put(image, image); s_systemImageTable = imageTable; } /** * Check if a color is a system color. A system color cannot be disposed. * * @param color The color to be disposed. * @param device The device that contains the color. */ public static boolean isSystemColor(Color color, Device device) { if (s_systemColorTable == null) setupSystemColorTable(device); return s_systemColorTable.get(color) == color; } /** * Check if a color is a system color. A system color cannot be disposed. * * @param cursor The cursor to be disposed. * @param display The display device. */ public static boolean isSystemCursor(Cursor cursor, Display display) { if (s_systemCursorTable == null) setupSystemCursorTable(display); return s_systemCursorTable.get(cursor) == cursor; } /** * Check if a color is a system color. A system color cannot be disposed. * * @param image The image to be disposed. * @param display The display device. */ public static boolean isSystemImage(Image image, Display display) { if (s_systemImageTable == null) setupSystemImageTable(display); return s_systemImageTable.get(image) == image; } /** * Check if a color is a system color. A system color cannot be disposed. * * @param font The font to be disposed. * @param device The display device. */ public static boolean isSystemFont(Font font, Device device) { return device.getSystemFont() == font; } /** * Dispose a color if it is not a system color. * * @param color The color to be disposed. * @param device The device that contains the color. */ public static void disposeColor(Color color, Device device) { if (color.isDisposed()) return; if (!isSystemColor(color, device)) { assert disposeDebug("Dispose color: " + color); color.dispose(); } } /** * Dispose a color if it is not a system color. * * @param image The image to be disposed. * @param device The device that contains the color. */ public static void disposeImage(Image image, Display device) { if (image.isDisposed()) return; if (!isSystemImage(image, device)) { assert disposeDebug("Dispose image: " + image); image.dispose(); } } /** * Attach a DisposeListener that dispose the resource when the widget * object is disposed. * * @param widget the widget to listen to. * @param color the resource to be disposed. */ public static void attachColorDisposeListener(Widget widget, Color color) { if (autoDisposeColor && !isSystemColor(color, widget.getDisplay())) widget.addDisposeListener(new ColorDisposeListener(color)); } /** * Attach a DisposeListener that dispose the resource when the widget * object is disposed. * * @param widget the widget to listen to. * @param cursor the resource to be disposed. */ public static void attachCursorDisposeListener(Widget widget, Cursor cursor) { if (autoDisposeCursor && !isSystemCursor(cursor, widget.getDisplay())) widget.addDisposeListener(new CursorDisposeListener(cursor)); } /** * Attach a DisposeListener that dispose the resource when the widget * object is disposed. * * @param widget the widget to listen to. * @param font the resource to be disposed. */ public static void attachFontDisposeListener(Widget widget, Font font) { if (autoDisposeFont && !isSystemFont(font, widget.getDisplay())) widget.addDisposeListener(new FontDisposeListener(font)); } /** * Attach a DisposeListener that dispose the resource when the widget * object is disposed. * * @param widget the widget to listen to. * @param image the resource to be disposed. */ public static void attachImageDisposeListener(Widget widget, Image image) { if (autoDisposeImage && !isSystemImage(image, widget.getDisplay())) widget.addDisposeListener(new ImageDisposeListener(image)); } /** * Attach a dropdown menu to a drop down ToolItem. The drop down menu will be * automatically positioned and displayed at under the ToolItem. * * @param item the drop down tool item * @param menu the drop down menu */ public static void attachToolItemDropDownMenu(ToolItem item, Menu menu) { item.addSelectionListener(new DropDownListener(menu)); } /** * Open all the shells inside the Display object and dispose the Display * after all shells are disposed. * * @param display the Display object. */ public static void showDisplay(Display display) { // open shells for display Shell[] shells = display.getShells(); for (int i = 0; i < shells.length; ++i) { if (!shells[i].isDisposed() && !shells[i].isVisible()) shells[i].open(); } // exit after all shells are disposed while (!display.isDisposed()) { shells = display.getShells(); boolean canExit = true; for (int i = 0; i < shells.length; ++i) { if (!shells[i].isDisposed()) { canExit = false; break; } } if (canExit) break; if (!display.readAndDispatch()) display.sleep(); } if (!display.isDisposed()) display.dispose(); } /** * This function is supposed to work in conjunction with assert to generate * a debug message but does not really throw an Exception * * @param msg the message to be printed. * @return true */ public static boolean disposeDebug(String msg) { System.out.println(msg); return true; } }