diff dwt/widgets/Label.d @ 0:380af2bdd8e5

Upload of whole dwt tree
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Sat, 09 Aug 2008 17:00:02 +0200
parents
children 649b8e223d5a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwt/widgets/Label.d	Sat Aug 09 17:00:02 2008 +0200
@@ -0,0 +1,393 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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
+ *******************************************************************************/
+module dwt.widgets.Label;
+
+import dwt.dwthelper.utils;
+
+
+import dwt.DWT;
+import dwt.DWTException;
+import dwt.graphics.Image;
+import dwt.graphics.Point;
+import dwt.graphics.Rectangle;
+import dwt.internal.cocoa.NSAttributedString;
+import dwt.internal.cocoa.NSBox;
+import dwt.internal.cocoa.NSCell;
+import dwt.internal.cocoa.NSColor;
+import dwt.internal.cocoa.NSImageView;
+import dwt.internal.cocoa.NSMutableDictionary;
+import dwt.internal.cocoa.NSRect;
+import dwt.internal.cocoa.NSString;
+import dwt.internal.cocoa.NSTextField;
+import dwt.internal.cocoa.NSTextFieldCell;
+import dwt.internal.cocoa.OS;
+import dwt.internal.cocoa.SWTBox;
+import dwt.internal.cocoa.SWTImageView;
+import dwt.internal.cocoa.SWTTextField;
+
+/**
+ * Instances of this class represent a non-selectable
+ * user interface object that displays a string or image.
+ * When SEPARATOR is specified, displays a single
+ * vertical or horizontal line.
+ * <dl>
+ * <dt><b>Styles:</b></dt>
+ * <dd>SEPARATOR, HORIZONTAL, VERTICAL</dd>
+ * <dd>SHADOW_IN, SHADOW_OUT, SHADOW_NONE</dd>
+ * <dd>CENTER, LEFT, RIGHT, WRAP</dd>
+ * <dt><b>Events:</b></dt>
+ * <dd>(none)</dd>
+ * </dl>
+ * <p>
+ * Note: Only one of SHADOW_IN, SHADOW_OUT and SHADOW_NONE may be specified.
+ * SHADOW_NONE is a HINT. Only one of HORIZONTAL and VERTICAL may be specified.
+ * Only one of CENTER, LEFT and RIGHT may be specified.
+ * </p><p>
+ * IMPORTANT: This class is intended to be subclassed <em>only</em>
+ * within the DWT implementation.
+ * </p>
+ */
+public class Label extends Control {
+    String text = "";
+    Image image;
+    bool isImage;
+    NSTextField textView;
+    NSImageView imageView;
+
+/**
+ * Constructs a new instance of this class given its parent
+ * and a style value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in
+ * class <code>DWT</code> which is applicable to instances of this
+ * class, or must be built by <em>bitwise OR</em>'ing together 
+ * (that is, using the <code>int</code> "|" operator) two or more
+ * of those <code>DWT</code> style constants. The class description
+ * lists the style constants that are applicable to the class.
+ * Style bits are also inherited from superclasses.
+ * </p>
+ *
+ * @param parent a composite control which will be the parent of the new instance (cannot be null)
+ * @param style the style of control to construct
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception DWTException <ul>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
+ *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
+ * </ul>
+ *
+ * @see DWT#SEPARATOR
+ * @see DWT#HORIZONTAL
+ * @see DWT#VERTICAL
+ * @see DWT#SHADOW_IN
+ * @see DWT#SHADOW_OUT
+ * @see DWT#SHADOW_NONE
+ * @see DWT#CENTER
+ * @see DWT#LEFT
+ * @see DWT#RIGHT
+ * @see DWT#WRAP
+ * @see Widget#checkSubclass
+ * @see Widget#getStyle
+ */
+public Label (Composite parent, int style) {
+    super (parent, checkStyle (style));
+}
+
+static int checkStyle (int style) {
+    style |= DWT.NO_FOCUS;
+    if ((style & DWT.SEPARATOR) !is 0) {
+        style = checkBits (style, DWT.VERTICAL, DWT.HORIZONTAL, 0, 0, 0, 0);
+        return checkBits (style, DWT.SHADOW_OUT, DWT.SHADOW_IN, DWT.SHADOW_NONE, 0, 0, 0);
+    } 
+    return checkBits (style, DWT.LEFT, DWT.CENTER, DWT.RIGHT, 0, 0, 0);
+}
+
+public Point computeSize (int wHint, int hHint, bool changed) {
+    checkWidget();
+    int width = 0, height = 0;
+    if ((style & DWT.SEPARATOR) !is 0) {
+        if ((style & DWT.HORIZONTAL) !is 0) {
+            width = DEFAULT_WIDTH;
+            height = 3;
+        } else {
+            width = 3;
+            height = DEFAULT_HEIGHT;
+        }
+    } else {
+        if (image !is null && isImage) {
+            Rectangle bounds = image.getBounds();
+            width = bounds.width;
+            height = bounds.height;
+        } else {
+            NSRect oldRect = textView.frame();
+            textView.sizeToFit();
+            NSRect newRect = textView.frame();
+            textView.setFrame (oldRect);
+            width = (int)newRect.width;
+            height = (int)newRect.height;
+        }
+    }
+    if (wHint !is DWT.DEFAULT) width = wHint;
+    if (hHint !is DWT.DEFAULT) height = hHint;
+    return new Point (width, height);
+}
+
+void createHandle () {
+    SWTBox widget = (SWTBox)new SWTBox().alloc();
+    widget.initWithFrame(new NSRect());
+    widget.setTag(jniRef);
+    widget.setTitle(NSString.stringWith(""));
+    if ((style & DWT.SEPARATOR) !is 0) {
+        widget.setBoxType(OS.NSBoxSeparator);
+    } else {
+        widget.setBorderType(OS.NSNoBorder);
+
+        NSImageView imageWidget = (NSImageView)new SWTImageView().alloc();
+        imageWidget.initWithFrame(new NSRect());
+        imageWidget.setTag(jniRef);
+        
+        SWTTextField textWidget = (SWTTextField)new SWTTextField().alloc();
+        textWidget.initWithFrame(new NSRect());
+        textWidget.setBordered(false);
+        textWidget.setEditable(false);
+        textWidget.setDrawsBackground(false);
+        textWidget.setTag(jniRef);
+        if ((style & DWT.WRAP) !is 0) {
+            NSTextFieldCell cell = new NSTextFieldCell(textWidget.cell());
+            cell.setWraps(true);
+        }
+        
+        widget.addSubview_(imageWidget);
+        widget.addSubview_(textWidget);
+        widget.setContentView(textWidget);
+        
+        imageView = imageWidget;
+        textView = textWidget;
+        _setAlignment();
+    }
+    view = widget;
+    parent.contentView().addSubview_(widget);
+}
+
+NSAttributedString createString() {
+    NSMutableDictionary dict = NSMutableDictionary.dictionaryWithCapacity(4);
+    if (foreground !is null) {
+        NSColor color = NSColor.colorWithDeviceRed(foreground.handle[0], foreground.handle[1], foreground.handle[2], 1);
+        dict.setObject(color, OS.NSForegroundColorAttributeName());
+    }
+    if (font !is null) {
+        dict.setObject(font.handle, OS.NSFontAttributeName());
+    }
+    char [] chars = new char [text.length ()];
+    text.getChars (0, chars.length, chars, 0);
+    int length = fixMnemonic (chars);
+
+    NSString str = NSString.stringWithCharacters(chars, length);
+    NSAttributedString attribStr = ((NSAttributedString)new NSAttributedString().alloc()).initWithString_attributes_(str, dict);
+    attribStr.autorelease();
+    return attribStr;
+}
+
+/**
+ * Returns a value which describes the position of the
+ * text or image in the receiver. The value will be one of
+ * <code>LEFT</code>, <code>RIGHT</code> or <code>CENTER</code>
+ * unless the receiver is a <code>SEPARATOR</code> label, in 
+ * which case, <code>NONE</code> is returned.
+ *
+ * @return the alignment 
+ *
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public int getAlignment () {
+    checkWidget();
+    if ((style & DWT.SEPARATOR) !is 0) return DWT.LEFT;
+    if ((style & DWT.CENTER) !is 0) return DWT.CENTER;
+    if ((style & DWT.RIGHT) !is 0) return DWT.RIGHT;
+    return DWT.LEFT;
+}
+
+/**
+ * Returns the receiver's image if it has one, or null
+ * if it does not.
+ *
+ * @return the receiver's image
+ *
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public Image getImage () {
+    checkWidget();
+    return image;
+}
+
+String getNameText () {
+    return getText ();
+}
+
+/**
+ * Returns the receiver's text, which will be an empty
+ * string if it has never been set or if the receiver is
+ * a <code>SEPARATOR</code> label.
+ *
+ * @return the receiver's text
+ *
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public String getText () {
+    checkWidget();
+    if ((style & DWT.SEPARATOR) !is 0) return "";
+    return text;
+}
+
+/**
+ * Controls how text and images will be displayed in the receiver.
+ * The argument should be one of <code>LEFT</code>, <code>RIGHT</code>
+ * or <code>CENTER</code>.  If the receiver is a <code>SEPARATOR</code>
+ * label, the argument is ignored and the alignment is not changed.
+ *
+ * @param alignment the new alignment 
+ *
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setAlignment (int alignment) {
+    checkWidget();
+    if ((style & DWT.SEPARATOR) !is 0) return;
+    if ((alignment & (DWT.LEFT | DWT.RIGHT | DWT.CENTER)) is 0) return;
+    style &= ~(DWT.LEFT | DWT.RIGHT | DWT.CENTER);
+    style |= alignment & (DWT.LEFT | DWT.RIGHT | DWT.CENTER);
+    _setAlignment();
+}
+
+void setBackground (float [] color) {
+    if ((style & DWT.SEPARATOR) !is 0) return;
+    textView.setDrawsBackground(color !is null);
+    if (color is null) return;
+    NSColor nsColor = NSColor.colorWithDeviceRed(color[0], color[1], color[2], 1);
+    NSTextFieldCell cell = new NSTextFieldCell(textView.cell());
+    cell.setBackgroundColor(nsColor);
+}
+
+void _setAlignment() {
+    if ((style & DWT.RIGHT) !is 0) {
+        textView.setAlignment(OS.NSRightTextAlignment);
+        imageView.setImageAlignment(OS.NSImageAlignRight);
+    }
+    if ((style & DWT.LEFT) !is 0) {
+        textView.setAlignment(OS.NSLeftTextAlignment);
+        imageView.setImageAlignment(OS.NSImageAlignLeft);
+    }
+    if ((style & DWT.CENTER) !is 0) {
+        textView.setAlignment(OS.NSCenterTextAlignment);
+        imageView.setImageAlignment(OS.NSImageAlignCenter);
+    }
+}
+
+int setBounds (int x, int y, int width, int height, bool move, bool resize) {
+    int result = super.setBounds(x, y, width, height, move, resize);
+    if ((result & RESIZED) !is 0) {
+        if (imageView !is null || textView !is null) {
+            NSRect rect = view.bounds();
+            imageView.setFrame(rect);
+            textView.setFrame(rect);
+        }
+    }
+    return result;
+}
+
+void setForeground (float [] color) {
+    if ((style & DWT.SEPARATOR) !is 0) return;
+    NSCell cell = new NSCell(textView.cell());
+    cell.setAttributedStringValue(createString());
+}
+
+bool setTabItemFocus () {
+    return false;
+}
+
+/**
+ * Sets the receiver's image to the argument, which may be
+ * null indicating that no image should be displayed.
+ *
+ * @param image the image to display on the receiver (may be null)
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> 
+ * </ul>
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setImage (Image image) {
+    checkWidget();
+    if ((style & DWT.SEPARATOR) !is 0) return;
+    if (image !is null && image.isDisposed ()) {
+        error (DWT.ERROR_INVALID_ARGUMENT);
+    }
+    this.image = image;
+    isImage = true;
+    imageView.setImage(image !is null ? image.handle : null);
+    ((NSBox)view).setContentView(imageView);
+}
+
+/**
+ * Sets the receiver's text.
+ * <p>
+ * This method sets the widget label.  The label may include
+ * the mnemonic character and line delimiters.
+ * </p>
+ * <p>
+ * Mnemonics are indicated by an '&amp;' that causes the next
+ * character to be the mnemonic.  When the user presses a
+ * key sequence that matches the mnemonic, focus is assigned
+ * to the control that follows the label. On most platforms,
+ * the mnemonic appears underlined but may be emphasised in a
+ * platform specific manner.  The mnemonic indicator character
+ * '&amp;' can be escaped by doubling it in the string, causing
+ * a single '&amp;' to be displayed.
+ * </p>
+ * 
+ * @param string the new text
+ *
+ * @exception IllegalArgumentException <ul>
+ *    <li>ERROR_NULL_ARGUMENT - if the text is null</li>
+ * </ul>
+ * @exception DWTException <ul>
+ *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
+ *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+ * </ul>
+ */
+public void setText (String string) {
+    checkWidget();
+    if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
+    if ((style & DWT.SEPARATOR) !is 0) return;
+    isImage = false;
+    text = string;
+    NSCell cell = new NSCell(textView.cell());
+    cell.setAttributedStringValue(createString());
+    ((NSBox)view).setContentView(textView);
+}
+
+}