diff options
author | Felipe Heidrich <fheidric> | 2009-06-30 22:00:12 +0000 |
---|---|---|
committer | Felipe Heidrich <fheidric> | 2009-06-30 22:00:12 +0000 |
commit | f664d297f7bb009784868bf3fcf0b3e3bb9a646b (patch) | |
tree | 54012fe4929893eef4891c88cbbf5841272ff433 /bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics | |
parent | bc18a5e014088ce811f09c603b88361094486062 (diff) | |
download | eclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.tar.gz eclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.tar.xz eclipse.platform.swt-f664d297f7bb009784868bf3fcf0b3e3bb9a646b.zip |
*** empty log message ***
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics')
15 files changed, 0 insertions, 11899 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java deleted file mode 100755 index dc1823530d..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Color.java +++ /dev/null @@ -1,266 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.*; - -/** - * Instances of this class manage the operating system resources that - * implement SWT's RGB color model. To create a color you can either - * specify the individual color components as integers in the range - * 0 to 255 or provide an instance of an <code>RGB</code>. - * <p> - * Application code must explicitly invoke the <code>Color.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * - * @see RGB - * @see Device#getSystemColor - * @see <a href="http://www.eclipse.org/swt/snippets/#color">Color and RGB snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: PaintExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class Color extends Resource { - /** - * the handle to the OS color resource - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public float /*double*/ [] handle; - -Color(Device device) { - super(device); -} - -/** - * Constructs a new instance of this class given a device and the - * desired red, green and blue values expressed as ints in the range - * 0 to 255 (where 0 is black and 255 is full brightness). On limited - * color devices, the color instance created by this call may not have - * the same RGB values as the ones specified by the arguments. The - * RGB values on the returned instance will be the color values of - * the operating system color. - * <p> - * You must dispose the color when it is no longer required. - * </p> - * - * @param device the device on which to allocate the color - * @param red the amount of red in the color - * @param green the amount of green in the color - * @param blue the amount of blue in the color - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_INVALID_ARGUMENT - if the red, green or blue argument is not between 0 and 255</li> - * </ul> - * - * @see #dispose - */ -public Color(Device device, int red, int green, int blue) { - super(device); - init(red, green, blue); - init(); -} - -/** - * Constructs a new instance of this class given a device and an - * <code>RGB</code> describing the desired red, green and blue values. - * On limited color devices, the color instance created by this call - * may not have the same RGB values as the ones specified by the - * argument. The RGB values on the returned instance will be the color - * values of the operating system color. - * <p> - * You must dispose the color when it is no longer required. - * </p> - * - * @param device the device on which to allocate the color - * @param rgb the RGB values of the desired color - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the rgb argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the red, green or blue components of the argument are not between 0 and 255</li> - * </ul> - * - * @see #dispose - */ -public Color(Device device, RGB rgb) { - super(device); - if (rgb == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - init(rgb.red, rgb.green, rgb.blue); - init(); -} - -void destroy() { - handle = null; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals(Object object) { - if (object == this) return true; - if (!(object instanceof Color)) return false; - Color color = (Color)object; - float /*double*/ [] rgbColor = color.handle; - if (handle == rgbColor) return true; - return device == color.device && - (int)(handle[0] * 255) == (int)(rgbColor[0] * 255) && - (int)(handle[1] * 255) == (int)(rgbColor[1] * 255) && - (int)(handle[2] * 255) == (int)(rgbColor[2] * 255); -} - -/** - * Returns the amount of blue in the color, from 0 to 255. - * - * @return the blue component of the color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getBlue() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return (int)(handle[2] * 255); -} - -/** - * Returns the amount of green in the color, from 0 to 255. - * - * @return the green component of the color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getGreen() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return (int)(handle[1] * 255); -} - -/** - * Returns the amount of red in the color, from 0 to 255. - * - * @return the red component of the color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getRed() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return (int)(handle[0] * 255); -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode() { - if (isDisposed()) return 0; - return (int)(handle[0] * 255) ^ (int)(handle[1] * 255) ^ (int)(handle[2] * 255); -} - -/** - * Returns an <code>RGB</code> representing the receiver. - * - * @return the RGB for the color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public RGB getRGB () { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return new RGB(getRed(), getGreen(), getBlue()); -} - -/** - * Invokes platform specific functionality to allocate a new color. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Color</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param device the device on which to allocate the color - * @param handle the handle for the color - * - * @private - */ -public static Color cocoa_new(Device device, float /*double*/ [] rgbColor) { - Color color = new Color(device); - color.handle = rgbColor; - return color; -} - -void init(int red, int green, int blue) { - if ((red > 255) || (red < 0) || - (green > 255) || (green < 0) || - (blue > 255) || (blue < 0)) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - float /*double*/ [] rgbColor = new float /*double*/ [4]; - rgbColor[0] = red / 255f; - rgbColor[1] = green / 255f; - rgbColor[2] = blue / 255f; - rgbColor[3] = 1; - handle = rgbColor; -} - -/** - * Returns <code>true</code> if the color has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the color. - * When a color has been disposed, it is an error to - * invoke any other method using the color. - * - * @return <code>true</code> when the color is disposed and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Color {*DISPOSED*}"; - return "Color {" + getRed() + ", " + getGreen() + ", " + getBlue() + "}"; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java deleted file mode 100755 index 64e4531750..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Cursor.java +++ /dev/null @@ -1,467 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.internal.cocoa.*; -import org.eclipse.swt.*; - -/** - * Instances of this class manage operating system resources that - * specify the appearance of the on-screen pointer. To create a - * cursor you specify the device and either a simple cursor style - * describing one of the standard operating system provided cursors - * or the image and mask data for the desired appearance. - * <p> - * Application code must explicitly invoke the <code>Cursor.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * <dl> - * <dt><b>Styles:</b></dt> - * <dd> - * CURSOR_ARROW, CURSOR_WAIT, CURSOR_CROSS, CURSOR_APPSTARTING, CURSOR_HELP, - * CURSOR_SIZEALL, CURSOR_SIZENESW, CURSOR_SIZENS, CURSOR_SIZENWSE, CURSOR_SIZEWE, - * CURSOR_SIZEN, CURSOR_SIZES, CURSOR_SIZEE, CURSOR_SIZEW, CURSOR_SIZENE, CURSOR_SIZESE, - * CURSOR_SIZESW, CURSOR_SIZENW, CURSOR_UPARROW, CURSOR_IBEAM, CURSOR_NO, CURSOR_HAND - * </dd> - * </dl> - * <p> - * Note: Only one of the above styles may be specified. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/snippets/#cursor">Cursor snippets</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ - -public final class Cursor extends Resource { - - static final byte[] WAIT_SOURCE = new byte[] { - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, - }; - - /** - * the handle to the OS cursor resource - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSCursor handle; - -/** - * Prevents uninitialized instances from being created outside the package. - */ -Cursor(Device device) { - super(device); -} - -/** - * Constructs a new cursor given a device and a style - * constant describing the desired cursor appearance. - * <p> - * You must dispose the cursor when it is no longer required. - * </p> - * - * @param device the device on which to allocate the cursor - * @param style the style of cursor to allocate - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_INVALID_ARGUMENT - when an unknown style is specified</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li> - * </ul> - * - * @see SWT#CURSOR_ARROW - * @see SWT#CURSOR_WAIT - * @see SWT#CURSOR_CROSS - * @see SWT#CURSOR_APPSTARTING - * @see SWT#CURSOR_HELP - * @see SWT#CURSOR_SIZEALL - * @see SWT#CURSOR_SIZENESW - * @see SWT#CURSOR_SIZENS - * @see SWT#CURSOR_SIZENWSE - * @see SWT#CURSOR_SIZEWE - * @see SWT#CURSOR_SIZEN - * @see SWT#CURSOR_SIZES - * @see SWT#CURSOR_SIZEE - * @see SWT#CURSOR_SIZEW - * @see SWT#CURSOR_SIZENE - * @see SWT#CURSOR_SIZESE - * @see SWT#CURSOR_SIZESW - * @see SWT#CURSOR_SIZENW - * @see SWT#CURSOR_UPARROW - * @see SWT#CURSOR_IBEAM - * @see SWT#CURSOR_NO - * @see SWT#CURSOR_HAND - */ -public Cursor(Device device, int style) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - switch (style) { - case SWT.CURSOR_HAND: handle = NSCursor.pointingHandCursor(); break; - case SWT.CURSOR_ARROW: handle = NSCursor.arrowCursor(); break; - case SWT.CURSOR_WAIT: break; - case SWT.CURSOR_CROSS: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_APPSTARTING: handle = NSCursor.arrowCursor(); break; - case SWT.CURSOR_HELP: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZEALL: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZENESW: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZENS: handle = NSCursor.resizeUpDownCursor(); break; - case SWT.CURSOR_SIZENWSE: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZEWE: handle = NSCursor.resizeLeftRightCursor(); break; - case SWT.CURSOR_SIZEN: handle = NSCursor.resizeUpCursor(); break; - case SWT.CURSOR_SIZES: handle = NSCursor.resizeDownCursor(); break; - case SWT.CURSOR_SIZEE: handle = NSCursor.resizeRightCursor(); break; - case SWT.CURSOR_SIZEW: handle = NSCursor.resizeLeftCursor(); break; - case SWT.CURSOR_SIZENE: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZESE: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZESW: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_SIZENW: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_UPARROW: handle = NSCursor.crosshairCursor(); break; - case SWT.CURSOR_IBEAM: handle = NSCursor.IBeamCursor(); break; - case SWT.CURSOR_NO: handle = NSCursor.crosshairCursor(); break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - if (handle == null && style == SWT.CURSOR_WAIT) { - NSImage nsImage = (NSImage)new NSImage().alloc(); - NSBitmapImageRep nsImageRep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - handle = (NSCursor)new NSCursor().alloc(); - int width = 16, height = 16; - NSSize size = new NSSize(); - size.width = width; - size.height = height; - nsImage = nsImage.initWithSize(size); - nsImageRep = nsImageRep.initWithBitmapDataPlanes(0, width, height, 8, 4, true, false, OS.NSDeviceRGBColorSpace, - OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width*4, 32); - OS.memmove(nsImageRep.bitmapData(), WAIT_SOURCE, WAIT_SOURCE.length); - nsImage.addRepresentation(nsImageRep); - NSPoint point = new NSPoint(); - point.x = 0; - point.y = 0; - handle = handle.initWithImage(nsImage, point); - nsImageRep.release(); - nsImage.release(); - } else { - handle.retain(); - } - handle.setOnMouseEntered(true); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new cursor given a device, image and mask - * data describing the desired cursor appearance, and the x - * and y coordinates of the <em>hotspot</em> (that is, the point - * within the area covered by the cursor which is considered - * to be where the on-screen pointer is "pointing"). - * <p> - * The mask data is allowed to be null, but in this case the source - * must be an ImageData representing an icon that specifies both - * color data and mask data. - * <p> - * You must dispose the cursor when it is no longer required. - * </p> - * - * @param device the device on which to allocate the cursor - * @param source the color data for the cursor - * @param mask the mask data for the cursor (or null) - * @param hotspotX the x coordinate of the cursor's hotspot - * @param hotspotY the y coordinate of the cursor's hotspot - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the source is null</li> - * <li>ERROR_NULL_ARGUMENT - if the mask is null and the source does not have a mask</li> - * <li>ERROR_INVALID_ARGUMENT - if the source and the mask are not the same - * size, or if the hotspot is outside the bounds of the image</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li> - * </ul> - */ -public Cursor(Device device, ImageData source, ImageData mask, int hotspotX, int hotspotY) { - super(device); - if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (mask == null) { - if (source.getTransparencyType() != SWT.TRANSPARENCY_MASK) { - SWT.error(SWT.ERROR_NULL_ARGUMENT); - } - mask = source.getTransparencyMask(); - } - /* Check the bounds. Mask must be the same size as source */ - if (mask.width != source.width || mask.height != source.height) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - /* Check the hotspots */ - if (hotspotX >= source.width || hotspotX < 0 || - hotspotY >= source.height || hotspotY < 0) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - byte[] data = new byte[source.width * source.height * 4]; - for (int y = 0; y < source.height; y++) { - int offset = y * source.width * 4; - for (int x = 0; x < source.width; x++) { - int pixel = source.getPixel(x, y); - int maskPixel = mask.getPixel(x, y); - if (pixel == 0 && maskPixel == 0) { - // BLACK - data[offset] = (byte)0xFF; - } else if (pixel == 0 && maskPixel == 1) { - // WHITE - cursor color - data[offset] = data[offset + 1] = data[offset + 2] = data[offset + 3] = (byte)0xFF; - } else if (pixel == 1 && maskPixel == 0) { - // SCREEN - } else { - /* - * Feature in the Macintosh. It is not possible to have - * the reverse screen case using NSCursor. - * Reverse screen will be the same as screen. - */ - // REVERSE SCREEN -> SCREEN - } - offset += 4; - } - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - createNSCursor(hotspotX, hotspotY, data, source.width, source.height); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -void createNSCursor(int hotspotX, int hotspotY, byte[] buffer, int width, int height) { - NSImage nsImage = (NSImage)new NSImage().alloc(); - NSBitmapImageRep nsImageRep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - handle = (NSCursor)new NSCursor().alloc(); - NSSize size = new NSSize(); - size.width = width; - size.height = height; - nsImage = nsImage.initWithSize(size); - nsImageRep = nsImageRep.initWithBitmapDataPlanes(0, width, height, - 8, 4, true, false, new NSString(OS.NSDeviceRGBColorSpace()), - OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width * 4, 32); - OS.memmove(nsImageRep.bitmapData(), buffer, buffer.length); - nsImage.addRepresentation(nsImageRep); - NSPoint point = new NSPoint(); - point.x = hotspotX; - point.y = hotspotY; - handle = handle.initWithImage(nsImage, point); - nsImageRep.release(); - nsImage.release(); -} - -/** - * Constructs a new cursor given a device, image data describing - * the desired cursor appearance, and the x and y coordinates of - * the <em>hotspot</em> (that is, the point within the area - * covered by the cursor which is considered to be where the - * on-screen pointer is "pointing"). - * <p> - * You must dispose the cursor when it is no longer required. - * </p> - * - * @param device the device on which to allocate the cursor - * @param source the image data for the cursor - * @param hotspotX the x coordinate of the cursor's hotspot - * @param hotspotY the y coordinate of the cursor's hotspot - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the image is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the hotspot is outside the bounds of the - * image</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a handle could not be obtained for cursor creation</li> - * </ul> - * - * @since 3.0 - */ -public Cursor(Device device, ImageData source, int hotspotX, int hotspotY) { - super(device); - if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (hotspotX >= source.width || hotspotX < 0 || - hotspotY >= source.height || hotspotY < 0) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - byte[] data = new byte[source.width * source.height * 4]; - PaletteData palette = source.palette; - if (palette.isDirect) { - ImageData.blit(ImageData.BLIT_SRC, - source.data, source.depth, source.bytesPerLine, source.getByteOrder(), 0, 0, source.width, source.height, palette.redMask, palette.greenMask, palette.blueMask, - ImageData.ALPHA_OPAQUE, null, 0, 0, 0, - data, 32, source.width * 4, ImageData.MSB_FIRST, 0, 0, source.width, source.height, 0xFF0000, 0xFF00, 0xFF, - false, false); - } else { - RGB[] rgbs = palette.getRGBs(); - int length = rgbs.length; - byte[] srcReds = new byte[length]; - byte[] srcGreens = new byte[length]; - byte[] srcBlues = new byte[length]; - for (int i = 0; i < rgbs.length; i++) { - RGB rgb = rgbs[i]; - if (rgb == null) continue; - srcReds[i] = (byte)rgb.red; - srcGreens[i] = (byte)rgb.green; - srcBlues[i] = (byte)rgb.blue; - } - ImageData.blit(ImageData.BLIT_SRC, - source.data, source.depth, source.bytesPerLine, source.getByteOrder(), 0, 0, source.width, source.height, srcReds, srcGreens, srcBlues, - ImageData.ALPHA_OPAQUE, null, 0, 0, 0, - data, 32, source.width * 4, ImageData.MSB_FIRST, 0, 0, source.width, source.height, 0xFF0000, 0xFF00, 0xFF, - false, false); - } - if (source.maskData != null || source.transparentPixel != -1) { - ImageData mask = source.getTransparencyMask(); - byte[] maskData = mask.data; - int maskBpl = mask.bytesPerLine; - int offset = 0, maskOffset = 0; - for (int y = 0; y<source.height; y++) { - for (int x = 0; x<source.width; x++) { - data[offset] = ((maskData[maskOffset + (x >> 3)]) & (1 << (7 - (x & 0x7)))) != 0 ? (byte)0xff : 0; - offset += 4; - } - maskOffset += maskBpl; - } - } else if (source.alpha != -1) { - byte alpha = (byte)source.alpha; - for (int i=0; i<data.length; i+=4) { - data[i] = alpha; - } - } else if (source.alphaData != null) { - byte[] alphaData = source.alphaData; - for (int i=0; i<data.length; i+=4) { - data[i] = alphaData[i/4]; - } - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - createNSCursor(hotspotX, hotspotY, data, source.width, source.height); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -void destroy() { - handle.release(); - handle = null; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals (Object object) { - if (object == this) return true; - if (!(object instanceof Cursor)) return false; - Cursor cursor = (Cursor) object; - return device == cursor.device && handle == cursor.handle; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode () { - return handle != null ? (int)/*64*/handle.id : 0; -} - -/** - * Returns <code>true</code> if the cursor has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the cursor. - * When a cursor has been disposed, it is an error to - * invoke any other method using the cursor. - * - * @return <code>true</code> when the cursor is disposed and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Cursor {*DISPOSED*}"; - return "Cursor {" + handle + "}"; -} - -/** - * Invokes platform specific functionality to allocate a new cursor. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Cursor</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param device the device on which to allocate the color - * @param handle the handle for the cursor - * - * @private - */ -public static Cursor cocoa_new(Device device, NSCursor handle) { - Cursor cursor = new Cursor(device); - cursor.handle = handle; - return cursor; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java deleted file mode 100755 index 932e1d49f6..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Device.java +++ /dev/null @@ -1,748 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.Compatibility; -import org.eclipse.swt.internal.cocoa.*; - -/** - * This class is the abstract superclass of all device objects, - * such as the Display device and the Printer device. Devices - * can have a graphics context (GC) created for them, and they - * can be drawn on by sending messages to the associated GC. - * - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public abstract class Device implements Drawable { - - /* Debugging */ - public static boolean DEBUG; - boolean debug = DEBUG; - boolean tracking = DEBUG; - Error [] errors; - Object [] objects; - Object trackingLock; - - /* Disposed flag */ - boolean disposed, warnings; - - Color COLOR_BLACK, COLOR_DARK_RED, COLOR_DARK_GREEN, COLOR_DARK_YELLOW, COLOR_DARK_BLUE; - Color COLOR_DARK_MAGENTA, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY, COLOR_RED; - Color COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE; - - /* System Font */ - Font systemFont; - - NSMutableParagraphStyle paragraphStyle; - - /* Device DPI */ - Point dpi; - - /* - * TEMPORARY CODE. When a graphics object is - * created and the device parameter is null, - * the current Display is used. This presents - * a problem because SWT graphics does not - * reference classes in SWT widgets. The correct - * fix is to remove this feature. Unfortunately, - * too many application programs rely on this - * feature. - */ - protected static Device CurrentDevice; - protected static Runnable DeviceFinder; - static { - try { - Class.forName ("org.eclipse.swt.widgets.Display"); - } catch (ClassNotFoundException e) {} - } - -/* -* TEMPORARY CODE. -*/ -static synchronized Device getDevice () { - if (DeviceFinder != null) DeviceFinder.run(); - Device device = CurrentDevice; - CurrentDevice = null; - return device; -} - -/** - * Constructs a new instance of this class. - * <p> - * You must dispose the device when it is no longer required. - * </p> - * - * @see #create - * @see #init - * - * @since 3.1 - */ -public Device() { - this(null); -} - -/** - * Constructs a new instance of this class. - * <p> - * You must dispose the device when it is no longer required. - * </p> - * - * @param data the DeviceData which describes the receiver - * - * @see #create - * @see #init - * @see DeviceData - */ -public Device(DeviceData data) { - synchronized (Device.class) { - if (data != null) { - debug = data.debug; - tracking = data.tracking; - } - if (tracking) { - errors = new Error [128]; - objects = new Object [128]; - trackingLock = new Object (); - } - if (NSThread.isMainThread()) { - NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - NSThread nsthread = NSThread.currentThread(); - NSMutableDictionary dictionary = nsthread.threadDictionary(); - NSString key = NSString.stringWith("SWT_NSAutoreleasePool"); - id obj = dictionary.objectForKey(key); - if (obj == null) { - NSNumber nsnumber = NSNumber.numberWithInteger(pool.id); - dictionary.setObject(nsnumber, key); - } else { - pool.release(); - } - } - //check and create pool - create (data); - init (); - } -} - -/** - * Throws an <code>SWTException</code> if the receiver can not - * be accessed by the caller. This may include both checks on - * the state of the receiver and more generally on the entire - * execution context. This method <em>should</em> be called by - * device implementors to enforce the standard SWT invariants. - * <p> - * Currently, it is an error to invoke any method (other than - * <code>isDisposed()</code> and <code>dispose()</code>) on a - * device that has had its <code>dispose()</code> method called. - * </p><p> - * In future releases of SWT, there may be more or fewer error - * checks and exceptions may be thrown for different reasons. - * <p> - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -protected void checkDevice () { - if (disposed) SWT.error(SWT.ERROR_DEVICE_DISPOSED); -} - -/** - * Creates the device in the operating system. If the device - * does not have a handle, this method may do nothing depending - * on the device. - * <p> - * This method is called before <code>init</code>. - * </p><p> - * Subclasses are supposed to reimplement this method and not - * call the <code>super</code> implementation. - * </p> - * - * @param data the DeviceData which describes the receiver - * - * @see #init - */ -protected void create (DeviceData data) { -} - -/** - * Disposes of the operating system resources associated with - * the receiver. After this method has been invoked, the receiver - * will answer <code>true</code> when sent the message - * <code>isDisposed()</code>. - * - * @see #release - * @see #destroy - * @see #checkDevice - */ -public void dispose () { - synchronized (Device.class) { - if (isDisposed()) return; - checkDevice (); - release (); - destroy (); - disposed = true; - if (tracking) { - synchronized (trackingLock) { - printErrors (); - objects = null; - errors = null; - trackingLock = null; - } - } - } -} - -void dispose_Object (Object object) { - synchronized (trackingLock) { - for (int i=0; i<objects.length; i++) { - if (objects [i] == object) { - objects [i] = null; - errors [i] = null; - return; - } - } - } -} - -/** - * Destroys the device in the operating system and releases - * the device's handle. If the device does not have a handle, - * this method may do nothing depending on the device. - * <p> - * This method is called after <code>release</code>. - * </p><p> - * Subclasses are supposed to reimplement this method and not - * call the <code>super</code> implementation. - * </p> - * - * @see #dispose - * @see #release - */ -protected void destroy () { -} - -/** - * Returns a rectangle describing the receiver's size and location. - * - * @return the bounding rectangle - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Rectangle getBounds () { - checkDevice (); - NSRect frame = getPrimaryScreen().frame(); - return new Rectangle((int)frame.x, (int)frame.y, (int)frame.width, (int)frame.height); -} - -/** - * Returns a <code>DeviceData</code> based on the receiver. - * Modifications made to this <code>DeviceData</code> will not - * affect the receiver. - * - * @return a <code>DeviceData</code> containing the device's data and attributes - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see DeviceData - */ -public DeviceData getDeviceData () { - checkDevice(); - DeviceData data = new DeviceData (); - data.debug = debug; - data.tracking = tracking; - if (tracking) { - synchronized (trackingLock) { - int count = 0, length = objects.length; - for (int i=0; i<length; i++) { - if (objects [i] != null) count++; - } - int index = 0; - data.objects = new Object [count]; - data.errors = new Error [count]; - for (int i=0; i<length; i++) { - if (objects [i] != null) { - data.objects [index] = objects [i]; - data.errors [index] = errors [i]; - index++; - } - } - } - } else { - data.objects = new Object [0]; - data.errors = new Error [0]; - } - return data; -} - -/** - * Returns a rectangle which describes the area of the - * receiver which is capable of displaying data. - * - * @return the client area - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getBounds - */ -public Rectangle getClientArea () { - checkDevice (); - return getBounds (); -} - -/** - * Returns the bit depth of the screen, which is the number of - * bits it takes to represent the number of unique colors that - * the screen is currently capable of displaying. This number - * will typically be one of 1, 8, 15, 16, 24 or 32. - * - * @return the depth of the screen - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getDepth () { - checkDevice (); - return (int)/*64*/OS.NSBitsPerPixelFromDepth(getPrimaryScreen().depth()); -} - -/** - * Returns a point whose x coordinate is the horizontal - * dots per inch of the display, and whose y coordinate - * is the vertical dots per inch of the display. - * - * @return the horizontal and vertical DPI - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Point getDPI () { - checkDevice (); - return getScreenDPI(); -} - -NSScreen getPrimaryScreen () { - NSArray screens = NSScreen.screens(); - return new NSScreen(screens.objectAtIndex(0)); -} - -/** - * Returns <code>FontData</code> objects which describe - * the fonts that match the given arguments. If the - * <code>faceName</code> is null, all fonts will be returned. - * - * @param faceName the name of the font to look for, or null - * @param scalable if true only scalable fonts are returned, otherwise only non-scalable fonts are returned. - * @return the matching font data - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public FontData[] getFontList (String faceName, boolean scalable) { - checkDevice (); - if (!scalable) return new FontData[0]; - int count = 0; - NSArray families = NSFontManager.sharedFontManager().availableFontFamilies(); - int /*long*/ familyCount = families.count(); - FontData[] fds = new FontData[100]; - for (int i = 0; i < familyCount; i++) { - NSString nsFamily = new NSString(families.objectAtIndex(i)); - String name = nsFamily.getString(); - NSArray fonts = NSFontManager.sharedFontManager().availableMembersOfFontFamily(nsFamily); - int fontCount = (int)/*64*/fonts.count(); - for (int j = 0; j < fontCount; j++) { - NSArray fontDetails = new NSArray(fonts.objectAtIndex(j)); - String nsName = new NSString(fontDetails.objectAtIndex(0)).getString(); - int /*long*/ weight = new NSNumber(fontDetails.objectAtIndex(2)).integerValue(); - int /*long*/ traits = new NSNumber(fontDetails.objectAtIndex(3)).integerValue(); - int style = SWT.NORMAL; - if ((traits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC; - if (weight == 9) style |= SWT.BOLD; - if (faceName == null || Compatibility.equalsIgnoreCase(faceName, name)) { - FontData data = new FontData(name, 0, style); - data.nsName = nsName; - if (count == fds.length) { - FontData[] newFds = new FontData[fds.length + 100]; - System.arraycopy(fds, 0, newFds, 0, fds.length); - fds = newFds; - } - fds[count++] = data; - } - } - } - if (count == fds.length) return fds; - FontData[] result = new FontData[count]; - System.arraycopy(fds, 0, result, 0, count); - return result; -} - -Point getScreenDPI () { - NSDictionary dictionary = getPrimaryScreen().deviceDescription(); - NSValue value = new NSValue(dictionary.objectForKey(new id(OS.NSDeviceResolution())).id); - NSSize size = value.sizeValue(); - return new Point((int)size.width, (int)size.height); -} - -/** - * Returns the matching standard color for the given - * constant, which should be one of the color constants - * specified in class <code>SWT</code>. Any value other - * than one of the SWT color constants which is passed - * in will result in the color black. This color should - * not be freed because it was allocated by the system, - * not the application. - * - * @param id the color constant - * @return the matching color - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see SWT - */ -public Color getSystemColor (int id) { - checkDevice (); - switch (id) { - case SWT.COLOR_BLACK: return COLOR_BLACK; - case SWT.COLOR_DARK_RED: return COLOR_DARK_RED; - case SWT.COLOR_DARK_GREEN: return COLOR_DARK_GREEN; - case SWT.COLOR_DARK_YELLOW: return COLOR_DARK_YELLOW; - case SWT.COLOR_DARK_BLUE: return COLOR_DARK_BLUE; - case SWT.COLOR_DARK_MAGENTA: return COLOR_DARK_MAGENTA; - case SWT.COLOR_DARK_CYAN: return COLOR_DARK_CYAN; - case SWT.COLOR_GRAY: return COLOR_GRAY; - case SWT.COLOR_DARK_GRAY: return COLOR_DARK_GRAY; - case SWT.COLOR_RED: return COLOR_RED; - case SWT.COLOR_GREEN: return COLOR_GREEN; - case SWT.COLOR_YELLOW: return COLOR_YELLOW; - case SWT.COLOR_BLUE: return COLOR_BLUE; - case SWT.COLOR_MAGENTA: return COLOR_MAGENTA; - case SWT.COLOR_CYAN: return COLOR_CYAN; - case SWT.COLOR_WHITE: return COLOR_WHITE; - } - return COLOR_BLACK; -} - -/** - * Returns a reasonable font for applications to use. - * On some platforms, this will match the "default font" - * or "system font" if such can be found. This font - * should not be freed because it was allocated by the - * system, not the application. - * <p> - * Typically, applications which want the default look - * should simply not set the font on the widgets they - * create. Widgets are always created with the correct - * default font for the class of user-interface component - * they represent. - * </p> - * - * @return a font - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Font getSystemFont () { - checkDevice (); - return systemFont; -} - -/** - * Returns <code>true</code> if the underlying window system prints out - * warning messages on the console, and <code>setWarnings</code> - * had previously been called with <code>true</code>. - * - * @return <code>true</code>if warnings are being handled, and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean getWarnings () { - checkDevice (); - return warnings; -} - -/** - * Initializes any internal resources needed by the - * device. - * <p> - * This method is called after <code>create</code>. - * </p><p> - * If subclasses reimplement this method, they must - * call the <code>super</code> implementation. - * </p> - * - * @see #create - */ -protected void init () { - /* Create the standard colors */ - COLOR_BLACK = new Color (this, 0,0,0); - COLOR_DARK_RED = new Color (this, 0x80,0,0); - COLOR_DARK_GREEN = new Color (this, 0,0x80,0); - COLOR_DARK_YELLOW = new Color (this, 0x80,0x80,0); - COLOR_DARK_BLUE = new Color (this, 0,0,0x80); - COLOR_DARK_MAGENTA = new Color (this, 0x80,0,0x80); - COLOR_DARK_CYAN = new Color (this, 0,0x80,0x80); - COLOR_GRAY = new Color (this, 0xC0,0xC0,0xC0); - COLOR_DARK_GRAY = new Color (this, 0x80,0x80,0x80); - COLOR_RED = new Color (this, 0xFF,0,0); - COLOR_GREEN = new Color (this, 0,0xFF,0); - COLOR_YELLOW = new Color (this, 0xFF,0xFF,0); - COLOR_BLUE = new Color (this, 0,0,0xFF); - COLOR_MAGENTA = new Color (this, 0xFF,0,0xFF); - COLOR_CYAN = new Color (this, 0,0xFF,0xFF); - COLOR_WHITE = new Color (this, 0xFF,0xFF,0xFF); - - paragraphStyle = (NSMutableParagraphStyle)new NSMutableParagraphStyle().alloc().init(); - paragraphStyle.setAlignment(OS.NSLeftTextAlignment); - paragraphStyle.setLineBreakMode(OS.NSLineBreakByClipping); - NSArray tabs = new NSArray(new NSArray().alloc().init()); - paragraphStyle.setTabStops(tabs); - tabs.release(); - - /* Initialize the system font slot */ - boolean smallFonts = System.getProperty("org.eclipse.swt.internal.carbon.smallFonts") != null; - float /*double*/ systemFontSize = smallFonts ? NSFont.smallSystemFontSize() : NSFont.systemFontSize(); - Point dpi = this.dpi = getDPI(), screenDPI = getScreenDPI(); - NSFont font = NSFont.systemFontOfSize(systemFontSize * dpi.y / screenDPI.y); - font.retain(); - systemFont = Font.cocoa_new(this, font); -} - -/** - * Invokes platform specific functionality to allocate a new GC handle. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Device</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param data the platform specific GC data - * @return the platform specific GC handle - */ -public abstract int /*long*/ internal_new_GC (GCData data); - -/** - * Invokes platform specific functionality to dispose a GC handle. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Device</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param hDC the platform specific GC handle - * @param data the platform specific GC data - */ -public abstract void internal_dispose_GC (int /*long*/ handle, GCData data); - -/** - * Returns <code>true</code> if the device has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the device. - * When a device has been disposed, it is an error to - * invoke any other method using the device. - * - * @return <code>true</code> when the device is disposed and <code>false</code> otherwise - */ -public boolean isDisposed () { - synchronized (Device.class) { - return disposed; - } -} - -/** - * Loads the font specified by a file. The font will be - * present in the list of fonts available to the application. - * - * @param path the font file path - * @return whether the font was successfully loaded - * - * @exception SWTException <ul> - * <li>ERROR_NULL_ARGUMENT - if path is null</li> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Font - * - * @since 3.3 - */ -public boolean loadFont (String path) { - checkDevice(); - if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - boolean result = false; - NSString nsPath = NSString.stringWith(path); - int /*long*/ fsRepresentation = nsPath.fileSystemRepresentation(); - - if (fsRepresentation != 0) { - byte [] fsRef = new byte [80]; - boolean [] isDirectory = new boolean[1]; - if (OS.FSPathMakeRef (fsRepresentation, fsRef, isDirectory) == OS.noErr) { - result = OS.ATSFontActivateFromFileReference (fsRef, OS.kATSFontContextLocal, OS.kATSFontFormatUnspecified, 0, OS.kATSOptionFlagsDefault, null) == OS.noErr; - } - } - - return result; -} - -void new_Object (Object object) { - synchronized (trackingLock) { - for (int i=0; i<objects.length; i++) { - if (objects [i] == null) { - objects [i] = object; - errors [i] = new Error (); - return; - } - } - Object [] newObjects = new Object [objects.length + 128]; - System.arraycopy (objects, 0, newObjects, 0, objects.length); - newObjects [objects.length] = object; - objects = newObjects; - Error [] newErrors = new Error [errors.length + 128]; - System.arraycopy (errors, 0, newErrors, 0, errors.length); - newErrors [errors.length] = new Error (); - errors = newErrors; - } -} - -void printErrors () { - if (!DEBUG) return; - if (tracking) { - synchronized (trackingLock) { - if (objects == null || errors == null) return; - int objectCount = 0; - int colors = 0, cursors = 0, fonts = 0, gcs = 0, images = 0; - int paths = 0, patterns = 0, regions = 0, textLayouts = 0, transforms = 0; - for (int i=0; i<objects.length; i++) { - Object object = objects [i]; - if (object != null) { - objectCount++; - if (object instanceof Color) colors++; - if (object instanceof Cursor) cursors++; - if (object instanceof Font) fonts++; - if (object instanceof GC) gcs++; - if (object instanceof Image) images++; - if (object instanceof Path) paths++; - if (object instanceof Pattern) patterns++; - if (object instanceof Region) regions++; - if (object instanceof TextLayout) textLayouts++; - if (object instanceof Transform) transforms++; - } - } - if (objectCount != 0) { - String string = "Summary: "; - if (colors != 0) string += colors + " Color(s), "; - if (cursors != 0) string += cursors + " Cursor(s), "; - if (fonts != 0) string += fonts + " Font(s), "; - if (gcs != 0) string += gcs + " GC(s), "; - if (images != 0) string += images + " Image(s), "; - if (paths != 0) string += paths + " Path(s), "; - if (patterns != 0) string += patterns + " Pattern(s), "; - if (regions != 0) string += regions + " Region(s), "; - if (textLayouts != 0) string += textLayouts + " TextLayout(s), "; - if (transforms != 0) string += transforms + " Transforms(s), "; - if (string.length () != 0) { - string = string.substring (0, string.length () - 2); - System.out.println (string); - } - for (int i=0; i<errors.length; i++) { - if (errors [i] != null) errors [i].printStackTrace (System.out); - } - } - } - } -} - -/** - * Releases any internal resources back to the operating - * system and clears all fields except the device handle. - * <p> - * When a device is destroyed, resources that were acquired - * on behalf of the programmer need to be returned to the - * operating system. For example, if the device allocated a - * font to be used as the system font, this font would be - * freed in <code>release</code>. Also,to assist the garbage - * collector and minimize the amount of memory that is not - * reclaimed when the programmer keeps a reference to a - * disposed device, all fields except the handle are zero'd. - * The handle is needed by <code>destroy</code>. - * </p> - * This method is called before <code>destroy</code>. - * </p><p> - * If subclasses reimplement this method, they must - * call the <code>super</code> implementation. - * </p> - * - * @see #dispose - * @see #destroy - */ -protected void release () { - if (paragraphStyle != null) paragraphStyle.release(); - paragraphStyle = null; - - if (systemFont != null) systemFont.dispose(); - systemFont = null; - - if (COLOR_BLACK != null) COLOR_BLACK.dispose(); - if (COLOR_DARK_RED != null) COLOR_DARK_RED.dispose(); - if (COLOR_DARK_GREEN != null) COLOR_DARK_GREEN.dispose(); - if (COLOR_DARK_YELLOW != null) COLOR_DARK_YELLOW.dispose(); - if (COLOR_DARK_BLUE != null) COLOR_DARK_BLUE.dispose(); - if (COLOR_DARK_MAGENTA != null) COLOR_DARK_MAGENTA.dispose(); - if (COLOR_DARK_CYAN != null) COLOR_DARK_CYAN.dispose(); - if (COLOR_GRAY != null) COLOR_GRAY.dispose(); - if (COLOR_DARK_GRAY != null) COLOR_DARK_GRAY.dispose(); - if (COLOR_RED != null) COLOR_RED.dispose(); - if (COLOR_GREEN != null) COLOR_GREEN.dispose(); - if (COLOR_YELLOW != null) COLOR_YELLOW.dispose(); - if (COLOR_BLUE != null) COLOR_BLUE.dispose(); - if (COLOR_MAGENTA != null) COLOR_MAGENTA.dispose(); - if (COLOR_CYAN != null) COLOR_CYAN.dispose(); - if (COLOR_WHITE != null) COLOR_WHITE.dispose(); - COLOR_BLACK = COLOR_DARK_RED = COLOR_DARK_GREEN = COLOR_DARK_YELLOW = COLOR_DARK_BLUE = - COLOR_DARK_MAGENTA = COLOR_DARK_CYAN = COLOR_GRAY = COLOR_DARK_GRAY = COLOR_RED = - COLOR_GREEN = COLOR_YELLOW = COLOR_BLUE = COLOR_MAGENTA = COLOR_CYAN = COLOR_WHITE = null; -} - -/** - * If the underlying window system supports printing warning messages - * to the console, setting warnings to <code>false</code> prevents these - * messages from being printed. If the argument is <code>true</code> then - * message printing is not blocked. - * - * @param warnings <code>true</code>if warnings should be printed, and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setWarnings (boolean warnings) { - checkDevice (); - this.warnings = warnings; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java deleted file mode 100755 index ad0c2b2afe..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/DeviceData.java +++ /dev/null @@ -1,23 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2007 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -public class DeviceData { - /* - * Debug fields - may not be honoured - * on some SWT platforms. - */ - public boolean debug; - public boolean tracking; - public Error [] errors; - public Object [] objects; -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java deleted file mode 100755 index b30ab417f2..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Font.java +++ /dev/null @@ -1,370 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.internal.cocoa.*; -import org.eclipse.swt.*; - -/** - * Instances of this class manage operating system resources that - * define how text looks when it is displayed. Fonts may be constructed - * by providing a device and either name, size and style information - * or a <code>FontData</code> object which encapsulates this data. - * <p> - * Application code must explicitly invoke the <code>Font.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * - * @see FontData - * @see <a href="http://www.eclipse.org/swt/snippets/#font">Font snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Examples: GraphicsExample, PaintExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class Font extends Resource { - - /** - * the handle to the OS font resource - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSFont handle; - - /** - * the traits not supported to the OS font resource - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public int extraTraits; - - static final double SYNTHETIC_BOLD = -2.5; - static final double SYNTHETIC_ITALIC = 0.2; - -Font(Device device) { - super(device); -} - -/** - * Constructs a new font given a device and font data - * which describes the desired font's appearance. - * <p> - * You must dispose the font when it is no longer required. - * </p> - * - * @param device the device to create the font on - * @param fd the FontData that describes the desired font (must not be null) - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the fd argument is null</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a font could not be created from the given font data</li> - * </ul> - */ -public Font(Device device, FontData fd) { - super(device); - if (fd == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(fd.getName(), fd.getHeightF(), fd.getStyle(), fd.nsName); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new font given a device and an array - * of font data which describes the desired font's - * appearance. - * <p> - * You must dispose the font when it is no longer required. - * </p> - * - * @param device the device to create the font on - * @param fds the array of FontData that describes the desired font (must not be null) - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the fds argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the length of fds is zero</li> - * <li>ERROR_NULL_ARGUMENT - if any fd in the array is null</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a font could not be created from the given font data</li> - * </ul> - * - * @since 2.1 - */ -public Font(Device device, FontData[] fds) { - super(device); - if (fds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (fds.length == 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - for (int i=0; i<fds.length; i++) { - if (fds[i] == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - FontData fd = fds[0]; - init(fd.getName(), fd.getHeightF(), fd.getStyle(), fd.nsName); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new font given a device, a font name, - * the height of the desired font in points, and a font - * style. - * <p> - * You must dispose the font when it is no longer required. - * </p> - * - * @param device the device to create the font on - * @param name the name of the font (must not be null) - * @param height the font height in points - * @param style a bit or combination of NORMAL, BOLD, ITALIC - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the name argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if a font could not be created from the given arguments</li> - * </ul> - */ -public Font(Device device, String name, int height, int style) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(name, height, style, null); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/*public*/ Font(Device device, String name, float height, int style) { - super(device); - init(name, height, style, null); - init(); -} - -void addTraits(NSMutableAttributedString attrStr, NSRange range) { - if ((extraTraits & OS.NSBoldFontMask) != 0) { - attrStr.addAttribute(OS.NSStrokeWidthAttributeName, NSNumber.numberWithDouble(SYNTHETIC_BOLD), range); - } - if ((extraTraits & OS.NSItalicFontMask) != 0) { - attrStr.addAttribute(OS.NSObliquenessAttributeName, NSNumber.numberWithDouble(SYNTHETIC_ITALIC), range); - } -} - -void addTraits(NSMutableDictionary dict) { - if ((extraTraits & OS.NSBoldFontMask) != 0) { - dict.setObject(NSNumber.numberWithDouble(SYNTHETIC_BOLD), OS.NSStrokeWidthAttributeName); - } - if ((extraTraits & OS.NSItalicFontMask) != 0) { - dict.setObject(NSNumber.numberWithDouble(SYNTHETIC_ITALIC), OS.NSObliquenessAttributeName); - } -} - -void destroy() { - handle.release(); - handle = null; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals(Object object) { - if (object == this) return true; - if (!(object instanceof Font)) return false; - Font font = (Font)object; - return handle == font.handle; -} - -/** - * Returns an array of <code>FontData</code>s representing the receiver. - * On Windows, only one FontData will be returned per font. On X however, - * a <code>Font</code> object <em>may</em> be composed of multiple X - * fonts. To support this case, we return an array of font data objects. - * - * @return an array of font data objects describing the receiver - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public FontData[] getFontData() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSString family = handle.familyName(); - String name = family.getString(); - NSString str = handle.fontName(); - String nsName = str.getString(); - NSFontManager manager = NSFontManager.sharedFontManager(); - int /*long*/ traits = manager.traitsOfFont(handle); - int style = SWT.NORMAL; - if ((traits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC; - if ((traits & OS.NSBoldFontMask) != 0) style |= SWT.BOLD; - if ((extraTraits & OS.NSItalicFontMask) != 0) style |= SWT.ITALIC; - if ((extraTraits & OS.NSBoldFontMask) != 0) style |= SWT.BOLD; - Point dpi = device.dpi, screenDPI = device.getScreenDPI(); - FontData data = new FontData(name, (float)/*64*/handle.pointSize() * screenDPI.y / dpi.y, style); - data.nsName = nsName; - return new FontData[]{data}; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Invokes platform specific functionality to allocate a new font. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Font</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param device the device on which to allocate the color - * @param handle the handle for the font - * @param style the style for the font - * @param size the size for the font - * - * @private - */ -public static Font cocoa_new(Device device, NSFont handle) { - Font font = new Font(device); - font.handle = handle; - return font; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode() { - return handle != null ? (int)/*64*/handle.id : 0; -} - -void init(String name, float height, int style, String nsName) { - if (name == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - Point dpi = device.dpi, screenDPI = device.getScreenDPI(); - float size = height * dpi.y / screenDPI.y; - if (nsName != null) { - handle = NSFont.fontWithName(NSString.stringWith(nsName), size); - } else { - NSString family = NSString.stringWith(name); - NSFont nsFont = NSFont.fontWithName(family, size); - if (nsFont == null) nsFont = NSFont.systemFontOfSize(size); - NSFontManager manager = NSFontManager.sharedFontManager(); - if (nsFont != null) { - if ((style & (SWT.BOLD | SWT.ITALIC)) == 0) { - handle = nsFont; - } else { - int traits = 0; - if ((style & SWT.ITALIC) != 0) traits |= OS.NSItalicFontMask; - if ((style & SWT.BOLD) != 0) traits |= OS.NSBoldFontMask; - handle = manager.convertFont(nsFont, traits); - if ((style & SWT.ITALIC) != 0 && (handle == null || (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0)) { - traits &= ~OS.NSItalicFontMask; - handle = null; - if ((style & SWT.BOLD) != 0) { - handle = manager.convertFont(nsFont, traits); - } - } - if ((style & SWT.BOLD) != 0 && handle == null) { - traits &= ~OS.NSBoldFontMask; - if ((style & SWT.ITALIC) != 0) { - traits |= OS.NSItalicFontMask; - handle = manager.convertFont(nsFont, traits); - } - } - if (handle == null) handle = nsFont; - } - } - if (handle == null) { - handle = NSFont.systemFontOfSize(size); - } - if ((style & SWT.ITALIC) != 0 && (manager.traitsOfFont(handle) & OS.NSItalicFontMask) == 0) { - extraTraits |= OS.NSItalicFontMask; - } - if ((style & SWT.BOLD) != 0 && (manager.traitsOfFont(handle) & OS.NSBoldFontMask) == 0) { - extraTraits |= OS.NSBoldFontMask; - } - } - if (handle == null) { - handle = device.systemFont.handle; - } - handle.retain(); -} - -/** - * Returns <code>true</code> if the font has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the font. - * When a font has been disposed, it is an error to - * invoke any other method using the font. - * - * @return <code>true</code> when the font is disposed and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Font {*DISPOSED*}"; - return "Font {" + handle + "}"; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java deleted file mode 100755 index 589f151ebe..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontData.java +++ /dev/null @@ -1,447 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.*; - -/** - * Instances of this class describe operating system fonts. - * <p> - * For platform-independent behaviour, use the get and set methods - * corresponding to the following properties: - * <dl> - * <dt>height</dt><dd>the height of the font in points</dd> - * <dt>name</dt><dd>the face name of the font, which may include the foundry</dd> - * <dt>style</dt><dd>A bitwise combination of NORMAL, ITALIC and BOLD</dd> - * </dl> - * If extra, platform-dependent functionality is required: - * <ul> - * <li>On <em>Windows</em>, the data member of the <code>FontData</code> - * corresponds to a Windows <code>LOGFONT</code> structure whose fields - * may be retrieved and modified.</li> - * <li>On <em>X</em>, the fields of the <code>FontData</code> correspond - * to the entries in the font's XLFD name and may be retrieved and modified. - * </ul> - * Application code does <em>not</em> need to explicitly release the - * resources managed by each instance when those instances are no longer - * required, and thus no <code>dispose()</code> method is provided. - * - * @see Font - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class FontData { - /** - * the font name - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public String name; - - /** - * The height of the font data in points - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public float height; - - /** - * the font style - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public int style; - - /** - * the NSFont font name - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public String nsName; - - /** - * The locales of the font - */ - String lang, country, variant; - -/** - * Constructs a new uninitialized font data. - */ -public FontData () { - this("", 12, SWT.NORMAL); -} - -/** - * Constructs a new FontData given a string representation - * in the form generated by the <code>FontData.toString</code> - * method. - * <p> - * Note that the representation varies between platforms, - * and a FontData can only be created from a string that was - * generated on the same platform. - * </p> - * - * @param string the string representation of a <code>FontData</code> (must not be null) - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the argument does not represent a valid description</li> - * </ul> - * - * @see #toString - */ -public FontData(String string) { - if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - int start = 0; - int end = string.indexOf('|'); - if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - String version1 = string.substring(start, end); - try { - if (Integer.parseInt(version1) != 1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } catch (NumberFormatException e) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - start = end + 1; - end = string.indexOf('|', start); - if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - String name = string.substring(start, end); - - start = end + 1; - end = string.indexOf('|', start); - if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - float height = 0; - try { - height = Float.parseFloat(string.substring(start, end)); - } catch (NumberFormatException e) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - start = end + 1; - end = string.indexOf('|', start); - if (end == -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - int style = 0; - try { - style = Integer.parseInt(string.substring(start, end)); - } catch (NumberFormatException e) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - start = end + 1; - end = string.indexOf('|', start); - setName(name); - setHeight(height); - setStyle(style); - if (end == -1) return; - String platform = string.substring(start, end); - - start = end + 1; - end = string.indexOf('|', start); - if (end == -1) return; - String version2 = string.substring(start, end); - - if (platform.equals("COCOA") && version2.equals("1")) { - start = end + 1; - end = string.length(); - if (start < end) nsName = string.substring(start, end); - } -} - -/** - * Constructs a new font data given a font name, - * the height of the desired font in points, - * and a font style. - * - * @param name the name of the font (must not be null) - * @param height the font height in points - * @param style a bit or combination of NORMAL, BOLD, ITALIC - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - when the font name is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li> - * </ul> - */ -public FontData(String name, int height, int style) { - setName(name); - setHeight(height); - setStyle(style); -} - -/*public*/ FontData(String name, float height, int style) { - setName(name); - setHeight(height); - setStyle(style); -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals (Object object) { - if (object == this) return true; - if (!(object instanceof FontData)) return false; - FontData data = (FontData)object; - return name.equals(data.name) && height == data.height && style == data.style; -} - -/** - * Returns the height of the receiver in points. - * - * @return the height of this FontData - * - * @see #setHeight(int) - */ -public int getHeight() { - return (int)height; -} - -/*public*/ float getHeightF() { - return height; -} - -/** - * Returns the locale of the receiver. - * <p> - * The locale determines which platform character set this - * font is going to use. Widgets and graphics operations that - * use this font will convert UNICODE strings to the platform - * character set of the specified locale. - * </p> - * <p> - * On platforms where there are multiple character sets for a - * given language/country locale, the variant portion of the - * locale will determine the character set. - * </p> - * - * @return the <code>String</code> representing a Locale object - * @since 3.0 - */ -public String getLocale () { - StringBuffer buffer = new StringBuffer (); - char sep = '_'; - if (lang != null) { - buffer.append (lang); - buffer.append (sep); - } - if (country != null) { - buffer.append (country); - buffer.append (sep); - } - if (variant != null) { - buffer.append (variant); - } - - String result = buffer.toString (); - int length = result.length (); - if (length > 0) { - if (result.charAt (length - 1) == sep) { - result = result.substring (0, length - 1); - } - } - return result; -} - -/** - * Returns the name of the receiver. - * On platforms that support font foundries, the return value will - * be the foundry followed by a dash ("-") followed by the face name. - * - * @return the name of this <code>FontData</code> - * - * @see #setName - */ -public String getName() { - return name; -} - -/** - * Returns the style of the receiver which is a bitwise OR of - * one or more of the <code>SWT</code> constants NORMAL, BOLD - * and ITALIC. - * - * @return the style of this <code>FontData</code> - * - * @see #setStyle - */ -public int getStyle() { - return style; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode () { - return name.hashCode() ^ getHeight() ^ style; -} - -/** - * Sets the height of the receiver. The parameter is - * specified in terms of points, where a point is one - * seventy-second of an inch. - * - * @param height the height of the <code>FontData</code> - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the height is negative</li> - * </ul> - * - * @see #getHeight - */ -public void setHeight(int height) { - if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - this.height = height; -} - -/*public*/ void setHeight(float height) { - if (height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - this.height = height; -} - -/** - * Sets the locale of the receiver. - * <p> - * The locale determines which platform character set this - * font is going to use. Widgets and graphics operations that - * use this font will convert UNICODE strings to the platform - * character set of the specified locale. - * </p> - * <p> - * On platforms where there are multiple character sets for a - * given language/country locale, the variant portion of the - * locale will determine the character set. - * </p> - * - * @param locale the <code>String</code> representing a Locale object - * @see java.util.Locale#toString - */ -public void setLocale(String locale) { - lang = country = variant = null; - if (locale != null) { - char sep = '_'; - int length = locale.length(); - int firstSep, secondSep; - - firstSep = locale.indexOf(sep); - if (firstSep == -1) { - firstSep = secondSep = length; - } else { - secondSep = locale.indexOf(sep, firstSep + 1); - if (secondSep == -1) secondSep = length; - } - if (firstSep > 0) lang = locale.substring(0, firstSep); - if (secondSep > firstSep + 1) country = locale.substring(firstSep + 1, secondSep); - if (length > secondSep + 1) variant = locale.substring(secondSep + 1); - } -} - -/** - * Sets the name of the receiver. - * <p> - * Some platforms support font foundries. On these platforms, the name - * of the font specified in setName() may have one of the following forms: - * <ol> - * <li>a face name (for example, "courier")</li> - * <li>a foundry followed by a dash ("-") followed by a face name (for example, "adobe-courier")</li> - * </ol> - * In either case, the name returned from getName() will include the - * foundry. - * </p> - * <p> - * On platforms that do not support font foundries, only the face name - * (for example, "courier") is used in <code>setName()</code> and - * <code>getName()</code>. - * </p> - * - * @param name the name of the font data (must not be null) - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - when the font name is null</li> - * </ul> - * - * @see #getName - */ -public void setName(String name) { - if (name == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - this.name = name; - nsName = null; -} - -/** - * Sets the style of the receiver to the argument which must - * be a bitwise OR of one or more of the <code>SWT</code> - * constants NORMAL, BOLD and ITALIC. All other style bits are - * ignored. - * - * @param style the new style for this <code>FontData</code> - * - * @see #getStyle - */ -public void setStyle(int style) { - this.style = style; - nsName = null; -} - -/** - * Returns a string representation of the receiver which is suitable - * for constructing an equivalent instance using the - * <code>FontData(String)</code> constructor. - * - * @return a string representation of the FontData - * - * @see FontData - */ -public String toString() { - StringBuffer buffer = new StringBuffer(128); - buffer.append("1|"); - buffer.append(getName()); - buffer.append("|"); - buffer.append(getHeightF()); - buffer.append("|"); - buffer.append(getStyle()); - buffer.append("|"); - buffer.append("COCOA|1|"); - if (nsName != null) buffer.append(nsName); - return buffer.toString(); -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java deleted file mode 100755 index 2c0d6a7a3f..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/FontMetrics.java +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -/** - * Instances of this class provide measurement information - * about fonts including ascent, descent, height, leading - * space between rows, and average character width. - * <code>FontMetrics</code> are obtained from <code>GC</code>s - * using the <code>getFontMetrics()</code> method. - * - * @see GC#getFontMetrics - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class FontMetrics { - int ascent, descent, averageCharWidth, leading, height; - -FontMetrics() { -} - -public static FontMetrics cocoa_new(int ascent, int descent, int averageCharWidth, int leading, int height) { - FontMetrics fontMetrics = new FontMetrics(); - fontMetrics.ascent = ascent; - fontMetrics.descent = descent; - fontMetrics.averageCharWidth = averageCharWidth; - fontMetrics.leading = leading; - fontMetrics.height = height; - return fontMetrics; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals (Object object) { - if (object == this) return true; - if (!(object instanceof FontMetrics)) return false; - FontMetrics metrics = (FontMetrics)object; - return ascent == metrics.ascent && descent == metrics.descent && - averageCharWidth == metrics.averageCharWidth && leading == metrics.leading && - height == metrics.height; -} - -/** - * Returns the ascent of the font described by the receiver. A - * font's <em>ascent</em> is the distance from the baseline to the - * top of actual characters, not including any of the leading area, - * measured in pixels. - * - * @return the ascent of the font - */ -public int getAscent() { - return ascent; -} - -/** - * Returns the average character width, measured in pixels, - * of the font described by the receiver. - * - * @return the average character width of the font - */ -public int getAverageCharWidth() { - return averageCharWidth; -} - -/** - * Returns the descent of the font described by the receiver. A - * font's <em>descent</em> is the distance from the baseline to the - * bottom of actual characters, not including any of the leading area, - * measured in pixels. - * - * @return the descent of the font - */ -public int getDescent() { - return descent; -} - -/** - * Returns the height of the font described by the receiver, - * measured in pixels. A font's <em>height</em> is the sum of - * its ascent, descent and leading area. - * - * @return the height of the font - * - * @see #getAscent - * @see #getDescent - * @see #getLeading - */ -public int getHeight() { - return height; -} - -/** - * Returns the leading area of the font described by the - * receiver. A font's <em>leading area</em> is the space - * above its ascent which may include accents or other marks. - * - * @return the leading space of the font - */ -public int getLeading() { - return leading; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode() { - return ascent ^ descent ^ averageCharWidth ^ leading ^ height; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java deleted file mode 100755 index 0d34639929..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GC.java +++ /dev/null @@ -1,3918 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.*; -import org.eclipse.swt.internal.cocoa.*; - -/** - * Class <code>GC</code> is where all of the drawing capabilities that are - * supported by SWT are located. Instances are used to draw on either an - * <code>Image</code>, a <code>Control</code>, or directly on a <code>Display</code>. - * <dl> - * <dt><b>Styles:</b></dt> - * <dd>LEFT_TO_RIGHT, RIGHT_TO_LEFT</dd> - * </dl> - * - * <p> - * The SWT drawing coordinate system is the two-dimensional space with the origin - * (0,0) at the top left corner of the drawing area and with (x,y) values increasing - * to the right and downward respectively. - * </p> - * - * <p> - * The result of drawing on an image that was created with an indexed - * palette using a color that is not in the palette is platform specific. - * Some platforms will match to the nearest color while other will draw - * the color itself. This happens because the allocated image might use - * a direct palette on platforms that do not support indexed palette. - * </p> - * - * <p> - * Application code must explicitly invoke the <code>GC.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. This is <em>particularly</em> - * important on Windows95 and Windows98 where the operating system has a limited - * number of device contexts available. - * </p> - * - * <p> - * Note: Only one of LEFT_TO_RIGHT and RIGHT_TO_LEFT may be specified. - * </p> - * - * @see org.eclipse.swt.events.PaintEvent - * @see <a href="http://www.eclipse.org/swt/snippets/#gc">GC snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Examples: GraphicsExample, PaintExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class GC extends Resource { - /** - * the handle to the OS device context - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSGraphicsContext handle; - - Drawable drawable; - GCData data; - - CGPathElement element; - int count, typeCount; - byte[] types; - float /*double*/[] points; - float /*double*/ [] point; - - static final int TAB_COUNT = 32; - - final static int FOREGROUND = 1 << 0; - final static int BACKGROUND = 1 << 1; - final static int FONT = 1 << 2; - final static int LINE_STYLE = 1 << 3; - final static int LINE_CAP = 1 << 4; - final static int LINE_JOIN = 1 << 5; - final static int LINE_WIDTH = 1 << 6; - final static int LINE_MITERLIMIT = 1 << 7; - final static int FOREGROUND_FILL = 1 << 8; - final static int DRAW_OFFSET = 1 << 9; - final static int CLIPPING = 1 << 10; - final static int TRANSFORM = 1 << 11; - final static int VISIBLE_REGION = 1 << 12; - final static int DRAW = CLIPPING | TRANSFORM | FOREGROUND | LINE_WIDTH | LINE_STYLE | LINE_CAP | LINE_JOIN | LINE_MITERLIMIT | DRAW_OFFSET; - final static int FILL = CLIPPING | TRANSFORM | BACKGROUND; - - static final float[] LINE_DOT = new float[]{1, 1}; - static final float[] LINE_DASH = new float[]{3, 1}; - static final float[] LINE_DASHDOT = new float[]{3, 1, 1, 1}; - static final float[] LINE_DASHDOTDOT = new float[]{3, 1, 1, 1, 1, 1}; - static final float[] LINE_DOT_ZERO = new float[]{3, 3}; - static final float[] LINE_DASH_ZERO = new float[]{18, 6}; - static final float[] LINE_DASHDOT_ZERO = new float[]{9, 6, 3, 6}; - static final float[] LINE_DASHDOTDOT_ZERO = new float[]{9, 3, 3, 3, 3, 3}; - -GC() { -} - -/** - * Constructs a new instance of this class which has been - * configured to draw on the specified drawable. Sets the - * foreground color, background color and font in the GC - * to match those in the drawable. - * <p> - * You must dispose the graphics context when it is no longer required. - * </p> - * @param drawable the drawable to draw on - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the drawable is null</li> - * <li>ERROR_NULL_ARGUMENT - if there is no current device</li> - * <li>ERROR_INVALID_ARGUMENT - * - if the drawable is an image that is not a bitmap or an icon - * - if the drawable is an image or printer that is already selected - * into another graphics context</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for GC creation</li> - * <li>ERROR_THREAD_INVALID_ACCESS if not called from the thread that created the drawable</li> - * </ul> - */ -public GC(Drawable drawable) { - this(drawable, 0); -} - -/** - * Constructs a new instance of this class which has been - * configured to draw on the specified drawable. Sets the - * foreground color, background color and font in the GC - * to match those in the drawable. - * <p> - * You must dispose the graphics context when it is no longer required. - * </p> - * - * @param drawable the drawable to draw on - * @param style the style of GC to construct - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the drawable is null</li> - * <li>ERROR_NULL_ARGUMENT - if there is no current device</li> - * <li>ERROR_INVALID_ARGUMENT - * - if the drawable is an image that is not a bitmap or an icon - * - if the drawable is an image or printer that is already selected - * into another graphics context</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for GC creation</li> - * <li>ERROR_THREAD_INVALID_ACCESS if not called from the thread that created the drawable</li> - * </ul> - * - * @since 2.1.2 - */ -public GC(Drawable drawable, int style) { - if (drawable == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - GCData data = new GCData(); - data.style = checkStyle(style); - int /*long*/ contextId = drawable.internal_new_GC(data); - Device device = data.device; - if (device == null) device = Device.getDevice(); - if (device == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - this.device = data.device = device; - init(drawable, data, contextId); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -static int checkStyle (int style) { - if ((style & SWT.LEFT_TO_RIGHT) != 0) style &= ~SWT.RIGHT_TO_LEFT; - return style & (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT); -} - -/** - * Invokes platform specific functionality to allocate a new graphics context. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>GC</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param drawable the Drawable for the receiver. - * @param data the data for the receiver. - * - * @return a new <code>GC</code> - * - * @private - */ -public static GC cocoa_new(Drawable drawable, GCData data) { - GC gc = new GC(); - int /*long*/ context = drawable.internal_new_GC(data); - gc.device = data.device; - gc.init(drawable, data, context); - return gc; -} - -int /*long*/ applierFunc(int /*long*/ info, int /*long*/ elementPtr) { - OS.memmove(element, elementPtr, CGPathElement.sizeof); - int type = 0, length = 1; - switch (element.type) { - case OS.kCGPathElementMoveToPoint: type = SWT.PATH_MOVE_TO; break; - case OS.kCGPathElementAddLineToPoint: type = SWT.PATH_LINE_TO; break; - case OS.kCGPathElementAddQuadCurveToPoint: type = SWT.PATH_QUAD_TO; length = 2; break; - case OS.kCGPathElementAddCurveToPoint: type = SWT.PATH_CUBIC_TO; length = 3; break; - case OS.kCGPathElementCloseSubpath: type = SWT.PATH_CLOSE; length = 0; break; - } - if (types != null) { - types[typeCount] = (byte)type; - if (length > 0) { - OS.memmove(point, element.points, length * CGPoint.sizeof); - System.arraycopy(point, 0, points, count, length * 2); - } - } - typeCount++; - count += length * 2; - return 0; -} - -NSAutoreleasePool checkGC (int mask) { - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - if (data.flippedContext != null && !handle.isEqual(NSGraphicsContext.currentContext())) { - data.restoreContext = true; - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(handle); - } - if ((mask & (CLIPPING | TRANSFORM)) != 0) { - NSView view = data.view; - if ((data.state & CLIPPING) == 0 || (data.state & TRANSFORM) == 0 || (data.state & VISIBLE_REGION) == 0) { - boolean antialias = handle.shouldAntialias(); - handle.restoreGraphicsState(); - handle.saveGraphicsState(); - handle.setShouldAntialias(antialias); - if (view != null && (data.paintRect == null || !view.isFlipped())) { - NSAffineTransform transform = NSAffineTransform.transform(); - NSRect rect = view.convertRect_toView_(view.bounds(), null); - if (data.paintRect == null) { - transform.translateXBy(rect.x, rect.y + rect.height); - } else { - transform.translateXBy(0, rect.height); - } - transform.scaleXBy(1, -1); - transform.concat(); - if (data.visibleRgn != 0) { - if (data.visiblePath == null || (data.state & VISIBLE_REGION) == 0) { - if (data.visiblePath != null) data.visiblePath.release(); - data.visiblePath = Region.cocoa_new(device, data.visibleRgn).getPath(); - } - data.visiblePath.addClip(); - data.state |= VISIBLE_REGION; - } - } - if (data.clipPath != null) data.clipPath.addClip(); - if (data.transform != null) data.transform.concat(); - mask &= ~(TRANSFORM | CLIPPING); - data.state |= TRANSFORM | CLIPPING; - data.state &= ~(BACKGROUND | FOREGROUND); - } - } - - int state = data.state; - if ((state & mask) == mask) return pool; - state = (state ^ mask) & mask; - data.state |= mask; - - if ((state & FOREGROUND) != 0) { - Pattern pattern = data.foregroundPattern; - if (pattern != null) { - if (pattern.color != null) pattern.color.setStroke(); - } else { - float /*double*/ [] color = data.foreground; - if (data.fg != null) data.fg.release(); - NSColor fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f); - fg.retain(); - fg.setStroke(); - } - } - if ((state & FOREGROUND_FILL) != 0) { - Pattern pattern = data.foregroundPattern; - if (pattern != null) { - if (pattern.color != null) pattern.color.setFill(); - } else { - float /*double*/ [] color = data.foreground; - if (data.fg != null) data.fg.release(); - NSColor fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f); - fg.retain(); - fg.setFill(); - } - data.state &= ~BACKGROUND; - } - if ((state & BACKGROUND) != 0) { - Pattern pattern = data.backgroundPattern; - if (pattern != null) { - if (pattern.color != null) pattern.color.setFill(); - } else { - float /*double*/ [] color = data.background; - if (data.bg != null) data.bg.release(); - NSColor bg = data.bg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f); - bg.retain(); - bg.setFill(); - } - data.state &= ~FOREGROUND_FILL; - } - NSBezierPath path = data.path; - if ((state & LINE_WIDTH) != 0) { - path.setLineWidth(data.lineWidth == 0 ? 1 : data.lineWidth); - switch (data.lineStyle) { - case SWT.LINE_DOT: - case SWT.LINE_DASH: - case SWT.LINE_DASHDOT: - case SWT.LINE_DASHDOTDOT: - state |= LINE_STYLE; - } - } - if ((state & LINE_STYLE) != 0) { - float[] dashes = null; - float width = data.lineWidth; - switch (data.lineStyle) { - case SWT.LINE_SOLID: break; - case SWT.LINE_DASH: dashes = width != 0 ? LINE_DASH : LINE_DASH_ZERO; break; - case SWT.LINE_DOT: dashes = width != 0 ? LINE_DOT : LINE_DOT_ZERO; break; - case SWT.LINE_DASHDOT: dashes = width != 0 ? LINE_DASHDOT : LINE_DASHDOT_ZERO; break; - case SWT.LINE_DASHDOTDOT: dashes = width != 0 ? LINE_DASHDOTDOT : LINE_DASHDOTDOT_ZERO; break; - case SWT.LINE_CUSTOM: dashes = data.lineDashes; break; - } - if (dashes != null) { - float /*double*/[] lengths = new float /*double*/[dashes.length]; - for (int i = 0; i < lengths.length; i++) { - lengths[i] = width == 0 || data.lineStyle == SWT.LINE_CUSTOM ? dashes[i] : dashes[i] * width; - } - path.setLineDash(lengths, lengths.length, data.lineDashesOffset); - } else { - path.setLineDash(null, 0, 0); - } - } - if ((state & LINE_MITERLIMIT) != 0) { - path.setMiterLimit(data.lineMiterLimit); - } - if ((state & LINE_JOIN) != 0) { - int joinStyle = 0; - switch (data.lineJoin) { - case SWT.JOIN_MITER: joinStyle = OS.NSMiterLineJoinStyle; break; - case SWT.JOIN_ROUND: joinStyle = OS.NSRoundLineJoinStyle; break; - case SWT.JOIN_BEVEL: joinStyle = OS.NSBevelLineJoinStyle; break; - } - path.setLineJoinStyle(joinStyle); - } - if ((state & LINE_CAP) != 0) { - int capStyle = 0; - switch (data.lineCap) { - case SWT.CAP_ROUND: capStyle = OS.NSRoundLineCapStyle; break; - case SWT.CAP_FLAT: capStyle = OS.NSButtLineCapStyle; break; - case SWT.CAP_SQUARE: capStyle = OS.NSSquareLineCapStyle; break; - } - path.setLineCapStyle(capStyle); - } - if ((state & DRAW_OFFSET) != 0) { - data.drawXOffset = data.drawYOffset = 0; - NSSize size = new NSSize(); - size.width = size.height = 1; - if (data.transform != null) { - size = data.transform.transformSize(size); - } - float /*double*/ scaling = size.width; - if (scaling < 0) scaling = -scaling; - float /*double*/ strokeWidth = data.lineWidth * scaling; - if (strokeWidth == 0 || ((int)strokeWidth % 2) == 1) { - data.drawXOffset = 0.5f / scaling; - } - scaling = size.height; - if (scaling < 0) scaling = -scaling; - strokeWidth = data.lineWidth * scaling; - if (strokeWidth == 0 || ((int)strokeWidth % 2) == 1) { - data.drawYOffset = 0.5f / scaling; - } - } - return pool; -} - -/** - * Copies a rectangular area of the receiver at the specified - * position into the image, which must be of type <code>SWT.BITMAP</code>. - * - * @param image the image to copy into - * @param x the x coordinate in the receiver of the area to be copied - * @param y the y coordinate in the receiver of the area to be copied - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the image is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the image is not a bitmap or has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void copyArea(Image image, int x, int y) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (image.type != SWT.BITMAP || image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = checkGC(TRANSFORM | CLIPPING); - try { - if (data.image != null) { - int srcX = x, srcY = y, destX = 0, destY = 0; - NSSize srcSize = data.image.handle.size(); - int imgHeight = (int)srcSize.height; - int destWidth = (int)srcSize.width - x, destHeight = (int)srcSize.height - y; - int srcWidth = destWidth, srcHeight = destHeight; - NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(image.getRepresentation()); - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(context); - NSAffineTransform transform = NSAffineTransform.transform(); - NSSize size = image.handle.size(); - transform.translateXBy(0, size.height-(destHeight + 2 * destY)); - transform.concat(); - NSRect srcRect = new NSRect(); - srcRect.x = srcX; - srcRect.y = imgHeight - (srcY + srcHeight); - srcRect.width = srcWidth; - srcRect.height = srcHeight; - NSRect destRect = new NSRect(); - destRect.x = destX; - destRect.y = destY; - destRect.width = destWidth; - destRect.height = destHeight; - data.image.handle.drawInRect(destRect, srcRect, OS.NSCompositeCopy, 1); - NSGraphicsContext.static_restoreGraphicsState(); - return; - } - if (data.view != null) { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - NSWindow window = data.view.window(); - pt = data.view.convertPoint_toView_(pt, window.contentView().superview()); - NSRect frame = window.frame(); - pt.y = frame.height - pt.y; - NSSize size = image.handle.size(); - CGRect destRect = new CGRect(); - destRect.size.width = size.width; - destRect.size.height = size.height; - CGRect srcRect = new CGRect(); - srcRect.origin.x = pt.x; - srcRect.origin.y = pt.y; - srcRect.size.width = size.width; - srcRect.size.height = size.height; - NSBitmapImageRep imageRep = image.getRepresentation(); - NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(imageRep); - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(context); - int /*long*/ contextID = OS.objc_msgSend(NSApplication.sharedApplication().id, OS.sel_contextID); - OS.CGContextCopyWindowContentsToRect(context.graphicsPort(), destRect, contextID, window.windowNumber(), srcRect); - NSGraphicsContext.static_restoreGraphicsState(); - return; - } - if (handle.isDrawingToScreen()) { - NSImage imageHandle = image.handle; - NSSize size = imageHandle.size(); - CGRect rect = new CGRect(); - rect.origin.x = x; - rect.origin.y = y; - rect.size.width = size.width; - rect.size.height = size.height; - int displayCount = 16; - int /*long*/ displays = OS.malloc(4 * displayCount), countPtr = OS.malloc(4); - if (OS.CGGetDisplaysWithRect(rect, displayCount, displays, countPtr) != 0) return; - int[] count = new int[1], display = new int[1]; - OS.memmove(count, countPtr, OS.PTR_SIZEOF); - for (int i = 0; i < count[0]; i++) { - OS.memmove(display, displays + (i * 4), 4); - OS.CGDisplayBounds(display[0], rect); - int /*long*/ address = OS.CGDisplayBaseAddress(display[0]); - if (address != 0) { - int /*long*/ width = OS.CGDisplayPixelsWide(display[0]); - int /*long*/ height = OS.CGDisplayPixelsHigh(display[0]); - int /*long*/ bpr = OS.CGDisplayBytesPerRow(display[0]); - int /*long*/ bpp = OS.CGDisplayBitsPerPixel(display[0]); - int /*long*/ bps = OS.CGDisplayBitsPerSample(display[0]); - int bitmapInfo = OS.kCGImageAlphaNoneSkipFirst; - switch ((int)/*63*/bpp) { - case 16: bitmapInfo |= OS.kCGBitmapByteOrder16Host; break; - case 32: bitmapInfo |= OS.kCGBitmapByteOrder32Host; break; - } - int /*long*/ srcImage = 0; - if (OS.__BIG_ENDIAN__() && OS.VERSION >= 0x1040) { - int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB(); - int /*long*/ context = OS.CGBitmapContextCreate(address, width, height, bps, bpr, colorspace, bitmapInfo); - OS.CGColorSpaceRelease(colorspace); - srcImage = OS.CGBitmapContextCreateImage(context); - OS.CGContextRelease(context); - } else { - int /*long*/ provider = OS.CGDataProviderCreateWithData(0, address, bpr * height, 0); - int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB(); - srcImage = OS.CGImageCreate(width, height, bps, bpp, bpr, colorspace, bitmapInfo, provider, 0, true, 0); - OS.CGColorSpaceRelease(colorspace); - OS.CGDataProviderRelease(provider); - } - copyArea(image, x - (int)rect.origin.x, y - (int)rect.origin.y, srcImage); - if (srcImage != 0) OS.CGImageRelease(srcImage); - } - } - OS.free(displays); - OS.free(countPtr); - } - } finally { - uncheckGC(pool); - } -} - -void copyArea (Image image, int x, int y, int /*long*/ srcImage) { - if (srcImage == 0) return; - NSBitmapImageRep rep = image.getRepresentation(); - int /*long*/ bpc = rep.bitsPerSample(); - int /*long*/ width = rep.pixelsWide(); - int /*long*/ height = rep.pixelsHigh(); - int /*long*/ bpr = rep.bytesPerRow(); - int alphaInfo = rep.hasAlpha() ? OS.kCGImageAlphaFirst : OS.kCGImageAlphaNoneSkipFirst; - int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB(); - int /*long*/ context = OS.CGBitmapContextCreate(rep.bitmapData(), width, height, bpc, bpr, colorspace, alphaInfo); - OS.CGColorSpaceRelease(colorspace); - if (context != 0) { - CGRect rect = new CGRect(); - rect.origin.x = -x; - rect.origin.y = y; - rect.size.width = OS.CGImageGetWidth(srcImage); - rect.size.height = OS.CGImageGetHeight(srcImage); - OS.CGContextTranslateCTM(context, 0, -(rect.size.height - height)); - OS.CGContextDrawImage(context, rect, srcImage); - OS.CGContextRelease(context); - } -} - -/** - * Copies a rectangular area of the receiver at the source - * position onto the receiver at the destination position. - * - * @param srcX the x coordinate in the receiver of the area to be copied - * @param srcY the y coordinate in the receiver of the area to be copied - * @param width the width of the area to copy - * @param height the height of the area to copy - * @param destX the x coordinate in the receiver of the area to copy to - * @param destY the y coordinate in the receiver of the area to copy to - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void copyArea(int srcX, int srcY, int width, int height, int destX, int destY) { - copyArea(srcX, srcY, width, height, destX, destY, true); -} -/** - * Copies a rectangular area of the receiver at the source - * position onto the receiver at the destination position. - * - * @param srcX the x coordinate in the receiver of the area to be copied - * @param srcY the y coordinate in the receiver of the area to be copied - * @param width the width of the area to copy - * @param height the height of the area to copy - * @param destX the x coordinate in the receiver of the area to copy to - * @param destY the y coordinate in the receiver of the area to copy to - * @param paint if <code>true</code> paint events will be generated for old and obscured areas - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void copyArea(int srcX, int srcY, int width, int height, int destX, int destY, boolean paint) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width <= 0 || height <= 0) return; - int deltaX = destX - srcX, deltaY = destY - srcY; - if (deltaX == 0 && deltaY == 0) return; - NSAutoreleasePool pool = checkGC(TRANSFORM | CLIPPING); - try { - Image image = data.image; - if (image != null) { - NSImage imageHandle = image.handle; - NSSize size = imageHandle.size(); - int imgHeight = (int)size.height; - handle.saveGraphicsState(); - NSAffineTransform transform = NSAffineTransform.transform(); - transform.scaleXBy(1, -1); - transform.translateXBy(0, -(height + 2 * destY)); - transform.concat(); - NSRect srcRect = new NSRect(); - srcRect.x = srcX; - srcRect.y = imgHeight - (srcY + height); - srcRect.width = width; - srcRect.height = height; - NSRect destRect = new NSRect(); - destRect.x = destX; - destRect.y = destY; - destRect.width = width; - destRect.height = height; - imageHandle.drawInRect(destRect, srcRect, OS.NSCompositeCopy, 1); - handle.restoreGraphicsState(); - return; - } - if (data.view != null) { - NSView view = data.view; - NSRect visibleRect = view.visibleRect(); - if (visibleRect.width <= 0 || visibleRect.height <= 0) return; - NSRect damage = new NSRect(); - damage.x = srcX; - damage.y = srcY; - damage.width = width; - damage.height = height; - NSPoint dest = new NSPoint(); - dest.x = destX; - dest.y = destY; - - view.lockFocus(); - OS.NSCopyBits(0, damage , dest); - view.unlockFocus(); - - if (paint) { - boolean disjoint = (destX + width < srcX) || (srcX + width < destX) || (destY + height < srcY) || (srcY + height < destY); - if (disjoint) { - view.setNeedsDisplayInRect(damage); - } else { - if (deltaX != 0) { - int newX = destX - deltaX; - if (deltaX < 0) newX = destX + width; - damage.x = newX; - damage.width = Math.abs(deltaX); - view.setNeedsDisplayInRect(damage); - } - if (deltaY != 0) { - int newY = destY - deltaY; - if (deltaY < 0) newY = destY + height; - damage.x = srcX; - damage.y = newY; - damage.width = width; - damage.height = Math.abs (deltaY); - view.setNeedsDisplayInRect(damage); - } - } - - NSRect srcRect = new NSRect(); - srcRect.x = srcX; - srcRect.y = srcY; - srcRect.width = width; - srcRect.height = height; - OS.NSIntersectionRect(visibleRect, visibleRect, srcRect); - - if (!OS.NSEqualRects(visibleRect, srcRect)) { - if (srcRect.x != visibleRect.x) { - damage.x = srcRect.x + deltaX; - damage.y = srcRect.y + deltaY; - damage.width = visibleRect.x - srcRect.x; - damage.height = srcRect.height; - view.setNeedsDisplayInRect(damage); - } - if (visibleRect.x + visibleRect.width != srcRect.x + srcRect.width) { - damage.x = srcRect.x + visibleRect.width + deltaX; - damage.y = srcRect.y + deltaY; - damage.width = srcRect.width - visibleRect.width; - damage.height = srcRect.height; - view.setNeedsDisplayInRect(damage); - } - if (visibleRect.y != srcRect.y) { - damage.x = visibleRect.x + deltaX; - damage.y = srcRect.y + deltaY; - damage.width = visibleRect.width; - damage.height = visibleRect.y - srcRect.y; - view.setNeedsDisplayInRect(damage); - } - if (visibleRect.y + visibleRect.height != srcRect.y + srcRect.height) { - damage.x = visibleRect.x + deltaX; - damage.y = visibleRect.y + visibleRect.height + deltaY; - damage.width = visibleRect.width; - damage.height = srcRect.y + srcRect.height - (visibleRect.y + visibleRect.height); - view.setNeedsDisplayInRect(damage); - } - } - } - return; - } - } finally { - uncheckGC(pool); - } -} - -static int /*long*/ createCGPathRef(NSBezierPath nsPath) { - int /*long*/ count = nsPath.elementCount(); - if (count > 0) { - int /*long*/ cgPath = OS.CGPathCreateMutable(); - if (cgPath == 0) SWT.error(SWT.ERROR_NO_HANDLES); - int /*long*/ points = OS.malloc(NSPoint.sizeof * 3); - if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES); - float /*double*/ [] pt = new float /*double*/ [6]; - for (int i = 0; i < count; i++) { - int element = (int)/*64*/nsPath.elementAtIndex(i, points); - switch (element) { - case OS.NSMoveToBezierPathElement: - OS.memmove(pt, points, NSPoint.sizeof); - OS.CGPathMoveToPoint(cgPath, 0, pt[0], pt[1]); - break; - case OS.NSLineToBezierPathElement: - OS.memmove(pt, points, NSPoint.sizeof); - OS.CGPathAddLineToPoint(cgPath, 0, pt[0], pt[1]); - break; - case OS.NSCurveToBezierPathElement: - OS.memmove(pt, points, NSPoint.sizeof * 3); - OS.CGPathAddCurveToPoint(cgPath, 0, pt[0], pt[1], pt[2], pt[3], pt[4], pt[5]); - break; - case OS.NSClosePathBezierPathElement: - OS.CGPathCloseSubpath(cgPath); - break; - } - } - OS.free(points); - return cgPath; - } - return 0; -} - - - -NSBezierPath createNSBezierPath (int /*long*/ cgPath) { - Callback callback = new Callback(this, "applierFunc", 2); - int /*long*/ proc = callback.getAddress(); - if (proc == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS); - count = typeCount = 0; - element = new CGPathElement(); - OS.CGPathApply(cgPath, 0, proc); - types = new byte[typeCount]; - points = new float /*double*/ [count]; - point = new float /*double*/ [6]; - count = typeCount = 0; - OS.CGPathApply(cgPath, 0, proc); - callback.dispose(); - - NSBezierPath bezierPath = NSBezierPath.bezierPath(); - NSPoint nsPoint = new NSPoint(), nsPoint2 = new NSPoint(), nsPoint3 = new NSPoint(); - for (int i = 0, j = 0; i < types.length; i++) { - switch (types[i]) { - case SWT.PATH_MOVE_TO: - nsPoint.x = points[j++]; - nsPoint.y = points[j++]; - bezierPath.moveToPoint(nsPoint); - break; - case SWT.PATH_LINE_TO: - nsPoint.x = points[j++]; - nsPoint.y = points[j++]; - bezierPath.lineToPoint(nsPoint); - break; - case SWT.PATH_CUBIC_TO: - nsPoint2.x = points[j++]; - nsPoint2.y = points[j++]; - nsPoint3.x = points[j++]; - nsPoint3.y = points[j++]; - nsPoint.x = points[j++]; - nsPoint.y = points[j++]; - bezierPath.curveToPoint(nsPoint, nsPoint2, nsPoint3); - break; - case SWT.PATH_QUAD_TO: - float /*double*/ currentX = nsPoint.x; - float /*double*/ currentY = nsPoint.y; - nsPoint2.x = points[j++]; - nsPoint2.y = points[j++]; - nsPoint.x = points[j++]; - nsPoint.y = points[j++]; - float /*double*/ x0 = currentX; - float /*double*/ y0 = currentY; - float /*double*/ cx1 = x0 + 2 * (nsPoint2.x - x0) / 3; - float /*double*/ cy1 = y0 + 2 * (nsPoint2.y - y0) / 3; - float /*double*/ cx2 = cx1 + (nsPoint.x - x0) / 3; - float /*double*/ cy2 = cy1 + (nsPoint.y - y0) / 3; - nsPoint2.x = cx1; - nsPoint2.y = cy1; - nsPoint3.x = cx2; - nsPoint3.y = cy2; - bezierPath.curveToPoint(nsPoint, nsPoint2, nsPoint3); - break; - case SWT.PATH_CLOSE: - bezierPath.closePath(); - break; - default: - dispose(); - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - element = null; - types = null; - points = null; - nsPoint = null; - return bezierPath; -} - -NSAttributedString createString(String string, int flags, boolean draw) { - NSMutableDictionary dict = ((NSMutableDictionary)new NSMutableDictionary().alloc()).initWithCapacity(5); - Font font = data.font; - dict.setObject(font.handle, OS.NSFontAttributeName); - font.addTraits(dict); - if (draw) { - Pattern pattern = data.foregroundPattern; - if (pattern != null) { - if (pattern.color != null) dict.setObject(pattern.color, OS.NSForegroundColorAttributeName); - } else { - NSColor fg = data.fg; - if (fg == null) { - float /*double*/ [] color = data.foreground; - fg = data.fg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f); - fg.retain(); - } - dict.setObject(fg, OS.NSForegroundColorAttributeName); - } - } - if ((flags & SWT.DRAW_TAB) == 0) { - dict.setObject(device.paragraphStyle, OS.NSParagraphStyleAttributeName); - } - int length = string.length(); - char[] chars = new char[length]; - string.getChars(0, length, chars, 0); - int breakCount = 0; - int[] breaks = null; - if ((flags & SWT.DRAW_MNEMONIC) !=0 || (flags & SWT.DRAW_DELIMITER) == 0) { - int i=0, j=0; - while (i < chars.length) { - char c = chars [j++] = chars [i++]; - switch (c) { - case '&': { - if ((flags & SWT.DRAW_MNEMONIC) != 0) { - if (i == chars.length) {continue;} - if (chars [i] == '&') {i++; continue;} - j--; - } - break; - } - case '\r': - case '\n': { - if ((flags & SWT.DRAW_DELIMITER) == 0) { - if (c == '\r' && i != chars.length && chars[i] == '\n') i++; - j--; - if (breaks == null) { - breaks = new int[4]; - } else if (breakCount == breaks.length) { - int[] newBreaks = new int[breaks.length + 4]; - System.arraycopy(breaks, 0, newBreaks, 0, breaks.length); - breaks = newBreaks; - } - breaks[breakCount++] = j; - } - break; - } - } - } - length = j; - } - NSString str = ((NSString)new NSString().alloc()).initWithCharacters(chars, length); - NSAttributedString attribStr = ((NSAttributedString)new NSAttributedString().alloc()).initWithString(str, dict); - dict.release(); - str.release(); - return attribStr; -} - -void destroy() { - /* Free resources */ - Image image = data.image; - if (image != null) { - image.memGC = null; - image.createAlpha(); - } - if (data.fg != null) data.fg.release(); - if (data.bg != null) data.bg.release(); - if (data.path != null) data.path.release(); - if (data.clipPath != null) data.clipPath.release(); - if (data.visiblePath != null) data.visiblePath.release(); - if (data.transform != null) data.transform.release(); - if (data.inverseTransform != null) data.inverseTransform.release(); - data.path = data.clipPath = data.visiblePath = null; - data.transform = data.inverseTransform = null; - data.fg = data.bg = null; - - /* Dispose the GC */ - if (drawable != null) drawable.internal_dispose_GC(handle.id, data); - handle.restoreGraphicsState(); - handle.release(); - - drawable = null; - data.image = null; - data = null; - handle = null; -} - -/** - * Draws the outline of a circular or elliptical arc - * within the specified rectangular area. - * <p> - * The resulting arc begins at <code>startAngle</code> and extends - * for <code>arcAngle</code> degrees, using the current color. - * Angles are interpreted such that 0 degrees is at the 3 o'clock - * position. A positive value indicates a counter-clockwise rotation - * while a negative value indicates a clockwise rotation. - * </p><p> - * The center of the arc is the center of the rectangle whose origin - * is (<code>x</code>, <code>y</code>) and whose size is specified by the - * <code>width</code> and <code>height</code> arguments. - * </p><p> - * The resulting arc covers an area <code>width + 1</code> pixels wide - * by <code>height + 1</code> pixels tall. - * </p> - * - * @param x the x coordinate of the upper-left corner of the arc to be drawn - * @param y the y coordinate of the upper-left corner of the arc to be drawn - * @param width the width of the arc to be drawn - * @param height the height of the arc to be drawn - * @param startAngle the beginning angle - * @param arcAngle the angular extent of the arc, relative to the start angle - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - if (width == 0 || height == 0 || arcAngle == 0) return; - NSAutoreleasePool pool = checkGC(DRAW); - try { - handle.saveGraphicsState(); - NSAffineTransform transform = NSAffineTransform.transform(); - float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset; - transform.translateXBy(x + xOffset + width / 2f, y + yOffset + height / 2f); - transform.scaleXBy(width / 2f, height / 2f); - NSBezierPath path = data.path; - NSPoint center = new NSPoint(); - float sAngle = -startAngle; - float eAngle = -(startAngle + arcAngle); - path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0); - path.transformUsingAffineTransform(transform); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - handle.restoreGraphicsState(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws a rectangle, based on the specified arguments, which has - * the appearance of the platform's <em>focus rectangle</em> if the - * platform supports such a notion, and otherwise draws a simple - * rectangle in the receiver's foreground color. - * - * @param x the x coordinate of the rectangle - * @param y the y coordinate of the rectangle - * @param width the width of the rectangle - * @param height the height of the rectangle - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawRectangle(int, int, int, int) - */ -public void drawFocus(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM); - try { - int[] metric = new int[1]; - OS.GetThemeMetric(OS.kThemeMetricFocusRectOutset, metric); - CGRect rect = new CGRect(); - rect.origin.x = x + metric[0]; - rect.origin.y = y + metric[0]; - rect.size.width = width - metric[0] * 2; - rect.size.height = height - metric[0] * 2; - OS.HIThemeDrawFocusRect(rect, true, handle.graphicsPort(), OS.kHIThemeOrientationNormal); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the given image in the receiver at the specified - * coordinates. - * - * @param image the image to draw - * @param x the x coordinate of where to draw - * @param y the y coordinate of where to draw - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the image is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> - * <li>ERROR_INVALID_ARGUMENT - if the given coordinates are outside the bounds of the image</li> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if no handles are available to perform the operation</li> - * </ul> - */ -public void drawImage(Image image, int x, int y) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - drawImage(image, 0, 0, -1, -1, x, y, -1, -1, true); -} - -/** - * Copies a rectangular area from the source image into a (potentially - * different sized) rectangular area in the receiver. If the source - * and destination areas are of differing sizes, then the source - * area will be stretched or shrunk to fit the destination area - * as it is copied. The copy fails if any part of the source rectangle - * lies outside the bounds of the source image, or if any of the width - * or height arguments are negative. - * - * @param image the source image - * @param srcX the x coordinate in the source image to copy from - * @param srcY the y coordinate in the source image to copy from - * @param srcWidth the width in pixels to copy from the source - * @param srcHeight the height in pixels to copy from the source - * @param destX the x coordinate in the destination to copy to - * @param destY the y coordinate in the destination to copy to - * @param destWidth the width in pixels of the destination rectangle - * @param destHeight the height in pixels of the destination rectangle - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the image is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> - * <li>ERROR_INVALID_ARGUMENT - if any of the width or height arguments are negative. - * <li>ERROR_INVALID_ARGUMENT - if the source rectangle is not contained within the bounds of the source image</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES - if no handles are available to perform the operation</li> - * </ul> - */ -public void drawImage(Image image, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (srcWidth == 0 || srcHeight == 0 || destWidth == 0 || destHeight == 0) return; - if (srcX < 0 || srcY < 0 || srcWidth < 0 || srcHeight < 0 || destWidth < 0 || destHeight < 0) { - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - drawImage(image, srcX, srcY, srcWidth, srcHeight, destX, destY, destWidth, destHeight, false); -} - -void drawImage(Image srcImage, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, boolean simple) { - NSImage imageHandle = srcImage.handle; - NSSize size = imageHandle.size(); - int imgWidth = (int)size.width; - int imgHeight = (int)size.height; - if (simple) { - srcWidth = destWidth = imgWidth; - srcHeight = destHeight = imgHeight; - } else { - simple = srcX == 0 && srcY == 0 && - srcWidth == destWidth && destWidth == imgWidth && - srcHeight == destHeight && destHeight == imgHeight; - if (srcX + srcWidth > imgWidth || srcY + srcHeight > imgHeight) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM); - try { - if (srcImage.memGC != null) { - srcImage.createAlpha(); - } - handle.saveGraphicsState(); - NSAffineTransform transform = NSAffineTransform.transform(); - transform.scaleXBy(1, -1); - transform.translateXBy(0, -(destHeight + 2 * destY)); - transform.concat(); - NSRect srcRect = new NSRect(); - srcRect.x = srcX; - srcRect.y = imgHeight - (srcY + srcHeight); - srcRect.width = srcWidth; - srcRect.height = srcHeight; - NSRect destRect = new NSRect(); - destRect.x = destX; - destRect.y = destY; - destRect.width = destWidth; - destRect.height = destHeight; - imageHandle.drawInRect(destRect, srcRect, OS.NSCompositeSourceOver, 1); - handle.restoreGraphicsState(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws a line, using the foreground color, between the points - * (<code>x1</code>, <code>y1</code>) and (<code>x2</code>, <code>y2</code>). - * - * @param x1 the first point's x coordinate - * @param y1 the first point's y coordinate - * @param x2 the second point's x coordinate - * @param y2 the second point's y coordinate - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawLine(int x1, int y1, int x2, int y2) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(DRAW); - try { - NSBezierPath path = data.path; - NSPoint pt = new NSPoint(); - pt.x = x1 + data.drawXOffset; - pt.y = y1 + data.drawYOffset; - path.moveToPoint(pt); - pt.x = x2 + data.drawXOffset; - pt.y = y2 + data.drawYOffset; - path.lineToPoint(pt); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the outline of an oval, using the foreground color, - * within the specified rectangular area. - * <p> - * The result is a circle or ellipse that fits within the - * rectangle specified by the <code>x</code>, <code>y</code>, - * <code>width</code>, and <code>height</code> arguments. - * </p><p> - * The oval covers an area that is <code>width + 1</code> - * pixels wide and <code>height + 1</code> pixels tall. - * </p> - * - * @param x the x coordinate of the upper left corner of the oval to be drawn - * @param y the y coordinate of the upper left corner of the oval to be drawn - * @param width the width of the oval to be drawn - * @param height the height of the oval to be drawn - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawOval(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(DRAW); - try { - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - NSBezierPath path = data.path; - NSRect rect = new NSRect(); - rect.x = x + data.drawXOffset; - rect.y = y + data.drawXOffset; - rect.width = width; - rect.height = height; - path.appendBezierPathWithOvalInRect(rect); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the path described by the parameter. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param path the path to draw - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Path - * - * @since 3.1 - */ -public void drawPath(Path path) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (path.handle == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = checkGC(DRAW); - try { - handle.saveGraphicsState(); - NSAffineTransform transform = NSAffineTransform.transform(); - transform.translateXBy(data.drawXOffset, data.drawYOffset); - transform.concat(); - NSBezierPath drawPath = data.path; - drawPath.appendBezierPath(path.handle); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(drawPath, pattern); - } else { - drawPath.stroke(); - } - drawPath.removeAllPoints(); - handle.restoreGraphicsState(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws a pixel, using the foreground color, at the specified - * point (<code>x</code>, <code>y</code>). - * <p> - * Note that the receiver's line attributes do not affect this - * operation. - * </p> - * - * @param x the point's x coordinate - * @param y the point's y coordinate - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void drawPoint(int x, int y) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(FOREGROUND_FILL | CLIPPING | TRANSFORM); - try { - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = 1; - rect.height = 1; - NSBezierPath path = data.path; - path.appendBezierPathWithRect(rect); - path.fill(); - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the closed polygon which is defined by the specified array - * of integer coordinates, using the receiver's foreground color. The array - * contains alternating x and y values which are considered to represent - * points which are the vertices of the polygon. Lines are drawn between - * each consecutive pair, and between the first pair and last pair in the - * array. - * - * @param pointArray an array of alternating x and y values which are the vertices of the polygon - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT if pointArray is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawPolygon(int[] pointArray) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (pointArray.length < 4) return; - NSAutoreleasePool pool = checkGC(DRAW); - try { - float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset; - NSBezierPath path = data.path; - NSPoint pt = new NSPoint(); - pt.x = pointArray[0] + xOffset; - pt.y = pointArray[1] + yOffset; - path.moveToPoint(pt); - int end = pointArray.length / 2 * 2; - for (int i = 2; i < end; i+=2) { - pt.x = pointArray[i] + xOffset; - pt.y = pointArray[i+1] + yOffset; - path.lineToPoint(pt); - } - path.closePath(); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the polyline which is defined by the specified array - * of integer coordinates, using the receiver's foreground color. The array - * contains alternating x and y values which are considered to represent - * points which are the corners of the polyline. Lines are drawn between - * each consecutive pair, but not between the first pair and last pair in - * the array. - * - * @param pointArray an array of alternating x and y values which are the corners of the polyline - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the point array is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawPolyline(int[] pointArray) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (pointArray.length < 4) return; - NSAutoreleasePool pool = checkGC(DRAW); - try { - float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset; - NSBezierPath path = data.path; - NSPoint pt = new NSPoint(); - pt.x = pointArray[0] + xOffset; - pt.y = pointArray[1] + yOffset; - path.moveToPoint(pt); - int end = pointArray.length / 2 * 2; - for (int i = 2; i < end; i+=2) { - pt.x = pointArray[i] + xOffset; - pt.y = pointArray[i+1] + yOffset; - path.lineToPoint(pt); - } - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the outline of the rectangle specified by the arguments, - * using the receiver's foreground color. The left and right edges - * of the rectangle are at <code>x</code> and <code>x + width</code>. - * The top and bottom edges are at <code>y</code> and <code>y + height</code>. - * - * @param x the x coordinate of the rectangle to be drawn - * @param y the y coordinate of the rectangle to be drawn - * @param width the width of the rectangle to be drawn - * @param height the height of the rectangle to be drawn - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawRectangle(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(DRAW); - try { - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - NSRect rect = new NSRect(); - rect.x = x + data.drawXOffset; - rect.y = y + data.drawYOffset; - rect.width = width; - rect.height = height; - NSBezierPath path = data.path; - path.appendBezierPathWithRect(rect); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the outline of the specified rectangle, using the receiver's - * foreground color. The left and right edges of the rectangle are at - * <code>rect.x</code> and <code>rect.x + rect.width</code>. The top - * and bottom edges are at <code>rect.y</code> and - * <code>rect.y + rect.height</code>. - * - * @param rect the rectangle to draw - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawRectangle(Rectangle rect) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - drawRectangle (rect.x, rect.y, rect.width, rect.height); -} - -/** - * Draws the outline of the round-cornered rectangle specified by - * the arguments, using the receiver's foreground color. The left and - * right edges of the rectangle are at <code>x</code> and <code>x + width</code>. - * The top and bottom edges are at <code>y</code> and <code>y + height</code>. - * The <em>roundness</em> of the corners is specified by the - * <code>arcWidth</code> and <code>arcHeight</code> arguments, which - * are respectively the width and height of the ellipse used to draw - * the corners. - * - * @param x the x coordinate of the rectangle to be drawn - * @param y the y coordinate of the rectangle to be drawn - * @param width the width of the rectangle to be drawn - * @param height the height of the rectangle to be drawn - * @param arcWidth the width of the arc - * @param arcHeight the height of the arc - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (arcWidth == 0 || arcHeight == 0) { - drawRectangle(x, y, width, height); - return; - } - NSAutoreleasePool pool = checkGC(DRAW); - try { - NSBezierPath path = data.path; - NSRect rect = new NSRect(); - rect.x = x + data.drawXOffset; - rect.y = y + data.drawYOffset; - rect.width = width; - rect.height = height; - path.appendBezierPathWithRoundedRect(rect, arcWidth / 2f, arcHeight / 2f); - Pattern pattern = data.foregroundPattern; - if (pattern != null && pattern.gradient != null) { - strokePattern(path, pattern); - } else { - path.stroke(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Draws the given string, using the receiver's current font and - * foreground color. No tab expansion or carriage return processing - * will be performed. The background of the rectangular area where - * the string is being drawn will be filled with the receiver's - * background color. - * - * @param string the string to be drawn - * @param x the x coordinate of the top left corner of the rectangular area where the string is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the string is to be drawn - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawString (String string, int x, int y) { - drawString(string, x, y, false); -} - -/** - * Draws the given string, using the receiver's current font and - * foreground color. No tab expansion or carriage return processing - * will be performed. If <code>isTransparent</code> is <code>true</code>, - * then the background of the rectangular area where the string is being - * drawn will not be modified, otherwise it will be filled with the - * receiver's background color. - * - * @param string the string to be drawn - * @param x the x coordinate of the top left corner of the rectangular area where the string is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the string is to be drawn - * @param isTransparent if <code>true</code> the background will be transparent, otherwise it will be opaque - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawString(String string, int x, int y, boolean isTransparent) { - drawText(string, x, y, isTransparent ? SWT.DRAW_TRANSPARENT : 0); -} - -/** - * Draws the given string, using the receiver's current font and - * foreground color. Tab expansion and carriage return processing - * are performed. The background of the rectangular area where - * the text is being drawn will be filled with the receiver's - * background color. - * - * @param string the string to be drawn - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawText(String string, int x, int y) { - drawText(string, x, y, SWT.DRAW_DELIMITER | SWT.DRAW_TAB); -} - -/** - * Draws the given string, using the receiver's current font and - * foreground color. Tab expansion and carriage return processing - * are performed. If <code>isTransparent</code> is <code>true</code>, - * then the background of the rectangular area where the text is being - * drawn will not be modified, otherwise it will be filled with the - * receiver's background color. - * - * @param string the string to be drawn - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param isTransparent if <code>true</code> the background will be transparent, otherwise it will be opaque - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawText(String string, int x, int y, boolean isTransparent) { - int flags = SWT.DRAW_DELIMITER | SWT.DRAW_TAB; - if (isTransparent) flags |= SWT.DRAW_TRANSPARENT; - drawText(string, x, y, flags); -} - -/** - * Draws the given string, using the receiver's current font and - * foreground color. Tab expansion, line delimiter and mnemonic - * processing are performed according to the specified flags. If - * <code>flags</code> includes <code>DRAW_TRANSPARENT</code>, - * then the background of the rectangular area where the text is being - * drawn will not be modified, otherwise it will be filled with the - * receiver's background color. - * <p> - * The parameter <code>flags</code> may be a combination of: - * <dl> - * <dt><b>DRAW_DELIMITER</b></dt> - * <dd>draw multiple lines</dd> - * <dt><b>DRAW_TAB</b></dt> - * <dd>expand tabs</dd> - * <dt><b>DRAW_MNEMONIC</b></dt> - * <dd>underline the mnemonic character</dd> - * <dt><b>DRAW_TRANSPARENT</b></dt> - * <dd>transparent background</dd> - * </dl> - * </p> - * - * @param string the string to be drawn - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param flags the flags specifying how to process the text - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void drawText (String string, int x, int y, int flags) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM | FONT); - try { - handle.saveGraphicsState(); - boolean mode = true; - switch (data.textAntialias) { - case SWT.DEFAULT: - /* Printer is off by default */ - if (!handle.isDrawingToScreen()) mode = false; - break; - case SWT.OFF: mode = false; break; - case SWT.ON: mode = true; break; - } - handle.setShouldAntialias(mode); - NSAttributedString str = createString(string, flags, true); - if ((flags & SWT.DRAW_TRANSPARENT) == 0) { - NSSize size = str.size(); - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = size.width; - rect.height = size.height; - NSColor bg = data.bg; - if (bg == null) { - float /*double*/ [] color = data.background; - bg = data.bg = NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f); - bg.retain(); - } - bg.setFill(); - NSBezierPath.fillRect(rect); - str.drawInRect(rect); - } else { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - str.drawAtPoint(pt); - } - str.release(); - handle.restoreGraphicsState(); - } finally { - uncheckGC(pool); - } -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals(Object object) { - if (object == this) return true; - if (!(object instanceof GC)) return false; - return handle == ((GC)object).handle; -} - -/** - * Fills the interior of a circular or elliptical arc within - * the specified rectangular area, with the receiver's background - * color. - * <p> - * The resulting arc begins at <code>startAngle</code> and extends - * for <code>arcAngle</code> degrees, using the current color. - * Angles are interpreted such that 0 degrees is at the 3 o'clock - * position. A positive value indicates a counter-clockwise rotation - * while a negative value indicates a clockwise rotation. - * </p><p> - * The center of the arc is the center of the rectangle whose origin - * is (<code>x</code>, <code>y</code>) and whose size is specified by the - * <code>width</code> and <code>height</code> arguments. - * </p><p> - * The resulting arc covers an area <code>width + 1</code> pixels wide - * by <code>height + 1</code> pixels tall. - * </p> - * - * @param x the x coordinate of the upper-left corner of the arc to be filled - * @param y the y coordinate of the upper-left corner of the arc to be filled - * @param width the width of the arc to be filled - * @param height the height of the arc to be filled - * @param startAngle the beginning angle - * @param arcAngle the angular extent of the arc, relative to the start angle - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawArc - */ -public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - if (width == 0 || height == 0 || arcAngle == 0) return; - NSAutoreleasePool pool = checkGC(FILL); - try { - handle.saveGraphicsState(); - NSAffineTransform transform = NSAffineTransform.transform(); - float /*double*/ xOffset = data.drawXOffset, yOffset = data.drawYOffset; - transform.translateXBy(x + xOffset + width / 2f, y + yOffset + height / 2f); - transform.scaleXBy(width / 2f, height / 2f); - NSBezierPath path = data.path; - NSPoint center = new NSPoint(); - path.moveToPoint(center); - float sAngle = -startAngle; - float eAngle = -(startAngle + arcAngle); - path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0); - path.closePath(); - path.transformUsingAffineTransform(transform); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(path, pattern); - } else { - path.fill(); - } - path.removeAllPoints(); - handle.restoreGraphicsState(); - } finally { - uncheckGC(pool); - } -} - -/** - * Fills the interior of the specified rectangle with a gradient - * sweeping from left to right or top to bottom progressing - * from the receiver's foreground color to its background color. - * - * @param x the x coordinate of the rectangle to be filled - * @param y the y coordinate of the rectangle to be filled - * @param width the width of the rectangle to be filled, may be negative - * (inverts direction of gradient if horizontal) - * @param height the height of the rectangle to be filled, may be negative - * (inverts direction of gradient if vertical) - * @param vertical if true sweeps from top to bottom, else - * sweeps from left to right - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawRectangle(int, int, int, int) - */ -public void fillGradientRectangle(int x, int y, int width, int height, boolean vertical) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if ((width == 0) || (height == 0)) return; - NSAutoreleasePool pool = checkGC(CLIPPING | TRANSFORM); - try { - RGB backgroundRGB, foregroundRGB; - backgroundRGB = getBackground().getRGB(); - foregroundRGB = getForeground().getRGB(); - - RGB fromRGB, toRGB; - fromRGB = foregroundRGB; - toRGB = backgroundRGB; - boolean swapColors = false; - if (width < 0) { - x += width; width = -width; - if (! vertical) swapColors = true; - } - if (height < 0) { - y += height; height = -height; - if (vertical) swapColors = true; - } - if (swapColors) { - fromRGB = backgroundRGB; - toRGB = foregroundRGB; - } - if (fromRGB.equals(toRGB)) { - fillRectangle(x, y, width, height); - } else { - NSColor startingColor = NSColor.colorWithDeviceRed(fromRGB.red / 255f, fromRGB.green / 255f, fromRGB.blue / 255f, data.alpha / 255f); - NSColor endingColor = NSColor.colorWithDeviceRed(toRGB.red / 255f, toRGB.green / 255f, toRGB.blue / 255f, data.alpha / 255f); - NSGradient gradient = ((NSGradient)new NSGradient().alloc()).initWithStartingColor(startingColor, endingColor); - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - gradient.drawInRect(rect, vertical ? 90 : 0); - gradient.release(); - } - } finally { - uncheckGC(pool); - } -} - -/** - * Fills the interior of an oval, within the specified - * rectangular area, with the receiver's background - * color. - * - * @param x the x coordinate of the upper left corner of the oval to be filled - * @param y the y coordinate of the upper left corner of the oval to be filled - * @param width the width of the oval to be filled - * @param height the height of the oval to be filled - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawOval - */ -public void fillOval(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(FILL); - try { - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - NSBezierPath path = data.path; - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - path.appendBezierPathWithOvalInRect(rect); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(path, pattern); - } else { - path.fill(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -void fillPattern(NSBezierPath path, Pattern pattern) { - handle.saveGraphicsState(); - path.addClip(); - NSRect bounds = path.bounds(); - NSPoint start = new NSPoint(); - start.x = pattern.pt1.x; - start.y = pattern.pt1.y; - NSPoint end = new NSPoint(); - end.x = pattern.pt2.x; - end.y = pattern.pt2.y; - float /*double*/ difx = end.x - start.x; - float /*double*/ dify = end.y - start.y; - if (difx == 0 && dify == 0) { - float /*double*/ [] color = pattern.color1; - NSColor.colorWithDeviceRed(color[0], color[1], color[2], data.alpha / 255f).setFill(); - path.fill(); - handle.restoreGraphicsState(); - return; - } - float /*double*/ startx, starty, endx, endy; - if (difx == 0 || dify == 0) { - startx = bounds.x; - starty = bounds.y; - endx = bounds.x + bounds.width; - endy = bounds.y + bounds.height; - if (difx < 0 || dify < 0) { - startx = endx; - starty = endy; - endx = bounds.x; - endy = bounds.y; - } - } else { - float /*double*/ m = (end.y-start.y)/(end.x - start.x); - float /*double*/ b = end.y - (m * end.x); - float /*double*/ m2 = -1/m; //perpendicular slope - float /*double*/ b2 = bounds.y - (m2 * bounds.x); - startx = endx = (b - b2) / (m2 - m); - b2 = (bounds.y + bounds.height) - (m2 * bounds.x); - float /*double*/ x2 = (b - b2) / (m2 - m); - startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2); - endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2); - b2 = bounds.y - (m2 * (bounds.x + bounds.width)); - x2 = (b - b2) / (m2 - m); - startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2); - endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2); - b2 = (bounds.y + bounds.height) - (m2 * (bounds.x + bounds.width)); - x2 = (b - b2) / (m2 - m); - startx = difx > 0 ? Math.min(startx, x2) : Math.max(startx, x2); - endx = difx < 0 ? Math.min(endx, x2) : Math.max(endx, x2); - starty = (m * startx) + b; - endy = (m * endx) + b; - } - if (difx != 0) { - while ((difx > 0 && start.x >= startx) || (difx < 0 && start.x <= startx)) { - start.x -= difx; - start.y -= dify; - } - } else { - while ((dify > 0 && start.y >= starty) || (dify < 0 && start.y <= starty)) { - start.x -= difx; - start.y -= dify; - } - } - end.x = start.x; - end.y = start.y; - do { - end.x += difx; - end.y += dify; - pattern.gradient.drawFromPoint(start, end, 0); - start.x = end.x; - start.y = end.y; - } while ( - (difx > 0 && end.x <= endx) || - (difx < 0 && end.x >= endx) || - (difx == 0 && ((dify > 0 && end.y <= endy) || (dify < 0 && end.y >= endy))) - ); - handle.restoreGraphicsState(); -} - -/** - * Fills the path described by the parameter. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param path the path to fill - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Path - * - * @since 3.1 - */ -public void fillPath(Path path) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (path.handle == null) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = checkGC(FILL); - try { - NSBezierPath drawPath = data.path; - drawPath.appendBezierPath(path.handle); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(drawPath, pattern); - } else { - drawPath.fill(); - } - drawPath.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Fills the interior of the closed polygon which is defined by the - * specified array of integer coordinates, using the receiver's - * background color. The array contains alternating x and y values - * which are considered to represent points which are the vertices of - * the polygon. Lines are drawn between each consecutive pair, and - * between the first pair and last pair in the array. - * - * @param pointArray an array of alternating x and y values which are the vertices of the polygon - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT if pointArray is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawPolygon - */ -public void fillPolygon(int[] pointArray) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (pointArray.length < 4) return; - NSAutoreleasePool pool = checkGC(FILL); - try { - NSBezierPath path = data.path; - NSPoint pt = new NSPoint(); - pt.x = pointArray[0]; - pt.y = pointArray[1]; - path.moveToPoint(pt); - int end = pointArray.length / 2 * 2; - for (int i = 2; i < end; i+=2) { - pt.x = pointArray[i]; - pt.y = pointArray[i+1]; - path.lineToPoint(pt); - } - path.closePath(); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(path, pattern); - } else { - path.fill(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Fills the interior of the rectangle specified by the arguments, - * using the receiver's background color. - * - * @param x the x coordinate of the rectangle to be filled - * @param y the y coordinate of the rectangle to be filled - * @param width the width of the rectangle to be filled - * @param height the height of the rectangle to be filled - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawRectangle(int, int, int, int) - */ -public void fillRectangle(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(FILL); - try { - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - NSBezierPath path = data.path; - path.appendBezierPathWithRect(rect); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(path, pattern); - } else { - path.fill(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -/** - * Fills the interior of the specified rectangle, using the receiver's - * background color. - * - * @param rect the rectangle to be filled - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawRectangle(int, int, int, int) - */ -public void fillRectangle(Rectangle rect) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - fillRectangle(rect.x, rect.y, rect.width, rect.height); -} - -/** - * Fills the interior of the round-cornered rectangle specified by - * the arguments, using the receiver's background color. - * - * @param x the x coordinate of the rectangle to be filled - * @param y the y coordinate of the rectangle to be filled - * @param width the width of the rectangle to be filled - * @param height the height of the rectangle to be filled - * @param arcWidth the width of the arc - * @param arcHeight the height of the arc - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #drawRoundRectangle - */ -public void fillRoundRectangle(int x, int y, int width, int height, int arcWidth, int arcHeight) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (arcWidth == 0 || arcHeight == 0) { - fillRectangle(x, y, width, height); - return; - } - NSAutoreleasePool pool = checkGC(FILL); - try { - NSBezierPath path = data.path; - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - path.appendBezierPathWithRoundedRect(rect, arcWidth / 2f, arcHeight / 2f); - Pattern pattern = data.backgroundPattern; - if (pattern != null && pattern.gradient != null) { - fillPattern(path, pattern); - } else { - path.fill(); - } - path.removeAllPoints(); - } finally { - uncheckGC(pool); - } -} - -void strokePattern(NSBezierPath path, Pattern pattern) { - handle.saveGraphicsState(); - int /*long*/ cgPath = createCGPathRef(path); - int /*long*/ cgContext = handle.graphicsPort(); - OS.CGContextSaveGState(cgContext); - initCGContext(cgContext); - OS.CGContextAddPath(cgContext, cgPath); - OS.CGContextReplacePathWithStrokedPath(cgContext); - OS.CGPathRelease(cgPath); - cgPath = 0; - cgPath = OS.CGContextCopyPath(cgContext); - if (cgPath == 0) SWT.error(SWT.ERROR_NO_HANDLES); - OS.CGContextRestoreGState(cgContext); - NSBezierPath strokePath = createNSBezierPath(cgPath); - OS.CGPathRelease(cgPath); - fillPattern(strokePath, pattern); - handle.restoreGraphicsState(); -} - -void flush () { - handle.flushGraphics(); -} - -/** - * Returns the <em>advance width</em> of the specified character in - * the font which is currently selected into the receiver. - * <p> - * The advance width is defined as the horizontal distance the cursor - * should move after printing the character in the selected font. - * </p> - * - * @param ch the character to measure - * @return the distance in the x direction to move past the character before painting the next - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getAdvanceWidth(char ch) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - //NOT DONE - return stringExtent(new String(new char[]{ch})).x; -} - -/** - * Returns the background color. - * - * @return the receiver's background color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Color getBackground() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return Color.cocoa_new (data.device, data.background); -} - -/** - * Returns the background pattern. The default value is - * <code>null</code>. - * - * @return the receiver's background pattern - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Pattern - * - * @since 3.1 - */ -public Pattern getBackgroundPattern() { - if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED); - return data.backgroundPattern; -} - -/** - * Returns <code>true</code> if receiver is using the operating system's - * advanced graphics subsystem. Otherwise, <code>false</code> is returned - * to indicate that normal graphics are in use. - * <p> - * Advanced graphics may not be installed for the operating system. In this - * case, <code>false</code> is always returned. Some operating system have - * only one graphics subsystem. If this subsystem supports advanced graphics, - * then <code>true</code> is always returned. If any graphics operation such - * as alpha, antialias, patterns, interpolation, paths, clipping or transformation - * has caused the receiver to switch from regular to advanced graphics mode, - * <code>true</code> is returned. If the receiver has been explicitly switched - * to advanced mode and this mode is supported, <code>true</code> is returned. - * </p> - * - * @return the advanced value - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setAdvanced - * - * @since 3.1 - */ -public boolean getAdvanced() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return true; -} - -/** - * Returns the receiver's alpha value. The alpha value - * is between 0 (transparent) and 255 (opaque). - * - * @return the alpha value - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int getAlpha() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.alpha; -} - -/** - * Returns the receiver's anti-aliasing setting value, which will be - * one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or - * <code>SWT.ON</code>. Note that this controls anti-aliasing for all - * <em>non-text drawing</em> operations. - * - * @return the anti-aliasing setting - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getTextAntialias - * - * @since 3.1 - */ -public int getAntialias() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.antialias; -} - -/** - * Returns the width of the specified character in the font - * selected into the receiver. - * <p> - * The width is defined as the space taken up by the actual - * character, not including the leading and tailing whitespace - * or overhang. - * </p> - * - * @param ch the character to measure - * @return the width of the character - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getCharWidth(char ch) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - //NOT DONE - return stringExtent(new String(new char[]{ch})).x; -} - -/** - * Returns the bounding rectangle of the receiver's clipping - * region. If no clipping region is set, the return value - * will be a rectangle which covers the entire bounds of the - * object the receiver is drawing on. - * - * @return the bounding rectangle of the clipping region - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Rectangle getClipping() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSRect rect = null; - if (data.view != null) { - rect = data.view.visibleRect(); - } else { - rect = new NSRect(); - if (data.image != null) { - NSSize size = data.image.handle.size(); - rect.width = size.width; - rect.height = size.height; - } else if (data.size != null) { - rect.width = data.size.width; - rect.height = data.size.height; - } - } - if (data.paintRect != null || data.clipPath != null || data.inverseTransform != null) { - if (data.paintRect != null) { - OS.NSIntersectionRect(rect, rect, data.paintRect); - } - if (data.clipPath != null) { - NSRect clip = data.clipPath.bounds(); - OS.NSIntersectionRect(rect, rect, clip); - } - if (data.inverseTransform != null && rect.width > 0 && rect.height > 0) { - NSPoint pt = new NSPoint(); - pt.x = rect.x; - pt.y = rect.y; - NSSize size = new NSSize(); - size.width = rect.width; - size.height = rect.height; - pt = data.inverseTransform.transformPoint(pt); - size = data.inverseTransform.transformSize(size); - rect.x = pt.x; - rect.y = pt.y; - rect.width = size.width; - rect.height = size.height; - } - } - return new Rectangle((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the region managed by the argument to the current - * clipping region of the receiver. - * - * @param region the region to fill with the clipping region - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the region is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the region is disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void getClipping(Region region) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - region.subtract(region); - NSRect rect = null; - if (data.view != null) { - rect = data.view.visibleRect(); - } else { - rect = new NSRect(); - if (data.image != null) { - NSSize size = data.image.handle.size(); - rect.width = size.width; - rect.height = size.height; - } else if (data.size != null) { - rect.width = data.size.width; - rect.height = data.size.height; - } - } - region.add((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height); - NSRect paintRect = data.paintRect; - if (paintRect != null) { - region.intersect((int)paintRect.x, (int)paintRect.y, (int)paintRect.width, (int)paintRect.height); - } - if (data.clipPath != null) { - NSBezierPath clip = data.clipPath.bezierPathByFlatteningPath(); - int count = (int)/*64*/clip.elementCount(); - int pointCount = 0; - Region clipRgn = new Region(device); - int[] pointArray = new int[count * 2]; - int /*long*/ points = OS.malloc(NSPoint.sizeof); - if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES); - NSPoint pt = new NSPoint(); - for (int i = 0; i < count; i++) { - int element = (int)/*64*/clip.elementAtIndex(i, points); - switch (element) { - case OS.NSMoveToBezierPathElement: - if (pointCount != 0) clipRgn.add(pointArray, pointCount); - pointCount = 0; - OS.memmove(pt, points, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - break; - case OS.NSLineToBezierPathElement: - OS.memmove(pt, points, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - break; - case OS.NSClosePathBezierPathElement: - if (pointCount != 0) clipRgn.add(pointArray, pointCount); - pointCount = 0; - break; - } - } - if (pointCount != 0) clipRgn.add(pointArray, pointCount); - OS.free(points); - region.intersect(clipRgn); - clipRgn.dispose(); - } - if (data.inverseTransform != null) { - region.convertRgn(data.inverseTransform); - } - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the receiver's fill rule, which will be one of - * <code>SWT.FILL_EVEN_ODD</code> or <code>SWT.FILL_WINDING</code>. - * - * @return the receiver's fill rule - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int getFillRule() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.fillRule; -} - -/** - * Returns the font currently being used by the receiver - * to draw and measure text. - * - * @return the receiver's font - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Font getFont() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.font; -} - -/** - * Returns a FontMetrics which contains information - * about the font currently being used by the receiver - * to draw and measure text. - * - * @return font metrics for the receiver's font - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public FontMetrics getFontMetrics() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = checkGC(FONT); - try { - NSFont font = data.font.handle; - int ascent = (int)(0.5f + font.ascender()); - int descent = (int)(0.5f + (-font.descender() + font.leading())); - String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - int averageCharWidth = stringExtent(s).x / s.length(); - return FontMetrics.cocoa_new(ascent, descent, averageCharWidth, 0, ascent + descent); - } finally { - uncheckGC(pool); - } -} - -/** - * Returns the receiver's foreground color. - * - * @return the color used for drawing foreground things - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Color getForeground() { - if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED); - return Color.cocoa_new(data.device, data.foreground); -} - -/** - * Returns the foreground pattern. The default value is - * <code>null</code>. - * - * @return the receiver's foreground pattern - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Pattern - * - * @since 3.1 - */ -public Pattern getForegroundPattern() { - if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED); - return data.foregroundPattern; -} - -/** - * Returns the GCData. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>GC</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @return the receiver's GCData - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see GCData - * - * @since 3.2 - * @noreference This method is not intended to be referenced by clients. - */ -public GCData getGCData() { - if (handle == null) SWT.error(SWT.ERROR_WIDGET_DISPOSED); - return data; -} - -/** - * Returns the receiver's interpolation setting, which will be one of - * <code>SWT.DEFAULT</code>, <code>SWT.NONE</code>, - * <code>SWT.LOW</code> or <code>SWT.HIGH</code>. - * - * @return the receiver's interpolation setting - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int getInterpolation() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - int interpolation = (int)/*64*/handle.imageInterpolation(); - switch (interpolation) { - case OS.NSImageInterpolationDefault: return SWT.DEFAULT; - case OS.NSImageInterpolationNone: return SWT.NONE; - case OS.NSImageInterpolationLow: return SWT.LOW; - case OS.NSImageInterpolationHigh: return SWT.HIGH; - } - return SWT.DEFAULT; -} - -/** - * Returns the receiver's line attributes. - * - * @return the line attributes used for drawing lines - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.3 - */ -public LineAttributes getLineAttributes() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - float[] dashes = null; - if (data.lineDashes != null) { - dashes = new float[data.lineDashes.length]; - System.arraycopy(data.lineDashes, 0, dashes, 0, dashes.length); - } - return new LineAttributes(data.lineWidth, data.lineCap, data.lineJoin, data.lineStyle, dashes, data.lineDashesOffset, data.lineMiterLimit); -} - -/** - * Returns the receiver's line cap style, which will be one - * of the constants <code>SWT.CAP_FLAT</code>, <code>SWT.CAP_ROUND</code>, - * or <code>SWT.CAP_SQUARE</code>. - * - * @return the cap style used for drawing lines - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int getLineCap() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.lineCap; -} - -/** - * Returns the receiver's line dash style. The default value is - * <code>null</code>. - * - * @return the line dash style used for drawing lines - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int[] getLineDash() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (data.lineDashes == null) return null; - int[] lineDashes = new int[data.lineDashes.length]; - for (int i = 0; i < lineDashes.length; i++) { - lineDashes[i] = (int)data.lineDashes[i]; - } - return lineDashes; -} - -/** - * Returns the receiver's line join style, which will be one - * of the constants <code>SWT.JOIN_MITER</code>, <code>SWT.JOIN_ROUND</code>, - * or <code>SWT.JOIN_BEVEL</code>. - * - * @return the join style used for drawing lines - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public int getLineJoin() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.lineJoin; -} - -/** - * Returns the receiver's line style, which will be one - * of the constants <code>SWT.LINE_SOLID</code>, <code>SWT.LINE_DASH</code>, - * <code>SWT.LINE_DOT</code>, <code>SWT.LINE_DASHDOT</code> or - * <code>SWT.LINE_DASHDOTDOT</code>. - * - * @return the style used for drawing lines - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getLineStyle() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.lineStyle; -} - -/** - * Returns the width that will be used when drawing lines - * for all of the figure drawing operations (that is, - * <code>drawLine</code>, <code>drawRectangle</code>, - * <code>drawPolyline</code>, and so forth. - * - * @return the receiver's line width - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getLineWidth() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return (int)data.lineWidth; -} - -/** - * Returns the receiver's style information. - * <p> - * Note that the value which is returned by this method <em>may - * not match</em> the value which was provided to the constructor - * when the receiver was created. This can occur when the underlying - * operating system does not support a particular combination of - * requested styles. - * </p> - * - * @return the style bits - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 2.1.2 - */ -public int getStyle () { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.style; -} - -/** - * Returns the receiver's text drawing anti-aliasing setting value, - * which will be one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> or - * <code>SWT.ON</code>. Note that this controls anti-aliasing - * <em>only</em> for text drawing operations. - * - * @return the anti-aliasing setting - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getAntialias - * - * @since 3.1 - */ -public int getTextAntialias() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.textAntialias; -} - -/** - * Sets the parameter to the transform that is currently being - * used by the receiver. - * - * @param transform the destination to copy the transform into - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Transform - * - * @since 3.1 - */ -public void getTransform (Transform transform) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (transform == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAffineTransform cmt = data.transform; - if (cmt != null) { - NSAffineTransformStruct struct = cmt.transformStruct(); - transform.handle.setTransformStruct(struct); - } else { - transform.setElements(1, 0, 0, 1, 0, 0); - } -} - -/** - * Returns <code>true</code> if this GC is drawing in the mode - * where the resulting color in the destination is the - * <em>exclusive or</em> of the color values in the source - * and the destination, and <code>false</code> if it is - * drawing in the mode where the destination color is being - * replaced with the source color value. - * - * @return <code>true</code> true if the receiver is in XOR mode, and false otherwise - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean getXORMode() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.xorMode; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #equals - */ -public int hashCode() { - return handle != null ? (int)/*64*/handle.id : 0; -} - -void init(Drawable drawable, GCData data, int /*long*/ context) { - if (data.foreground != null) data.state &= ~(FOREGROUND | FOREGROUND_FILL); - if (data.background != null) data.state &= ~BACKGROUND; - if (data.font != null) data.state &= ~FONT; - data.state &= ~DRAW_OFFSET; - - Image image = data.image; - if (image != null) image.memGC = this; - this.drawable = drawable; - this.data = data; - handle = new NSGraphicsContext(context); - handle.retain(); - handle.saveGraphicsState(); - data.path = NSBezierPath.bezierPath(); - data.path.setWindingRule(data.fillRule == SWT.FILL_WINDING ? OS.NSNonZeroWindingRule : OS.NSEvenOddWindingRule); - data.path.retain(); -} - -void initCGContext(int /*long*/ cgContext) { - int state = data.state; - if ((state & LINE_WIDTH) != 0) { - OS.CGContextSetLineWidth(cgContext, data.lineWidth == 0 ? 1 : data.lineWidth); - switch (data.lineStyle) { - case SWT.LINE_DOT: - case SWT.LINE_DASH: - case SWT.LINE_DASHDOT: - case SWT.LINE_DASHDOTDOT: - state |= LINE_STYLE; - } - } - if ((state & LINE_STYLE) != 0) { - float[] dashes = null; - float width = data.lineWidth; - switch (data.lineStyle) { - case SWT.LINE_SOLID: break; - case SWT.LINE_DASH: dashes = width != 0 ? LINE_DASH : LINE_DASH_ZERO; break; - case SWT.LINE_DOT: dashes = width != 0 ? LINE_DOT : LINE_DOT_ZERO; break; - case SWT.LINE_DASHDOT: dashes = width != 0 ? LINE_DASHDOT : LINE_DASHDOT_ZERO; break; - case SWT.LINE_DASHDOTDOT: dashes = width != 0 ? LINE_DASHDOTDOT : LINE_DASHDOTDOT_ZERO; break; - case SWT.LINE_CUSTOM: dashes = data.lineDashes; break; - } - if (dashes != null) { - float[] lengths = new float[dashes.length]; - for (int i = 0; i < lengths.length; i++) { - lengths[i] = width == 0 || data.lineStyle == SWT.LINE_CUSTOM ? dashes[i] : dashes[i] * width; - } - OS.CGContextSetLineDash(cgContext, data.lineDashesOffset, lengths, lengths.length); - } else { - OS.CGContextSetLineDash(cgContext, 0, null, 0); - } - } - if ((state & LINE_MITERLIMIT) != 0) { - OS.CGContextSetMiterLimit(cgContext, data.lineMiterLimit); - } - if ((state & LINE_JOIN) != 0) { - int joinStyle = 0; - switch (data.lineJoin) { - case SWT.JOIN_MITER: joinStyle = OS.kCGLineJoinMiter; break; - case SWT.JOIN_ROUND: joinStyle = OS.kCGLineJoinRound; break; - case SWT.JOIN_BEVEL: joinStyle = OS.kCGLineJoinBevel; break; - } - OS.CGContextSetLineJoin(cgContext, joinStyle); - } - if ((state & LINE_CAP) != 0) { - int capStyle = 0; - switch (data.lineCap) { - case SWT.CAP_ROUND: capStyle = OS.kCGLineCapRound; break; - case SWT.CAP_FLAT: capStyle = OS.kCGLineCapButt; break; - case SWT.CAP_SQUARE: capStyle = OS.kCGLineCapSquare; break; - } - OS.CGContextSetLineCap(cgContext, capStyle); - } -} - -/** - * Returns <code>true</code> if the receiver has a clipping - * region set into it, and <code>false</code> otherwise. - * If this method returns false, the receiver will draw on all - * available space in the destination. If it returns true, - * it will draw only in the area that is covered by the region - * that can be accessed with <code>getClipping(region)</code>. - * - * @return <code>true</code> if the GC has a clipping region, and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean isClipped() { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - return data.clipPath != null; -} - -/** - * Returns <code>true</code> if the GC has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the GC. - * When a GC has been disposed, it is an error to - * invoke any other method using the GC. - * - * @return <code>true</code> when the GC is disposed and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -boolean isIdentity(float[] transform) { - return transform[0] == 1 && transform[1] == 0 && transform[2] == 0 - && transform[3] == 1 && transform[4] == 0 && transform[5] == 0; -} - -/** - * Sets the receiver to always use the operating system's advanced graphics - * subsystem for all graphics operations if the argument is <code>true</code>. - * If the argument is <code>false</code>, the advanced graphics subsystem is - * no longer used, advanced graphics state is cleared and the normal graphics - * subsystem is used from now on. - * <p> - * Normally, the advanced graphics subsystem is invoked automatically when - * any one of the alpha, antialias, patterns, interpolation, paths, clipping - * or transformation operations in the receiver is requested. When the receiver - * is switched into advanced mode, the advanced graphics subsystem performs both - * advanced and normal graphics operations. Because the two subsystems are - * different, their output may differ. Switching to advanced graphics before - * any graphics operations are performed ensures that the output is consistent. - * </p><p> - * Advanced graphics may not be installed for the operating system. In this - * case, this operation does nothing. Some operating system have only one - * graphics subsystem, so switching from normal to advanced graphics does - * nothing. However, switching from advanced to normal graphics will always - * clear the advanced graphics state, even for operating systems that have - * only one graphics subsystem. - * </p> - * - * @param advanced the new advanced graphics state - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setAlpha - * @see #setAntialias - * @see #setBackgroundPattern - * @see #setClipping(Path) - * @see #setForegroundPattern - * @see #setLineAttributes - * @see #setInterpolation - * @see #setTextAntialias - * @see #setTransform - * @see #getAdvanced - * - * @since 3.1 - */ -public void setAdvanced(boolean advanced) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (!advanced) { - setAlpha(0xFF); - setAntialias(SWT.DEFAULT); - setBackgroundPattern(null); - setClipping((Rectangle)null); - setForegroundPattern(null); - setInterpolation(SWT.DEFAULT); - setTextAntialias(SWT.DEFAULT); - setTransform(null); - } -} - -/** - * Sets the receiver's alpha value which must be - * between 0 (transparent) and 255 (opaque). - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * @param alpha the alpha value - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setAlpha(int alpha) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - data.alpha = alpha & 0xFF; - data.state &= ~(BACKGROUND | FOREGROUND | FOREGROUND_FILL); - -} - -/** - * Sets the receiver's anti-aliasing value to the parameter, - * which must be one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> - * or <code>SWT.ON</code>. Note that this controls anti-aliasing for all - * <em>non-text drawing</em> operations. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param antialias the anti-aliasing setting - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the parameter is not one of <code>SWT.DEFAULT</code>, - * <code>SWT.OFF</code> or <code>SWT.ON</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see #getAdvanced - * @see #setAdvanced - * @see #setTextAntialias - * - * @since 3.1 - */ -public void setAntialias(int antialias) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - boolean mode = true; - switch (antialias) { - case SWT.DEFAULT: - /* Printer is off by default */ - if (!handle.isDrawingToScreen()) mode = false; - break; - case SWT.OFF: mode = false; break; - case SWT.ON: mode = true; break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.antialias = antialias; - handle.setShouldAntialias(mode); -} - -/** - * Sets the background color. The background color is used - * for fill operations and as the background color when text - * is drawn. - * - * @param color the new background color for the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the color is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the color has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setBackground(Color color) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - data.background = color.handle; - data.backgroundPattern = null; - if (data.bg != null) data.bg.release(); - data.bg = null; - data.state &= ~BACKGROUND; -} - -/** - * Sets the background pattern. The default value is <code>null</code>. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param pattern the new background pattern - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Pattern - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setBackgroundPattern(Pattern pattern) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pattern != null && pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (data.backgroundPattern == pattern) return; - data.backgroundPattern = pattern; - data.state &= ~BACKGROUND; -} - -/** - * Sets the area of the receiver which can be changed - * by drawing operations to the rectangular area specified - * by the arguments. - * - * @param x the x coordinate of the clipping rectangle - * @param y the y coordinate of the clipping rectangle - * @param width the width of the clipping rectangle - * @param height the height of the clipping rectangle - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setClipping(int x, int y, int width, int height) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (width < 0) { - x = x + width; - width = -width; - } - if (height < 0) { - y = y + height; - height = -height; - } - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - NSBezierPath path = NSBezierPath.bezierPathWithRect(rect); - path.retain(); - setClipping(path); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the area of the receiver which can be changed - * by drawing operations to the path specified - * by the argument. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param path the clipping path. - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the path has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Path - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setClipping(Path path) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (path != null && path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - setClipping(new NSBezierPath(path.handle.copy().id)); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the area of the receiver which can be changed - * by drawing operations to the rectangular area specified - * by the argument. Specifying <code>null</code> for the - * rectangle reverts the receiver's clipping area to its - * original value. - * - * @param rect the clipping rectangle or <code>null</code> - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setClipping(Rectangle rect) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) { - setClipping((NSBezierPath)null); - } else { - setClipping(rect.x, rect.y, rect.width, rect.height); - } -} - -/** - * Sets the area of the receiver which can be changed - * by drawing operations to the region specified - * by the argument. Specifying <code>null</code> for the - * region reverts the receiver's clipping area to its - * original value. - * - * @param region the clipping region or <code>null</code> - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the region has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setClipping(Region region) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (region != null && region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - setClipping(region != null ? region.getPath() : null); - } finally { - if (pool != null) pool.release(); - } -} - -void setClipping(NSBezierPath path) { - if (data.clipPath != null) { - data.clipPath.release(); - data.clipPath = null; - } - if (path != null) { - data.clipPath = path; - if (data.transform != null) { - data.clipPath.transformUsingAffineTransform(data.transform); - } - } - data.state &= ~CLIPPING; -} - -/** - * Sets the receiver's fill rule to the parameter, which must be one of - * <code>SWT.FILL_EVEN_ODD</code> or <code>SWT.FILL_WINDING</code>. - * - * @param rule the new fill rule - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the rule is not one of <code>SWT.FILL_EVEN_ODD</code> - * or <code>SWT.FILL_WINDING</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void setFillRule(int rule) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - switch (rule) { - case SWT.FILL_WINDING: - case SWT.FILL_EVEN_ODD: break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.fillRule = rule; - data.path.setWindingRule(rule == SWT.FILL_WINDING ? OS.NSNonZeroWindingRule : OS.NSEvenOddWindingRule); -} - -/** - * Sets the font which will be used by the receiver - * to draw and measure text to the argument. If the - * argument is null, then a default font appropriate - * for the platform will be used instead. - * - * @param font the new font for the receiver, or null to indicate a default font - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the font has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setFont(Font font) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (font != null && font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - data.font = font != null ? font : data.device.systemFont; - data.state &= ~FONT; -} - -/** - * Sets the foreground color. The foreground color is used - * for drawing operations including when text is drawn. - * - * @param color the new foreground color for the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the color is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the color has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setForeground(Color color) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - data.foreground = color.handle; - data.foregroundPattern = null; - if (data.fg != null) data.fg.release(); - data.fg = null; - data.state &= ~(FOREGROUND | FOREGROUND_FILL); -} - -/** - * Sets the foreground pattern. The default value is <code>null</code>. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * @param pattern the new foreground pattern - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Pattern - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setForegroundPattern(Pattern pattern) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pattern != null && pattern.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (data.foregroundPattern == pattern) return; - data.foregroundPattern = pattern; - data.state &= ~(FOREGROUND | FOREGROUND_FILL); -} - -/** - * Sets the receiver's interpolation setting to the parameter, which - * must be one of <code>SWT.DEFAULT</code>, <code>SWT.NONE</code>, - * <code>SWT.LOW</code> or <code>SWT.HIGH</code>. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param interpolation the new interpolation setting - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the rule is not one of <code>SWT.DEFAULT</code>, - * <code>SWT.NONE</code>, <code>SWT.LOW</code> or <code>SWT.HIGH</code> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setInterpolation(int interpolation) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - int quality = 0; - switch (interpolation) { - case SWT.DEFAULT: quality = OS.NSImageInterpolationDefault; break; - case SWT.NONE: quality = OS.NSImageInterpolationNone; break; - case SWT.LOW: quality = OS.NSImageInterpolationLow; break; - case SWT.HIGH: quality = OS.NSImageInterpolationHigh; break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - handle.setImageInterpolation(quality); -} - -/** - * Sets the receiver's line attributes. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * @param attributes the line attributes - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the attributes is null</li> - * <li>ERROR_INVALID_ARGUMENT - if any of the line attributes is not valid</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see LineAttributes - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.3 - */ -public void setLineAttributes(LineAttributes attributes) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (attributes == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - int mask = 0; - float lineWidth = attributes.width; - if (lineWidth != data.lineWidth) { - mask |= LINE_WIDTH | DRAW_OFFSET; - } - int lineStyle = attributes.style; - if (lineStyle != data.lineStyle) { - mask |= LINE_STYLE; - switch (lineStyle) { - case SWT.LINE_SOLID: - case SWT.LINE_DASH: - case SWT.LINE_DOT: - case SWT.LINE_DASHDOT: - case SWT.LINE_DASHDOTDOT: - break; - case SWT.LINE_CUSTOM: - if (attributes.dash == null) lineStyle = SWT.LINE_SOLID; - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - int join = attributes.join; - if (join != data.lineJoin) { - mask |= LINE_JOIN; - switch (join) { - case SWT.CAP_ROUND: - case SWT.CAP_FLAT: - case SWT.CAP_SQUARE: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - int cap = attributes.cap; - if (cap != data.lineCap) { - mask |= LINE_CAP; - switch (cap) { - case SWT.JOIN_MITER: - case SWT.JOIN_ROUND: - case SWT.JOIN_BEVEL: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } - float[] dashes = attributes.dash; - float[] lineDashes = data.lineDashes; - if (dashes != null && dashes.length > 0) { - boolean changed = lineDashes == null || lineDashes.length != dashes.length; - for (int i = 0; i < dashes.length; i++) { - float dash = dashes[i]; - if (dash <= 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (!changed && lineDashes[i] != dash) changed = true; - } - if (changed) { - float[] newDashes = new float[dashes.length]; - System.arraycopy(dashes, 0, newDashes, 0, dashes.length); - dashes = newDashes; - mask |= LINE_STYLE; - } else { - dashes = lineDashes; - } - } else { - if (lineDashes != null && lineDashes.length > 0) { - mask |= LINE_STYLE; - } else { - dashes = lineDashes; - } - } - float dashOffset = attributes.dashOffset; - if (dashOffset != data.lineDashesOffset) { - mask |= LINE_STYLE; - } - float miterLimit = attributes.miterLimit; - if (miterLimit != data.lineMiterLimit) { - mask |= LINE_MITERLIMIT; - } - if (mask == 0) return; - data.lineWidth = lineWidth; - data.lineStyle = lineStyle; - data.lineCap = cap; - data.lineJoin = join; - data.lineDashes = dashes; - data.lineDashesOffset = dashOffset; - data.lineMiterLimit = miterLimit; - data.state &= ~mask; -} - -/** - * Sets the receiver's line cap style to the argument, which must be one - * of the constants <code>SWT.CAP_FLAT</code>, <code>SWT.CAP_ROUND</code>, - * or <code>SWT.CAP_SQUARE</code>. - * - * @param cap the cap style to be used for drawing lines - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void setLineCap(int cap) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (data.lineCap == cap) return; - switch (cap) { - case SWT.CAP_ROUND: - case SWT.CAP_FLAT: - case SWT.CAP_SQUARE: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.lineCap = cap; - data.state &= ~LINE_CAP; -} - -/** - * Sets the receiver's line dash style to the argument. The default - * value is <code>null</code>. If the argument is not <code>null</code>, - * the receiver's line style is set to <code>SWT.LINE_CUSTOM</code>, otherwise - * it is set to <code>SWT.LINE_SOLID</code>. - * - * @param dashes the dash style to be used for drawing lines - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if any of the values in the array is less than or equal 0</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void setLineDash(int[] dashes) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - float[] lineDashes = data.lineDashes; - if (dashes != null && dashes.length > 0) { - boolean changed = data.lineStyle != SWT.LINE_CUSTOM || lineDashes == null || lineDashes.length != dashes.length; - for (int i = 0; i < dashes.length; i++) { - int dash = dashes[i]; - if (dash <= 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (!changed && lineDashes[i] != dash) changed = true; - } - if (!changed) return; - data.lineDashes = new float[dashes.length]; - for (int i = 0; i < dashes.length; i++) { - data.lineDashes[i] = dashes[i]; - } - data.lineStyle = SWT.LINE_CUSTOM; - } else { - if (data.lineStyle == SWT.LINE_SOLID && (lineDashes == null || lineDashes.length == 0)) return; - data.lineDashes = null; - data.lineStyle = SWT.LINE_SOLID; - } - data.state &= ~LINE_STYLE; -} - -/** - * Sets the receiver's line join style to the argument, which must be one - * of the constants <code>SWT.JOIN_MITER</code>, <code>SWT.JOIN_ROUND</code>, - * or <code>SWT.JOIN_BEVEL</code>. - * - * @param join the join style to be used for drawing lines - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void setLineJoin(int join) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (data.lineJoin == join) return; - switch (join) { - case SWT.JOIN_MITER: - case SWT.JOIN_ROUND: - case SWT.JOIN_BEVEL: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.lineJoin = join; - data.state &= ~LINE_JOIN; -} - -/** - * Sets the receiver's line style to the argument, which must be one - * of the constants <code>SWT.LINE_SOLID</code>, <code>SWT.LINE_DASH</code>, - * <code>SWT.LINE_DOT</code>, <code>SWT.LINE_DASHDOT</code> or - * <code>SWT.LINE_DASHDOTDOT</code>. - * - * @param lineStyle the style to be used for drawing lines - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the style is not valid</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setLineStyle(int lineStyle) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (data.lineStyle == lineStyle) return; - switch (lineStyle) { - case SWT.LINE_SOLID: - case SWT.LINE_DASH: - case SWT.LINE_DOT: - case SWT.LINE_DASHDOT: - case SWT.LINE_DASHDOTDOT: - break; - case SWT.LINE_CUSTOM: - if (data.lineDashes == null) lineStyle = SWT.LINE_SOLID; - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.lineStyle = lineStyle; - data.state &= ~LINE_STYLE; -} - -/** - * Sets the width that will be used when drawing lines - * for all of the figure drawing operations (that is, - * <code>drawLine</code>, <code>drawRectangle</code>, - * <code>drawPolyline</code>, and so forth. - * <p> - * Note that line width of zero is used as a hint to - * indicate that the fastest possible line drawing - * algorithms should be used. This means that the - * output may be different from line width one. - * </p> - * - * @param lineWidth the width of a line - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setLineWidth(int lineWidth) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (data.lineWidth == lineWidth) return; - data.lineWidth = lineWidth; - data.state &= ~(LINE_WIDTH | DRAW_OFFSET); -} - -/** - * If the argument is <code>true</code>, puts the receiver - * in a drawing mode where the resulting color in the destination - * is the <em>exclusive or</em> of the color values in the source - * and the destination, and if the argument is <code>false</code>, - * puts the receiver in a drawing mode where the destination color - * is replaced with the source color value. - * <p> - * Note that this mode in fundamentally unsupportable on certain - * platforms, notably Carbon (Mac OS X). Clients that want their - * code to run on all platforms need to avoid this method. - * </p> - * - * @param xor if <code>true</code>, then <em>xor</em> mode is used, otherwise <em>source copy</em> mode is used - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @deprecated this functionality is not supported on some platforms - */ -public void setXORMode(boolean xor) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - data.xorMode = xor; -} - -/** - * Sets the receiver's text anti-aliasing value to the parameter, - * which must be one of <code>SWT.DEFAULT</code>, <code>SWT.OFF</code> - * or <code>SWT.ON</code>. Note that this controls anti-aliasing only - * for all <em>text drawing</em> operations. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param antialias the anti-aliasing setting - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the parameter is not one of <code>SWT.DEFAULT</code>, - * <code>SWT.OFF</code> or <code>SWT.ON</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see #getAdvanced - * @see #setAdvanced - * @see #setAntialias - * - * @since 3.1 - */ -public void setTextAntialias(int antialias) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - switch (antialias) { - case SWT.DEFAULT: - case SWT.OFF: - case SWT.ON: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - data.textAntialias = antialias; -} - -/** - * Sets the transform that is currently being used by the receiver. If - * the argument is <code>null</code>, the current transform is set to - * the identity transform. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param transform the transform to set - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * - * @see Transform - * @see #getAdvanced - * @see #setAdvanced - * - * @since 3.1 - */ -public void setTransform(Transform transform) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (transform != null && transform.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (transform != null) { - if (data.transform != null) data.transform.release(); - if (data.inverseTransform != null) data.inverseTransform.release(); - data.transform = ((NSAffineTransform)new NSAffineTransform().alloc()).initWithTransform(transform.handle); - data.inverseTransform = ((NSAffineTransform)new NSAffineTransform().alloc()).initWithTransform(transform.handle); - NSAffineTransformStruct struct = data.inverseTransform.transformStruct(); - if ((struct.m11 * struct.m22 - struct.m12 * struct.m21) != 0) { - data.inverseTransform.invert(); - } - } else { - data.transform = data.inverseTransform = null; - } - data.state &= ~(TRANSFORM | DRAW_OFFSET); -} - -/** - * Returns the extent of the given string. No tab - * expansion or carriage return processing will be performed. - * <p> - * The <em>extent</em> of a string is the width and height of - * the rectangular area it would cover if drawn in a particular - * font (in this case, the current font in the receiver). - * </p> - * - * @param string the string to measure - * @return a point containing the extent of the string - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Point stringExtent(String string) { - return textExtent(string, 0); -} - -/** - * Returns the extent of the given string. Tab expansion and - * carriage return processing are performed. - * <p> - * The <em>extent</em> of a string is the width and height of - * the rectangular area it would cover if drawn in a particular - * font (in this case, the current font in the receiver). - * </p> - * - * @param string the string to measure - * @return a point containing the extent of the string - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Point textExtent(String string) { - return textExtent(string, SWT.DRAW_DELIMITER | SWT.DRAW_TAB); -} - -/** - * Returns the extent of the given string. Tab expansion, line - * delimiter and mnemonic processing are performed according to - * the specified flags, which can be a combination of: - * <dl> - * <dt><b>DRAW_DELIMITER</b></dt> - * <dd>draw multiple lines</dd> - * <dt><b>DRAW_TAB</b></dt> - * <dd>expand tabs</dd> - * <dt><b>DRAW_MNEMONIC</b></dt> - * <dd>underline the mnemonic character</dd> - * <dt><b>DRAW_TRANSPARENT</b></dt> - * <dd>transparent background</dd> - * </dl> - * <p> - * The <em>extent</em> of a string is the width and height of - * the rectangular area it would cover if drawn in a particular - * font (in this case, the current font in the receiver). - * </p> - * - * @param string the string to measure - * @param flags the flags specifying how to process the text - * @return a point containing the extent of the string - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the string is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Point textExtent(String string, int flags) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (string == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = checkGC(FONT); - try { - NSAttributedString str = createString(string, flags, false); - NSSize size = str.size(); - str.release(); - return new Point((int)size.width, (int)size.height); - } finally { - uncheckGC(pool); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "GC {*DISPOSED*}"; - return "GC {" + handle + "}"; -} - -void uncheckGC(NSAutoreleasePool pool) { - if (data.flippedContext != null && data.restoreContext) { - NSGraphicsContext.static_restoreGraphicsState(); - data.restoreContext = false; - } - NSView view = data.view; - if (view != null && data.paintRect == null) { - if (data.thread != Thread.currentThread()) flush(); - } - if (pool != null) pool.release(); -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java deleted file mode 100755 index 9e44658e63..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/GCData.java +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.cocoa.*; - -/** - * Instances of this class are descriptions of GCs in terms - * of unallocated platform-specific data fields. - * <p> - * <b>IMPORTANT:</b> This class is <em>not</em> part of the public - * API for SWT. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms, and should never be called from application code. - * </p> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - * @noinstantiate This class is not intended to be instantiated by clients. - */ -public final class GCData { - public Device device; - public int style, state = -1; - public float /*double*/ [] foreground; - public float /*double*/ [] background; - public Pattern foregroundPattern; - public Pattern backgroundPattern; - public Font font; - public int alpha = 0xFF; - public float lineWidth; - public int lineStyle = SWT.LINE_SOLID; - public int lineCap = SWT.CAP_FLAT; - public int lineJoin = SWT.JOIN_MITER; - public float lineDashesOffset; - public float[] lineDashes; - public float lineMiterLimit = 10; - public boolean xorMode; - public int antialias = SWT.DEFAULT; - public int textAntialias = SWT.DEFAULT; - public int fillRule = SWT.FILL_EVEN_ODD; - public Image image; - - public NSColor fg, bg; - public float /*double*/ drawXOffset, drawYOffset; - public NSRect paintRect; - public NSBezierPath path; - public NSAffineTransform transform, inverseTransform; - public NSBezierPath clipPath, visiblePath; - public int /*long*/ visibleRgn; - public NSView view; - public NSSize size; - public Thread thread; - public NSGraphicsContext flippedContext; - public boolean restoreContext; -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java deleted file mode 100755 index 646c5de74b..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Image.java +++ /dev/null @@ -1,1192 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.internal.cocoa.*; -import org.eclipse.swt.*; -import java.io.*; - -/** - * Instances of this class are graphics which have been prepared - * for display on a specific device. That is, they are ready - * to paint using methods such as <code>GC.drawImage()</code> - * and display on widgets with, for example, <code>Button.setImage()</code>. - * <p> - * If loaded from a file format that supports it, an - * <code>Image</code> may have transparency, meaning that certain - * pixels are specified as being transparent when drawn. Examples - * of file formats that support transparency are GIF and PNG. - * </p><p> - * There are two primary ways to use <code>Images</code>. - * The first is to load a graphic file from disk and create an - * <code>Image</code> from it. This is done using an <code>Image</code> - * constructor, for example: - * <pre> - * Image i = new Image(device, "C:\\graphic.bmp"); - * </pre> - * A graphic file may contain a color table specifying which - * colors the image was intended to possess. In the above example, - * these colors will be mapped to the closest available color in - * SWT. It is possible to get more control over the mapping of - * colors as the image is being created, using code of the form: - * <pre> - * ImageData data = new ImageData("C:\\graphic.bmp"); - * RGB[] rgbs = data.getRGBs(); - * // At this point, rgbs contains specifications of all - * // the colors contained within this image. You may - * // allocate as many of these colors as you wish by - * // using the Color constructor Color(RGB), then - * // create the image: - * Image i = new Image(device, data); - * </pre> - * <p> - * Applications which require even greater control over the image - * loading process should use the support provided in class - * <code>ImageLoader</code>. - * </p><p> - * Application code must explicitly invoke the <code>Image.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * - * @see Color - * @see ImageData - * @see ImageLoader - * @see <a href="http://www.eclipse.org/swt/snippets/#image">Image snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Examples: GraphicsExample, ImageAnalyzer</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class Image extends Resource implements Drawable { - - /** - * specifies whether the receiver is a bitmap or an icon - * (one of <code>SWT.BITMAP</code>, <code>SWT.ICON</code>) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public int type; - - /** - * the handle to the OS image resource - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSImage handle; - - /** - * specifies the transparent pixel - */ - int transparentPixel = -1; - - /** - * The GC the image is currently selected in. - */ - GC memGC; - - /** - * The alpha data of the image. - */ - byte[] alphaData; - - /** - * The global alpha value to be used for every pixel. - */ - int alpha = -1; - - /** - * The width of the image. - */ - int width = -1; - - /** - * The height of the image. - */ - int height = -1; - - /** - * Specifies the default scanline padding. - */ - static final int DEFAULT_SCANLINE_PAD = 4; - -Image(Device device) { - super(device); -} - -/** - * Constructs an empty instance of this class with the - * specified width and height. The result may be drawn upon - * by creating a GC and using any of its drawing operations, - * as shown in the following example: - * <pre> - * Image i = new Image(device, width, height); - * GC gc = new GC(i); - * gc.drawRectangle(0, 0, 50, 50); - * gc.dispose(); - * </pre> - * <p> - * Note: Some platforms may have a limitation on the size - * of image that can be created (size depends on width, height, - * and depth). For example, Windows 95, 98, and ME do not allow - * images larger than 16M. - * </p> - * - * @param device the device on which to create the image - * @param width the width of the new image - * @param height the height of the new image - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_INVALID_ARGUMENT - if either the width or height is negative or zero</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, int width, int height) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(width, height); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new instance of this class based on the - * provided image, with an appearance that varies depending - * on the value of the flag. The possible flag values are: - * <dl> - * <dt><b>{@link SWT#IMAGE_COPY}</b></dt> - * <dd>the result is an identical copy of srcImage</dd> - * <dt><b>{@link SWT#IMAGE_DISABLE}</b></dt> - * <dd>the result is a copy of srcImage which has a <em>disabled</em> look</dd> - * <dt><b>{@link SWT#IMAGE_GRAY}</b></dt> - * <dd>the result is a copy of srcImage which has a <em>gray scale</em> look</dd> - * </dl> - * - * @param device the device on which to create the image - * @param srcImage the image to use as the source - * @param flag the style, either <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code> - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if srcImage is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the flag is not one of <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code></li> - * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon, or is otherwise in an invalid state</li> - * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the image is not supported</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, Image srcImage, int flag) { - super(device); - if (srcImage == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (srcImage.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - switch (flag) { - case SWT.IMAGE_COPY: - case SWT.IMAGE_DISABLE: - case SWT.IMAGE_GRAY: - break; - default: - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - device = this.device; - this.type = srcImage.type; - /* Get source image size */ - NSSize size = srcImage.handle.size(); - int width = (int)size.width; - int height = (int)size.height; - NSBitmapImageRep srcRep = srcImage.getRepresentation(); - int /*long*/ bpr = srcRep.bytesPerRow(); - - /* Copy transparent pixel and alpha data when necessary */ - transparentPixel = srcImage.transparentPixel; - alpha = srcImage.alpha; - if (srcImage.alphaData != null) { - alphaData = new byte[srcImage.alphaData.length]; - System.arraycopy(srcImage.alphaData, 0, alphaData, 0, alphaData.length); - } - - /* Create the image */ - handle = (NSImage)new NSImage().alloc(); - handle = handle.initWithSize(size); - NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - rep = rep.initWithBitmapDataPlanes(0, width, height, srcRep.bitsPerSample(), srcRep.samplesPerPixel(), srcRep.samplesPerPixel() == 4, srcRep.isPlanar(), OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, srcRep.bytesPerRow(), srcRep.bitsPerPixel()); - handle.addRepresentation(rep); - rep.release(); - handle.setCacheMode(OS.NSImageCacheNever); - - int /*long*/ data = rep.bitmapData(); - OS.memmove(data, srcRep.bitmapData(), width * height * 4); - if (flag != SWT.IMAGE_COPY) { - - /* Apply transformation */ - switch (flag) { - case SWT.IMAGE_DISABLE: { - Color zeroColor = device.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - RGB zeroRGB = zeroColor.getRGB(); - byte zeroRed = (byte)zeroRGB.red; - byte zeroGreen = (byte)zeroRGB.green; - byte zeroBlue = (byte)zeroRGB.blue; - Color oneColor = device.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND); - RGB oneRGB = oneColor.getRGB(); - byte oneRed = (byte)oneRGB.red; - byte oneGreen = (byte)oneRGB.green; - byte oneBlue = (byte)oneRGB.blue; - byte[] line = new byte[(int)/*64*/bpr]; - for (int y=0; y<height; y++) { - OS.memmove(line, data + (y * bpr), bpr); - int offset = 0; - for (int x=0; x<width; x++) { - int red = line[offset+1] & 0xFF; - int green = line[offset+2] & 0xFF; - int blue = line[offset+3] & 0xFF; - int intensity = red * red + green * green + blue * blue; - if (intensity < 98304) { - line[offset+1] = zeroRed; - line[offset+2] = zeroGreen; - line[offset+3] = zeroBlue; - } else { - line[offset+1] = oneRed; - line[offset+2] = oneGreen; - line[offset+3] = oneBlue; - } - offset += 4; - } - OS.memmove(data + (y * bpr), line, bpr); - } - break; - } - case SWT.IMAGE_GRAY: { - byte[] line = new byte[(int)/*64*/bpr]; - for (int y=0; y<height; y++) { - OS.memmove(line, data + (y * bpr), bpr); - int offset = 0; - for (int x=0; x<width; x++) { - int red = line[offset+1] & 0xFF; - int green = line[offset+2] & 0xFF; - int blue = line[offset+3] & 0xFF; - byte intensity = (byte)((red+red+green+green+green+green+green+blue) >> 3); - line[offset+1] = line[offset+2] = line[offset+3] = intensity; - offset += 4; - } - OS.memmove(data + (y * bpr), line, bpr); - } - break; - } - } - } - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs an empty instance of this class with the - * width and height of the specified rectangle. The result - * may be drawn upon by creating a GC and using any of its - * drawing operations, as shown in the following example: - * <pre> - * Image i = new Image(device, boundsRectangle); - * GC gc = new GC(i); - * gc.drawRectangle(0, 0, 50, 50); - * gc.dispose(); - * </pre> - * <p> - * Note: Some platforms may have a limitation on the size - * of image that can be created (size depends on width, height, - * and depth). For example, Windows 95, 98, and ME do not allow - * images larger than 16M. - * </p> - * - * @param device the device on which to create the image - * @param bounds a rectangle specifying the image's width and height (must not be null) - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the bounds rectangle is null</li> - * <li>ERROR_INVALID_ARGUMENT - if either the rectangle's width or height is negative</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, Rectangle bounds) { - super(device); - if (bounds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(bounds.width, bounds.height); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs an instance of this class from the given - * <code>ImageData</code>. - * - * @param device the device on which to create the image - * @param data the image data to create the image from (must not be null) - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the image data is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the ImageData is not supported</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, ImageData data) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(data); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs an instance of this class, whose type is - * <code>SWT.ICON</code>, from the two given <code>ImageData</code> - * objects. The two images must be the same size. Pixel transparency - * in either image will be ignored. - * <p> - * The mask image should contain white wherever the icon is to be visible, - * and black wherever the icon is to be transparent. In addition, - * the source image should contain black wherever the icon is to be - * transparent. - * </p> - * - * @param device the device on which to create the icon - * @param source the color data for the icon - * @param mask the mask data for the icon - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if either the source or mask is null </li> - * <li>ERROR_INVALID_ARGUMENT - if source and mask are different sizes</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, ImageData source, ImageData mask) { - super(device); - if (source == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (mask == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (source.width != mask.width || source.height != mask.height) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - mask = ImageData.convertMask(mask); - ImageData image = new ImageData(source.width, source.height, source.depth, source.palette, source.scanlinePad, source.data); - image.maskPad = mask.scanlinePad; - image.maskData = mask.data; - init(image); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs an instance of this class by loading its representation - * from the specified input stream. Throws an error if an error - * occurs while loading the image, or if the result is an image - * of an unsupported type. Application code is still responsible - * for closing the input stream. - * <p> - * This constructor is provided for convenience when loading a single - * image only. If the stream contains multiple images, only the first - * one will be loaded. To load multiple images, use - * <code>ImageLoader.load()</code>. - * </p><p> - * This constructor may be used to load a resource as follows: - * </p> - * <pre> - * static Image loadImage (Display display, Class clazz, String string) { - * InputStream stream = clazz.getResourceAsStream (string); - * if (stream == null) return null; - * Image image = null; - * try { - * image = new Image (display, stream); - * } catch (SWTException ex) { - * } finally { - * try { - * stream.close (); - * } catch (IOException ex) {} - * } - * return image; - * } - * </pre> - * - * @param device the device on which to create the image - * @param stream the input stream to load the image from - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the stream is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_IO - if an IO error occurs while reading from the stream</li> - * <li>ERROR_INVALID_IMAGE - if the image stream contains invalid data </li> - * <li>ERROR_UNSUPPORTED_DEPTH - if the image stream describes an image with an unsupported depth</li> - * <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, InputStream stream) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - init(new ImageData(stream)); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs an instance of this class by loading its representation - * from the file with the specified name. Throws an error if an error - * occurs while loading the image, or if the result is an image - * of an unsupported type. - * <p> - * This constructor is provided for convenience when loading - * a single image only. If the specified file contains - * multiple images, only the first one will be used. - * - * @param device the device on which to create the image - * @param filename the name of the file to load the image from - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the file name is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_IO - if an IO error occurs while reading from the file</li> - * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data </li> - * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li> - * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> - * </ul> - */ -public Image(Device device, String filename) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (filename == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - initNative(filename); - if (this.handle == null) init(new ImageData(filename)); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -void createAlpha () { - if (transparentPixel == -1 && alpha == -1 && alphaData == null) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSBitmapImageRep imageRep = getRepresentation(); - int /*long*/ height = imageRep.pixelsHigh(); - int /*long*/ bpr = imageRep.bytesPerRow(); - int /*long*/ dataSize = height * bpr; - byte[] srcData = new byte[(int)/*64*/dataSize]; - OS.memmove(srcData, imageRep.bitmapData(), dataSize); - if (transparentPixel != -1) { - for (int i=0; i<dataSize; i+=4) { - int pixel = ((srcData[i+1] & 0xFF) << 16) | ((srcData[i+2] & 0xFF) << 8) | (srcData[i+3] & 0xFF); - srcData[i] = (byte)(pixel == transparentPixel ? 0 : 0xFF); - } - } else if (alpha != -1) { - byte a = (byte)this.alpha; - for (int i=0; i<dataSize; i+=4) { - srcData[i] = a; - } - } else { - int /*long*/ width = imageRep.pixelsWide(); - int offset = 0, alphaOffset = 0; - for (int y = 0; y<height; y++) { - for (int x = 0; x<width; x++) { - srcData[offset] = alphaData[alphaOffset]; - offset += 4; - alphaOffset += 1; - } - } - } - - // Since we just calculated alpha for the image rep, tell it that it now has an alpha component. - imageRep.setAlpha(true); - - OS.memmove(imageRep.bitmapData(), srcData, dataSize); - } finally { - if (pool != null) pool.release(); - } -} - -void destroy() { - if (memGC != null) memGC.dispose(); - handle.release(); - handle = null; - memGC = null; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals (Object object) { - if (object == this) return true; - if (!(object instanceof Image)) return false; - Image image = (Image)object; - return device == image.device && handle == image.handle && - transparentPixel == image.transparentPixel; -} - -/** - * Returns the color to which to map the transparent pixel, or null if - * the receiver has no transparent pixel. - * <p> - * There are certain uses of Images that do not support transparency - * (for example, setting an image into a button or label). In these cases, - * it may be desired to simulate transparency by using the background - * color of the widget to paint the transparent pixels of the image. - * Use this method to check which color will be used in these cases - * in place of transparency. This value may be set with setBackground(). - * <p> - * - * @return the background color of the image, or null if there is no transparency in the image - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Color getBackground() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (transparentPixel == -1) return null; - int red = (transparentPixel >> 16) & 0xFF; - int green = (transparentPixel >> 8) & 0xFF; - int blue = (transparentPixel >> 0) & 0xFF; - return Color.cocoa_new(device, new float /*double*/ []{red / 255f, green / 255f, blue / 255f, 1}); -} - -/** - * Returns the bounds of the receiver. The rectangle will always - * have x and y values of 0, and the width and height of the - * image. - * - * @return a rectangle specifying the image's bounds - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li> - * </ul> - */ -public Rectangle getBounds() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (width != -1 && height != -1) { - return new Rectangle(0, 0, width, height); - } - NSSize size = handle.size(); - return new Rectangle(0, 0, width = (int)size.width, height = (int)size.height); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns an <code>ImageData</code> based on the receiver - * Modifications made to this <code>ImageData</code> will not - * affect the Image. - * - * @return an <code>ImageData</code> containing the image's data and attributes - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li> - * </ul> - * - * @see ImageData - */ -public ImageData getImageData() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSBitmapImageRep imageRep = getRepresentation(); - int /*long*/ width = imageRep.pixelsWide(); - int /*long*/ height = imageRep.pixelsHigh(); - int /*long*/ bpr = imageRep.bytesPerRow(); - int /*long*/ bpp = imageRep.bitsPerPixel(); - int /*long*/ dataSize = height * bpr; - - byte[] srcData = new byte[(int)/*64*/dataSize]; - OS.memmove(srcData, imageRep.bitmapData(), dataSize); - - PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF); - ImageData data = new ImageData((int)/*64*/width, (int)/*64*/height, (int)/*64*/bpp, palette, 4, srcData); - data.bytesPerLine = (int)/*64*/bpr; - - data.transparentPixel = transparentPixel; - if (transparentPixel == -1 && type == SWT.ICON) { - /* Get the icon mask data */ - int maskPad = 2; - int /*long*/ maskBpl = (((width + 7) / 8) + (maskPad - 1)) / maskPad * maskPad; - byte[] maskData = new byte[(int)/*64*/(height * maskBpl)]; - int offset = 0, maskOffset = 0; - for (int y = 0; y<height; y++) { - for (int x = 0; x<width; x++) { - if (srcData[offset] != 0) { - maskData[maskOffset + (x >> 3)] |= (1 << (7 - (x & 0x7))); - } else { - maskData[maskOffset + (x >> 3)] &= ~(1 << (7 - (x & 0x7))); - } - offset += 4; - } - maskOffset += maskBpl; - } - data.maskData = maskData; - data.maskPad = maskPad; - } - for (int i = 0; i < srcData.length; i+= 4) { - srcData[i] = 0; - } - data.alpha = alpha; - if (alpha == -1 && alphaData != null) { - data.alphaData = new byte[alphaData.length]; - System.arraycopy(alphaData, 0, data.alphaData, 0, alphaData.length); - } - return data; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Invokes platform specific functionality to allocate a new image. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Image</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param device the device on which to allocate the color - * @param type the type of the image (<code>SWT.BITMAP</code> or <code>SWT.ICON</code>) - * @param handle the OS handle for the image - * @param data the OS data for the image - * - * @private - */ -public static Image cocoa_new(Device device, int type, NSImage nsImage) { - Image image = new Image(device); - image.type = type; - image.handle = nsImage; - return image; -} - -NSBitmapImageRep getRepresentation () { - NSImageRep rep = handle.bestRepresentationForDevice(null); - if (!rep.isKindOfClass(OS.class_NSBitmapImageRep)) { - SWT.error(SWT.ERROR_UNSPECIFIED); - } - return new NSBitmapImageRep(rep); -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode () { - return handle != null ? (int)/*64*/handle.id : 0; -} - -void init(int width, int height) { - if (width <= 0 || height <= 0) { - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - this.type = SWT.BITMAP; - this.width = width; - this.height = height; - - handle = (NSImage)new NSImage().alloc(); - NSSize size = new NSSize(); - size.width = width; - size.height = height; - handle = handle.initWithSize(size); - NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - rep = rep.initWithBitmapDataPlanes(0, width, height, 8, 3, false, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, width * 4, 32); - OS.memset(rep.bitmapData(), 0xFF, width * height * 4); - handle.addRepresentation(rep); - rep.release(); - handle.setCacheMode(OS.NSImageCacheNever); -} - -void init(ImageData image) { - if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - this.width = image.width; - this.height = image.height; - PaletteData palette = image.palette; - if (!(((image.depth == 1 || image.depth == 2 || image.depth == 4 || image.depth == 8) && !palette.isDirect) || - ((image.depth == 8) || (image.depth == 16 || image.depth == 24 || image.depth == 32) && palette.isDirect))) - SWT.error(SWT.ERROR_UNSUPPORTED_DEPTH); - - /* Create the image */ - int dataSize = width * height * 4; - - /* Initialize data */ - int bpr = width * 4; - byte[] buffer = new byte[dataSize]; - if (palette.isDirect) { - ImageData.blit(ImageData.BLIT_SRC, - image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, palette.redMask, palette.greenMask, palette.blueMask, - ImageData.ALPHA_OPAQUE, null, 0, 0, 0, - buffer, 32, bpr, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF, - false, false); - } else { - RGB[] rgbs = palette.getRGBs(); - int length = rgbs.length; - byte[] srcReds = new byte[length]; - byte[] srcGreens = new byte[length]; - byte[] srcBlues = new byte[length]; - for (int i = 0; i < rgbs.length; i++) { - RGB rgb = rgbs[i]; - if (rgb == null) continue; - srcReds[i] = (byte)rgb.red; - srcGreens[i] = (byte)rgb.green; - srcBlues[i] = (byte)rgb.blue; - } - ImageData.blit(ImageData.BLIT_SRC, - image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, srcReds, srcGreens, srcBlues, - ImageData.ALPHA_OPAQUE, null, 0, 0, 0, - buffer, 32, bpr, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF, - false, false); - } - - /* Initialize transparency */ - int transparency = image.getTransparencyType(); - boolean hasAlpha = transparency != SWT.TRANSPARENCY_NONE; - if (transparency == SWT.TRANSPARENCY_MASK || image.transparentPixel != -1) { - this.type = image.transparentPixel != -1 ? SWT.BITMAP : SWT.ICON; - if (image.transparentPixel != -1) { - int transRed = 0, transGreen = 0, transBlue = 0; - if (palette.isDirect) { - RGB rgb = palette.getRGB(image.transparentPixel); - transRed = rgb.red; - transGreen = rgb.green; - transBlue = rgb.blue; - } else { - RGB[] rgbs = palette.getRGBs(); - if (image.transparentPixel < rgbs.length) { - RGB rgb = rgbs[image.transparentPixel]; - transRed = rgb.red; - transGreen = rgb.green; - transBlue = rgb.blue; - } - } - transparentPixel = transRed << 16 | transGreen << 8 | transBlue; - } - ImageData maskImage = image.getTransparencyMask(); - byte[] maskData = maskImage.data; - int maskBpl = maskImage.bytesPerLine; - int offset = 0, maskOffset = 0; - for (int y = 0; y<height; y++) { - for (int x = 0; x<width; x++) { - buffer[offset] = ((maskData[maskOffset + (x >> 3)]) & (1 << (7 - (x & 0x7)))) != 0 ? (byte)0xff : 0; - offset += 4; - } - maskOffset += maskBpl; - } - } else { - this.type = SWT.BITMAP; - if (image.alpha != -1) { - hasAlpha = true; - this.alpha = image.alpha; - byte a = (byte)this.alpha; - for (int dataIndex=0; dataIndex<buffer.length; dataIndex+=4) { - buffer[dataIndex] = a; - } - } else if (image.alphaData != null) { - hasAlpha = true; - this.alphaData = new byte[image.alphaData.length]; - System.arraycopy(image.alphaData, 0, this.alphaData, 0, alphaData.length); - int offset = 0, alphaOffset = 0; - for (int y = 0; y<height; y++) { - for (int x = 0; x<width; x++) { - buffer[offset] = alphaData[alphaOffset]; - offset += 4; - alphaOffset += 1; - } - } - } - } - - if (handle != null) handle.release(); - - handle = (NSImage)new NSImage().alloc(); - NSSize size = new NSSize(); - size.width = width; - size.height = height; - handle = handle.initWithSize(size); - NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - rep = rep.initWithBitmapDataPlanes(0, width, height, 8, hasAlpha ? 4 : 3, hasAlpha, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, bpr, 32); - OS.memmove(rep.bitmapData(), buffer, dataSize); - handle.addRepresentation(rep); - rep.release(); - handle.setCacheMode(OS.NSImageCacheNever); -} - -void initNative(String filename) { - NSAutoreleasePool pool = null; - NSImage nativeImage = null; - - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - nativeImage = new NSImage(); - nativeImage.alloc(); - - // initByReferencingFile returns null if the file can't be found or is - // not an image. - nativeImage = nativeImage.initWithContentsOfFile(NSString.stringWith(filename)); - if (nativeImage == null) { - // In order to get the same kind of exception, let the file format try to load and throw - // the appropriate exception. It is possible file format supports some image formats - // that is not natively supported as well. - return; - } - - NSImageRep nativeRep = nativeImage.bestRepresentationForDevice(null); - if (!nativeRep.isKindOfClass(OS.class_NSBitmapImageRep)) { - return; - } - - width = (int)/*64*/nativeRep.pixelsWide(); - height = (int)/*64*/nativeRep.pixelsHigh(); - - boolean hasAlpha = nativeRep.hasAlpha(); - int bpr = width * 4; - handle = (NSImage)new NSImage().alloc(); - NSSize size = new NSSize(); - size.width = width; - size.height = height; - handle = handle.initWithSize(size); - NSBitmapImageRep rep = (NSBitmapImageRep)new NSBitmapImageRep().alloc(); - rep = rep.initWithBitmapDataPlanes(0, width, height, 8, hasAlpha ? 4 : 3, hasAlpha, false, OS.NSDeviceRGBColorSpace, OS.NSAlphaFirstBitmapFormat | OS.NSAlphaNonpremultipliedBitmapFormat, bpr, 32); - handle.addRepresentation(rep); - rep.release(); - handle.setCacheMode(OS.NSImageCacheNever); - NSRect rect = new NSRect(); - rect.width = width; - rect.height = height; - - /* Compute the pixels */ - int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB(); - int /*long*/ ctx = OS.CGBitmapContextCreate(rep.bitmapData(), width, height, 8, bpr, colorspace, OS.kCGImageAlphaNoneSkipFirst); - OS.CGColorSpaceRelease(colorspace); - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(NSGraphicsContext.graphicsContextWithGraphicsPort(ctx, false)); - if (hasAlpha) OS.objc_msgSend(nativeRep.id, OS.sel_setAlpha_, 0); - nativeRep.drawInRect(rect); - if (hasAlpha) OS.objc_msgSend(nativeRep.id, OS.sel_setAlpha_, 1); - NSGraphicsContext.static_restoreGraphicsState(); - OS.CGContextRelease(ctx); - - if (hasAlpha) { - /* Compute the alpha values */ - int /*long*/ bitmapBytesPerRow = width; - int /*long*/ bitmapByteCount = bitmapBytesPerRow * height; - int /*long*/ alphaBitmapData = OS.malloc(bitmapByteCount); - int /*long*/ alphaBitmapCtx = OS.CGBitmapContextCreate(alphaBitmapData, width, height, 8, bitmapBytesPerRow, 0, OS.kCGImageAlphaOnly); - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(NSGraphicsContext.graphicsContextWithGraphicsPort(alphaBitmapCtx, false)); - nativeRep.drawInRect(rect); - NSGraphicsContext.static_restoreGraphicsState(); - byte[] alphaData = new byte[(int)/*64*/bitmapByteCount]; - OS.memmove(alphaData, alphaBitmapData, bitmapByteCount); - OS.free(alphaBitmapData); - OS.CGContextRelease(alphaBitmapCtx); - - /* Merge the alpha values with the pixels */ - byte[] srcData = new byte[height * bpr]; - OS.memmove(srcData, rep.bitmapData(), srcData.length); - for (int a = 0, p = 0; a < alphaData.length; a++, p += 4) { - srcData[p] = alphaData[a]; - } - OS.memmove(rep.bitmapData(), srcData, srcData.length); - - // If the alpha has only 0 or 255 (-1) for alpha values, compute the transparent pixel color instead - // of a continuous alpha range. - int transparentOffset = -1, i = 0; - for (i = 0; i < alphaData.length; i++) { - int alpha = alphaData[i]; - if (transparentOffset == -1 && alpha == 0) transparentOffset = i; - if (!(alpha == 0 || alpha == -1)) break; - } - this.alpha = -1; - if (i == alphaData.length && transparentOffset != -1) { - NSColor color = rep.colorAtX(transparentOffset % width, transparentOffset / width); - int red = (int) (color.redComponent() * 255); - int green = (int) (color.greenComponent() * 255); - int blue = (int) (color.blueComponent() * 255); - this.transparentPixel = (red << 16) + (green << 8) + blue; - } else { - this.alphaData = alphaData; - } - } - - // For compatibility, images created from .ico files are treated as SWT.ICON format, even though - // they are no different than other bitmaps in Cocoa. - if (filename.toLowerCase().endsWith(".ico")) { - this.type = SWT.ICON; - } else { - this.type = SWT.BITMAP; - } - } finally { - if (nativeImage != null) nativeImage.release(); - if (pool != null) pool.release(); - } - -} - -/** - * Invokes platform specific functionality to allocate a new GC handle. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Image</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param data the platform specific GC data - * @return the platform specific GC handle - */ -public int /*long*/ internal_new_GC (GCData data) { - if (handle == null) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (type != SWT.BITMAP || memGC != null) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSBitmapImageRep imageRep = getRepresentation(); - - // Can't perform transforms on image reps with alpha. - imageRep.setAlpha(false); - - NSGraphicsContext context = NSGraphicsContext.graphicsContextWithBitmapImageRep(imageRep); - NSGraphicsContext flippedContext = NSGraphicsContext.graphicsContextWithGraphicsPort(context.graphicsPort(), true); - context = flippedContext; - context.retain(); - if (data != null) data.flippedContext = flippedContext; - NSGraphicsContext.static_saveGraphicsState(); - NSGraphicsContext.setCurrentContext(context); - NSAffineTransform transform = NSAffineTransform.transform(); - NSSize size = handle.size(); - transform.translateXBy(0, size.height); - transform.scaleXBy(1, -1); - transform.set(); - NSGraphicsContext.static_restoreGraphicsState(); - if (data != null) { - int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - if ((data.style & mask) == 0) { - data.style |= SWT.LEFT_TO_RIGHT; - } - data.device = device; - data.background = device.COLOR_WHITE.handle; - data.foreground = device.COLOR_BLACK.handle; - data.font = device.systemFont; - data.image = this; - } - return context.id; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Invokes platform specific functionality to dispose a GC handle. - * <p> - * <b>IMPORTANT:</b> This method is <em>not</em> part of the public - * API for <code>Image</code>. It is marked public only so that it - * can be shared within the packages provided by SWT. It is not - * available on all platforms, and should never be called from - * application code. - * </p> - * - * @param hDC the platform specific GC handle - * @param data the platform specific GC data - */ -public void internal_dispose_GC (int /*long*/ context, GCData data) { - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (context != 0) { - NSGraphicsContext contextObj = new NSGraphicsContext(context); - contextObj.release(); - } -// handle.setCacheMode(OS.NSImageCacheDefault); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the image has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the image. - * When an image has been disposed, it is an error to - * invoke any other method using the image. - * - * @return <code>true</code> when the image is disposed and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Sets the color to which to map the transparent pixel. - * <p> - * There are certain uses of <code>Images</code> that do not support - * transparency (for example, setting an image into a button or label). - * In these cases, it may be desired to simulate transparency by using - * the background color of the widget to paint the transparent pixels - * of the image. This method specifies the color that will be used in - * these cases. For example: - * <pre> - * Button b = new Button(); - * image.setBackground(b.getBackground()); - * b.setImage(image); - * </pre> - * </p><p> - * The image may be modified by this operation (in effect, the - * transparent regions may be filled with the supplied color). Hence - * this operation is not reversible and it is not legal to call - * this function twice or with a null argument. - * </p><p> - * This method has no effect if the receiver does not have a transparent - * pixel value. - * </p> - * - * @param color the color to use when a transparent pixel is specified - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the color is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the color has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setBackground(Color color) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (color == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (transparentPixel == -1) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - byte red = (byte)((transparentPixel >> 16) & 0xFF); - byte green = (byte)((transparentPixel >> 8) & 0xFF); - byte blue = (byte)((transparentPixel >> 0) & 0xFF); - byte newRed = (byte)((int)(color.handle[0] * 255) & 0xFF); - byte newGreen = (byte)((int)(color.handle[1] * 255) & 0xFF); - byte newBlue = (byte)((int)(color.handle[2] * 255) & 0xFF); - NSBitmapImageRep imageRep = getRepresentation(); - int /*long*/ bpr = imageRep.bytesPerRow(); - int /*long*/ data = imageRep.bitmapData(); - byte[] line = new byte[(int)bpr]; - for (int i = 0, offset = 0; i < height; i++, offset += bpr) { - OS.memmove(line, data + offset, bpr); - for (int j = 0; j < line.length; j += 4) { - if (line[j+ 1] == red && line[j + 2] == green && line[j + 3] == blue) { - line[j + 1] = newRed; - line[j + 2] = newGreen; - line[j + 3] = newBlue; - } - } - OS.memmove(data + offset, line, bpr); - } - transparentPixel = (newRed & 0xFF) << 16 | (newGreen & 0xFF) << 8 | (newBlue & 0xFF); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Image {*DISPOSED*}"; - return "Image {" + handle + "}"; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java deleted file mode 100755 index 7ab8a8b4ea..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Path.java +++ /dev/null @@ -1,759 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.cocoa.*; - -/** - * Instances of this class represent paths through the two-dimensional - * coordinate system. Paths do not have to be continuous, and can be - * described using lines, rectangles, arcs, cubic or quadratic bezier curves, - * glyphs, or other paths. - * <p> - * Application code must explicitly invoke the <code>Path.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * <p> - * This class requires the operating system's advanced graphics subsystem - * which may not be available on some platforms. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/snippets/#path">Path, Pattern snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - * - * @since 3.1 - */ -public class Path extends Resource { - - /** - * the OS resource for the Path - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSBezierPath handle; - -/** - * Constructs a new empty Path. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the path - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Path (Device device) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle = NSBezierPath.bezierPath(); - if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES); - handle.retain(); - handle.moveToPoint(new NSPoint()); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new Path that is a copy of <code>path</code>. If - * <code>flatness</code> is less than or equal to zero, an unflatten - * copy of the path is created. Otherwise, it specifies the maximum - * error between the path and its flatten copy. Smaller numbers give - * better approximation. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the path - * @param path the path to make a copy - * @param flatness the flatness value - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the path is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the path has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li> - * </ul> - * - * @see #dispose() - * @since 3.4 - */ -public Path (Device device, Path path, float flatness) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - flatness = Math.max(0, flatness); - if (flatness == 0) { - handle = new NSBezierPath(path.handle.copy().id); - } else { - float /*double*/ defaultFlatness = NSBezierPath.defaultFlatness(); - NSBezierPath.setDefaultFlatness(flatness); - handle = path.handle.bezierPathByFlatteningPath(); - handle.retain(); - NSBezierPath.setDefaultFlatness(defaultFlatness); - } - if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new Path with the specifed PathData. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the path - * @param data the data for the path - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device</li> - * <li>ERROR_NULL_ARGUMENT - if the data is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the path could not be obtained</li> - * </ul> - * - * @see #dispose() - * @since 3.4 - */ -public Path (Device device, PathData data) { - this(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - if (data == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - init(data); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver a circular or elliptical arc that lies within - * the specified rectangular area. - * <p> - * The resulting arc begins at <code>startAngle</code> and extends - * for <code>arcAngle</code> degrees. - * Angles are interpreted such that 0 degrees is at the 3 o'clock - * position. A positive value indicates a counter-clockwise rotation - * while a negative value indicates a clockwise rotation. - * </p><p> - * The center of the arc is the center of the rectangle whose origin - * is (<code>x</code>, <code>y</code>) and whose size is specified by the - * <code>width</code> and <code>height</code> arguments. - * </p><p> - * The resulting arc covers an area <code>width + 1</code> pixels wide - * by <code>height + 1</code> pixels tall. - * </p> - * - * @param x the x coordinate of the upper-left corner of the arc - * @param y the y coordinate of the upper-left corner of the arc - * @param width the width of the arc - * @param height the height of the arc - * @param startAngle the beginning angle - * @param arcAngle the angular extent of the arc, relative to the start angle - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void addArc(float x, float y, float width, float height, float startAngle, float arcAngle) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransform transform = NSAffineTransform.transform(); - transform.translateXBy(x + width / 2f, y + height / 2f); - transform.scaleXBy(width / 2f, height / 2f); - NSBezierPath path = NSBezierPath.bezierPath(); - NSPoint center = new NSPoint(); - float sAngle = -startAngle; - float eAngle = -(startAngle + arcAngle); - path.appendBezierPathWithArcWithCenter(center, 1, sAngle, eAngle, arcAngle>0); - path.transformUsingAffineTransform(transform); - handle.appendBezierPath(path); - if (Math.abs(arcAngle) >= 360) handle.closePath(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver the path described by the parameter. - * - * @param path the path to add to the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void addPath(Path path) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (path == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (path.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.appendBezierPath(path.handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver the rectangle specified by x, y, width and height. - * - * @param x the x coordinate of the rectangle to add - * @param y the y coordinate of the rectangle to add - * @param width the width of the rectangle to add - * @param height the height of the rectangle to add - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void addRectangle(float x, float y, float width, float height) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSRect rect = new NSRect(); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.appendBezierPathWithRect(rect); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver the pattern of glyphs generated by drawing - * the given string using the given font starting at the point (x, y). - * - * @param string the text to use - * @param x the x coordinate of the starting point - * @param y the y coordinate of the starting point - * @param font the font to use - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the font is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the font has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void addString(String string, float x, float y, Font font) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (font == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSString str = NSString.stringWith(string); - NSTextStorage textStorage = (NSTextStorage)new NSTextStorage().alloc().init(); - NSLayoutManager layoutManager = (NSLayoutManager)new NSLayoutManager().alloc().init(); - NSTextContainer textContainer = (NSTextContainer)new NSTextContainer().alloc(); - NSSize size = new NSSize(); - size.width = Float.MAX_VALUE; - size.height = Float.MAX_VALUE; - textContainer.initWithContainerSize(size); - textStorage.addLayoutManager(layoutManager); - layoutManager.addTextContainer(textContainer); - NSRange range = new NSRange(); - range.length = str.length(); - /* - * Feature in Cocoa. Adding attributes directly to a NSTextStorage causes - * output to the console and eventually a segmentation fault when printing - * on a thread other than the main thread. The fix is to add attributes to - * a separate NSMutableAttributedString and add it to text storage when done. - */ - NSMutableAttributedString attrStr = (NSMutableAttributedString)new NSMutableAttributedString().alloc(); - attrStr.id = attrStr.initWithString(str).id; - attrStr.beginEditing(); - attrStr.addAttribute(OS.NSFontAttributeName, font.handle, range); - font.addTraits(attrStr, range); - attrStr.endEditing(); - textStorage.setAttributedString(attrStr); - attrStr.release(); - range = layoutManager.glyphRangeForTextContainer(textContainer); - if (range.length != 0) { - int /*long*/ glyphs = OS.malloc(4 * range.length * 2); - layoutManager.getGlyphs(glyphs, range); - NSBezierPath path = NSBezierPath.bezierPath(); - NSPoint point = new NSPoint(); - path.moveToPoint(point); - path.appendBezierPathWithGlyphs(glyphs, range.length, font.handle); - NSAffineTransform transform = NSAffineTransform.transform(); - transform.scaleXBy(1, -1); - float /*double*/ baseline = layoutManager.defaultBaselineOffsetForFont(font.handle); - transform.translateXBy(x, -(y + baseline)); - path.transformUsingAffineTransform(transform); - OS.free(glyphs); - handle.appendBezierPath(path); - } - textContainer.release(); - layoutManager.release(); - textStorage.release(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Closes the current sub path by adding to the receiver a line - * from the current point of the path back to the starting point - * of the sub path. - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void close() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.closePath(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the specified point is contained by - * the receiver and false otherwise. - * <p> - * If outline is <code>true</code>, the point (x, y) checked for containment in - * the receiver's outline. If outline is <code>false</code>, the point is - * checked to see if it is contained within the bounds of the (closed) area - * covered by the receiver. - * - * @param x the x coordinate of the point to test for containment - * @param y the y coordinate of the point to test for containment - * @param gc the GC to use when testing for containment - * @param outline controls whether to check the outline or contained area of the path - * @return <code>true</code> if the path contains the point and <code>false</code> otherwise - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the gc is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the gc has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean contains(float x, float y, GC gc, boolean outline) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (gc == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (gc.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - //TODO - see windows - if (outline) { - int /*long*/ pixel = OS.malloc(4); - if (pixel == 0) SWT.error(SWT.ERROR_NO_HANDLES); - int[] buffer = new int[]{0xFFFFFFFF}; - OS.memmove(pixel, buffer, 4); - int /*long*/ colorspace = OS.CGColorSpaceCreateDeviceRGB(); - int /*long*/ context = OS.CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorspace, OS.kCGImageAlphaNoneSkipFirst); - OS.CGColorSpaceRelease(colorspace); - if (context == 0) { - OS.free(pixel); - SWT.error(SWT.ERROR_NO_HANDLES); - } - GCData data = gc.data; - int capStyle = 0; - switch (data.lineCap) { - case SWT.CAP_ROUND: capStyle = OS.kCGLineCapRound; break; - case SWT.CAP_FLAT: capStyle = OS.kCGLineCapButt; break; - case SWT.CAP_SQUARE: capStyle = OS.kCGLineCapSquare; break; - } - OS.CGContextSetLineCap(context, capStyle); - int joinStyle = 0; - switch (data.lineJoin) { - case SWT.JOIN_MITER: joinStyle = OS.kCGLineJoinMiter; break; - case SWT.JOIN_ROUND: joinStyle = OS.kCGLineJoinRound; break; - case SWT.JOIN_BEVEL: joinStyle = OS.kCGLineJoinBevel; break; - } - OS.CGContextSetLineJoin(context, joinStyle); - OS.CGContextSetLineWidth(context, data.lineWidth); - OS.CGContextTranslateCTM(context, -x + 0.5f, -y + 0.5f); - int /*long*/ path = GC.createCGPathRef(handle); - OS.CGContextAddPath(context, path); - OS.CGPathRelease(path); - OS.CGContextStrokePath(context); - OS.CGContextRelease(context); - OS.memmove(buffer, pixel, 4); - OS.free(pixel); - return buffer[0] != 0xFFFFFFFF; - } else { - NSPoint point = new NSPoint(); - point.x = x; - point.y = y; - return handle.containsPoint(point); - } - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver a cubic bezier curve based on the parameters. - * - * @param cx1 the x coordinate of the first control point of the spline - * @param cy1 the y coordinate of the first control of the spline - * @param cx2 the x coordinate of the second control of the spline - * @param cy2 the y coordinate of the second control of the spline - * @param x the x coordinate of the end point of the spline - * @param y the y coordinate of the end point of the spline - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void cubicTo(float cx1, float cy1, float cx2, float cy2, float x, float y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - NSPoint ct1 = new NSPoint(); - ct1.x = cx1; - ct1.y = cy1; - NSPoint ct2 = new NSPoint(); - ct2.x = cx2; - ct2.y = cy2; - handle.curveToPoint(pt, ct1, ct2); - } finally { - if (pool != null) pool.release(); - } -} - -void destroy() { - handle.release(); - handle = null; -} - -/** - * Replaces the first four elements in the parameter with values that - * describe the smallest rectangle that will completely contain the - * receiver (i.e. the bounding box). - * - * @param bounds the array to hold the result - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the bounding box</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void getBounds(float[] bounds) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (bounds == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (bounds.length < 4) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSRect rect = handle.controlPointBounds(); - bounds[0] = (float)/*64*/rect.x; - bounds[1] = (float)/*64*/rect.y; - bounds[2] = (float)/*64*/rect.width; - bounds[3] = (float)/*64*/rect.height; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Replaces the first two elements in the parameter with values that - * describe the current point of the path. - * - * @param point the array to hold the result - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the end point</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void getCurrentPoint(float[] point) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (point == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (point.length < 2) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint pt = handle.currentPoint(); - point[0] = (float)/*64*/pt.x; - point[1] = (float)/*64*/pt.y; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a device independent representation of the receiver. - * - * @return the PathData for the receiver - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see PathData - */ -public PathData getPathData() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int count = (int)/*64*/handle.elementCount(); - int pointCount = 0, typeCount = 0; - byte[] types = new byte[count]; - float[] pointArray = new float[count * 6]; - int /*long*/ points = OS.malloc(3 * NSPoint.sizeof); - if (points == 0) SWT.error(SWT.ERROR_NO_HANDLES); - NSPoint pt = new NSPoint(); - for (int i = 0; i < count; i++) { - int element = (int)/*64*/handle.elementAtIndex(i, points); - switch (element) { - case OS.NSMoveToBezierPathElement: - types[typeCount++] = SWT.PATH_MOVE_TO; - OS.memmove(pt, points, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - break; - case OS.NSLineToBezierPathElement: - types[typeCount++] = SWT.PATH_LINE_TO; - OS.memmove(pt, points, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - break; - case OS.NSCurveToBezierPathElement: - types[typeCount++] = SWT.PATH_CUBIC_TO; - OS.memmove(pt, points, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - OS.memmove(pt, points + NSPoint.sizeof, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - OS.memmove(pt, points + NSPoint.sizeof + NSPoint.sizeof, NSPoint.sizeof); - pointArray[pointCount++] = (int)pt.x; - pointArray[pointCount++] = (int)pt.y; - break; - case OS.NSClosePathBezierPathElement: - types[typeCount++] = SWT.PATH_CLOSE; - break; - } - } - OS.free(points); - if (pointCount != pointArray.length) { - float[] temp = new float[pointCount]; - System.arraycopy(pointArray, 0, temp, 0, pointCount); - pointArray = temp; - } - PathData data = new PathData(); - data.types = types; - data.points = pointArray; - return data; - } finally { - if (pool != null) pool.release(); - } -} - -void init(PathData data) { - byte[] types = data.types; - float[] points = data.points; - for (int i = 0, j = 0; i < types.length; i++) { - switch (types[i]) { - case SWT.PATH_MOVE_TO: - moveTo(points[j++], points[j++]); - break; - case SWT.PATH_LINE_TO: - lineTo(points[j++], points[j++]); - break; - case SWT.PATH_CUBIC_TO: - cubicTo(points[j++], points[j++], points[j++], points[j++], points[j++], points[j++]); - break; - case SWT.PATH_QUAD_TO: - quadTo(points[j++], points[j++], points[j++], points[j++]); - break; - case SWT.PATH_CLOSE: - close(); - break; - default: - dispose(); - SWT.error(SWT.ERROR_INVALID_ARGUMENT); - } - } -} - -/** - * Returns <code>true</code> if the Path has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the Path. - * When a Path has been disposed, it is an error to - * invoke any other method using the Path. - * - * @return <code>true</code> when the Path is disposed, and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Adds to the receiver a line from the current point to - * the point specified by (x, y). - * - * @param x the x coordinate of the end of the line to add - * @param y the y coordinate of the end of the line to add - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void lineTo(float x, float y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - handle.lineToPoint(pt); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the current point of the receiver to the point - * specified by (x, y). Note that this starts a new - * sub path. - * - * @param x the x coordinate of the new end point - * @param y the y coordinate of the new end point - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void moveTo(float x, float y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - handle.moveToPoint(pt); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds to the receiver a quadratic curve based on the parameters. - * - * @param cx the x coordinate of the control point of the spline - * @param cy the y coordinate of the control point of the spline - * @param x the x coordinate of the end point of the spline - * @param y the y coordinate of the end point of the spline - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void quadTo(float cx, float cy, float x, float y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - NSPoint ct = new NSPoint(); - ct.x = cx; - ct.y = cy; - handle.curveToPoint(pt, ct, ct); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Path {*DISPOSED*}"; - return "Path {" + handle + "}"; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java deleted file mode 100755 index 1670e9ab87..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Pattern.java +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.cocoa.*; - -/** - * Instances of this class represent patterns to use while drawing. Patterns - * can be specified either as bitmaps or gradients. - * <p> - * Application code must explicitly invoke the <code>Pattern.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * <p> - * This class requires the operating system's advanced graphics subsystem - * which may not be available on some platforms. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/snippets/#path">Path, Pattern snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - * - * @since 3.1 - */ -public class Pattern extends Resource { - NSColor color; - NSGradient gradient; - NSPoint pt1, pt2; - Image image; - float /*double*/ [] color1, color2; - int alpha1, alpha2; - -/** - * Constructs a new Pattern given an image. Drawing with the resulting - * pattern will cause the image to be tiled over the resulting area. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the pattern - * @param image the image that the pattern will draw - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device, or the image is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Pattern(Device device, Image image) { - super(device); - if (image == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (image.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - this.image = image; - color = NSColor.colorWithPatternImage(image.handle); - color.retain(); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Constructs a new Pattern that represents a linear, two color - * gradient. Drawing with the pattern will cause the resulting area to be - * tiled with the gradient specified by the arguments. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the pattern - * @param x1 the x coordinate of the starting corner of the gradient - * @param y1 the y coordinate of the starting corner of the gradient - * @param x2 the x coordinate of the ending corner of the gradient - * @param y2 the y coordinate of the ending corner of the gradient - * @param color1 the starting color of the gradient - * @param color2 the ending color of the gradient - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device, - * or if either color1 or color2 is null</li> - * <li>ERROR_INVALID_ARGUMENT - if either color1 or color2 has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Pattern(Device device, float x1, float y1, float x2, float y2, Color color1, Color color2) { - this(device, x1, y1, x2, y2, color1, 0xFF, color2, 0xFF); -} -/** - * Constructs a new Pattern that represents a linear, two color - * gradient. Drawing with the pattern will cause the resulting area to be - * tiled with the gradient specified by the arguments. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the pattern - * @param x1 the x coordinate of the starting corner of the gradient - * @param y1 the y coordinate of the starting corner of the gradient - * @param x2 the x coordinate of the ending corner of the gradient - * @param y2 the y coordinate of the ending corner of the gradient - * @param color1 the starting color of the gradient - * @param alpha1 the starting alpha value of the gradient - * @param color2 the ending color of the gradient - * @param alpha2 the ending alpha value of the gradient - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the device is null and there is no current device, - * or if either color1 or color2 is null</li> - * <li>ERROR_INVALID_ARGUMENT - if either color1 or color2 has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the pattern could not be obtained</li> - * </ul> - * - * @see #dispose() - * - * @since 3.2 - */ -public Pattern(Device device, float x1, float y1, float x2, float y2, Color color1, int alpha1, Color color2, int alpha2) { - super(device); - if (color1 == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (color1.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (color2 == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (color2.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - pt1 = new NSPoint(); - pt2 = new NSPoint(); - pt1.x = x1; - pt1.y = y1; - pt2.x = x2; - pt2.y = y2; - this.color1 = color1.handle; - this.color2 = color2.handle; - this.alpha1 = alpha1; - this.alpha2 = alpha2; - NSColor start = NSColor.colorWithDeviceRed(color1.handle[0], color1.handle[1], color1.handle[2], alpha1 / 255f); - NSColor end = NSColor.colorWithDeviceRed(color2.handle[0], color2.handle[1], color2.handle[2], alpha2 / 255f); - gradient = ((NSGradient)new NSGradient().alloc()).initWithStartingColor(start, end); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -void destroy() { - if (color != null) color.release(); - color = null; - if (gradient != null) gradient.release(); - gradient = null; - image = null; - color1 = color2 = null; -} - -/** - * Returns <code>true</code> if the Pattern has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the Pattern. - * When a Pattern has been disposed, it is an error to - * invoke any other method using the Pattern. - * - * @return <code>true</code> when the Pattern is disposed, and <code>false</code> otherwise - */ -public boolean isDisposed() { - return device == null; -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString() { - if (isDisposed()) return "Pattern {*DISPOSED*}"; - return "Pattern {" + (color != null ? color.id : gradient.id) + "}"; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java deleted file mode 100755 index c8de98bb3a..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Region.java +++ /dev/null @@ -1,839 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - - -import org.eclipse.swt.internal.*; -import org.eclipse.swt.internal.cocoa.*; -import org.eclipse.swt.*; - -/** - * Instances of this class represent areas of an x-y coordinate - * system that are aggregates of the areas covered by a number - * of polygons. - * <p> - * Application code must explicitly invoke the <code>Region.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - */ -public final class Region extends Resource { - /** - * the OS resource for the region - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public int /*long*/ handle; - -/** - * Constructs a new empty region. - * - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for region creation</li> - * </ul> - */ -public Region() { - this(null); -} - -/** - * Constructs a new empty region. - * <p> - * You must dispose the region when it is no longer required. - * </p> - * - * @param device the device on which to allocate the region - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle could not be obtained for region creation</li> - * </ul> - * - * @see #dispose - * - * @since 3.0 - */ -public Region(Device device) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle = OS.NewRgn(); - if (handle == 0) SWT.error(SWT.ERROR_NO_HANDLES); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -Region(Device device, int /*long*/ handle) { - super(device); - this.handle = handle; -} - -public static Region cocoa_new(Device device, int /*long*/ handle) { - return new Region(device, handle); -} - -static int /*long*/ polyToRgn(int[] poly, int length) { - short[] r = new short[4]; - int /*long*/ polyRgn = OS.NewRgn(), rectRgn = OS.NewRgn(); - int minY = poly[1], maxY = poly[1]; - for (int y = 3; y < length; y += 2) { - if (poly[y] < minY) minY = poly[y]; - if (poly[y] > maxY) maxY = poly[y]; - } - int[] inter = new int[length + 1]; - for (int y = minY; y <= maxY; y++) { - int count = 0; - int x1 = poly[0], y1 = poly[1]; - for (int p = 2; p < length; p += 2) { - int x2 = poly[p], y2 = poly[p + 1]; - if (y1 != y2 && ((y1 <= y && y < y2) || (y2 <= y && y < y1))) { - inter[count++] = (int)((((y - y1) / (float)(y2 - y1)) * (x2 - x1)) + x1 + 0.5f); - } - x1 = x2; - y1 = y2; - } - int x2 = poly[0], y2 = poly[1]; - if (y1 != y2 && ((y1 <= y && y < y2) || (y2 <= y && y < y1))) { - inter[count++] = (int)((((y - y1) / (float)(y2 - y1)) * (x2 - x1)) + x1 + 0.5f); - } - for (int gap=count/2; gap>0; gap/=2) { - for (int i=gap; i<count; i++) { - for (int j=i-gap; j>=0; j-=gap) { - if ((inter[j] - inter[j + gap]) <= 0) - break; - int temp = inter[j]; - inter[j] = inter[j + gap]; - inter[j + gap] = temp; - } - } - } - for (int i = 0; i < count; i += 2) { - OS.SetRect(r, (short)inter[i], (short)y, (short)(inter[i + 1]),(short)(y + 1)); - OS.RectRgn(rectRgn, r); - OS.UnionRgn(polyRgn, rectRgn, polyRgn); - } - } - OS.DisposeRgn(rectRgn); - return polyRgn; -} - -static int /*long*/ polyRgn(int[] pointArray, int count) { - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ polyRgn; - if (C.PTR_SIZEOF == 4) { - polyRgn = OS.NewRgn(); - OS.OpenRgn(); - OS.MoveTo((short)pointArray[0], (short)pointArray[1]); - for (int i = 1; i < count / 2; i++) { - OS.LineTo((short)pointArray[2 * i], (short)pointArray[2 * i + 1]); - } - OS.LineTo((short)pointArray[0], (short)pointArray[1]); - OS.CloseRgn(polyRgn); - } else { - polyRgn = polyToRgn(pointArray, count); - } - return polyRgn; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds the given polygon to the collection of polygons - * the receiver maintains to describe its area. - * - * @param pointArray points that describe the polygon to merge with the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 -* - */ -public void add (int[] pointArray) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - add(pointArray, pointArray.length); - } finally { - if (pool != null) pool.release(); - } -} - -void add(int[] pointArray, int count) { - if (count <= 2) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ polyRgn = polyRgn(pointArray, count); - OS.UnionRgn(handle, polyRgn, handle); - OS.DisposeRgn(polyRgn); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds the given rectangle to the collection of polygons - * the receiver maintains to describe its area. - * - * @param rect the rectangle to merge with the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void add(Rectangle rect) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (rect.width < 0 || rect.height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - add (rect.x, rect.y, rect.width, rect.height); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds the given rectangle to the collection of polygons - * the receiver maintains to describe its area. - * - * @param x the x coordinate of the rectangle - * @param y the y coordinate of the rectangle - * @param width the width coordinate of the rectangle - * @param height the height coordinate of the rectangle - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void add(int x, int y, int width, int height) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ rectRgn = OS.NewRgn(); - short[] r = new short[4]; - OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height)); - OS.RectRgn(rectRgn, r); - OS.UnionRgn(handle, rectRgn, handle); - OS.DisposeRgn(rectRgn); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Adds all of the polygons which make up the area covered - * by the argument to the collection of polygons the receiver - * maintains to describe its area. - * - * @param region the region to merge - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void add(Region region) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - OS.UnionRgn(handle, region.handle, handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the point specified by the - * arguments is inside the area specified by the receiver, - * and <code>false</code> otherwise. - * - * @param x the x coordinate of the point to test for containment - * @param y the y coordinate of the point to test for containment - * @return <code>true</code> if the region contains the point and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean contains(int x, int y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - short[] point = new short[]{(short)y, (short)x}; - return OS.PtInRgn(point, handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the given point is inside the - * area specified by the receiver, and <code>false</code> - * otherwise. - * - * @param pt the point to test for containment - * @return <code>true</code> if the region contains the point and <code>false</code> otherwise - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean contains(Point pt) { - if (pt == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - return contains(pt.x, pt.y); -} - -NSAffineTransform transform; -void convertRgn(NSAffineTransform transform) { - int /*long*/ newRgn = OS.NewRgn(); - Callback callback = new Callback(this, "convertRgn", 4); - int /*long*/ proc = callback.getAddress(); - if (proc == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS); - this.transform = transform; - OS.QDRegionToRects(handle, OS.kQDParseRegionFromTopLeft, proc, newRgn); - this.transform = null; - callback.dispose(); - OS.CopyRgn(newRgn, handle); - OS.DisposeRgn(newRgn); -} - -int /*long*/ convertRgn(int /*long*/ message, int /*long*/ rgn, int /*long*/ r, int /*long*/ newRgn) { - if (message == OS.kQDRegionToRectsMsgParse) { - short[] rect = new short[4]; - OS.memmove(rect, r, rect.length * 2); - int i = 0; - NSPoint point = new NSPoint(); - int[] points = new int[10]; - point.x = rect[1]; - point.y = rect[0]; - point = transform.transformPoint(point); - short startX, startY; - points[i++] = startX = (short)point.x; - points[i++] = startY = (short)point.y; - point.x = rect[3]; - point.y = rect[0]; - point = transform.transformPoint(point); - points[i++] = (short)Math.round(point.x); - points[i++] = (short)point.y; - point.x = rect[3]; - point.y = rect[2]; - point = transform.transformPoint(point); - points[i++] = (short)Math.round(point.x); - points[i++] = (short)Math.round(point.y); - point.x = rect[1]; - point.y = rect[2]; - point = transform.transformPoint(point); - points[i++] = (short)point.x; - points[i++] = (short)Math.round(point.y); - points[i++] = startX; - points[i++] = startY; - int /*long*/ polyRgn = polyRgn(points, points.length); - OS.UnionRgn(newRgn, polyRgn, newRgn); - OS.DisposeRgn(polyRgn); - } - return 0; -} - -void destroy() { - OS.DisposeRgn(handle); - handle = 0; -} - -/** - * Compares the argument to the receiver, and returns true - * if they represent the <em>same</em> object using a class - * specific comparison. - * - * @param object the object to compare with this object - * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise - * - * @see #hashCode - */ -public boolean equals(Object object) { - if (this == object) return true; - if (!(object instanceof Region)) return false; - Region region = (Region)object; - return handle == region.handle; -} - -/** - * Returns a rectangle which represents the rectangular - * union of the collection of polygons the receiver - * maintains to describe its area. - * - * @return a bounding rectangle for the region - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Rectangle#union - */ -public Rectangle getBounds() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - short[] bounds = new short[4]; - OS.GetRegionBounds(handle, bounds); - int width = bounds[3] - bounds[1]; - int height = bounds[2] - bounds[0]; - return new Rectangle(bounds[1], bounds[0], width, height); - } finally { - if (pool != null) pool.release(); - } -} - -NSBezierPath getPath() { - Callback callback = new Callback(this, "regionToRects", 4); - if (callback.getAddress() == 0) SWT.error(SWT.ERROR_NO_MORE_CALLBACKS); - NSBezierPath path = NSBezierPath.bezierPath(); - path.retain(); - OS.QDRegionToRects(handle, OS.kQDParseRegionFromTopLeft, callback.getAddress(), path.id); - callback.dispose(); - if (path.isEmpty()) path.appendBezierPathWithRect(new NSRect()); - return path; -} - -NSPoint pt = new NSPoint(); -short[] rect = new short[4]; -int /*long*/ regionToRects(int /*long*/ message, int /*long*/ rgn, int /*long*/ r, int /*long*/ path) { - if (message == OS.kQDRegionToRectsMsgParse) { - OS.memmove(rect, r, rect.length * 2); - pt.x = rect[1]; - pt.y = rect[0]; - OS.objc_msgSend(path, OS.sel_moveToPoint_, pt); - pt.x = rect[3]; - OS.objc_msgSend(path, OS.sel_lineToPoint_, pt); - pt.x = rect[3]; - pt.y = rect[2]; - OS.objc_msgSend(path, OS.sel_lineToPoint_, pt); - pt.x = rect[1]; - OS.objc_msgSend(path, OS.sel_lineToPoint_, pt); - OS.objc_msgSend(path, OS.sel_closePath); - } - return 0; -} - -/** - * Returns an integer hash code for the receiver. Any two - * objects that return <code>true</code> when passed to - * <code>equals</code> must return the same value for this - * method. - * - * @return the receiver's hash - * - * @see #equals - */ -public int hashCode() { - return (int)/*64*/handle; -} - -/** - * Intersects the given rectangle to the collection of polygons - * the receiver maintains to describe its area. - * - * @param rect the rectangle to intersect with the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void intersect(Rectangle rect) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - intersect (rect.x, rect.y, rect.width, rect.height); -} - -/** - * Intersects the given rectangle to the collection of polygons - * the receiver maintains to describe its area. - * - * @param x the x coordinate of the rectangle - * @param y the y coordinate of the rectangle - * @param width the width coordinate of the rectangle - * @param height the height coordinate of the rectangle - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void intersect(int x, int y, int width, int height) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ rectRgn = OS.NewRgn(); - short[] r = new short[4]; - OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height)); - OS.RectRgn(rectRgn, r); - OS.SectRgn(handle, rectRgn, handle); - OS.DisposeRgn(rectRgn); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Intersects all of the polygons which make up the area covered - * by the argument to the collection of polygons the receiver - * maintains to describe its area. - * - * @param region the region to intersect - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void intersect(Region region) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - OS.SectRgn(handle, region.handle, handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the rectangle described by the - * arguments intersects with any of the polygons the receiver - * maintains to describe its area, and <code>false</code> otherwise. - * - * @param x the x coordinate of the origin of the rectangle - * @param y the y coordinate of the origin of the rectangle - * @param width the width of the rectangle - * @param height the height of the rectangle - * @return <code>true</code> if the rectangle intersects with the receiver, and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Rectangle#intersects(Rectangle) - */ -public boolean intersects (int x, int y, int width, int height) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - short[] r = new short[4]; - OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height)); - return OS.RectInRgn(r, handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the given rectangle intersects - * with any of the polygons the receiver maintains to describe - * its area and <code>false</code> otherwise. - * - * @param rect the rectangle to test for intersection - * @return <code>true</code> if the rectangle intersects with the receiver, and <code>false</code> otherwise - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see Rectangle#intersects(Rectangle) - */ -public boolean intersects(Rectangle rect) { - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - return intersects(rect.x, rect.y, rect.width, rect.height); -} - -/** - * Returns <code>true</code> if the region has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the region. - * When a region has been disposed, it is an error to - * invoke any other method using the region. - * - * @return <code>true</code> when the region is disposed, and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == 0; -} - -/** - * Returns <code>true</code> if the receiver does not cover any - * area in the (x, y) coordinate plane, and <code>false</code> if - * the receiver does cover some area in the plane. - * - * @return <code>true</code> if the receiver is empty, and <code>false</code> otherwise - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public boolean isEmpty() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - return OS.EmptyRgn(handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Subtracts the given polygon from the collection of polygons - * the receiver maintains to describe its area. - * - * @param pointArray points that describe the polygon to merge with the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void subtract (int[] pointArray) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (pointArray.length < 2) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ polyRgn = polyRgn(pointArray, pointArray.length); - OS.DiffRgn(handle, polyRgn, handle); - OS.DisposeRgn(polyRgn); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Subtracts the given rectangle from the collection of polygons - * the receiver maintains to describe its area. - * - * @param rect the rectangle to subtract from the receiver - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void subtract(Rectangle rect) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (rect == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - subtract (rect.x, rect.y, rect.width, rect.height); -} - -/** - * Subtracts the given rectangle from the collection of polygons - * the receiver maintains to describe its area. - * - * @param x the x coordinate of the rectangle - * @param y the y coordinate of the rectangle - * @param width the width coordinate of the rectangle - * @param height the height coordinate of the rectangle - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the rectangle's width or height is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void subtract(int x, int y, int width, int height) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (width < 0 || height < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int /*long*/ rectRgn = OS.NewRgn(); - short[] r = new short[4]; - OS.SetRect(r, (short)x, (short)y, (short)(x + width),(short)(y + height)); - OS.RectRgn(rectRgn, r); - OS.DiffRgn(handle, rectRgn, handle); - OS.DisposeRgn(rectRgn); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Subtracts all of the polygons which make up the area covered - * by the argument from the collection of polygons the receiver - * maintains to describe its area. - * - * @param region the region to subtract - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.0 - */ -public void subtract(Region region) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (region == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (region.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - OS.DiffRgn(handle, region.handle, handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Translate all of the polygons the receiver maintains to describe - * its area by the specified point. - * - * @param x the x coordinate of the point to translate - * @param y the y coordinate of the point to translate - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void translate (int x, int y) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - OS.OffsetRgn (handle, (short)x, (short)y); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Translate all of the polygons the receiver maintains to describe - * its area by the specified point. - * - * @param pt the point to translate - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the argument is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.1 - */ -public void translate (Point pt) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pt == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - translate (pt.x, pt.y); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "Region {*DISPOSED*}"; - return "Region {" + handle + "}"; -} -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java deleted file mode 100755 index 1d8b96f356..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/TextLayout.java +++ /dev/null @@ -1,1980 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.internal.C; -import org.eclipse.swt.internal.Compatibility; -import org.eclipse.swt.internal.cocoa.*; -import org.eclipse.swt.*; - -/** - * <code>TextLayout</code> is a graphic object that represents - * styled text. - * <p> - * Instances of this class provide support for drawing, cursor - * navigation, hit testing, text wrapping, alignment, tab expansion - * line breaking, etc. These are aspects required for rendering internationalized text. - * </p><p> - * Application code must explicitly invoke the <code>TextLayout#dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/snippets/#textlayout">TextLayout, TextStyle snippets</a> - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: CustomControlExample, StyledText tab</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - * - * @since 3.0 - */ -public final class TextLayout extends Resource { - - NSTextStorage textStorage; - NSLayoutManager layoutManager; - NSTextContainer textContainer; - Font font; - String text; - StyleItem[] styles; - int spacing, ascent, descent, indent; - boolean justify; - int alignment; - int[] tabs; - int[] segments; - int wrapWidth; - int orientation; - - int[] lineOffsets; - NSRect[] lineBounds; - - static final int UNDERLINE_THICK = 1 << 16; - static final RGB LINK_FOREGROUND = new RGB (0, 51, 153); - int[] invalidOffsets; - static final char LTR_MARK = '\u200E', RTL_MARK = '\u200F', ZWS = '\u200B'; - - static class StyleItem { - TextStyle style; - int start; - - public String toString () { - return "StyleItem {" + start + ", " + style + "}"; - } - } - -/** - * Constructs a new instance of this class on the given device. - * <p> - * You must dispose the text layout when it is no longer required. - * </p> - * - * @param device the device on which to allocate the text layout - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * </ul> - * - * @see #dispose() - */ -public TextLayout (Device device) { - super(device); - wrapWidth = ascent = descent = -1; - alignment = SWT.LEFT; - orientation = SWT.LEFT_TO_RIGHT; - text = ""; - styles = new StyleItem[2]; - styles[0] = new StyleItem(); - styles[1] = new StyleItem(); - init(); -} - -void checkLayout() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); -} - -float[] computePolyline(int left, int top, int right, int bottom) { - int height = bottom - top; // can be any number - int width = 2 * height; // must be even - int peaks = Compatibility.ceil(right - left, width); - if (peaks == 0 && right - left > 2) { - peaks = 1; - } - int length = ((2 * peaks) + 1) * 2; - if (length < 0) return new float[0]; - - float[] coordinates = new float[length]; - for (int i = 0; i < peaks; i++) { - int index = 4 * i; - coordinates[index] = left + (width * i); - coordinates[index+1] = bottom; - coordinates[index+2] = coordinates[index] + width / 2; - coordinates[index+3] = top; - } - coordinates[length-2] = left + (width * peaks); - coordinates[length-1] = bottom; - return coordinates; -} - - -void computeRuns() { - if (textStorage != null) return; - String segmentsText = getSegmentsText(); - NSString str = NSString.stringWith(segmentsText); - textStorage = (NSTextStorage)new NSTextStorage().alloc().init(); - layoutManager = (NSLayoutManager)new NSLayoutManager().alloc().init(); - layoutManager.setBackgroundLayoutEnabled(NSThread.isMainThread()); - textContainer = (NSTextContainer)new NSTextContainer().alloc(); - NSSize size = new NSSize(); - size.width = wrapWidth != -1 ? wrapWidth : Float.MAX_VALUE; - size.height = Float.MAX_VALUE; - textContainer.initWithContainerSize(size); - textStorage.addLayoutManager(layoutManager); - layoutManager.addTextContainer(textContainer); - - /* - * Bug in Cocoa. Adding attributes directly to a NSTextStorage causes - * output to the console and eventually a segmentation fault when printing - * on a thread other than the main thread. The fix is to add attributes to - * a separate NSMutableAttributedString and add it to text storage when done. - */ - NSMutableAttributedString attrStr = (NSMutableAttributedString)new NSMutableAttributedString().alloc(); - attrStr.id = attrStr.initWithString(str).id; - attrStr.beginEditing(); - Font defaultFont = font != null ? font : device.systemFont; - NSRange range = new NSRange(); - range.length = str.length(); - attrStr.addAttribute(OS.NSFontAttributeName, defaultFont.handle, range); - defaultFont.addTraits(attrStr, range); - //TODO ascend descent wrap - NSMutableParagraphStyle paragraph = (NSMutableParagraphStyle)new NSMutableParagraphStyle().alloc().init(); - int align = OS.NSLeftTextAlignment; - if (justify) { - align = OS.NSJustifiedTextAlignment; - } else { - switch (alignment) { - case SWT.CENTER: - align = OS.NSCenterTextAlignment; - break; - case SWT.RIGHT: - align = OS.NSRightTextAlignment; - } - } - paragraph.setAlignment(align); - paragraph.setLineSpacing(spacing); - paragraph.setFirstLineHeadIndent(indent); - paragraph.setLineBreakMode(wrapWidth != -1 ? OS.NSLineBreakByWordWrapping : OS.NSLineBreakByClipping); - paragraph.setTabStops(NSArray.array()); - if (tabs != null) { - int count = tabs.length; - for (int i = 0, pos = 0; i < count; i++) { - pos += tabs[i]; - NSTextTab tab = (NSTextTab)new NSTextTab().alloc(); - tab = tab.initWithType(OS.NSLeftTabStopType, pos); - paragraph.addTabStop(tab); - tab.release(); - } - int width = count - 2 >= 0 ? tabs[count - 1] - tabs[count - 2] : tabs[count - 1]; - paragraph.setDefaultTabInterval(width); - } - attrStr.addAttribute(OS.NSParagraphStyleAttributeName, paragraph, range); - paragraph.release(); - int /*long*/ textLength = str.length(); - for (int i = 0; i < styles.length - 1; i++) { - StyleItem run = styles[i]; - if (run.style == null) continue; - TextStyle style = run.style; - range.location = textLength != 0 ? translateOffset(run.start) : 0; - range.length = translateOffset(styles[i + 1].start) - range.location; - Font font = style.font; - if (font != null) { - attrStr.addAttribute(OS.NSFontAttributeName, font.handle, range); - font.addTraits(attrStr, range); - } - Color foreground = style.foreground; - if (foreground != null) { - NSColor color = NSColor.colorWithDeviceRed(foreground.handle[0], foreground.handle[1], foreground.handle[2], 1); - attrStr.addAttribute(OS.NSForegroundColorAttributeName, color, range); - } - Color background = style.background; - if (background != null) { - NSColor color = NSColor.colorWithDeviceRed(background.handle[0], background.handle[1], background.handle[2], 1); - attrStr.addAttribute(OS.NSBackgroundColorAttributeName, color, range); - } - if (style.strikeout) { - attrStr.addAttribute(OS.NSStrikethroughStyleAttributeName, NSNumber.numberWithInt(OS.NSUnderlineStyleSingle), range); - Color strikeColor = style.strikeoutColor; - if (strikeColor != null) { - NSColor color = NSColor.colorWithDeviceRed(strikeColor.handle[0], strikeColor.handle[1], strikeColor.handle[2], 1); - attrStr.addAttribute(OS.NSStrikethroughColorAttributeName, color, range); - } - } - if (isUnderlineSupported(style)) { - int underlineStyle = 0; - switch (style.underlineStyle) { - case SWT.UNDERLINE_SINGLE: - underlineStyle = OS.NSUnderlineStyleSingle; - break; - case SWT.UNDERLINE_DOUBLE: - underlineStyle = OS.NSUnderlineStyleDouble; - break; - case UNDERLINE_THICK: - underlineStyle = OS.NSUnderlineStyleThick; - break; - case SWT.UNDERLINE_LINK: { - underlineStyle = OS.NSUnderlineStyleSingle; - if (foreground == null) { - NSColor color = NSColor.colorWithDeviceRed(LINK_FOREGROUND.red / 255f, LINK_FOREGROUND.green / 255f, LINK_FOREGROUND.blue / 255f, 1); - attrStr.addAttribute(OS.NSForegroundColorAttributeName, color, range); - } - break; - } - } - if (underlineStyle != 0) { - attrStr.addAttribute(OS.NSUnderlineStyleAttributeName, NSNumber.numberWithInt(underlineStyle), range); - Color underlineColor = style.underlineColor; - if (underlineColor != null) { - NSColor color = NSColor.colorWithDeviceRed(underlineColor.handle[0], underlineColor.handle[1], underlineColor.handle[2], 1); - attrStr.addAttribute(OS.NSUnderlineColorAttributeName, color, range); - } - } - } - if (style.rise != 0) { - attrStr.addAttribute(OS.NSBaselineOffsetAttributeName, NSNumber.numberWithInt(style.rise), range); - } - if (style.metrics != null) { - //TODO implement metrics - } - } - attrStr.endEditing(); - textStorage.setAttributedString(attrStr); - attrStr.release(); - - textContainer.setLineFragmentPadding(0); - layoutManager.glyphRangeForTextContainer(textContainer); - - int numberOfLines; - int /*long*/ numberOfGlyphs = layoutManager.numberOfGlyphs(), index; - int /*long*/ rangePtr = OS.malloc(NSRange.sizeof); - NSRange lineRange = new NSRange(); - for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){ - layoutManager.lineFragmentUsedRectForGlyphAtIndex(index, rangePtr, true); - OS.memmove(lineRange, rangePtr, NSRange.sizeof); - index = lineRange.location + lineRange.length; - } - if (numberOfLines == 0) numberOfLines++; - int[] offsets = new int[numberOfLines + 1]; - NSRect[] bounds = new NSRect[numberOfLines]; - for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){ - bounds[numberOfLines] = layoutManager.lineFragmentUsedRectForGlyphAtIndex(index, rangePtr, true); - if (numberOfLines < bounds.length - 1) bounds[numberOfLines].height -= spacing; - OS.memmove(lineRange, rangePtr, NSRange.sizeof); - offsets[numberOfLines] = (int)/*64*/lineRange.location; - index = lineRange.location + lineRange.length; - } - if (numberOfLines == 0) { - Font font = this.font != null ? this.font : device.systemFont; - NSFont nsFont = font.handle; - bounds[0] = new NSRect(); - bounds[0].height = Math.max(layoutManager.defaultLineHeightForFont(nsFont), ascent + descent); - } - OS.free(rangePtr); - offsets[numberOfLines] = (int)/*64*/textStorage.length(); - this.lineOffsets = offsets; - this.lineBounds = bounds; -} - -void destroy() { - freeRuns(); - font = null; - text = null; - styles = null; -} - -/** - * Draws the receiver's text using the specified GC at the specified - * point. - * - * @param gc the GC to draw - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the gc is null</li> - * </ul> - */ -public void draw(GC gc, int x, int y) { - draw(gc, x, y, -1, -1, null, null); -} - -/** - * Draws the receiver's text using the specified GC at the specified - * point. - * - * @param gc the GC to draw - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param selectionStart the offset where the selections starts, or -1 indicating no selection - * @param selectionEnd the offset where the selections ends, or -1 indicating no selection - * @param selectionForeground selection foreground, or NULL to use the system default color - * @param selectionBackground selection background, or NULL to use the system default color - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the gc is null</li> - * </ul> - */ -public void draw(GC gc, int x, int y, int selectionStart, int selectionEnd, Color selectionForeground, Color selectionBackground) { - draw(gc, x, y, selectionStart, selectionEnd, selectionForeground, selectionBackground, 0); -} - -/** - * Draws the receiver's text using the specified GC at the specified - * point. - * <p> - * The parameter <code>flags</code> can include one of <code>SWT.DELIMITER_SELECTION</code> - * or <code>SWT.FULL_SELECTION</code> to specify the selection behavior on all lines except - * for the last line, and can also include <code>SWT.LAST_LINE_SELECTION</code> to extend - * the specified selection behavior to the last line. - * </p> - * @param gc the GC to draw - * @param x the x coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param y the y coordinate of the top left corner of the rectangular area where the text is to be drawn - * @param selectionStart the offset where the selections starts, or -1 indicating no selection - * @param selectionEnd the offset where the selections ends, or -1 indicating no selection - * @param selectionForeground selection foreground, or NULL to use the system default color - * @param selectionBackground selection background, or NULL to use the system default color - * @param flags drawing options - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the gc is null</li> - * </ul> - * - * @since 3.3 - */ -public void draw(GC gc, int x, int y, int selectionStart, int selectionEnd, Color selectionForeground, Color selectionBackground, int flags) { - checkLayout (); - if (gc == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (gc.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (selectionForeground != null && selectionForeground.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (selectionBackground != null && selectionBackground.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = gc.checkGC(GC.CLIPPING | GC.TRANSFORM | GC.FOREGROUND); - try { - computeRuns(); - int length = translateOffset(text.length()); - if (length == 0 && flags == 0) return; - gc.handle.saveGraphicsState(); - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - NSRange range = new NSRange(); - int /*long*/ numberOfGlyphs = layoutManager.numberOfGlyphs(); - if (numberOfGlyphs > 0) { - range.location = 0; - range.length = numberOfGlyphs; - layoutManager.drawBackgroundForGlyphRange(range, pt); - } - boolean hasSelection = selectionStart <= selectionEnd && selectionStart != -1 && selectionEnd != -1; - if (hasSelection || (flags & SWT.LAST_LINE_SELECTION) != 0) { - if (selectionBackground == null) selectionBackground = device.getSystemColor(SWT.COLOR_LIST_SELECTION); - NSColor selectionColor = NSColor.colorWithDeviceRed(selectionBackground.handle[0], selectionBackground.handle[1], selectionBackground.handle[2], selectionBackground.handle[3]); - NSBezierPath path = NSBezierPath.bezierPath(); - NSRect rect = new NSRect(); - if (hasSelection) { - int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF); - range.location = translateOffset(selectionStart); - range.length = translateOffset(selectionEnd - selectionStart + 1); - int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount); - int /*long*/ [] rectCount = new int /*long*/ [1]; - OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF); - OS.free(pRectCount); - for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) { - OS.memmove(rect, pArray, NSRect.sizeof); - fixRect(rect); - rect.x += pt.x; - rect.y += pt.y; - rect.height = Math.max(rect.height, ascent + descent); - path.appendBezierPathWithRect(rect); - } - } - //TODO draw full selection for wrapped text - if ((flags & SWT.LAST_LINE_SELECTION) != 0) { - NSRect bounds = lineBounds[lineBounds.length - 1]; - rect.x = pt.x + bounds.x + bounds.width; - rect.y = y + bounds.y; - rect.width = (flags & SWT.FULL_SELECTION) != 0 ? 0x7fffffff : bounds.height / 3; - rect.height = Math.max(bounds.height, ascent + descent); - path.appendBezierPathWithRect(rect); - } - selectionColor.setFill(); - path.fill(); - } - if (numberOfGlyphs > 0) { - range.location = 0; - range.length = numberOfGlyphs; - float /*double*/ [] fg = gc.data.foreground; - boolean defaultFg = fg[0] == 0 && fg[1] == 0 && fg[2] == 0 && fg[3] == 1; - if (!defaultFg) { - for (int i = 0; i < styles.length - 1; i++) { - StyleItem run = styles[i]; - if (run.style != null && run.style.foreground != null) continue; - if (run.style != null && run.style.underline && run.style.underlineStyle == SWT.UNDERLINE_LINK) continue; - range.location = length != 0 ? translateOffset(run.start) : 0; - range.length = translateOffset(styles[i + 1].start) - range.location; - layoutManager.addTemporaryAttribute(OS.NSForegroundColorAttributeName, gc.data.fg, range); - } - } - range.location = 0; - range.length = numberOfGlyphs; - layoutManager.drawGlyphsForGlyphRange(range, pt); - if (!defaultFg) { - range.location = 0; - range.length = length; - layoutManager.removeTemporaryAttribute(OS.NSForegroundColorAttributeName, range); - } - NSPoint point = new NSPoint(); - for (int j = 0; j < styles.length; j++) { - StyleItem run = styles[j]; - TextStyle style = run.style; - if (style == null) continue; - boolean drawUnderline = style.underline && !isUnderlineSupported(style); - drawUnderline = drawUnderline && (j + 1 == styles.length || !style.isAdherentUnderline(styles[j + 1].style)); - boolean drawBorder = style.borderStyle != SWT.NONE; - drawBorder = drawBorder && (j + 1 == styles.length || !style.isAdherentBorder(styles[j + 1].style)); - if (!drawUnderline && !drawBorder) continue; - int end = j + 1 < styles.length ? translateOffset(styles[j + 1].start - 1) : length; - for (int i = 0; i < lineOffsets.length - 1; i++) { - int lineStart = untranslateOffset(lineOffsets[i]); - int lineEnd = untranslateOffset(lineOffsets[i + 1] - 1); - if (drawUnderline) { - int start = run.start; - for (int k = j; k > 0 && style.isAdherentUnderline(styles[k - 1].style); k--) { - start = styles[k - 1].start; - } - start = translateOffset(start); - if (!(start > lineEnd || end < lineStart)) { - range.location = Math.max(lineStart, start); - range.length = Math.min(lineEnd, end) + 1 - range.location; - if (range.length > 0) { - int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF); - int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount); - int /*long*/ [] rectCount = new int /*long*/ [1]; - OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF); - OS.free(pRectCount); - NSRect rect = new NSRect(); - gc.handle.saveGraphicsState(); - float /*double*/ baseline = layoutManager.typesetter().baselineOffsetInLayoutManager(layoutManager, lineStart); - float /*double*/ [] color = null; - if (style.underlineColor != null) color = style.underlineColor.handle; - if (color == null && style.foreground != null) color = style.foreground.handle; - if (color != null) { - NSColor.colorWithDeviceRed(color[0], color[1], color[2], color[3]).setStroke(); - } - for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) { - OS.memmove(rect, pArray, NSRect.sizeof); - fixRect(rect); - float /*double*/ underlineX = pt.x + rect.x; - float /*double*/ underlineY = pt.y + rect.y + rect.height - baseline + 1; - NSBezierPath path = NSBezierPath.bezierPath(); - switch (style.underlineStyle) { - case SWT.UNDERLINE_ERROR: { - path.setLineWidth(2f); - path.setLineCapStyle(OS.NSRoundLineCapStyle); - path.setLineJoinStyle(OS.NSRoundLineJoinStyle); - path.setLineDash(new float /*double*/ []{1, 3f}, 2, 0); - point.x = underlineX; - point.y = underlineY + 0.5f; - path.moveToPoint(point); - point.x = underlineX + rect.width; - point.y = underlineY + 0.5f; - path.lineToPoint(point); - break; - } - case SWT.UNDERLINE_SQUIGGLE: { - gc.handle.setShouldAntialias(false); - path.setLineWidth(1.0f); - path.setLineCapStyle(OS.NSButtLineCapStyle); - path.setLineJoinStyle(OS.NSMiterLineJoinStyle); - float /*double*/ lineBottom = pt.y + rect.y + rect.height; - float squigglyThickness = 1; - float squigglyHeight = 2 * squigglyThickness; - float /*double*/ squigglyY = Math.min(underlineY - squigglyHeight / 2, lineBottom - squigglyHeight - 1); - float[] points = computePolyline((int)underlineX, (int)squigglyY, (int)(underlineX + rect.width), (int)(squigglyY + squigglyHeight)); - point.x = points[0] + 0.5f; - point.y = points[1] + 0.5f; - path.moveToPoint(point); - for (int p = 2; p < points.length; p+=2) { - point.x = points[p] + 0.5f; - point.y = points[p+1] + 0.5f; - path.lineToPoint(point); - } - break; - } - } - path.stroke(); - } - gc.handle.restoreGraphicsState(); - } - } - } - if (drawBorder) { - int start = run.start; - for (int k = j; k > 0 && style.isAdherentBorder(styles[k - 1].style); k--) { - start = styles[k - 1].start; - } - start = translateOffset(start); - if (!(start > lineEnd || end < lineStart)) { - range.location = Math.max(lineStart, start); - range.length = Math.min(lineEnd, end) + 1 - range.location; - if (range.length > 0) { - int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF); - int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount); - int /*long*/ [] rectCount = new int /*long*/ [1]; - OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF); - OS.free(pRectCount); - NSRect rect = new NSRect(); - gc.handle.saveGraphicsState(); - float /*double*/ [] color = null; - if (style.borderColor != null) color = style.borderColor.handle; - if (color == null && style.foreground != null) color = style.foreground.handle; - if (color != null) { - NSColor.colorWithDeviceRed(color[0], color[1], color[2], color[3]).setStroke(); - } - int width = 1; - float[] dashes = null; - switch (style.borderStyle) { - case SWT.BORDER_SOLID: break; - case SWT.BORDER_DASH: dashes = width != 0 ? GC.LINE_DASH : GC.LINE_DASH_ZERO; break; - case SWT.BORDER_DOT: dashes = width != 0 ? GC.LINE_DOT : GC.LINE_DOT_ZERO; break; - } - float /*double*/ [] lengths = null; - if (dashes != null) { - lengths = new float /*double*/[dashes.length]; - for (int k = 0; k < lengths.length; k++) { - lengths[k] = width == 0 ? dashes[k] : dashes[k] * width; - } - } - for (int k = 0; k < rectCount[0]; k++, pArray += NSRect.sizeof) { - OS.memmove(rect, pArray, NSRect.sizeof); - fixRect(rect); - rect.x += pt.x + 0.5f; - rect.y += pt.y + 0.5f; - rect.width -= 0.5f; - rect.height -= 0.5f; - NSBezierPath path = NSBezierPath.bezierPath(); - path.setLineDash(lengths, lengths != null ? lengths.length : 0, 0); - path.appendBezierPathWithRect(rect); - path.stroke(); - } - gc.handle.restoreGraphicsState(); - } - } - } - } - } - } - gc.handle.restoreGraphicsState(); - } finally { - gc.uncheckGC(pool); - } -} - -void fixRect(NSRect rect) { - for (int j = 0; j < lineBounds.length; j++) { - NSRect line = lineBounds[j]; - if (line.y <= rect.y && rect.y < line.y + line.height) { - if (rect.x + rect.width > line.x + line.width) { - rect.width = line.x + line.width - rect.x; - } - } - } -} - -void freeRuns() { - if (textStorage == null) return; - if (textStorage != null) { - textStorage.release(); - } - if (layoutManager != null) { - layoutManager.release(); - } - if (textContainer != null) { - textContainer.release(); - } - textStorage = null; - layoutManager = null; - textContainer = null; -} - -/** - * Returns the receiver's horizontal text alignment, which will be one - * of <code>SWT.LEFT</code>, <code>SWT.CENTER</code> or - * <code>SWT.RIGHT</code>. - * - * @return the alignment used to positioned text horizontally - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getAlignment() { - checkLayout(); - return alignment; -} - -/** - * Returns the ascent of the receiver. - * - * @return the ascent - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getDescent() - * @see #setDescent(int) - * @see #setAscent(int) - * @see #getLineMetrics(int) - */ -public int getAscent () { - checkLayout(); - return ascent; -} - -/** - * Returns the bounds of the receiver. The width returned is either the - * width of the longest line or the width set using {@link TextLayout#setWidth(int)}. - * To obtain the text bounds of a line use {@link TextLayout#getLineBounds(int)}. - * - * @return the bounds of the receiver - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setWidth(int) - * @see #getLineBounds(int) - */ -public Rectangle getBounds() { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - NSRect rect = layoutManager.usedRectForTextContainer(textContainer); - if (wrapWidth != -1) rect.width = wrapWidth; - if (text.length() == 0) { - Font font = this.font != null ? this.font : device.systemFont; - NSFont nsFont = font.handle; - rect.height = layoutManager.defaultLineHeightForFont(nsFont); - } - rect.height = Math.max(rect.height, ascent + descent) + spacing; - return new Rectangle(0, 0, (int)Math.ceil(rect.width), (int)Math.ceil(rect.height)); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the bounds for the specified range of characters. The - * bounds is the smallest rectangle that encompasses all characters - * in the range. The start and end offsets are inclusive and will be - * clamped if out of range. - * - * @param start the start offset - * @param end the end offset - * @return the bounds of the character range - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Rectangle getBounds(int start, int end) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int length = text.length(); - if (length == 0) return new Rectangle(0, 0, 0, 0); - if (start > end) return new Rectangle(0, 0, 0, 0); - start = Math.min(Math.max(0, start), length - 1); - end = Math.min(Math.max(0, end), length - 1); - start = translateOffset(start); - end = translateOffset(end); - NSRange range = new NSRange(); - range.location = start; - range.length = end - start + 1; - int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF); - int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount); - int /*long*/ [] rectCount = new int /*long*/ [1]; - OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF); - OS.free(pRectCount); - NSRect rect = new NSRect(); - int left = 0x7FFFFFFF, right = 0; - int top = 0x7FFFFFFF, bottom = 0; - for (int i = 0; i < rectCount[0]; i++, pArray += NSRect.sizeof) { - OS.memmove(rect, pArray, NSRect.sizeof); - fixRect(rect); - left = Math.min(left, (int)rect.x); - right = Math.max(right, (int)Math.ceil(rect.x + rect.width)); - top = Math.min(top, (int)rect.y); - bottom = Math.max(bottom, (int)Math.ceil(rect.y + rect.height)); - } - return new Rectangle(left, top, right - left, bottom - top); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the descent of the receiver. - * - * @return the descent - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getAscent() - * @see #setAscent(int) - * @see #setDescent(int) - * @see #getLineMetrics(int) - */ -public int getDescent () { - checkLayout(); - return descent; -} - -/** - * Returns the default font currently being used by the receiver - * to draw and measure text. - * - * @return the receiver's font - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Font getFont () { - checkLayout(); - return font; -} - -/** -* Returns the receiver's indent. -* -* @return the receiver's indent -* -* @exception SWTException <ul> -* <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> -* </ul> -* -* @since 3.2 -*/ -public int getIndent () { - checkLayout(); - return indent; -} - -/** -* Returns the receiver's justification. -* -* @return the receiver's justification -* -* @exception SWTException <ul> -* <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> -* </ul> -* -* @since 3.2 -*/ -public boolean getJustify () { - checkLayout(); - return justify; -} - -/** - * Returns the embedding level for the specified character offset. The - * embedding level is usually used to determine the directionality of a - * character in bidirectional text. - * - * @param offset the character offset - * @return the embedding level - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - */ -public int getLevel(int offset) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int length = text.length(); - if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE); - offset = translateOffset(offset); - int /*long*/ glyphOffset = layoutManager.glyphIndexForCharacterAtIndex(offset); - NSRange range = new NSRange(); - range.location = glyphOffset; - range.length = 1; - int /*long*/ pBidiLevels = OS.malloc(1); - byte[] bidiLevels = new byte[1]; - int /*long*/ result = layoutManager.getGlyphsInRange(range, 0, 0, 0, 0, pBidiLevels); - if (result > 0) { - OS.memmove(bidiLevels, pBidiLevels, 1); - } - OS.free(pBidiLevels); - return bidiLevels[0]; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the line offsets. Each value in the array is the - * offset for the first character in a line except for the last - * value, which contains the length of the text. - * - * @return the line offsets - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int[] getLineOffsets() { - checkLayout (); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int[] offsets = new int[lineOffsets.length]; - for (int i = 0; i < offsets.length; i++) { - offsets[i] = untranslateOffset(lineOffsets[i]); - } - return offsets; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the index of the line that contains the specified - * character offset. - * - * @param offset the character offset - * @return the line index - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getLineIndex(int offset) { - checkLayout (); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int length = text.length(); - if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE); - offset = translateOffset(offset); - for (int line=0; line<lineOffsets.length - 1; line++) { - if (lineOffsets[line + 1] > offset) { - return line; - } - } - return lineBounds.length - 1; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the bounds of the line for the specified line index. - * - * @param lineIndex the line index - * @return the line bounds - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the line index is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public Rectangle getLineBounds(int lineIndex) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - if (!(0 <= lineIndex && lineIndex < lineBounds.length)) SWT.error(SWT.ERROR_INVALID_RANGE); - NSRect rect = lineBounds[lineIndex]; - int height = Math.max((int)Math.ceil(rect.height), ascent + descent); - return new Rectangle((int)rect.x, (int)rect.y, (int)Math.ceil(rect.width), height); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the receiver's line count. This includes lines caused - * by wrapping. - * - * @return the line count - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getLineCount() { - checkLayout (); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - return lineOffsets.length - 1; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the font metrics for the specified line index. - * - * @param lineIndex the line index - * @return the font metrics - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the line index is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public FontMetrics getLineMetrics (int lineIndex) { - checkLayout (); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int lineCount = getLineCount(); - if (!(0 <= lineIndex && lineIndex < lineCount)) SWT.error(SWT.ERROR_INVALID_RANGE); - int length = text.length(); - if (length == 0) { - Font font = this.font != null ? this.font : device.systemFont; - NSFont nsFont = font.handle; - int ascent = (int)(0.5f + nsFont.ascender()); - int descent = (int)(0.5f + (-nsFont.descender() + nsFont.leading())); - ascent = Math.max(ascent, this.ascent); - descent = Math.max(descent, this.descent); - return FontMetrics.cocoa_new(ascent, descent, 0, 0, ascent + descent); - } - Rectangle rect = getLineBounds(lineIndex); - int baseline = (int)layoutManager.typesetter().baselineOffsetInLayoutManager(layoutManager, getLineOffsets()[lineIndex]); - return FontMetrics.cocoa_new(rect.height - baseline, baseline, 0, 0, rect.height); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the location for the specified character offset. The - * <code>trailing</code> argument indicates whether the offset - * corresponds to the leading or trailing edge of the cluster. - * - * @param offset the character offset - * @param trailing the trailing flag - * @return the location of the character offset - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getOffset(Point, int[]) - * @see #getOffset(int, int, int[]) - */ -public Point getLocation(int offset, boolean trailing) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - int length = text.length(); - if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE); - if (length == 0) return new Point(0, 0); - offset = translateOffset(offset); - int /*long*/ glyphIndex = layoutManager.glyphIndexForCharacterAtIndex(offset); - NSRect rect = layoutManager.lineFragmentUsedRectForGlyphAtIndex(glyphIndex, 0); - NSPoint point = layoutManager.locationForGlyphAtIndex(glyphIndex); - if (trailing) { - NSRange range = new NSRange(); - range.location = offset; - range.length = 1; - int /*long*/ pRectCount = OS.malloc(C.PTR_SIZEOF); - int /*long*/ pArray = layoutManager.rectArrayForCharacterRange(range, range, textContainer, pRectCount); - int /*long*/ [] rectCount = new int /*long*/ [1]; - OS.memmove(rectCount, pRectCount, C.PTR_SIZEOF); - OS.free(pRectCount); - if (rectCount[0] > 0) { - NSRect bounds = new NSRect(); - OS.memmove(bounds, pArray, NSRect.sizeof); - fixRect(bounds); - point.x += bounds.width; - } - } - return new Point((int)point.x, (int)rect.y); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the next offset for the specified offset and movement - * type. The movement is one of <code>SWT.MOVEMENT_CHAR</code>, - * <code>SWT.MOVEMENT_CLUSTER</code>, <code>SWT.MOVEMENT_WORD</code>, - * <code>SWT.MOVEMENT_WORD_END</code> or <code>SWT.MOVEMENT_WORD_START</code>. - * - * @param offset the start offset - * @param movement the movement type - * @return the next offset - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the offset is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getPreviousOffset(int, int) - */ -public int getNextOffset (int offset, int movement) { - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - return _getOffset(offset, movement, true); - } finally { - if (pool != null) pool.release(); - } -} - -int _getOffset (int offset, int movement, boolean forward) { - checkLayout(); - computeRuns(); - int length = text.length(); - if (!(0 <= offset && offset <= length)) SWT.error(SWT.ERROR_INVALID_RANGE); - if (length == 0) return 0; - offset = translateOffset(offset); - length = translateOffset(length); - switch (movement) { - case SWT.MOVEMENT_CLUSTER://TODO cluster - case SWT.MOVEMENT_CHAR: { - boolean invalid = false; - do { - int newOffset = offset; - if (forward) { - if (newOffset < length) newOffset++; - } else { - if (newOffset > 0) newOffset--; - } - if (newOffset == offset) break; - offset = newOffset; - invalid = false; - if (invalidOffsets != null) { - for (int i = 0; i < invalidOffsets.length; i++) { - if (offset == invalidOffsets[i]) { - invalid = true; - break; - } - } - } - } while (invalid); - return untranslateOffset(offset); - } - case SWT.MOVEMENT_WORD: { - return untranslateOffset((int)/*64*/textStorage.nextWordFromIndex(offset, forward)); - } - case SWT.MOVEMENT_WORD_END: { - NSRange range = textStorage.doubleClickAtIndex(length == offset ? length - 1 : offset); - return untranslateOffset((int)/*64*/(range.location + range.length)); - } - case SWT.MOVEMENT_WORD_START: { - NSRange range = textStorage.doubleClickAtIndex(length == offset ? length - 1 : offset); - return untranslateOffset((int)/*64*/range.location); - } - } - return untranslateOffset(offset); -} - -/** - * Returns the character offset for the specified point. - * For a typical character, the trailing argument will be filled in to - * indicate whether the point is closer to the leading edge (0) or - * the trailing edge (1). When the point is over a cluster composed - * of multiple characters, the trailing argument will be filled with the - * position of the character in the cluster that is closest to - * the point. - * - * @param point the point - * @param trailing the trailing buffer - * @return the character offset - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the trailing length is less than <code>1</code></li> - * <li>ERROR_NULL_ARGUMENT - if the point is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getLocation(int, boolean) - */ -public int getOffset(Point point, int[] trailing) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - if (point == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - return getOffset(point.x, point.y, trailing); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the character offset for the specified point. - * For a typical character, the trailing argument will be filled in to - * indicate whether the point is closer to the leading edge (0) or - * the trailing edge (1). When the point is over a cluster composed - * of multiple characters, the trailing argument will be filled with the - * position of the character in the cluster that is closest to - * the point. - * - * @param x the x coordinate of the point - * @param y the y coordinate of the point - * @param trailing the trailing buffer - * @return the character offset - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the trailing length is less than <code>1</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getLocation(int, boolean) - */ -public int getOffset(int x, int y, int[] trailing) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - computeRuns(); - if (trailing != null && trailing.length < 1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - int length = text.length(); - if (length == 0) return 0; - NSPoint pt = new NSPoint(); - pt.x = x; - pt.y = y; - float /*double*/[] partialFration = new float /*double*/[1]; - int /*long*/ glyphIndex = layoutManager.glyphIndexForPoint(pt, textContainer, partialFration); - int /*long*/ offset = layoutManager.characterIndexForGlyphAtIndex(glyphIndex); - if (trailing != null) trailing[0] = Math.round((float)/*64*/partialFration[0]); - return Math.min(untranslateOffset((int)/*64*/offset), length - 1); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns the orientation of the receiver. - * - * @return the orientation style - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getOrientation() { - checkLayout(); - return orientation; -} - -/** - * Returns the previous offset for the specified offset and movement - * type. The movement is one of <code>SWT.MOVEMENT_CHAR</code>, - * <code>SWT.MOVEMENT_CLUSTER</code> or <code>SWT.MOVEMENT_WORD</code>, - * <code>SWT.MOVEMENT_WORD_END</code> or <code>SWT.MOVEMENT_WORD_START</code>. - * - * @param offset the start offset - * @param movement the movement type - * @return the previous offset - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the offset is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getNextOffset(int, int) - */ -public int getPreviousOffset (int index, int movement) { - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - return _getOffset(index, movement, false); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Gets the ranges of text that are associated with a <code>TextStyle</code>. - * - * @return the ranges, an array of offsets representing the start and end of each - * text style. - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getStyles() - * - * @since 3.2 - */ -public int[] getRanges () { - checkLayout(); - int[] result = new int[styles.length * 2]; - int count = 0; - for (int i=0; i<styles.length - 1; i++) { - if (styles[i].style != null) { - result[count++] = styles[i].start; - result[count++] = styles[i + 1].start - 1; - } - } - if (count != result.length) { - int[] newResult = new int[count]; - System.arraycopy(result, 0, newResult, 0, count); - result = newResult; - } - return result; -} - -/** - * Returns the text segments offsets of the receiver. - * - * @return the text segments offsets - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int[] getSegments() { - checkLayout(); - return segments; -} - -String getSegmentsText() { - if (segments == null) return text; - int nSegments = segments.length; - if (nSegments <= 1) return text; - int length = text.length(); - if (length == 0) return text; - if (nSegments == 2) { - if (segments[0] == 0 && segments[1] == length) return text; - } - invalidOffsets = new int[nSegments]; - char[] oldChars = new char[length]; - text.getChars(0, length, oldChars, 0); - char[] newChars = new char[length + nSegments]; - int charCount = 0, segmentCount = 0; - char separator = getOrientation() == SWT.RIGHT_TO_LEFT ? RTL_MARK : LTR_MARK; - while (charCount < length) { - if (segmentCount < nSegments && charCount == segments[segmentCount]) { - invalidOffsets[segmentCount] = charCount + segmentCount; - newChars[charCount + segmentCount++] = separator; - } else { - newChars[charCount + segmentCount] = oldChars[charCount++]; - } - } - if (segmentCount < nSegments) { - invalidOffsets[segmentCount] = charCount + segmentCount; - segments[segmentCount] = charCount; - newChars[charCount + segmentCount++] = separator; - } - if (segmentCount != nSegments) { - int[] tmp = new int [segmentCount]; - System.arraycopy(invalidOffsets, 0, tmp, 0, segmentCount); - invalidOffsets = tmp; - } - return new String(newChars, 0, Math.min(charCount + segmentCount, newChars.length)); -} - -/** - * Returns the line spacing of the receiver. - * - * @return the line spacing - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getSpacing () { - checkLayout(); - return spacing; -} - -/** - * Gets the style of the receiver at the specified character offset. - * - * @param offset the text offset - * @return the style or <code>null</code> if not set - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the character offset is out of range</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public TextStyle getStyle (int offset) { - checkLayout(); - int length = text.length(); - if (!(0 <= offset && offset < length)) SWT.error(SWT.ERROR_INVALID_RANGE); - for (int i=1; i<styles.length; i++) { - StyleItem item = styles[i]; - if (item.start > offset) { - return styles[i - 1].style; - } - } - return null; -} - -/** - * Gets all styles of the receiver. - * - * @return the styles - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #getRanges() - * - * @since 3.2 - */ -public TextStyle[] getStyles () { - checkLayout(); - TextStyle[] result = new TextStyle[styles.length]; - int count = 0; - for (int i=0; i<styles.length; i++) { - if (styles[i].style != null) { - result[count++] = styles[i].style; - } - } - if (count != result.length) { - TextStyle[] newResult = new TextStyle[count]; - System.arraycopy(result, 0, newResult, 0, count); - result = newResult; - } - return result; -} - -/** - * Returns the tab list of the receiver. - * - * @return the tab list - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int[] getTabs() { - checkLayout(); - return tabs; -} - -/** - * Gets the receiver's text, which will be an empty - * string if it has never been set. - * - * @return the receiver's text - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public String getText () { - checkLayout (); - return text; -} - -/** - * Returns the width of the receiver. - * - * @return the width - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public int getWidth () { - checkLayout(); - return wrapWidth; -} - -/** - * Returns <code>true</code> if the text layout has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the text layout. - * When a text layout has been disposed, it is an error to - * invoke any other method using the text layout. - * </p> - * - * @return <code>true</code> when the text layout is disposed and <code>false</code> otherwise - */ -public boolean isDisposed () { - return device == null; -} - -/* - * Returns true if the underline style is supported natively - */ -boolean isUnderlineSupported (TextStyle style) { - if (style != null && style.underline) { - int uStyle = style.underlineStyle; - return uStyle == SWT.UNDERLINE_SINGLE || uStyle == SWT.UNDERLINE_DOUBLE || uStyle == SWT.UNDERLINE_LINK || uStyle == UNDERLINE_THICK; - } - return false; -} - -/** - * Sets the text alignment for the receiver. The alignment controls - * how a line of text is positioned horizontally. The argument should - * be one of <code>SWT.LEFT</code>, <code>SWT.RIGHT</code> or <code>SWT.CENTER</code>. - * <p> - * The default alignment is <code>SWT.LEFT</code>. Note that the receiver's - * width must be set in order to use <code>SWT.RIGHT</code> or <code>SWT.CENTER</code> - * alignment. - * </p> - * - * @param alignment the new alignment - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setWidth(int) - */ -public void setAlignment (int alignment) { - checkLayout(); - int mask = SWT.LEFT | SWT.CENTER | SWT.RIGHT; - alignment &= mask; - if (alignment == 0) return; - if ((alignment & SWT.LEFT) != 0) alignment = SWT.LEFT; - if ((alignment & SWT.RIGHT) != 0) alignment = SWT.RIGHT; - if (this.alignment == alignment) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.alignment = alignment; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the ascent of the receiver. The ascent is distance in pixels - * from the baseline to the top of the line and it is applied to all - * lines. The default value is <code>-1</code> which means that the - * ascent is calculated from the line fonts. - * - * @param ascent the new ascent - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the ascent is less than <code>-1</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setDescent(int) - * @see #getLineMetrics(int) - */ -public void setAscent (int ascent) { - checkLayout (); - if (ascent < -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (this.ascent == ascent) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.ascent = ascent; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the descent of the receiver. The descent is distance in pixels - * from the baseline to the bottom of the line and it is applied to all - * lines. The default value is <code>-1</code> which means that the - * descent is calculated from the line fonts. - * - * @param descent the new descent - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the descent is less than <code>-1</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setAscent(int) - * @see #getLineMetrics(int) - */ -public void setDescent (int descent) { - checkLayout (); - if (descent < -1) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (this.descent == descent) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.descent = descent; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the default font which will be used by the receiver - * to draw and measure text. If the - * argument is null, then a default font appropriate - * for the platform will be used instead. Note that a text - * style can override the default font. - * - * @param font the new font for the receiver, or null to indicate a default font - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the font has been disposed</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setFont (Font font) { - checkLayout (); - if (font != null && font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - Font oldFont = this.font; - if (oldFont == font) return; - this.font = font; - if (oldFont != null && oldFont.equals(font)) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the indent of the receiver. This indent it applied of the first line of - * each paragraph. - * - * @param indent new indent - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.2 - */ -public void setIndent (int indent) { - checkLayout (); - if (indent < 0) return; - if (this.indent == indent) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.indent = indent; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the justification of the receiver. Note that the receiver's - * width must be set in order to use justification. - * - * @param justify new justify - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.2 - */ -public void setJustify (boolean justify) { - checkLayout (); - if (justify == this.justify) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.justify = justify; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the orientation of the receiver, which must be one - * of <code>SWT.LEFT_TO_RIGHT</code> or <code>SWT.RIGHT_TO_LEFT</code>. - * - * @param orientation new orientation style - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setOrientation(int orientation) { - checkLayout(); - int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; - orientation &= mask; - if (orientation == 0) return; - if ((orientation & SWT.LEFT_TO_RIGHT) != 0) orientation = SWT.LEFT_TO_RIGHT; - if (this.orientation == orientation) return; - this.orientation = orientation; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the offsets of the receiver's text segments. Text segments are used to - * override the default behaviour of the bidirectional algorithm. - * Bidirectional reordering can happen within a text segment but not - * between two adjacent segments. - * <p> - * Each text segment is determined by two consecutive offsets in the - * <code>segments</code> arrays. The first element of the array should - * always be zero and the last one should always be equals to length of - * the text. - * </p> - * - * @param segments the text segments offset - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setSegments(int[] segments) { - checkLayout(); - if (this.segments == null && segments == null) return; - if (this.segments != null && segments !=null) { - if (this.segments.length == segments.length) { - int i; - for (i = 0; i <segments.length; i++) { - if (this.segments[i] != segments[i]) break; - } - if (i == segments.length) return; - } - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.segments = segments; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the line spacing of the receiver. The line spacing - * is the space left between lines. - * - * @param spacing the new line spacing - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the spacing is negative</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setSpacing (int spacing) { - checkLayout(); - if (spacing < 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (this.spacing == spacing) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.spacing = spacing; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the style of the receiver for the specified range. Styles previously - * set for that range will be overwritten. The start and end offsets are - * inclusive and will be clamped if out of range. - * - * @param style the style - * @param start the start offset - * @param end the end offset - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setStyle (TextStyle style, int start, int end) { - checkLayout(); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - int length = text.length(); - if (length == 0) return; - if (start > end) return; - start = Math.min(Math.max(0, start), length - 1); - end = Math.min(Math.max(0, end), length - 1); - int low = -1; - int high = styles.length; - while (high - low > 1) { - int index = (high + low) / 2; - if (styles[index + 1].start > start) { - high = index; - } else { - low = index; - } - } - if (0 <= high && high < styles.length) { - StyleItem item = styles[high]; - if (item.start == start && styles[high + 1].start - 1 == end) { - if (style == null) { - if (item.style == null) return; - } else { - if (style.equals(item.style)) return; - } - } - } - freeRuns(); - int modifyStart = high; - int modifyEnd = modifyStart; - while (modifyEnd < styles.length) { - if (styles[modifyEnd + 1].start > end) break; - modifyEnd++; - } - if (modifyStart == modifyEnd) { - int styleStart = styles[modifyStart].start; - int styleEnd = styles[modifyEnd + 1].start - 1; - if (styleStart == start && styleEnd == end) { - styles[modifyStart].style = style; - return; - } - if (styleStart != start && styleEnd != end) { - StyleItem[] newStyles = new StyleItem[styles.length + 2]; - System.arraycopy(styles, 0, newStyles, 0, modifyStart + 1); - StyleItem item = new StyleItem(); - item.start = start; - item.style = style; - newStyles[modifyStart + 1] = item; - item = new StyleItem(); - item.start = end + 1; - item.style = styles[modifyStart].style; - newStyles[modifyStart + 2] = item; - System.arraycopy(styles, modifyEnd + 1, newStyles, modifyEnd + 3, styles.length - modifyEnd - 1); - styles = newStyles; - return; - } - } - if (start == styles[modifyStart].start) modifyStart--; - if (end == styles[modifyEnd + 1].start - 1) modifyEnd++; - int newLength = styles.length + 1 - (modifyEnd - modifyStart - 1); - StyleItem[] newStyles = new StyleItem[newLength]; - System.arraycopy(styles, 0, newStyles, 0, modifyStart + 1); - StyleItem item = new StyleItem(); - item.start = start; - item.style = style; - newStyles[modifyStart + 1] = item; - styles[modifyEnd].start = end + 1; - System.arraycopy(styles, modifyEnd, newStyles, modifyStart + 2, styles.length - modifyEnd); - styles = newStyles; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the receiver's tab list. Each value in the tab list specifies - * the space in pixels from the origin of the text layout to the respective - * tab stop. The last tab stop width is repeated continuously. - * - * @param tabs the new tab list - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setTabs(int[] tabs) { - checkLayout(); - if (this.tabs == null && tabs == null) return; - if (this.tabs != null && tabs !=null) { - if (this.tabs.length == tabs.length) { - int i; - for (i = 0; i < tabs.length; i++) { - if (this.tabs[i] != tabs[i]) break; - } - if (i == tabs.length) return; - } - } - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.tabs = tabs; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the receiver's text. - *<p> - * Note: Setting the text also clears all the styles. This method - * returns without doing anything if the new text is the same as - * the current text. - * </p> - * - * @param text the new text - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the text is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setText (String text) { - checkLayout (); - if (text == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (text.equals(this.text)) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.text = text; - styles = new StyleItem[2]; - styles[0] = new StyleItem(); - styles[1] = new StyleItem(); - styles[styles.length - 1].start = text.length(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Sets the line width of the receiver, which determines how - * text should be wrapped and aligned. The default value is - * <code>-1</code> which means wrapping is disabled. - * - * @param width the new width - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_INVALID_ARGUMENT - if the width is <code>0</code> or less than <code>-1</code></li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @see #setAlignment(int) - */ -public void setWidth (int width) { - checkLayout(); - if (width < -1 || width == 0) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - if (this.wrapWidth == width) return; - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - freeRuns(); - this.wrapWidth = width; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString () { - if (isDisposed()) return "TextLayout {*DISPOSED*}"; - return "TextLayout {" + text + "}"; -} - -/* - * Translate a client offset to an internal offset - */ -int translateOffset (int offset) { - int length = text.length(); - if (length == 0) return offset; - if (invalidOffsets == null) return offset; - for (int i = 0; i < invalidOffsets.length; i++) { - if (offset < invalidOffsets[i]) break; - offset++; - } - return offset; -} - -/* - * Translate an internal offset to a client offset - */ -int untranslateOffset (int offset) { - int length = text.length(); - if (length == 0) return offset; - if (invalidOffsets == null) return offset; - for (int i = 0; i < invalidOffsets.length; i++) { - if (offset == invalidOffsets[i]) { - offset++; - continue; - } - if (offset < invalidOffsets[i]) { - return offset - i; - } - } - return offset - invalidOffsets.length; -} - -} diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java deleted file mode 100755 index b4eee32e72..0000000000 --- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/graphics/Transform.java +++ /dev/null @@ -1,477 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2008 IBM 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.swt.graphics; - -import org.eclipse.swt.*; -import org.eclipse.swt.internal.cocoa.*; - -/** - * Instances of this class represent transformation matrices for - * points expressed as (x, y) pairs of floating point numbers. - * <p> - * Application code must explicitly invoke the <code>Transform.dispose()</code> - * method to release the operating system resources managed by each instance - * when those instances are no longer required. - * </p> - * <p> - * This class requires the operating system's advanced graphics subsystem - * which may not be available on some platforms. - * </p> - * - * @see <a href="http://www.eclipse.org/swt/examples.php">SWT Example: GraphicsExample</a> - * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> - * - * @since 3.1 - */ -public class Transform extends Resource { - /** - * the OS resource for the Transform - * (Warning: This field is platform dependent) - * <p> - * <b>IMPORTANT:</b> This field is <em>not</em> part of the SWT - * public API. It is marked public only so that it can be shared - * within the packages provided by SWT. It is not available on all - * platforms and should never be accessed from application code. - * </p> - */ - public NSAffineTransform handle; - -/** - * Constructs a new identity Transform. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the Transform - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Transform (Device device) { - this(device, 1, 0, 0, 1, 0, 0); -} - -/** - * Constructs a new Transform given an array of elements that represent the - * matrix that describes the transformation. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the Transform - * @param elements an array of floats that describe the transformation matrix - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device, or the elements array is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the elements array is too small to hold the matrix values</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Transform(Device device, float[] elements) { - this (device, checkTransform(elements)[0], elements[1], elements[2], elements[3], elements[4], elements[5]); -} - -/** - * Constructs a new Transform given all of the elements that represent the - * matrix that describes the transformation. - * <p> - * This operation requires the operating system's advanced - * graphics subsystem which may not be available on some - * platforms. - * </p> - * - * @param device the device on which to allocate the Transform - * @param m11 the first element of the first row of the matrix - * @param m12 the second element of the first row of the matrix - * @param m21 the first element of the second row of the matrix - * @param m22 the second element of the second row of the matrix - * @param dx the third element of the first row of the matrix - * @param dy the third element of the second row of the matrix - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_NO_GRAPHICS_LIBRARY - if advanced graphics are not available</li> - * </ul> - * @exception SWTError <ul> - * <li>ERROR_NO_HANDLES if a handle for the Transform could not be obtained</li> - * </ul> - * - * @see #dispose() - */ -public Transform (Device device, float m11, float m12, float m21, float m22, float dx, float dy) { - super(device); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle = NSAffineTransform.transform(); - if (handle == null) SWT.error(SWT.ERROR_NO_HANDLES); - handle.retain(); - setElements(m11, m12, m21, m22, dx, dy); - init(); - } finally { - if (pool != null) pool.release(); - } -} - -static float[] checkTransform(float[] elements) { - if (elements == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (elements.length < 6) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - return elements; -} - -void destroy() { - handle.release(); - handle = null; -} - -/** - * Fills the parameter with the values of the transformation matrix - * that the receiver represents, in the order {m11, m12, m21, m22, dx, dy}. - * - * @param elements array to hold the matrix values - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter is too small to hold the matrix values</li> - * </ul> - */ -public void getElements(float[] elements) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (elements == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (elements.length < 6) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = handle.transformStruct(); - elements[0] = (float)/*64*/struct.m11; - elements[1] = (float)/*64*/struct.m12; - elements[2] = (float)/*64*/struct.m21; - elements[3] = (float)/*64*/struct.m22; - elements[4] = (float)/*64*/struct.tX; - elements[5] = (float)/*64*/struct.tY; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver such that the matrix it represents becomes the - * identity matrix. - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.4 - */ -public void identity() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = new NSAffineTransformStruct(); - struct.m11 = 1; - struct.m22 = 1; - handle.setTransformStruct(struct); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver such that the matrix it represents becomes - * the mathematical inverse of the matrix it previously represented. - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_CANNOT_INVERT_MATRIX - if the matrix is not invertible</li> - * </ul> - */ -public void invert() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = handle.transformStruct(); - if ((struct.m11 * struct.m22 - struct.m12 * struct.m21) == 0) { - SWT.error(SWT.ERROR_CANNOT_INVERT_MATRIX); - } - handle.invert(); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns <code>true</code> if the Transform has been disposed, - * and <code>false</code> otherwise. - * <p> - * This method gets the dispose state for the Transform. - * When a Transform has been disposed, it is an error to - * invoke any other method using the Transform. - * - * @return <code>true</code> when the Transform is disposed, and <code>false</code> otherwise - */ -public boolean isDisposed() { - return handle == null; -} - -/** - * Returns <code>true</code> if the Transform represents the identity matrix - * and false otherwise. - * - * @return <code>true</code> if the receiver is an identity Transform, and <code>false</code> otherwise - */ -public boolean isIdentity() { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = handle.transformStruct(); - return struct.m11 == 1 && struct.m12 == 0 && struct.m21 == 0 && struct.m22 == 1 && struct.tX == 0 && struct.tY == 0; - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver such that the matrix it represents becomes the - * the result of multiplying the matrix it previously represented by the - * argument. - * - * @param matrix the matrix to multiply the receiver by - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the parameter is null</li> - * <li>ERROR_INVALID_ARGUMENT - if the parameter has been disposed</li> - * </ul> - */ -public void multiply(Transform matrix) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (matrix == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - if (matrix.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.prependTransform(matrix.handle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver so that it represents a transformation that is - * equivalent to its previous transformation rotated by the specified angle. - * The angle is specified in degrees and for the identity transform 0 degrees - * is at the 3 o'clock position. A positive value indicates a clockwise rotation - * while a negative value indicates a counter-clockwise rotation. - * - * @param angle the angle to rotate the transformation by - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void rotate(float angle) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.rotateByDegrees(angle); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver so that it represents a transformation that is - * equivalent to its previous transformation scaled by (scaleX, scaleY). - * - * @param scaleX the amount to scale in the X direction - * @param scaleY the amount to scale in the Y direction - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void scale(float scaleX, float scaleY) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.scaleXBy(scaleX, scaleY); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver to represent a new transformation given all of - * the elements that represent the matrix that describes that transformation. - * - * @param m11 the first element of the first row of the matrix - * @param m12 the second element of the first row of the matrix - * @param m21 the first element of the second row of the matrix - * @param m22 the second element of the second row of the matrix - * @param dx the third element of the first row of the matrix - * @param dy the third element of the second row of the matrix - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void setElements(float m11, float m12, float m21, float m22, float dx, float dy) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = new NSAffineTransformStruct(); - struct.m11 = m11; - struct.m12 = m12; - struct.m21 = m21; - struct.m22 = m22; - struct.tX = dx; - struct.tY = dy; - handle.setTransformStruct(struct); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver so that it represents a transformation that is - * equivalent to its previous transformation sheared by (shearX, shearY). - * - * @param shearX the shear factor in the X direction - * @param shearY the shear factor in the Y direction - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - * - * @since 3.4 - */ -public void shear(float shearX, float shearY) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSAffineTransformStruct struct = new NSAffineTransformStruct(); - struct.m11 = 1; - struct.m12 = shearX; - struct.m21 = shearY; - struct.m22 = 1; - NSAffineTransform matrix = NSAffineTransform.transform(); - matrix.setTransformStruct(struct); - handle.prependTransform(matrix); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Given an array containing points described by alternating x and y values, - * modify that array such that each point has been replaced with the result of - * applying the transformation represented by the receiver to that point. - * - * @param pointArray an array of alternating x and y values to be transformed - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the point array is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void transform(float[] pointArray) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - if (pointArray == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - NSPoint point = new NSPoint(); - int length = pointArray.length / 2; - for (int i = 0, j = 0; i < length; i++, j += 2) { - point.x = pointArray[j]; - point.y = pointArray[j + 1]; - point = handle.transformPoint(point); - pointArray[j] = (float)/*64*/point.x; - pointArray[j + 1] = (float)/*64*/point.y; - } - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Modifies the receiver so that it represents a transformation that is - * equivalent to its previous transformation translated by (offsetX, offsetY). - * - * @param offsetX the distance to translate in the X direction - * @param offsetY the distance to translate in the Y direction - * - * @exception SWTException <ul> - * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> - * </ul> - */ -public void translate(float offsetX, float offsetY) { - if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED); - NSAutoreleasePool pool = null; - if (!NSThread.isMainThread()) pool = (NSAutoreleasePool) new NSAutoreleasePool().alloc().init(); - try { - handle.translateXBy(offsetX, offsetY); - } finally { - if (pool != null) pool.release(); - } -} - -/** - * Returns a string containing a concise, human-readable - * description of the receiver. - * - * @return a string representation of the receiver - */ -public String toString() { - if (isDisposed()) return "Transform {*DISPOSED*}"; - float[] elements = new float[6]; - getElements(elements); - return "Transform {" + elements [0] + ", " + elements [1] + ", " +elements [2] + ", " +elements [3] + ", " +elements [4] + ", " +elements [5] + "}"; -} - -} |