Mercurial > projects > dwt-mac
diff dwt/widgets/FontDialog.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/FontDialog.d Sat Aug 09 17:00:02 2008 +0200 @@ -0,0 +1,293 @@ +/******************************************************************************* + * 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 + *******************************************************************************/ +module dwt.widgets.FontDialog; + +import dwt.dwthelper.utils; + + +import dwt.DWT; +import dwt.DWTException; +import dwt.graphics.Font; +import dwt.graphics.FontData; +import dwt.graphics.PaletteData; +import dwt.graphics.RGB; +import dwt.internal.cocoa.NSApplication; +import dwt.internal.cocoa.NSFont; +import dwt.internal.cocoa.NSFontManager; +import dwt.internal.cocoa.NSFontPanel; +import dwt.internal.cocoa.NSString; +import dwt.internal.cocoa.OS; +import dwt.internal.cocoa.SWTPanelDelegate; + +/** + * Instances of this class allow the user to select a font + * from all available fonts in the system. + * <dl> + * <dt><b>Styles:</b></dt> + * <dd>(none)</dd> + * <dt><b>Events:</b></dt> + * <dd>(none)</dd> + * </dl> + * <p> + * IMPORTANT: This class is intended to be subclassed <em>only</em> + * within the DWT implementation. + * </p> + */ +public class FontDialog extends Dialog { + FontData fontData; + RGB rgb; + bool open; + int fontID, fontSize; + +/** + * Constructs a new instance of this class given only its parent. + * + * @param parent a shell which will be the parent of the new instance + * + * @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> + */ +public FontDialog (Shell parent) { + this (parent, DWT.APPLICATION_MODAL); +} + +/** + * 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 shell which will be the parent of the new instance + * @param style the style of dialog 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> + */ +public FontDialog (Shell parent, int style) { + super (parent, style); + checkSubclass (); +} + +void changeFont(int arg0) { +} + +/** + * Returns a FontData object describing the font that was + * selected in the dialog, or null if none is available. + * + * @return the FontData for the selected font, or null + * @deprecated use #getFontList () + */ +public FontData getFontData () { + return fontData; +} + +/** + * Returns a FontData set describing the font that was + * selected in the dialog, or null if none is available. + * + * @return the FontData for the selected font, or null + * @since 2.1.1 + */ +public FontData [] getFontList () { + if (fontData is null) return null; + FontData [] result = new FontData [1]; + result [0] = fontData; + return result; +} + +/** + * Returns an RGB describing the color that was selected + * in the dialog, or null if none is available. + * + * @return the RGB value for the selected color, or null + * + * @see PaletteData#getRGBs + * + * @since 2.1 + */ +public RGB getRGB () { + return rgb; +} + +//int fontProc (int nextHandler, int theEvent, int userData) { +// int kind = OS.GetEventKind (theEvent); +// switch (kind) { +// case OS.kEventFontPanelClosed: +// open = false; +// break; +// case OS.kEventFontSelection: +// int [] fontID = new int [1]; +// if (OS.GetEventParameter (theEvent, OS.kEventParamATSUFontID, OS.typeUInt32, null, 4, null, fontID) is OS.noErr) { +// this.fontID = fontID [0]; +// } +// int [] fontSize = new int [1]; +// if (OS.GetEventParameter (theEvent, OS.kEventParamATSUFontSize, OS.typeFixed, null, 4, null, fontSize) is OS.noErr) { +// this.fontSize = fontSize [0]; +// } +// RGBColor color = new RGBColor (); +// int [] actualSize = new int [1]; +// if (OS.GetEventParameter (theEvent, OS.kEventParamFontColor, OS.typeRGBColor, null, RGBColor.sizeof, actualSize, color) is OS.noErr) { +// int red = (color.red >> 8) & 0xFF; +// int green = (color.green >> 8) & 0xFF; +// int blue = (color.blue >> 8) & 0xFF; +// rgb = new RGB (red, green, blue); +// } else { +// int [] dict = new int [1]; +// if (OS.GetEventParameter (theEvent, OS.kEventParamDictionary, OS.typeCFDictionaryRef, null, 4, actualSize, dict) is OS.noErr) { +// int [] attrib = new int [1]; +// if (OS.CFDictionaryGetValueIfPresent (dict [0], OS.kFontPanelAttributesKey (), attrib)) { +// int [] tags = new int [1]; +// int [] sizes = new int [1]; +// int [] values = new int [1]; +// if (OS.CFDictionaryGetValueIfPresent (attrib [0], OS.kFontPanelAttributeTagsKey (), tags) && +// OS.CFDictionaryGetValueIfPresent (attrib [0], OS.kFontPanelAttributeSizesKey (), sizes) && +// OS.CFDictionaryGetValueIfPresent (attrib [0], OS.kFontPanelAttributeValuesKey (), values) +// ) { +// int count = OS.CFDataGetLength (tags [0]) / 4; +// int tagPtr = OS.CFDataGetBytePtr (tags[0]); +// int sizePtr = OS.CFDataGetBytePtr (sizes [0]); +// int [] tag = new int [1]; +// int [] size = new int [1]; +// int valueOffset = 0; +// for (int i = 0 ; i < count ; i++) { +// OS.memmove (tag, tagPtr + (i * 4), 4); +// OS.memmove (size, sizePtr + (i * 4), 4); +// if (tag [0] is OS.kATSUColorTag && size[0] is RGBColor.sizeof) { +// int valuePtr = OS.CFDataGetBytePtr (values [0]); +// OS.memmove (color, valuePtr + valueOffset, RGBColor.sizeof); +// int red = (color.red >> 8) & 0xFF; +// int green = (color.green >> 8) & 0xFF; +// int blue = (color.blue >> 8) & 0xFF; +// rgb = new RGB (red, green, blue); +// break ; +// } +// valueOffset = size[0]; +// } +// } +// } +// } +// } +// break; +// } +// return OS.noErr; +//} + +/** + * Makes the dialog visible and brings it to the front + * of the display. + * + * @return a FontData object describing the font that was selected, + * or null if the dialog was cancelled or an error occurred + * + * @exception DWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the dialog has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the dialog</li> + * </ul> + */ +public FontData open () { + Display display = parent !is null ? parent.display : Display.getCurrent (); + + NSFontPanel panel = NSFontPanel.sharedFontPanel(); + panel.setTitle(NSString.stringWith(title !is null ? title : "")); + if (fontData !is null) { + Font font = new Font(display, fontData); + NSFontManager.sharedFontManager().setSelectedFont(font.handle, false); + font.dispose(); + } + SWTPanelDelegate delegate = (SWTPanelDelegate)new SWTPanelDelegate().alloc().init(); + int jniRef = OS.NewGlobalRef(this); + if (jniRef is 0) DWT.error(DWT.ERROR_NO_HANDLES); + delegate.setTag(jniRef); + panel.setDelegate(delegate); + fontData = null; + panel.orderFront(null); + NSApplication.sharedApplication().runModalForWindow_(panel); + panel.setDelegate(null); + delegate.release(); + OS.DeleteGlobalRef(jniRef); + NSFont font = NSFontManager.sharedFontManager().selectedFont(); + if (font !is null) { + //TODO - this does work + fontData = Font.cocoa_new(display, font).getFontData()[0]; + } + return fontData; +} + +/** + * Sets a FontData object describing the font to be + * selected by default in the dialog, or null to let + * the platform choose one. + * + * @param fontData the FontData to use initially, or null + * @deprecated use #setFontList (FontData []) + */ +public void setFontData (FontData fontData) { + this.fontData = fontData; +} + +/** + * Sets the set of FontData objects describing the font to + * be selected by default in the dialog, or null to let + * the platform choose one. + * + * @param fontData the set of FontData objects to use initially, or null + * to let the platform select a default when open() is called + * + * @see Font#getFontData + * + * @since 2.1.1 + */ +public void setFontList (FontData [] fontData) { + if (fontData !is null && fontData.length > 0) { + this.fontData = fontData [0]; + } else { + this.fontData = null; + } +} + +/** + * Sets the RGB describing the color to be selected by default + * in the dialog, or null to let the platform choose one. + * + * @param rgb the RGB value to use initially, or null to let + * the platform select a default when open() is called + * + * @see PaletteData#getRGBs + * + * @since 2.1 + */ +public void setRGB (RGB rgb) { + this.rgb = rgb; +} + +void windowWillClose(int sender) { + NSApplication.sharedApplication().stop(null); +} + +}