Mercurial > projects > dwt-mac
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 '&' 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 + * '&' can be escaped by doubling it in the string, causing + * a single '&' 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); +} + +}