# HG changeset patch # User Jacob Carlborg # Date 1229988924 -3600 # Node ID c74ba20de292a3408af06eb68176dd2501218394 # Parent 62202ce0039fb831c57e6a738d28096b3d84cb69 Fix: The application responds to events now diff -r 62202ce0039f -r c74ba20de292 dwt/DWT.d --- a/dwt/DWT.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/DWT.d Tue Dec 23 00:35:24 2008 +0100 @@ -3796,7 +3796,7 @@ } String message = findErrorText (code); - if (detail !is null) message += detail; + if (detail !is null) message ~= detail; switch (code) { /* Illegal Arguments (non-fatal) */ diff -r 62202ce0039f -r c74ba20de292 dwt/accessibility/Accessible.d --- a/dwt/accessibility/Accessible.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/accessibility/Accessible.d Tue Dec 23 00:35:24 2008 +0100 @@ -1041,7 +1041,7 @@ // The parameter is an NSNumber with the line number. NSNumber lineNumberObj = new NSNumber(parameter.id); int lineNumber = lineNumberObj.intValue(); - System.Out.println("Line number = " ~ Integer.toString(lineNumber)); + System.out_.println("Line number = " ~ Integer.toString(lineNumber)); AccessibleControlEvent event = new AccessibleControlEvent(this); event.childID = childID; event.result = null; diff -r 62202ce0039f -r c74ba20de292 dwt/accessibility/SWTAccessibleDelegate.d --- a/dwt/accessibility/SWTAccessibleDelegate.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/accessibility/SWTAccessibleDelegate.d Tue Dec 23 00:35:24 2008 +0100 @@ -171,7 +171,7 @@ void accessibilitySetValue_forAttribute(cocoa.id value, NSString attribute) { // This shouldn't be called! - System.Out.println("Ignoring attribute: " ~ attribute.getString()); + System.out_.println("Ignoring attribute: " ~ attribute.getString()); } static NSArray retainedAutoreleased(NSArray inObject) { diff -r 62202ce0039f -r c74ba20de292 dwt/dwthelper/FileInputStream.d --- a/dwt/dwthelper/FileInputStream.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/dwthelper/FileInputStream.d Tue Dec 23 00:35:24 2008 +0100 @@ -7,7 +7,16 @@ import dwt.dwthelper.File; import dwt.dwthelper.InputStream; -import tango.io.device.FileConduit; +version (LDC) +{ + import Tango = tango.io.device.File; + alias Tango.File FileConduit; +} + +else + import tango.io.device.FileConduit; + + import tango.io.protocol.Reader; import tango.core.Exception; import tango.text.convert.Format; diff -r 62202ce0039f -r c74ba20de292 dwt/dwthelper/ResourceBundle.d --- a/dwt/dwthelper/ResourceBundle.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/dwthelper/ResourceBundle.d Tue Dec 23 00:35:24 2008 +0100 @@ -9,7 +9,12 @@ import dwt.DWT; import dwt.dwthelper.utils; import dwt.dwthelper.utils : IOException; -import tango.io.File; + +version (LDC) + import tango.io.device.File; + +else + import tango.io.File; class ResourceBundle { @@ -128,8 +133,14 @@ } public static ResourceBundle getBundle( char[] name ){ try{ - scope f = new File(name); - return new ResourceBundle( cast(char[]) f.read() ); + version (LDC) + return new ResourceBundle( cast(char[]) File.read(name) ); + + else + { + scope f = new File(name); + return new ResourceBundle( cast(char[]) f.read() ); + } } catch( IOException e){ e.msg ~= " file:" ~ name; diff -r 62202ce0039f -r c74ba20de292 dwt/dwthelper/System.d --- a/dwt/dwthelper/System.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/dwthelper/System.d Tue Dec 23 00:35:24 2008 +0100 @@ -5,7 +5,16 @@ import tango.core.Exception; import tango.io.Stdout; -import tango.io.Print; + +version (LDC) +{ + import tango.io.stream.Format; + alias FormatOutput Print; +} + +else + import tango.io.Print; + import tango.stdc.stdlib : exit; import tango.time.Clock; @@ -89,10 +98,12 @@ } } -struct OutS +struct Out { + static Print!(char) delegate(char[] fmt,...) println; static Print!(char) delegate(char[] fmt,...) print; + static this () { println = &Stdout.formatln; @@ -104,6 +115,7 @@ { static Print!(char) delegate(char[] fmt,...) println; static Print!(char) delegate(char[] fmt,...) print; + static this () { println = &Stderr.formatln; @@ -165,6 +177,6 @@ } } - static OutS Out; + static Out out_; static Err err; } diff -r 62202ce0039f -r c74ba20de292 dwt/dwthelper/utils.d --- a/dwt/dwthelper/utils.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/dwthelper/utils.d Tue Dec 23 00:35:24 2008 +0100 @@ -9,7 +9,16 @@ public import tango.core.Exception : IllegalArgumentException, IOException, PlatformException; import tango.io.Stdout; -import tango.io.Print; + +version (LDC) +{ + import tango.io.stream.Format; + alias FormatOutput Print; +} + +else + import tango.io.Print; + import tango.stdc.stringz; static import tango.text.Util; static import tango.text.Text; @@ -816,6 +825,7 @@ void ExceptionPrintStackTrace( Exception e ){ ExceptionPrintStackTrace( e, Stderr ); } + void ExceptionPrintStackTrace( Exception e, Print!(char) print ){ Exception exception = e; while( exception !is null ){ diff -r 62202ce0039f -r c74ba20de292 dwt/graphics/Device.d --- a/dwt/graphics/Device.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/graphics/Device.d Tue Dec 23 00:35:24 2008 +0100 @@ -43,6 +43,7 @@ import dwt.graphics.GCData; import dwt.graphics.Point; import dwt.graphics.Rectangle; +import Carbon = dwt.internal.c.Carbon; import dwt.internal.objc.cocoa.Cocoa; import objc = dwt.internal.objc.runtime; diff -r 62202ce0039f -r c74ba20de292 dwt/graphics/Region.d --- a/dwt/graphics/Region.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/graphics/Region.d Tue Dec 23 00:35:24 2008 +0100 @@ -34,6 +34,7 @@ import dwt.graphics.Rectangle; import dwt.graphics.Resource; import Carbon = dwt.internal.c.Carbon; +import objc = dwt.internal.objc.runtime; /** * Instances of this class represent areas of an x-y coordinate diff -r 62202ce0039f -r c74ba20de292 dwt/internal/cocoa/NSBundle.d --- a/dwt/internal/cocoa/NSBundle.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/internal/cocoa/NSBundle.d Tue Dec 23 00:35:24 2008 +0100 @@ -13,7 +13,7 @@ *******************************************************************************/ module dwt.internal.cocoa.NSBundle; -import dwt.internal.cocoa.id; +import cocoa = dwt.internal.cocoa.id; import dwt.internal.cocoa.NSArray; import dwt.internal.cocoa.NSDictionary; import dwt.internal.cocoa.NSObject; diff -r 62202ce0039f -r c74ba20de292 dwt/internal/cocoa/NSEvent.d --- a/dwt/internal/cocoa/NSEvent.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/internal/cocoa/NSEvent.d Tue Dec 23 00:35:24 2008 +0100 @@ -92,7 +92,7 @@ } public NSEventType type() { - return cast(NSEventType) OS.objc_msgSend(this.id, OS.sel_type); + return cast(dwt.internal.objc.cocoa.Cocoa.NSEventType) OS.objc_msgSend(this.id, OS.sel_type); } public NSWindow window() { diff -r 62202ce0039f -r c74ba20de292 dwt/internal/cocoa/OS.d --- a/dwt/internal/cocoa/OS.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/internal/cocoa/OS.d Tue Dec 23 00:35:24 2008 +0100 @@ -2708,7 +2708,7 @@ public static const int NSAnimationNonblockingThreaded = 2; public static const int NSAnyEventMask = -1; public static const int NSAnyType = 0; -public static const int NSAppKitDefined = 13; +alias Cocoa.NSEventType.NSAppKitDefined NSAppKitDefined; public static const int NSAppKitDefinedMask = 8192; public static const int NSAppKitVersionNumber10_0 = 577; public static const int NSAppKitVersionNumber10_1 = 620; @@ -2857,7 +2857,7 @@ alias Cocoa.NSAlertStyle.NSCriticalAlertStyle NSCriticalAlertStyle; public static const int NSCriticalRequest = 0; public static const int NSCursorPointingDevice = 2; -public static const int NSCursorUpdate = 17; +alias Cocoa.NSEventType.NSCursorUpdate NSCursorUpdate; public static const int NSCursorUpdateMask = 131072; alias Cocoa.NSBezierPathElement.NSCurveToBezierPathElement NSCurveToBezierPathElement; public static const int NSCustomPaletteModeColorPanel = 4; @@ -2964,7 +2964,7 @@ public static const int NSFindPanelSubstringMatchTypeStartsWith = 1; public static const int NSFitPagination = 1; public static const int NSFixedPitchFontMask = 1024; -public static const int NSFlagsChanged = 12; +alias Cocoa.NSEventType.NSFlagsChanged NSFlagsChanged; public static const int NSFlagsChangedMask = 4096; public static const int NSFloatType = 3; public static const int NSFloatingPointSamplesBitmapFormat = 4; @@ -3102,18 +3102,18 @@ public static const int NSJPEG2000FileType = 5; public static const int NSJPEGFileType = 3; alias Cocoa.NSTextAlignment.NSJustifiedTextAlignment NSJustifiedTextAlignment; -public static const int NSKeyDown = 10; +alias Cocoa.NSEventType.NSKeyDown NSKeyDown; public static const int NSKeyDownMask = 1024; -public static const int NSKeyUp = 11; +alias Cocoa.NSEventType.NSKeyUp NSKeyUp; public static const int NSKeyUpMask = 2048; public static const int NSLABColorSpaceModel = 3; public static const int NSLandscapeOrientation = 1; public static const int NSLeftArrowFunctionKey = 63234; -public static const int NSLeftMouseDown = 1; +alias Cocoa.NSEventType.NSLeftMouseDown NSLeftMouseDown; public static const int NSLeftMouseDownMask = 2; -public static const int NSLeftMouseDragged = 6; +alias Cocoa.NSEventType.NSLeftMouseDragged NSLeftMouseDragged; public static const int NSLeftMouseDraggedMask = 64; -public static const int NSLeftMouseUp = 2; +alias Cocoa.NSEventType.NSLeftMouseUp NSLeftMouseUp; public static const int NSLeftMouseUpMask = 4; alias Cocoa.NSTextTabType.NSLeftTabStopType NSLeftTabStopType; public static const int NSLeftTabsBezelBorder = 1; @@ -3154,12 +3154,12 @@ alias Cocoa.NSButtonType.NSMomentaryLightButton NSMomentaryLightButton; public static const int NSMomentaryPushButton = 0; public static const int NSMomentaryPushInButton = 7; -public static const int NSMouseEntered = 8; +alias Cocoa.NSEventType.NSMouseEntered NSMouseEntered; public static const int NSMouseEnteredMask = 256; public static const int NSMouseEventSubtype = 0; -public static const int NSMouseExited = 9; +alias Cocoa.NSEventType.NSMouseExited NSMouseExited; public static const int NSMouseExitedMask = 512; -public static const int NSMouseMoved = 5; +alias Cocoa.NSEventType.NSMouseMoved NSMouseMoved; public static const int NSMouseMovedMask = 32; alias Cocoa.NSBezierPathElement.NSMoveToBezierPathElement NSMoveToBezierPathElement; public static const int NSNarrowFontMask = 16; @@ -3239,11 +3239,11 @@ public static const int NSOpenGLPFASupersample = 60; public static const int NSOpenGLPFAVirtualScreenCount = 128; public static const int NSOpenGLPFAWindow = 80; -public static const int NSOtherMouseDown = 25; +alias Cocoa.NSEventType.NSOtherMouseDown NSOtherMouseDown; public static const int NSOtherMouseDownMask = 33554432; -public static const int NSOtherMouseDragged = 27; +alias Cocoa.NSEventType.NSOtherMouseDragged NSOtherMouseDragged; public static const int NSOtherMouseDraggedMask = 134217728; -public static const int NSOtherMouseUp = 26; +alias Cocoa.NSEventType.NSOtherMouseUp NSOtherMouseUp; public static const int NSOtherMouseUpMask = 67108864; public static const int NSOtherTextMovement = 0; public static const int NSOutlineViewDropOnItemIndex = -1; @@ -3260,7 +3260,7 @@ public static const int NSPenPointingDevice = 1; public static const int NSPenTipMask = 1; public static const int NSPenUpperSideMask = 4; -public static const int NSPeriodic = 16; +alias Cocoa.NSEventType.NSPeriodic NSPeriodic; public static const int NSPeriodicMask = 65536; public static const int NSPlainTextTokenStyle = 1; public static const int NSPopUpArrowAtBottom = 2; @@ -3320,11 +3320,11 @@ public static const int NSResizableWindowMask = 8; public static const int NSReturnTextMovement = 16; public static const int NSRightArrowFunctionKey = 63235; -public static const int NSRightMouseDown = 3; +alias Cocoa.NSEventType.NSRightMouseDown NSRightMouseDown; public static const int NSRightMouseDownMask = 8; -public static const int NSRightMouseDragged = 7; +alias Cocoa.NSEventType.NSRightMouseDragged NSRightMouseDragged; public static const int NSRightMouseDraggedMask = 128; -public static const int NSRightMouseUp = 4; +alias Cocoa.NSEventType.NSRightMouseUp NSRightMouseUp; public static const int NSRightMouseUpMask = 16; public static const int NSRightTabStopType = 1; public static const int NSRightTabsBezelBorder = 3; @@ -3354,7 +3354,7 @@ public static const int NSScreenChangedEventType = 8; public static const int NSScreenSaverWindowLevel = 1000; public static const int NSScrollLockFunctionKey = 63279; -public static const int NSScrollWheel = 22; +alias Cocoa.NSEventType.NSScrollWheel NSScrollWheel; public static const int NSScrollWheelMask = 4194304; public static const int NSScrollerArrowsDefaultSetting = 0; public static const int NSScrollerArrowsMaxEnd = 0; @@ -3433,7 +3433,7 @@ public static const int NSSubmenuWindowLevel = 3; alias Cocoa.NSButtonType.NSSwitchButton NSSwitchButton; public static const int NSSysReqFunctionKey = 63281; -public static const int NSSystemDefined = 14; +alias Cocoa.NSEventType.NSSystemDefined NSSystemDefined; public static const int NSSystemDefinedMask = 16384; public static const int NSSystemFunctionKey = 63287; public static const int NSTIFFCompressionCCITTFAX3 = 3; @@ -3463,10 +3463,10 @@ public static const int NSTableViewSolidHorizontalGridLineMask = 2; public static const int NSTableViewSolidVerticalGridLineMask = 1; public static const int NSTableViewUniformColumnAutoresizingStyle = 1; -public static const int NSTabletPoint = 23; +alias Cocoa.NSEventType.NSTabletPoint NSTabletPoint; public static const int NSTabletPointEventSubtype = 1; public static const int NSTabletPointMask = 8388608; -public static const int NSTabletProximity = 24; +alias Cocoa.NSEventType.NSTabletProximity NSTabletProximity; public static const int NSTabletProximityEventSubtype = 2; public static const int NSTabletProximityMask = 16777216; alias Cocoa.NSApplicationTerminateReply.NSTerminateCancel NSTerminateCancel; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Canvas.d --- a/dwt/widgets/Canvas.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Canvas.d Tue Dec 23 00:35:24 2008 +0100 @@ -33,6 +33,7 @@ import dwt.dwthelper.utils; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Caret; import dwt.widgets.Composite; import dwt.widgets.Control; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/ColorDialog.d --- a/dwt/widgets/ColorDialog.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/ColorDialog.d Tue Dec 23 00:35:24 2008 +0100 @@ -26,6 +26,7 @@ import dwt.dwthelper.utils; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Dialog; import dwt.widgets.Display; import dwt.widgets.Shell; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Composite.d --- a/dwt/widgets/Composite.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Composite.d Tue Dec 23 00:35:24 2008 +0100 @@ -33,6 +33,7 @@ import dwt.dwthelper.utils; import Carbon = dwt.internal.c.Carbon; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Control; import dwt.widgets.Decorations; import dwt.widgets.Display; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Control.d --- a/dwt/widgets/Control.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Control.d Tue Dec 23 00:35:24 2008 +0100 @@ -1078,7 +1078,6 @@ sendKeyEvent (DWT.KeyUp, event); break; default: - assert(false); } if (mask !is 0) { int type = (mask & modifiers) !is 0 ? DWT.KeyDown : DWT.KeyUp; @@ -2445,6 +2444,7 @@ shell.setActiveControl (null); } break; + default: } } } @@ -2471,6 +2471,7 @@ case 2: event.button = 2; break; case 3: event.button = 4; break; case 4: event.button = 5; break; + default: } break; case DWT.MouseWheel: @@ -2478,6 +2479,7 @@ Carbon.CGFloat delta = nsEvent.deltaY(); event.count = delta > 0 ? Math.max (1, cast(int)delta) : Math.min (-1, cast(int)delta); break; + default: } if (event.button !is 0) event.count = cast(int)/*64*/nsEvent.clickCount(); NSPoint windowPoint; @@ -3438,6 +3440,7 @@ case DWT.TRAVERSE_MNEMONIC: return traverseMnemonic (event); case DWT.TRAVERSE_PAGE_NEXT: return traversePage (true); case DWT.TRAVERSE_PAGE_PREVIOUS: return traversePage (false); + default: } return false; } diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Display.d --- a/dwt/widgets/Display.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Display.d Tue Dec 23 00:35:24 2008 +0100 @@ -67,7 +67,7 @@ import dwt.internal.cocoa.OS; import dwt.internal.cocoa.SWTApplicationDelegate; import dwt.internal.cocoa.SWTWindowDelegate; -import dwt.internal.cocoa.id; +import cocoa = dwt.internal.cocoa.id; import dwt.internal.cocoa.objc_super; import tango.core.Thread; @@ -181,26 +181,26 @@ Event [] eventQueue; EventTable eventTable, filterTable; bool disposing; - + /* Sync/Async Widget Communication */ Synchronizer synchronizer; Thread thread; bool allowTimers, runAsyncMessages_; - + NSGraphicsContext[] contexts; - + Caret currentCaret; bool dragging; Control currentControl, grabControl, trackingControl; - + NSDictionary markedAttributes; - + Shell [] modalShells; Menu menuBar; Menu[] menus, popups; - + NSApplication application; objc.Class applicationClass; NSImage dockImage; @@ -213,18 +213,18 @@ int loopCounter = 0; bool idle; static const short SWT_IDLE_TYPE = 1; - + int[] screenID; NSPoint[] screenCascade; /* Menus */ -// Menu menuBar; -// static final int ID_TEMPORARY = 1000; -// static final int ID_START = 1001; + // Menu menuBar; + // static final int ID_TEMPORARY = 1000; + // static final int ID_START = 1001; /* Display Shutdown */ Runnable [] disposeList; - + /* System Tray */ Tray tray; @@ -234,94 +234,94 @@ /* Key Mappings. */ static int [] [] KeyTable = [ - - /* Keyboard and Mouse Masks */ - [58, DWT.ALT], - [56, DWT.SHIFT], - [59, DWT.CONTROL], - [55, DWT.COMMAND], - [61, DWT.ALT], - [62, DWT.CONTROL], - [60, DWT.SHIFT], - [54, DWT.COMMAND], - - /* Non-Numeric Keypad Keys */ - [126, DWT.ARROW_UP], - [125, DWT.ARROW_DOWN], - [123, DWT.ARROW_LEFT], - [124, DWT.ARROW_RIGHT], - [116, DWT.PAGE_UP], - [121, DWT.PAGE_DOWN], - [115, DWT.HOME], - [119, DWT.END], -// [??, DWT.INSERT], + + /* Keyboard and Mouse Masks */ + [58, DWT.ALT], + [56, DWT.SHIFT], + [59, DWT.CONTROL], + [55, DWT.COMMAND], + [61, DWT.ALT], + [62, DWT.CONTROL], + [60, DWT.SHIFT], + [54, DWT.COMMAND], + + /* Non-Numeric Keypad Keys */ + [126, DWT.ARROW_UP], + [125, DWT.ARROW_DOWN], + [123, DWT.ARROW_LEFT], + [124, DWT.ARROW_RIGHT], + [116, DWT.PAGE_UP], + [121, DWT.PAGE_DOWN], + [115, DWT.HOME], + [119, DWT.END], + // [??, DWT.INSERT], + + /* Virtual and Ascii Keys */ + [51, DWT.BS], + [36, DWT.CR], + [117, DWT.DEL], + [53, DWT.ESC], + [76, DWT.LF], + [48, DWT.TAB], + + /* Functions Keys */ + [122, DWT.F1], + [120, DWT.F2], + [99, DWT.F3], + [118, DWT.F4], + [96, DWT.F5], + [97, DWT.F6], + [98, DWT.F7], + [100, DWT.F8], + [101, DWT.F9], + [109, DWT.F10], + [103, DWT.F11], + [111, DWT.F12], + [105, DWT.F13], + [107, DWT.F14], + [113, DWT.F15], + + /* Numeric Keypad Keys */ + [67, DWT.KEYPAD_MULTIPLY], + [69, DWT.KEYPAD_ADD], + [76, DWT.KEYPAD_CR], + [78, DWT.KEYPAD_SUBTRACT], + [65, DWT.KEYPAD_DECIMAL], + [75, DWT.KEYPAD_DIVIDE], + [82, DWT.KEYPAD_0], + [83, DWT.KEYPAD_1], + [84, DWT.KEYPAD_2], + [85, DWT.KEYPAD_3], + [86, DWT.KEYPAD_4], + [87, DWT.KEYPAD_5], + [88, DWT.KEYPAD_6], + [89, DWT.KEYPAD_7], + [91, DWT.KEYPAD_8], + [92, DWT.KEYPAD_9], + [81, DWT.KEYPAD_EQUAL], + + /* Other keys */ + [57, DWT.CAPS_LOCK], + [71, DWT.NUM_LOCK], + // [??, DWT.SCROLL_LOCK], + // [??, DWT.PAUSE], + // [??, DWT.BREAK], + // [??, DWT.PRINT_SCREEN], + [114, DWT.HELP], + + ]; - /* Virtual and Ascii Keys */ - [51, DWT.BS], - [36, DWT.CR], - [117, DWT.DEL], - [53, DWT.ESC], - [76, DWT.LF], - [48, DWT.TAB], - - /* Functions Keys */ - [122, DWT.F1], - [120, DWT.F2], - [99, DWT.F3], - [118, DWT.F4], - [96, DWT.F5], - [97, DWT.F6], - [98, DWT.F7], - [100, DWT.F8], - [101, DWT.F9], - [109, DWT.F10], - [103, DWT.F11], - [111, DWT.F12], - [105, DWT.F13], - [107, DWT.F14], - [113, DWT.F15], - - /* Numeric Keypad Keys */ - [67, DWT.KEYPAD_MULTIPLY], - [69, DWT.KEYPAD_ADD], - [76, DWT.KEYPAD_CR], - [78, DWT.KEYPAD_SUBTRACT], - [65, DWT.KEYPAD_DECIMAL], - [75, DWT.KEYPAD_DIVIDE], - [82, DWT.KEYPAD_0], - [83, DWT.KEYPAD_1], - [84, DWT.KEYPAD_2], - [85, DWT.KEYPAD_3], - [86, DWT.KEYPAD_4], - [87, DWT.KEYPAD_5], - [88, DWT.KEYPAD_6], - [89, DWT.KEYPAD_7], - [91, DWT.KEYPAD_8], - [92, DWT.KEYPAD_9], - [81, DWT.KEYPAD_EQUAL], - - /* Other keys */ - [57, DWT.CAPS_LOCK], - [71, DWT.NUM_LOCK], -// [??, DWT.SCROLL_LOCK], -// [??, DWT.PAUSE], -// [??, DWT.BREAK], -// [??, DWT.PRINT_SCREEN], - [114, DWT.HELP], - - ]; - static String APP_NAME = "DWT"; static const String ADD_WIDGET_KEY = "dwt.internal.addWidget"; static const String SWT_OBJECT = "SWT_OBJECT"; //$NON-NLS-1$ - + /* Multiple Displays. */ static Display Default; static Display [] Displays; - + /* Package Name */ static const String PACKAGE_PREFIX = "dwt.widgets."; - + /* Timer */ Runnable timerList []; NSTimer nsTimers []; @@ -334,11 +334,12 @@ Object [] values; /* - * TEMPORARY CODE. Install the runnable that - * gets the current display. This code will - * be removed in the future. - */ + * TEMPORARY CODE. Install the runnable that + * gets the current display. This code will + * be removed in the future. + */ static this () { + Displays = new Display [4]; DeviceFinder = new class Runnable { public void run () { Device device = getCurrent (); @@ -347,3737 +348,3742 @@ } setDevice (device); } + }; + } + + /* + * TEMPORARY CODE. + */ + static void setDevice (Device device) { + CurrentDevice = device; + } + + static char* ascii (String name) { + /*int length = name.length (); + char [] chars = new char [length]; + name.getChars (0, length, chars, 0); + byte [] buffer = new byte [length + 1]; + for (int i=0; iDWT. When the event does occur, + * the listener is notified by sending it the handleEvent() + * message. + *

+ * Setting the type of an event to DWT.None from + * within the handleEvent() method can be used to + * change the event type and stop subsequent Java listeners + * from running. Because event filters run before other listeners, + * event filters can both block other listeners and set arbitrary + * fields within an event. For this reason, event filters are both + * powerful and dangerous. They should generally be avoided for + * performance, debugging and code maintenance reasons. + *

+ * + * @param eventType the type of event to listen for + * @param listener the listener which should be notified when the event occurs + * + * @exception IllegalArgumentException + * @exception DWTException + * + * @see Listener + * @see DWT + * @see #removeFilter + * @see #removeListener + * + * @since 3.0 + */ + public void addFilter (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); + if (filterTable is null) filterTable = new EventTable (); + filterTable.hook (eventType, listener); + } + + /** + * Adds the listener to the collection of listeners who will + * be notified when an event of the given type occurs. The event + * type is one of the event constants defined in class DWT. + * When the event does occur in the display, the listener is notified by + * sending it the handleEvent() message. + * + * @param eventType the type of event to listen for + * @param listener the listener which should be notified when the event occurs + * + * @exception IllegalArgumentException + * @exception DWTException + * + * @see Listener + * @see DWT + * @see #removeListener + * + * @since 2.0 + */ + public void addListener (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); + if (eventTable is null) eventTable = new EventTable (); + eventTable.hook (eventType, listener); + } + + void addMenu (Menu menu) { + if (menus is null) menus = new Menu [12]; + for (int i=0; irun() method of the runnable to + * be invoked by the user-interface thread at the next + * reasonable opportunity. The caller of this method continues + * to run in parallel, and is not notified when the + * runnable has completed. Specifying null as the + * runnable simply wakes the user-interface thread when run. + *

+ * Note that at the time the runnable is invoked, widgets + * that have the receiver as their display may have been + * disposed. Therefore, it is necessary to check for this + * case inside the runnable before accessing the widget. + *

+ * + * @param runnable code to run on the user-interface thread or null + * + * @exception DWTException
    + *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • + *
+ * + * @see #syncExec + */ + public void asyncExec (Runnable runnable) { + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + synchronizer.asyncExec (runnable); + } + } + + /** + * Causes the system hardware to emit a short sound + * (if it supports this capability). + * + * @exception DWTException
    + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • + *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • + *
+ */ + public void beep () { + checkDevice (); + OS.NSBeep (); + } + + void cascadeWindow (NSWindow window, NSScreen screen) { + NSDictionary dictionary = screen.deviceDescription(); + int screenNumber = (new NSNumber(dictionary.objectForKey(NSString.stringWith("NSScreenNumber")).id)).intValue(); + int index = 0; + while (screenID[index] !is 0 && screenID[index] !is screenNumber) index++; + screenID[index] = screenNumber; + NSPoint cascade = screenCascade[index]; + //FIXME Jacob Carlborg + /*if (cascade is null) { + NSRect frame = screen.frame(); + cascade = NSPoint(); + cascade.x = frame.x; + cascade.y = frame.y + frame.height; + }*/ + screenCascade[index] = window.cascadeTopLeftFromPoint(cascade); + } + + protected void checkDevice () { + if (thread is null) error (DWT.ERROR_WIDGET_DISPOSED); + if (thread !is Thread.getThis ()) error (DWT.ERROR_THREAD_INVALID_ACCESS); + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + } + + /** + * Checks that this class can be subclassed. + *

+ * IMPORTANT: See the comment in Widget.checkSubclass(). + *

+ * + * @exception DWTException
    + *
  • ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass
  • + *
+ * + * @see Widget#checkSubclass + */ + protected void checkSubclass () { + if (!Display.isValidClass (this.classinfo)) error (DWT.ERROR_INVALID_SUBCLASS); + } + + /** + * Constructs a new instance of this class. + *

+ * Note: The resulting display is marked as the current + * display. If this is the first display which has been + * constructed since the application started, it is also + * marked as the default display. + *

+ * + * @exception DWTException
    + *
  • ERROR_THREAD_INVALID_ACCESS - if called from a thread that already created an existing display
  • + *
  • ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass
  • + *
+ * + * @see #getCurrent + * @see #getDefault + * @see Widget#checkSubclass + * @see Shell + */ + public this () { + this (null); + } + + /** + * Constructs a new instance of this class using the parameter. + * + * @param data the device data + */ + public this (DeviceData data) { + super (data); + screenID = new int[32]; + screenCascade = new NSPoint[32]; + cursors = new Cursor [DWT.CURSOR_HAND + 1]; + timerDelegate = cast(SWTWindowDelegate)(new SWTWindowDelegate()).alloc().init(); + + caretTimer = new class(currentCaret) Runnable { + Caret currentCaret; + + this (Caret currentCaret) + { + this.currentCaret = currentCaret; + } + + public void run () { + if (currentCaret !is null) { + if (currentCaret is null || currentCaret.isDisposed()) return; + if (currentCaret.blinkCaret ()) { + int blinkRate = currentCaret.blinkRate; + if (blinkRate !is 0) timerExec (blinkRate, this); + } else { + currentCaret = null; + } + } + + } + }; + + hoverTimer = new class(currentControl) Runnable { + Control currentControl; + + this (Control currentControl) + { + this.currentControl = currentControl; + } + + public void run () { + if (currentControl !is null && !currentControl.isDisposed()) { + currentControl.sendMouseEvent (null, DWT.MouseHover, trackingControl !is null); + } + } }; } -/* -* TEMPORARY CODE. -*/ -static void setDevice (Device device) { - CurrentDevice = device; -} - -static char* ascii (String name) { - /*int length = name.length (); - char [] chars = new char [length]; - name.getChars (0, length, chars, 0); - byte [] buffer = new byte [length + 1]; - for (int i=0; iDWT. When the event does occur, - * the listener is notified by sending it the handleEvent() - * message. - *

- * Setting the type of an event to DWT.None from - * within the handleEvent() method can be used to - * change the event type and stop subsequent Java listeners - * from running. Because event filters run before other listeners, - * event filters can both block other listeners and set arbitrary - * fields within an event. For this reason, event filters are both - * powerful and dangerous. They should generally be avoided for - * performance, debugging and code maintenance reasons. - *

- * - * @param eventType the type of event to listen for - * @param listener the listener which should be notified when the event occurs - * - * @exception IllegalArgumentException
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception DWTException
    - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - *
- * - * @see Listener - * @see DWT - * @see #removeFilter - * @see #removeListener - * - * @since 3.0 - */ -public void addFilter (int eventType, Listener listener) { - checkDevice (); - if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); - if (filterTable is null) filterTable = new EventTable (); - filterTable.hook (eventType, listener); -} - -/** - * Adds the listener to the collection of listeners who will - * be notified when an event of the given type occurs. The event - * type is one of the event constants defined in class DWT. - * When the event does occur in the display, the listener is notified by - * sending it the handleEvent() message. - * - * @param eventType the type of event to listen for - * @param listener the listener which should be notified when the event occurs - * - * @exception IllegalArgumentException
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception DWTException
    - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - *
- * - * @see Listener - * @see DWT - * @see #removeListener - * - * @since 2.0 - */ -public void addListener (int eventType, Listener listener) { - checkDevice (); - if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); - if (eventTable is null) eventTable = new EventTable (); - eventTable.hook (eventType, listener); -} - -void addMenu (Menu menu) { - if (menus is null) menus = new Menu [12]; - for (int i=0; irun() method of the runnable to - * be invoked by the user-interface thread at the next - * reasonable opportunity. The caller of this method continues - * to run in parallel, and is not notified when the - * runnable has completed. Specifying null as the - * runnable simply wakes the user-interface thread when run. - *

- * Note that at the time the runnable is invoked, widgets - * that have the receiver as their display may have been - * disposed. Therefore, it is necessary to check for this - * case inside the runnable before accessing the widget. - *

- * - * @param runnable code to run on the user-interface thread or null - * - * @exception DWTException
    - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - *
- * - * @see #syncExec - */ -public void asyncExec (Runnable runnable) { - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - synchronizer.asyncExec (runnable); + + void clearModal (Shell shell) { + if (modalShells is null) return; + int index = 0, length_ = modalShells.length; + while (index < length_) { + if (modalShells [index] is shell) break; + if (modalShells [index] is null) return; + index++; + } + if (index is length_) return; + System.arraycopy (modalShells, index + 1, modalShells, index, --length_ - index); + modalShells [length_] = null; + if (index is 0 && modalShells [0] is null) modalShells = null; + Shell [] shells = getShells (); + for (int i=0; i - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - * - */ -public void beep () { - checkDevice (); - OS.NSBeep (); -} - -void cascadeWindow (NSWindow window, NSScreen screen) { - NSDictionary dictionary = screen.deviceDescription(); - int screenNumber = (new NSNumber(dictionary.objectForKey(NSString.stringWith("NSScreenNumber")).id)).intValue(); - int index = 0; - while (screenID[index] !is 0 && screenID[index] !is screenNumber) index++; - screenID[index] = screenNumber; - NSPoint cascade = screenCascade[index]; - //FIXME Jacob Carlborg - /*if (cascade is null) { - NSRect frame = screen.frame(); - cascade = NSPoint(); - cascade.x = frame.x; - cascade.y = frame.y + frame.height; - }*/ - screenCascade[index] = window.cascadeTopLeftFromPoint(cascade); -} - -protected void checkDevice () { - if (thread is null) error (DWT.ERROR_WIDGET_DISPOSED); - if (thread !is Thread.getThis ()) error (DWT.ERROR_THREAD_INVALID_ACCESS); - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); -} - -/** - * Checks that this class can be subclassed. - *

    - * IMPORTANT: See the comment in Widget.checkSubclass(). - *

    - * - * @exception DWTException
      - *
    • ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass
    • - *
    - * - * @see Widget#checkSubclass - */ -protected void checkSubclass () { - if (!Display.isValidClass (this.classinfo)) error (DWT.ERROR_INVALID_SUBCLASS); -} - -/** - * Constructs a new instance of this class. - *

    - * Note: The resulting display is marked as the current - * display. If this is the first display which has been - * constructed since the application started, it is also - * marked as the default display. - *

    - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if called from a thread that already created an existing display
    • - *
    • ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass
    • - *
    - * - * @see #getCurrent - * @see #getDefault - * @see Widget#checkSubclass - * @see Shell - */ -public this () { - this (null); -} - -/** - * Constructs a new instance of this class using the parameter. - * - * @param data the device data - */ -public this (DeviceData data) { - super (data); - screenID = new int[32]; - screenCascade = new NSPoint[32]; - cursors = new Cursor [DWT.CURSOR_HAND + 1]; - Displays = new Display [4]; - timerDelegate = cast(SWTWindowDelegate)(new SWTWindowDelegate()).alloc().init(); + + /** + * Requests that the connection between DWT and the underlying + * operating system be closed. + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see Device#dispose + * + * @since 2.0 + */ + public void close () { + checkDevice (); + Event event = new Event (); + sendEvent (DWT.Close, event); + if (event.doit) dispose (); + } - caretTimer = new class(currentCaret) Runnable { - Caret currentCaret; - - this (Caret currentCaret) - { - this.currentCaret = currentCaret; + /** + * Creates the device in the operating system. If the device + * does not have a handle, this method may do nothing depending + * on the device. + *

    + * This method is called before init. + *

    + * + * @param data the DeviceData which describes the receiver + * + * @see #init + */ + protected void create (DeviceData data) { + checkSubclass (); + checkDisplay (thread = Thread.getThis (), false); + createDisplay (data); + register (this); + synchronizer = new Synchronizer (this); + if (Default is null) Default = this; + } + + void createDisplay (DeviceData data) { + if (OS.VERSION < 0x1050) { + System.out_.println ("***WARNING: DWT requires MacOS X version {}{}{}{}" , 10 , "." , 5 , " or greater"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + System.out_.println ("***WARNING: Detected: {}{}{}{}{}" , Integer.toHexString((OS.VERSION & 0xFF00) >> 8) , "." , Integer.toHexString((OS.VERSION & 0xF0) >> 4) , "." , Integer.toHexString(OS.VERSION & 0xF)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + error(DWT.ERROR_NOT_IMPLEMENTED); } - public void run () { - if (currentCaret !is null) { - if (currentCaret is null || currentCaret.isDisposed()) return; - if (currentCaret.blinkCaret ()) { - int blinkRate = currentCaret.blinkRate; - if (blinkRate !is 0) timerExec (blinkRate, this); - } else { - currentCaret = null; + NSThread nsthread = NSThread.currentThread(); + NSMutableDictionary dictionary = nsthread.threadDictionary(); + NSString key = NSString.stringWith("SWT_NSAutoreleasePool"); + pool = new NSAutoreleasePool(dictionary.objectForKey(key)); + + application = NSApplication.sharedApplication(); + + /* + * TODO: If an NSApplication is already running we don't want to create another NSApplication. + * But if we don't we won't get mouse events, since we currently need to subclass NSApplication and intercept sendEvent to + * deliver mouse events correctly to widgets. + */ + if (!application.isRunning()) { + /* + * Feature in the Macintosh. On OS 10.2, it is necessary + * to explicitly check in with the Process Manager and set + * the current process to be the front process in order for + * windows to come to the front by default. The fix is call + * both GetCurrentProcess() and SetFrontProcess(). + * + * NOTE: It is not actually necessary to use the process + * serial number returned by GetCurrentProcess() in the + * call to SetFrontProcess() (ie. kCurrentProcess can be + * used) but both functions must be called in order for + * windows to come to the front. + */ + Carbon.ProcessSerialNumber psn; + if (OS.GetCurrentProcess (&psn) is OS.noErr) { + int pid = OS.getpid (); + char* ptr = OS.getenv (ascii ("APP_NAME_" ~ Integer.toString(pid))); + if (ptr is null && APP_NAME !is null) { + ptr = NSString.stringWith(APP_NAME).UTF8String(); + } + if (ptr !is null) OS.CPSSetProcessName (&psn, ptr); + OS.TransformProcessType (&psn, OS.kProcessTransformToForegroundApplication); + OS.SetFrontProcess (&psn); + ptr = OS.getenv (ascii ("APP_ICON_" ~ Integer.toString(pid))); + if (ptr !is null) { + NSString path = NSString.stringWithUTF8String (ptr); + NSImage image = cast(NSImage) (new NSImage()).alloc(); + image = image.initByReferencingFile(path); + dockImage = image; + application.setApplicationIconImage(image); } } - } - }; - - hoverTimer = new class(currentControl) Runnable { - Control currentControl; - - this (Control currentControl) - { - this.currentControl = currentControl; + String className = "SWTApplication"; + objc.Class cls; + if ((cls = cast(objc.Class) OS.objc_lookUpClass (className)) is null) { + objc.IMP proc2 = cast(objc.IMP) &applicationProc2; + objc.IMP proc3 = cast(objc.IMP) &applicationProc3; + objc.IMP proc6 = cast(objc.IMP) &applicationProc6; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSApplication, className, 0); + OS.class_addMethod(cls, OS.sel_registerName("sendEvent:"), proc3, "@:@"); + + static if ((void*).sizeof > int.sizeof) // 64bit target + OS.class_addMethod(cls, OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_, proc6, "@:Q@@B"); + else + OS.class_addMethod(cls, OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_, proc6, "@:I@@B"); + + OS.class_addMethod(cls, OS.sel_isRunning, proc2, "@:"); + OS.objc_registerClassPair(cls); + } + applicationClass = OS.object_setClass(application.id, cls); + } else { + isEmbedded = true; } - public void run () { - if (currentControl !is null && !currentControl.isDisposed()) { - currentControl.sendMouseEvent (null, DWT.MouseHover, trackingControl !is null); - } - } - }; -} - -static void checkDisplay (Thread thread, bool multiple) { - synchronized (Device.classinfo) { - for (int i=0; i + * This method is called after release. + *

    + * @see Device#dispose + * @see #release + */ + protected void destroy () { + if (this is Default) Default = null; + deregister (this); + destroyDisplay (); } - return result.toString (); -} - -void clearModal (Shell shell) { - if (modalShells is null) return; - int index = 0, length_ = modalShells.length; - while (index < length_) { - if (modalShells [index] is shell) break; - if (modalShells [index] is null) return; - index++; + + void destroyDisplay () { + application = null; } - if (index is length_) return; - System.arraycopy (modalShells, index + 1, modalShells, index, --length_ - index); - modalShells [length_] = null; - if (index is 0 && modalShells [0] is null) modalShells = null; - Shell [] shells = getShells (); - for (int i=0; i - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - * - * - * @see Device#dispose - * - * @since 2.0 - */ -public void close () { - checkDevice (); - Event event = new Event (); - sendEvent (DWT.Close, event); - if (event.doit) dispose (); -} - -/** - * Creates the device in the operating system. If the device - * does not have a handle, this method may do nothing depending - * on the device. - *

    - * This method is called before init. - *

    - * - * @param data the DeviceData which describes the receiver - * - * @see #init - */ -protected void create (DeviceData data) { - checkSubclass (); - checkDisplay (thread = Thread.getThis (), false); - createDisplay (data); - register (this); - synchronizer = new Synchronizer (this); - if (Default is null) Default = this; -} - -void createDisplay (DeviceData data) { - if (OS.VERSION < 0x1050) { - System.Out.println ("***WARNING: DWT requires MacOS X version {}{}{}{}" , 10 , "." , 5 , " or greater"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - System.Out.println ("***WARNING: Detected: {}{}{}{}{}" , Integer.toHexString((OS.VERSION & 0xFF00) >> 8) , "." , Integer.toHexString((OS.VERSION & 0xF0) >> 4) , "." , Integer.toHexString(OS.VERSION & 0xF)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - error(DWT.ERROR_NOT_IMPLEMENTED); - } - - NSThread nsthread = NSThread.currentThread(); - NSMutableDictionary dictionary = nsthread.threadDictionary(); - NSString key = NSString.stringWith("SWT_NSAutoreleasePool"); - pool = new NSAutoreleasePool(dictionary.objectForKey(key)); - - application = NSApplication.sharedApplication(); - - /* - * TODO: If an NSApplication is already running we don't want to create another NSApplication. - * But if we don't we won't get mouse events, since we currently need to subclass NSApplication and intercept sendEvent to - * deliver mouse events correctly to widgets. + + /** + * Causes the run() method of the runnable to + * be invoked by the user-interface thread just before the + * receiver is disposed. Specifying a null runnable + * is ignored. + * + * @param runnable code to run at dispose time. + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    */ - if (!application.isRunning()) { - /* - * Feature in the Macintosh. On OS 10.2, it is necessary - * to explicitly check in with the Process Manager and set - * the current process to be the front process in order for - * windows to come to the front by default. The fix is call - * both GetCurrentProcess() and SetFrontProcess(). - * - * NOTE: It is not actually necessary to use the process - * serial number returned by GetCurrentProcess() in the - * call to SetFrontProcess() (ie. kCurrentProcess can be - * used) but both functions must be called in order for - * windows to come to the front. - */ - Carbon.ProcessSerialNumber psn; - if (OS.GetCurrentProcess (&psn) is OS.noErr) { - int pid = OS.getpid (); - char* ptr = OS.getenv (ascii ("APP_NAME_" ~ Integer.toString(pid))); - if (ptr is null && APP_NAME !is null) { - ptr = NSString.stringWith(APP_NAME).UTF8String(); - } - if (ptr !is null) OS.CPSSetProcessName (&psn, ptr); - OS.TransformProcessType (&psn, OS.kProcessTransformToForegroundApplication); - OS.SetFrontProcess (&psn); - ptr = OS.getenv (ascii ("APP_ICON_" ~ Integer.toString(pid))); - if (ptr !is null) { - NSString path = NSString.stringWithUTF8String (ptr); - NSImage image = cast(NSImage) (new NSImage()).alloc(); - image = image.initByReferencingFile(path); - dockImage = image; - application.setApplicationIconImage(image); + public void disposeExec (Runnable runnable) { + checkDevice (); + if (disposeList is null) disposeList = new Runnable [4]; + for (int i=0; i int.sizeof) // 64bit target - OS.class_addMethod(cls, OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_, proc6, "@:Q@@B"); - else - OS.class_addMethod(cls, OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_, proc6, "@:I@@B"); - - OS.class_addMethod(cls, OS.sel_isRunning, proc2, "@:"); - OS.objc_registerClassPair(cls); - } - applicationClass = OS.object_setClass(application.id, cls); - } else { - isEmbedded = true; + Runnable [] newDisposeList = new Runnable [disposeList.length + 4]; + SimpleType!(Runnable).arraycopy (disposeList, 0, newDisposeList, 0, disposeList.length); + newDisposeList [disposeList.length] = runnable; + disposeList = newDisposeList; + } + + void error (int code) { + DWT.error(code); + } + + bool filterEvent (Event event) { + if (filterTable !is null) filterTable.sendEvent (event); + return false; + } + + bool filters (int eventType) { + if (filterTable is null) return false; + return filterTable.hooks (eventType); } - - // application = new NSApplication(OS.objc_msgSend(cls, OS.sel_sharedApplication)); -} -static void deregister (Display display) { - synchronized (Device.classinfo) { - for (int i=0; iWidget subclass which + * represents it in the currently running application, if + * such exists, or null if no matching widget can be found. + *

    + * IMPORTANT: This method should not be called from + * application code. The arguments are platform-specific. + *

    + * + * @param handle the handle for the widget + * @return the DWT widget that the handle represents + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Widget findWidget (objc.id handle) { + checkDevice (); + return getWidget (handle); } -} - -/** - * 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. - *

    - * This method is called after release. - *

    - * @see Device#dispose - * @see #release - */ -protected void destroy () { - if (this is Default) Default = null; - deregister (this); - destroyDisplay (); -} - -void destroyDisplay () { - application = null; -} - -/** - * Causes the run() method of the runnable to - * be invoked by the user-interface thread just before the - * receiver is disposed. Specifying a null runnable - * is ignored. - * - * @param runnable code to run at dispose time. - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public void disposeExec (Runnable runnable) { - checkDevice (); - if (disposeList is null) disposeList = new Runnable [4]; - for (int i=0; iWidget subclass which represents + * the handle/id pair in the currently running application, + * if such exists, or null if no matching widget can be found. + *

    + * IMPORTANT: This method should not be called from + * application code. The arguments are platform-specific. + *

    + * + * @param handle the handle for the widget + * @param id the id for the subwidget (usually an item) + * @return the DWT widget that the handle/id pair represents + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.1 + */ + public Widget findWidget (objc.id handle, int id) { + checkDevice (); + return getWidget (handle); + } + + /** + * Given a widget and a widget-specific id, returns the + * instance of the Widget subclass which represents + * the widget/id pair in the currently running application, + * if such exists, or null if no matching widget can be found. + * + * @param widget the widget + * @param id the id for the subwidget (usually an item) + * @return the DWT subwidget (usually an item) that the widget/id pair represents + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.3 + */ + public Widget findWidget (Widget widget, int id) { + checkDevice (); + return null; + } + + /** + * Returns the display which the given thread is the + * user-interface thread for, or null if the given thread + * is not a user-interface thread for any display. Specifying + * null as the thread will return null + * for the display. + * + * @param thread the user-interface thread + * @return the display for the given thread + */ + public static Display findDisplay (Thread thread) { + synchronized (Device.classinfo) { + for (int i=0; iWidget subclass which - * represents it in the currently running application, if - * such exists, or null if no matching widget can be found. - *

    - * IMPORTANT: This method should not be called from - * application code. The arguments are platform-specific. - *

    - * - * @param handle the handle for the widget - * @return the DWT widget that the handle represents - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Widget findWidget (objc.id handle) { - checkDevice (); - return getWidget (handle); -} - -/** - * Given the operating system handle for a widget, - * and widget-specific id, returns the instance of - * the Widget subclass which represents - * the handle/id pair in the currently running application, - * if such exists, or null if no matching widget can be found. - *

    - * IMPORTANT: This method should not be called from - * application code. The arguments are platform-specific. - *

    - * - * @param handle the handle for the widget - * @param id the id for the subwidget (usually an item) - * @return the DWT widget that the handle/id pair represents - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.1 - */ -public Widget findWidget (objc.id handle, int id) { - checkDevice (); - return getWidget (handle); -} - -/** - * Given a widget and a widget-specific id, returns the - * instance of the Widget subclass which represents - * the widget/id pair in the currently running application, - * if such exists, or null if no matching widget can be found. - * - * @param widget the widget - * @param id the id for the subwidget (usually an item) - * @return the DWT subwidget (usually an item) that the widget/id pair represents - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.3 - */ -public Widget findWidget (Widget widget, int id) { - checkDevice (); - return null; -} - -/** - * Returns the display which the given thread is the - * user-interface thread for, or null if the given thread - * is not a user-interface thread for any display. Specifying - * null as the thread will return null - * for the display. - * - * @param thread the user-interface thread - * @return the display for the given thread - */ -public static Display findDisplay (Thread thread) { - synchronized (Device.classinfo) { - for (int i=0; iShell, or null + * if no shell belonging to the currently running application + * is active. + * + * @return the active shell or null + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Shell getActiveShell () { + checkDevice (); + NSArray windows = application.windows(); + int count = cast(int)/*64*/windows.count(); + for (int i = 0; i < count; i++) { + NSWindow win = new NSWindow(windows.objectAtIndex(i)); + if (win.isKeyWindow()) { + Widget widget = getWidget(win.contentView()); + if (cast(Shell) widget) { + return cast(Shell)widget; + } } } return null; } -} - -/** - * Returns the currently active Shell, or null - * if no shell belonging to the currently running application - * is active. - * - * @return the active shell or null - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Shell getActiveShell () { - checkDevice (); - NSArray windows = application.windows(); - int count = cast(int)/*64*/windows.count(); - for (int i = 0; i < count; i++) { - NSWindow win = new NSWindow(windows.objectAtIndex(i)); - if (win.isKeyWindow()) { - Widget widget = getWidget(win.contentView()); - if (cast(Shell) widget) { - return cast(Shell)widget; - } + + /** + * Returns a rectangle describing the receiver's size and location. Note that + * on multi-monitor systems the origin can be negative. + * + * @return the bounding rectangle + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Rectangle getBounds () { + checkDevice (); + NSArray screens = NSScreen.screens(); + return getBounds (screens); + } + + Rectangle getBounds (NSArray screens) { + NSRect primaryFrame = (new NSScreen(screens.objectAtIndex(0))).frame(); + CGFloat minX = CGFloat.max, maxX = CGFloat.min; + CGFloat minY = CGFloat.max, maxY = CGFloat.min; + NSUInteger count = screens.count(); + for (NSUInteger i = 0; i < count; i++) { + NSScreen screen = new NSScreen(screens.objectAtIndex(i)); + NSRect frame = screen.frame(); + CGFloat x1 = frame.x, x2 = frame.x + frame.width; + CGFloat y1 = primaryFrame.height - frame.y, y2 = primaryFrame.height - (frame.y + frame.height); + if (x1 < minX) minX = x1; + if (x2 < minX) minX = x2; + if (x1 > maxX) maxX = x1; + if (x2 > maxX) maxX = x2; + if (y1 < minY) minY = y1; + if (y2 < minY) minY = y2; + if (y1 > maxY) maxY = y1; + if (y2 > maxY) maxY = y2; + } + return new Rectangle (cast(int)minX, cast(int)minY, cast(int)(maxX - minX), cast(int)(maxY - minY)); + } + + /** + * Returns the display which the currently running thread is + * the user-interface thread for, or null if the currently + * running thread is not a user-interface thread for any display. + * + * @return the current display + */ + public static Display getCurrent () { + return findDisplay (Thread.getThis ()); + } + + int getCaretBlinkTime () { + checkDevice (); + return 560; + } + + /** + * Returns a rectangle which describes the area of the + * receiver which is capable of displaying data. + * + * @return the client area + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #getBounds + */ + public Rectangle getClientArea () { + checkDevice (); + NSArray screens = NSScreen.screens(); + if (screens.count() !is 1) return getBounds (screens); + NSScreen screen = new NSScreen(screens.objectAtIndex(0)); + NSRect frame = screen.frame(); + NSRect visibleFrame = screen.visibleFrame(); + CGFloat y = frame.height - (visibleFrame.y + visibleFrame.height); + return new Rectangle(cast(int)visibleFrame.x, cast(int)y, cast(int)visibleFrame.width, cast(int)visibleFrame.height); + } + + /** + * Returns the control which the on-screen pointer is currently + * over top of, or null if it is not currently over one of the + * controls built by the currently running application. + * + * @return the control under the cursor + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Control getCursorControl () { + checkDevice(); + return findControl(null, false, false, true); + } + + /** + * Returns the location of the on-screen pointer relative + * to the top left corner of the screen. + * + * @return the cursor location + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Point getCursorLocation () { + checkDevice (); + NSPoint location = NSEvent.mouseLocation(); + NSRect primaryFrame = getPrimaryFrame(); + return new Point (cast(int) location.x, cast(int) (primaryFrame.height - location.y)); + } + + /** + * Returns an array containing the recommended cursor sizes. + * + * @return the array of cursor sizes + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.0 + */ + public Point [] getCursorSizes () { + checkDevice (); + return [new Point (16, 16)]; + } + + /** + * Returns the default display. One is created (making the + * thread that invokes this method its user-interface thread) + * if it did not already exist. + * + * @return the default display + */ + public static Display getDefault () { + synchronized (Device.classinfo) { + if (Default is null) Default = new Display (); + return Default; } } - return null; -} - -/** - * Returns a rectangle describing the receiver's size and location. Note that - * on multi-monitor systems the origin can be negative. - * - * @return the bounding rectangle - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Rectangle getBounds () { - checkDevice (); - NSArray screens = NSScreen.screens(); - return getBounds (screens); -} - -Rectangle getBounds (NSArray screens) { - NSRect primaryFrame = (new NSScreen(screens.objectAtIndex(0))).frame(); - CGFloat minX = CGFloat.max, maxX = CGFloat.min; - CGFloat minY = CGFloat.max, maxY = CGFloat.min; - NSUInteger count = screens.count(); - for (NSUInteger i = 0; i < count; i++) { - NSScreen screen = new NSScreen(screens.objectAtIndex(i)); - NSRect frame = screen.frame(); - CGFloat x1 = frame.x, x2 = frame.x + frame.width; - CGFloat y1 = primaryFrame.height - frame.y, y2 = primaryFrame.height - (frame.y + frame.height); - if (x1 < minX) minX = x1; - if (x2 < minX) minX = x2; - if (x1 > maxX) maxX = x1; - if (x2 > maxX) maxX = x2; - if (y1 < minY) minY = y1; - if (y2 < minY) minY = y2; - if (y1 > maxY) maxY = y1; - if (y2 > maxY) maxY = y2; + + /** + * Returns the application defined property of the receiver + * with the specified name, or null if it has not been set. + *

    + * Applications may have associated arbitrary objects with the + * receiver in this fashion. If the objects stored in the + * properties need to be notified when the display is disposed + * of, it is the application's responsibility to provide a + * disposeExec() handler which does so. + *

    + * + * @param key the name of the property + * @return the value of the property or null if it has not been set + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the key is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #setData(String, Object) + * @see #disposeExec(Runnable) + */ + public Object getData (String key) { + checkDevice (); + //if (key is null) error (DWT.ERROR_NULL_ARGUMENT); + if (keys is null) return null; + for (int i=0; i - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • - * - * - * @see #getBounds - */ -public Rectangle getClientArea () { - checkDevice (); - NSArray screens = NSScreen.screens(); - if (screens.count() !is 1) return getBounds (screens); - NSScreen screen = new NSScreen(screens.objectAtIndex(0)); - NSRect frame = screen.frame(); - NSRect visibleFrame = screen.visibleFrame(); - CGFloat y = frame.height - (visibleFrame.y + visibleFrame.height); - return new Rectangle(cast(int)visibleFrame.x, cast(int)y, cast(int)visibleFrame.width, cast(int)visibleFrame.height); -} - -/** - * Returns the control which the on-screen pointer is currently - * over top of, or null if it is not currently over one of the - * controls built by the currently running application. - * - * @return the control under the cursor - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Control getCursorControl () { - checkDevice(); - return findControl(null, false, false, true); -} - -/** - * Returns the location of the on-screen pointer relative - * to the top left corner of the screen. - * - * @return the cursor location - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Point getCursorLocation () { - checkDevice (); - NSPoint location = NSEvent.mouseLocation(); - NSRect primaryFrame = getPrimaryFrame(); - return new Point (cast(int) location.x, cast(int) (primaryFrame.height - location.y)); -} - -/** - * Returns an array containing the recommended cursor sizes. - * - * @return the array of cursor sizes - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.0 - */ -public Point [] getCursorSizes () { - checkDevice (); - return [new Point (16, 16)]; -} - -/** - * Returns the default display. One is created (making the - * thread that invokes this method its user-interface thread) - * if it did not already exist. - * - * @return the default display - */ -public static Display getDefault () { - synchronized (Device.classinfo) { - if (Default is null) Default = new Display (); - return Default; + + /** + * Returns the application defined, display specific data + * associated with the receiver, or null if it has not been + * set. The display specific data is a single, + * unnamed field that is stored with every display. + *

    + * Applications may put arbitrary objects in this field. If + * the object stored in the display specific data needs to + * be notified when the display is disposed of, it is the + * application's responsibility to provide a + * disposeExec() handler which does so. + *

    + * + * @return the display specific data + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #setData(Object) + * @see #disposeExec(Runnable) + */ + public Object getData () { + checkDevice (); + return data; } -} - -/** - * Returns the application defined property of the receiver - * with the specified name, or null if it has not been set. - *

    - * Applications may have associated arbitrary objects with the - * receiver in this fashion. If the objects stored in the - * properties need to be notified when the display is disposed - * of, it is the application's responsibility to provide a - * disposeExec() handler which does so. - *

    - * - * @param key the name of the property - * @return the value of the property or null if it has not been set - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the key is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #setData(String, Object) - * @see #disposeExec(Runnable) - */ -public Object getData (String key) { - checkDevice (); - //if (key is null) error (DWT.ERROR_NULL_ARGUMENT); - if (keys is null) return null; - for (int i=0; iLEFT or RIGHT. + * The button dismissal align_ment is the ordering that should be used when positioning the + * default dismissal button for a dialog. For example, in a dialog that contains an OK and + * CANCEL button, on platforms where the button dismissal align_ment is LEFT, the + * button ordering should be OK/CANCEL. When button dismissal align_ment is RIGHT, + * the button ordering should be CANCEL/OK. + * + * @return the button dismissal order + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1 + */ + public int getDismissalAlignment () { + checkDevice (); + return DWT.RIGHT; + } + + /** + * Returns the longest duration, in milliseconds, between + * two mouse button clicks that will be considered a + * double click by the underlying operating system. + * + * @return the double click time + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public int getDoubleClickTime () { + checkDevice (); + return 0; + // return OS.GetDblTime () * 1000 / 60; + } + + /** + * Returns the control which currently has keyboard focus, + * or null if keyboard events are not currently going to + * any of the controls built by the currently running + * application. + * + * @return the control under the cursor + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Control getFocusControl () { + checkDevice (); + NSWindow window = application.keyWindow(); + return GetFocusControl(window); } - return null; -} - -/** - * Returns the application defined, display specific data - * associated with the receiver, or null if it has not been - * set. The display specific data is a single, - * unnamed field that is stored with every display. - *

    - * Applications may put arbitrary objects in this field. If - * the object stored in the display specific data needs to - * be notified when the display is disposed of, it is the - * application's responsibility to provide a - * disposeExec() handler which does so. - *

    - * - * @return the display specific data - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #setData(Object) - * @see #disposeExec(Runnable) - */ -public Object getData () { - checkDevice (); - return data; -} - -/** - * Returns the button dismissal align_ment, one of LEFT or RIGHT. - * The button dismissal align_ment is the ordering that should be used when positioning the - * default dismissal button for a dialog. For example, in a dialog that contains an OK and - * CANCEL button, on platforms where the button dismissal align_ment is LEFT, the - * button ordering should be OK/CANCEL. When button dismissal align_ment is RIGHT, - * the button ordering should be CANCEL/OK. - * - * @return the button dismissal order - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1 - */ -public int getDismissalAlignment () { - checkDevice (); - return DWT.RIGHT; -} - -/** - * Returns the longest duration, in milliseconds, between - * two mouse button clicks that will be considered a - * double click by the underlying operating system. - * - * @return the double click time - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public int getDoubleClickTime () { - checkDevice (); - return 0; -// return OS.GetDblTime () * 1000 / 60; -} - -/** - * Returns the control which currently has keyboard focus, - * or null if keyboard events are not currently going to - * any of the controls built by the currently running - * application. - * - * @return the control under the cursor - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Control getFocusControl () { - checkDevice (); - NSWindow window = application.keyWindow(); - return GetFocusControl(window); -} - -static Control GetFocusControl(NSWindow window) { - if (window !is null) { - NSResponder responder = window.firstResponder(); - if (responder !is null && !responder.respondsToSelector(OS.sel_superview)) { - return null; + + static Control GetFocusControl(NSWindow window) { + if (window !is null) { + NSResponder responder = window.firstResponder(); + if (responder !is null && !responder.respondsToSelector(OS.sel_superview)) { + return null; + } + NSView view = new NSView(responder.id); + if (view !is null) { + do { + Widget widget = GetWidget (view.id); + if (cast(Control)widget) { + return cast(Control)widget; + } + view = view.superview(); + } while (view !is null); + } } - NSView view = new NSView(responder.id); - if (view !is null) { - do { - Widget widget = GetWidget (view.id); - if (cast(Control)widget) { - return cast(Control)widget; - } - view = view.superview(); - } while (view !is null); - } + return null; + } + + /** + * Returns true when the high contrast mode is enabled. + * Otherwise, false is returned. + *

    + * Note: This operation is a hint and is not supported on + * platforms that do not have this concept. + *

    + * + * @return the high contrast mode + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.0 + */ + public bool getHighContrast () { + checkDevice (); + return false; + } + + /** + * Returns the maximum allowed depth of icons on this display, in bits per pixel. + * On some platforms, this may be different than the actual depth of the display. + * + * @return the maximum icon depth + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see Device#getDepth + */ + public int getIconDepth () { + return getDepth (); + } + + /** + * Returns an array containing the recommended icon sizes. + * + * @return the array of icon sizes + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see Decorations#setImages(Image[]) + * + * @since 3.0 + */ + public Point [] getIconSizes () { + checkDevice (); + return [ + new Point (16, 16), new Point (32, 32), + new Point (64, 64), new Point (128, 128)]; } - return null; -} - -/** - * Returns true when the high contrast mode is enabled. - * Otherwise, false is returned. - *

    - * Note: This operation is a hint and is not supported on - * platforms that do not have this concept. - *

    - * - * @return the high contrast mode - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.0 - */ -public bool getHighContrast () { - checkDevice (); - return false; -} - -/** - * Returns the maximum allowed depth of icons on this display, in bits per pixel. - * On some platforms, this may be different than the actual depth of the display. - * - * @return the maximum icon depth - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see Device#getDepth - */ -public int getIconDepth () { - return getDepth (); -} - -/** - * Returns an array containing the recommended icon sizes. - * - * @return the array of icon sizes - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see Decorations#setImages(Image[]) - * - * @since 3.0 - */ -public Point [] getIconSizes () { - checkDevice (); - return [ - new Point (16, 16), new Point (32, 32), - new Point (64, 64), new Point (128, 128)]; -} - -int getLastEventTime () { - /* - * This code is intentionally commented. Event time is - * in seconds and we need an accurate time in milliseconds. - */ -// return (int) (OS.GetLastUserEventTime () * 1000.0); - return cast(int) System.currentTimeMillis (); -} - -Menu [] getMenus (Decorations shell) { - if (menus is null) return new Menu [0]; - int count = 0; - for (int i = 0; i < menus.length; i++) { - Menu menu = menus[i]; - if (menu !is null && menu.parent is shell) count++; + + int getLastEventTime () { + /* + * This code is intentionally commented. Event time is + * in seconds and we need an accurate time in milliseconds. + */ + // return (int) (OS.GetLastUserEventTime () * 1000.0); + return cast(int) System.currentTimeMillis (); + } + + Menu [] getMenus (Decorations shell) { + if (menus is null) return new Menu [0]; + int count = 0; + for (int i = 0; i < menus.length; i++) { + Menu menu = menus[i]; + if (menu !is null && menu.parent is shell) count++; + } + int index = 0; + Menu[] result = new Menu[count]; + for (int i = 0; i < menus.length; i++) { + Menu menu = menus[i]; + if (menu !is null && menu.parent is shell) { + result[index++] = menu; + } + } + return result; + } + + int getMessageCount () { + return synchronizer.getMessageCount (); } - int index = 0; - Menu[] result = new Menu[count]; - for (int i = 0; i < menus.length; i++) { - Menu menu = menus[i]; - if (menu !is null && menu.parent is shell) { - result[index++] = menu; + + /** + * Returns an array of monitors attached to the device. + * + * @return the array of monitors + * + * @since 3.0 + */ + public dwt.widgets.Monitor.Monitor [] getMonitors () { + checkDevice (); + NSArray screens = NSScreen.screens(); + NSRect primaryFrame = (new NSScreen(screens.objectAtIndex(0))).frame(); + NSUInteger count = screens.count(); + dwt.widgets.Monitor.Monitor [] monitors = new dwt.widgets.Monitor.Monitor [count]; + for (NSUInteger i=0; i + *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • + *
  • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
  • + * + */ + public Shell [] getShells () { + checkDevice (); + NSArray windows = application.windows(); + int index = 0; + Shell [] result = new Shell [windows.count()]; + for (int i = 0; i < result.length; i++) { + NSWindow window = new NSWindow(windows.objectAtIndex(i)); + Widget widget = getWidget(window.contentView()); + if (cast(Shell) widget) { + result[index++] = cast(Shell)widget; + } + } + if (index is result.length) return result; + Shell [] newResult = new Shell [index]; + System.arraycopy (result, 0, newResult, 0, index); + return newResult; } - return monitors; -} - -NSRect getPrimaryFrame () { - NSArray screens = NSScreen.screens(); - return (new NSScreen(screens.objectAtIndex(0))).frame(); -} - -/** - * Returns the primary monitor for that device. - * - * @return the primary monitor - * - * @since 3.0 - */ -public dwt.widgets.Monitor.Monitor getPrimaryMonitor () { - checkDevice (); - dwt.widgets.Monitor.Monitor monitor = new dwt.widgets.Monitor.Monitor (); - NSArray screens = NSScreen.screens(); - NSScreen screen = new NSScreen(screens.objectAtIndex(0)); - NSRect frame = screen.frame(); - monitor.x = cast(int)frame.x; - monitor.y = cast(int)(frame.height - (frame.y + frame.height)); - monitor.width = cast(int)frame.width; - monitor.height = cast(int)frame.height; - NSRect visibleFrame = screen.visibleFrame(); - monitor.clientX = cast(int)visibleFrame.x; - monitor.clientY = cast(int)(frame.height - (visibleFrame.y + visibleFrame.height)); - monitor.clientWidth = cast(int)visibleFrame.width; - monitor.clientHeight = cast(int)visibleFrame.height; - return monitor; -} - -/** - * Returns a (possibly empty) array containing all shells which have - * not been disposed and have the receiver as their display. - * - * @return the receiver's shells - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Shell [] getShells () { - checkDevice (); - NSArray windows = application.windows(); - int index = 0; - Shell [] result = new Shell [windows.count()]; - for (int i = 0; i < result.length; i++) { - NSWindow window = new NSWindow(windows.objectAtIndex(i)); - Widget widget = getWidget(window.contentView()); - if (cast(Shell) widget) { - result[index++] = cast(Shell)widget; + + /** + * Gets the synchronizer used by the display. + * + * @return the receiver's synchronizer + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.4 + */ + public Synchronizer getSynchronizer () { + checkDevice (); + return synchronizer; + } + + /** + * Returns the thread that has invoked syncExec + * or null if no such runnable is currently being invoked by + * the user-interface thread. + *

    + * Note: If a runnable invoked by asyncExec is currently + * running, this method will return null. + *

    + * + * @return the receiver's sync-interface thread + * + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Thread getSyncThread () { + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + return synchronizer.syncThread; } } - if (index is result.length) return result; - Shell [] newResult = new Shell [index]; - System.arraycopy (result, 0, newResult, 0, index); - return newResult; -} - -/** - * Gets the synchronizer used by the display. - * - * @return the receiver's synchronizer - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.4 - */ -public Synchronizer getSynchronizer () { - checkDevice (); - return synchronizer; -} - -/** - * Returns the thread that has invoked syncExec - * or null if no such runnable is currently being invoked by - * the user-interface thread. - *

    - * Note: If a runnable invoked by asyncExec is currently - * running, this method will return null. - *

    - * - * @return the receiver's sync-interface thread - * - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Thread getSyncThread () { - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - return synchronizer.syncThread; - } -} - -/** - * Returns the matching standard color for the given - * constant, which should be one of the color constants - * specified in class DWT. Any value other - * than one of the DWT color constants which is passed - * in will result in the color black. This color should - * not be free'd because it was allocated by the system, - * not the application. - * - * @param id the color constant - * @return the matching color - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see DWT - */ -public Color getSystemColor (int id) { - checkDevice (); - NSColor color = null; - switch (id) { - case DWT.COLOR_INFO_FOREGROUND: return super.getSystemColor (DWT.COLOR_BLACK); - case DWT.COLOR_INFO_BACKGROUND: return Color.cocoa_new (this, [0xFF / 255f, 0xFF / 255f, 0xE1 / 255f, 1]); - case DWT.COLOR_TITLE_FOREGROUND: color = NSColor.windowFrameTextColor(); break; - case DWT.COLOR_TITLE_BACKGROUND: color = NSColor.secondarySelectedControlColor(); break; - case DWT.COLOR_TITLE_BACKGROUND_GRADIENT: color = NSColor.windowFrameColor(); break; - case DWT.COLOR_TITLE_INACTIVE_FOREGROUND: color = NSColor.disabledControlTextColor(); break; - case DWT.COLOR_TITLE_INACTIVE_BACKGROUND: color = NSColor.secondarySelectedControlColor(); break; - case DWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT: color = NSColor.secondarySelectedControlColor(); break; - case DWT.COLOR_WIDGET_DARK_SHADOW: color = NSColor.controlDarkShadowColor(); break; - case DWT.COLOR_WIDGET_NORMAL_SHADOW: color = NSColor.controlShadowColor(); break; - case DWT.COLOR_WIDGET_LIGHT_SHADOW: color = NSColor.controlHighlightColor(); break; - case DWT.COLOR_WIDGET_HIGHLIGHT_SHADOW: color = NSColor.controlLightHighlightColor(); break; - case DWT.COLOR_WIDGET_BACKGROUND: color = NSColor.controlHighlightColor(); break; - case DWT.COLOR_WIDGET_FOREGROUND: color = NSColor.controlTextColor(); break; - case DWT.COLOR_WIDGET_BORDER: return super.getSystemColor (DWT.COLOR_BLACK); - case DWT.COLOR_LIST_FOREGROUND: color = NSColor.textColor(); break; - case DWT.COLOR_LIST_BACKGROUND: color = NSColor.textBackgroundColor(); break; - case DWT.COLOR_LIST_SELECTION_TEXT: color = NSColor.selectedTextColor(); break; - case DWT.COLOR_LIST_SELECTION: color = NSColor.selectedTextBackgroundColor(); break; - default: - return super.getSystemColor (id); + + /** + * Returns the matching standard color for the given + * constant, which should be one of the color constants + * specified in class DWT. Any value other + * than one of the DWT color constants which is passed + * in will result in the color black. This color should + * not be free'd because it was allocated by the system, + * not the application. + * + * @param id the color constant + * @return the matching color + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see DWT + */ + public Color getSystemColor (int id) { + checkDevice (); + NSColor color = null; + switch (id) { + case DWT.COLOR_INFO_FOREGROUND: return super.getSystemColor (DWT.COLOR_BLACK); + case DWT.COLOR_INFO_BACKGROUND: return Color.cocoa_new (this, [0xFF / 255f, 0xFF / 255f, 0xE1 / 255f, 1]); + case DWT.COLOR_TITLE_FOREGROUND: color = NSColor.windowFrameTextColor(); break; + case DWT.COLOR_TITLE_BACKGROUND: color = NSColor.secondarySelectedControlColor(); break; + case DWT.COLOR_TITLE_BACKGROUND_GRADIENT: color = NSColor.windowFrameColor(); break; + case DWT.COLOR_TITLE_INACTIVE_FOREGROUND: color = NSColor.disabledControlTextColor(); break; + case DWT.COLOR_TITLE_INACTIVE_BACKGROUND: color = NSColor.secondarySelectedControlColor(); break; + case DWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT: color = NSColor.secondarySelectedControlColor(); break; + case DWT.COLOR_WIDGET_DARK_SHADOW: color = NSColor.controlDarkShadowColor(); break; + case DWT.COLOR_WIDGET_NORMAL_SHADOW: color = NSColor.controlShadowColor(); break; + case DWT.COLOR_WIDGET_LIGHT_SHADOW: color = NSColor.controlHighlightColor(); break; + case DWT.COLOR_WIDGET_HIGHLIGHT_SHADOW: color = NSColor.controlLightHighlightColor(); break; + case DWT.COLOR_WIDGET_BACKGROUND: color = NSColor.controlHighlightColor(); break; + case DWT.COLOR_WIDGET_FOREGROUND: color = NSColor.controlTextColor(); break; + case DWT.COLOR_WIDGET_BORDER: return super.getSystemColor (DWT.COLOR_BLACK); + case DWT.COLOR_LIST_FOREGROUND: color = NSColor.textColor(); break; + case DWT.COLOR_LIST_BACKGROUND: color = NSColor.textBackgroundColor(); break; + case DWT.COLOR_LIST_SELECTION_TEXT: color = NSColor.selectedTextColor(); break; + case DWT.COLOR_LIST_SELECTION: color = NSColor.selectedTextBackgroundColor(); break; + default: + return super.getSystemColor (id); + } + if (color is null) return super.getSystemColor(id); + color = color.colorUsingColorSpace(NSColorSpace.deviceRGBColorSpace()); + if (color is null) return super.getSystemColor(id); + CGFloat[] components = new CGFloat[color.numberOfComponents()]; + color.getComponents(components.ptr); + return Color.cocoa_new (this, [components[0], components[1], components[2], components[3]]); } - if (color is null) return super.getSystemColor(id); - color = color.colorUsingColorSpace(NSColorSpace.deviceRGBColorSpace()); - if (color is null) return super.getSystemColor(id); - CGFloat[] components = new CGFloat[color.numberOfComponents()]; - color.getComponents(components.ptr); - return Color.cocoa_new (this, [components[0], components[1], components[2], components[3]]); -} - -/** - * Returns the matching standard platform cursor for the given - * constant, which should be one of the cursor constants - * specified in class DWT. This cursor should - * not be free'd because it was allocated by the system, - * not the application. A value of null will - * be returned if the supplied constant is not an DWT cursor - * constant. - * - * @param id the DWT cursor constant - * @return the corresponding cursor or null - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see DWT#CURSOR_ARROW - * @see DWT#CURSOR_WAIT - * @see DWT#CURSOR_CROSS - * @see DWT#CURSOR_APPSTARTING - * @see DWT#CURSOR_HELP - * @see DWT#CURSOR_SIZEALL - * @see DWT#CURSOR_SIZENESW - * @see DWT#CURSOR_SIZENS - * @see DWT#CURSOR_SIZENWSE - * @see DWT#CURSOR_SIZEWE - * @see DWT#CURSOR_SIZEN - * @see DWT#CURSOR_SIZES - * @see DWT#CURSOR_SIZEE - * @see DWT#CURSOR_SIZEW - * @see DWT#CURSOR_SIZENE - * @see DWT#CURSOR_SIZESE - * @see DWT#CURSOR_SIZESW - * @see DWT#CURSOR_SIZENW - * @see DWT#CURSOR_UPARROW - * @see DWT#CURSOR_IBEAM - * @see DWT#CURSOR_NO - * @see DWT#CURSOR_HAND - * - * @since 3.0 - */ -public Cursor getSystemCursor (int id) { - checkDevice (); - if (!(0 <= id && id < cursors.length)) return null; - if (cursors [id] is null) { - cursors [id] = new Cursor (this, id); + + /** + * Returns the matching standard platform cursor for the given + * constant, which should be one of the cursor constants + * specified in class DWT. This cursor should + * not be free'd because it was allocated by the system, + * not the application. A value of null will + * be returned if the supplied constant is not an DWT cursor + * constant. + * + * @param id the DWT cursor constant + * @return the corresponding cursor or null + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see DWT#CURSOR_ARROW + * @see DWT#CURSOR_WAIT + * @see DWT#CURSOR_CROSS + * @see DWT#CURSOR_APPSTARTING + * @see DWT#CURSOR_HELP + * @see DWT#CURSOR_SIZEALL + * @see DWT#CURSOR_SIZENESW + * @see DWT#CURSOR_SIZENS + * @see DWT#CURSOR_SIZENWSE + * @see DWT#CURSOR_SIZEWE + * @see DWT#CURSOR_SIZEN + * @see DWT#CURSOR_SIZES + * @see DWT#CURSOR_SIZEE + * @see DWT#CURSOR_SIZEW + * @see DWT#CURSOR_SIZENE + * @see DWT#CURSOR_SIZESE + * @see DWT#CURSOR_SIZESW + * @see DWT#CURSOR_SIZENW + * @see DWT#CURSOR_UPARROW + * @see DWT#CURSOR_IBEAM + * @see DWT#CURSOR_NO + * @see DWT#CURSOR_HAND + * + * @since 3.0 + */ + public Cursor getSystemCursor (int id) { + checkDevice (); + if (!(0 <= id && id < cursors.length)) return null; + if (cursors [id] is null) { + cursors [id] = new Cursor (this, id); + } + return cursors [id]; } - return cursors [id]; -} - -/** - * Returns the matching standard platform image for the given - * constant, which should be one of the icon constants - * specified in class DWT. This image should - * not be free'd because it was allocated by the system, - * not the application. A value of null will - * be returned either if the supplied constant is not an - * DWT icon constant or if the platform does not define an - * image that corresponds to the constant. - * - * @param id the DWT icon constant - * @return the corresponding image or null - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see DWT#ICON_ERROR - * @see DWT#ICON_INFORMATION - * @see DWT#ICON_QUESTION - * @see DWT#ICON_WARNING - * @see DWT#ICON_WORKING - * - * @since 3.0 - */ -public Image getSystemImage (int id) { - checkDevice (); - switch(id) { - case DWT.ICON_ERROR: { - if (errorImage !is null) return errorImage; - NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertStopIcon))); - if (nsImage is null) return null; - nsImage.retain (); - return errorImage = Image.cocoa_new (this, DWT.ICON, nsImage); + + /** + * Returns the matching standard platform image for the given + * constant, which should be one of the icon constants + * specified in class DWT. This image should + * not be free'd because it was allocated by the system, + * not the application. A value of null will + * be returned either if the supplied constant is not an + * DWT icon constant or if the platform does not define an + * image that corresponds to the constant. + * + * @param id the DWT icon constant + * @return the corresponding image or null + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see DWT#ICON_ERROR + * @see DWT#ICON_INFORMATION + * @see DWT#ICON_QUESTION + * @see DWT#ICON_WARNING + * @see DWT#ICON_WORKING + * + * @since 3.0 + */ + public Image getSystemImage (int id) { + checkDevice (); + switch(id) { + case DWT.ICON_ERROR: { + if (errorImage !is null) return errorImage; + NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertStopIcon))); + if (nsImage is null) return null; + nsImage.retain (); + return errorImage = Image.cocoa_new (this, DWT.ICON, nsImage); + } + case DWT.ICON_INFORMATION: + case DWT.ICON_QUESTION: + case DWT.ICON_WORKING: { + if (infoImage !is null) return infoImage; + NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertNoteIcon))); + if (nsImage is null) return null; + nsImage.retain (); + return infoImage = Image.cocoa_new (this, DWT.ICON, nsImage); + } + case DWT.ICON_WARNING: { + if (warningImage !is null) return warningImage; + NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertCautionIcon))); + if (nsImage is null) return null; + nsImage.retain (); + return warningImage = Image.cocoa_new (this, DWT.ICON, nsImage); + } + + default: } - case DWT.ICON_INFORMATION: - case DWT.ICON_QUESTION: - case DWT.ICON_WORKING: { - if (infoImage !is null) return infoImage; - NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertNoteIcon))); - if (nsImage is null) return null; - nsImage.retain (); - return infoImage = Image.cocoa_new (this, DWT.ICON, nsImage); - } - case DWT.ICON_WARNING: { - if (warningImage !is null) return warningImage; - NSImage nsImage = NSWorkspace.sharedWorkspace ().iconForFileType (new NSString (OS.NSFileTypeForHFSTypeCode (OS.kAlertCautionIcon))); - if (nsImage is null) return null; - nsImage.retain (); - return warningImage = Image.cocoa_new (this, DWT.ICON, nsImage); + return null; + } + + /** + * Returns the single instance of the system tray or null + * when there is no system tray available for the platform. + * + * @return the system tray or null + * + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.0 + */ + public Tray getSystemTray () { + checkDevice (); + if (tray !is null) return tray; + return tray = new Tray (this, DWT.NONE); + } + + /** + * Returns the user-interface thread for the receiver. + * + * @return the receiver's user-interface thread + * + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + */ + public Thread getThread () { + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + return thread; } } - return null; -} - -/** - * Returns the single instance of the system tray or null - * when there is no system tray available for the platform. - * - * @return the system tray or null - * - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.0 - */ -public Tray getSystemTray () { - checkDevice (); - if (tray !is null) return tray; - return tray = new Tray (this, DWT.NONE); -} - -/** - * Returns the user-interface thread for the receiver. - * - * @return the receiver's user-interface thread - * - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - */ -public Thread getThread () { - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - return thread; + + int getToolTipTime () { + checkDevice (); + //TODO get OS value (NSTooltipManager?) + return 560; + } + + Widget getWidget (objc.id id) { + return GetWidget (id); } -} - -int getToolTipTime () { - checkDevice (); - //TODO get OS value (NSTooltipManager?) - return 560; -} - -Widget getWidget (objc.id id) { - return GetWidget (id); -} - -static Widget GetWidget (objc.id id) { - if (id is null) return null; - void* jniRef; - OS.object_getInstanceVariable(id, SWT_OBJECT, jniRef); - if (jniRef is null) return null; - return cast(Widget)OS.JNIGetObject(jniRef); -} - -Widget getWidget (NSView view) { - if (view is null) return null; - return getWidget(view.id); -} - -/** - * Initializes any internal resources needed by the - * device. - *

    - * This method is called after create. - *

    - * - * @see #create - */ -protected void init_ () { - super.init_ (); - initClasses (); - if (!isEmbedded) { - initApplicationDelegate(); - application.finishLaunching(); + static Widget GetWidget (objc.id id) { + if (id is null) return null; + void* jniRef; + OS.object_getInstanceVariable(id, SWT_OBJECT, jniRef); + if (jniRef is null) return null; + return cast(Widget)OS.JNIGetObject(jniRef); } - - timerDelegate = cast(SWTWindowDelegate)(new SWTWindowDelegate()).alloc().init(); + + Widget getWidget (NSView view) { + if (view is null) return null; + return getWidget(view.id); + } - NSTextView textView = cast(NSTextView)(new NSTextView()).alloc(); - textView.initWithFrame (NSRect ()); - markedAttributes = textView.markedTextAttributes (); - markedAttributes.retain (); - textView.release (); -} - -void initApplicationDelegate() { - String className = "SWTApplicationDelegate"; - if (OS.objc_lookUpClass (className) is null) { - objc.IMP appProc3 = cast(objc.IMP) &applicationDelegateProc; - objc.Class cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); - OS.class_addMethod(cls, OS.sel_applicationWillFinishLaunching_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_terminate_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_orderFrontStandardAboutPanel_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_hideOtherApplications_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_hide_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_unhideAllApplications_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_applicationShouldTerminate_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_applicationWillTerminate_, appProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_applicationWillResignActive_, appProc3, "@:@"); - OS.objc_registerClassPair(cls); - } - applicationDelegate = cast(SWTApplicationDelegate)(new SWTApplicationDelegate()).alloc().init(); - application.setDelegate(applicationDelegate); -} - -void addEventMethods (objc.Class cls, objc.IMP proc2, objc.IMP proc3, objc.IMP drawRectProc) { - OS.class_addMethod(cls, OS.sel_mouseDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_mouseUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_scrollWheel_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_rightMouseDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_rightMouseUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_otherMouseDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_otherMouseUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_mouseDragged_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_mouseMoved_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_mouseEntered_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_mouseExited_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_menuForEvent_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_resignFirstResponder, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_becomeFirstResponder, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_keyDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_keyUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_flagsChanged_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_drawRect_, drawRectProc, "@:{NSRect}"); -} - -void addFrameMethods(objc.Class cls, objc.IMP setFrameOriginProc, objc.IMP setFrameSizeProc) { - OS.class_addMethod(cls, OS.sel_setFrameOrigin_, setFrameOriginProc, "@:{NSPoint}"); - OS.class_addMethod(cls, OS.sel_setFrameSize_, setFrameSizeProc, "@:{NSSize}"); -} - -void addAccessibilityMethods(objc.Class cls, objc.IMP proc2, objc.IMP proc3, objc.IMP proc4, objc.IMP accessibilityHitTestProc) { - OS.class_addMethod(cls, OS.sel_accessibilityActionNames, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_accessibilityAttributeNames, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_accessibilityParameterizedAttributeNames, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_accessibilityFocusedUIElement, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_accessibilityIsIgnored, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_accessibilityAttributeValue_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_accessibilityIsAttributeSettable_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_accessibilityHitTest_, accessibilityHitTestProc, "@:{NSPoint}"); - OS.class_addMethod(cls, OS.sel_accessibilityAttributeValue_forParameter_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_accessibilityPerformAction_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_accessibilityActionDescription_, proc3, "@:@"); -} - -objc.Class registerCellSubclass(objc.Class cellClass, int size, int align_, String types) { - String cellClassName = OS.class_getName(cellClass); - objc.Class cls = OS.objc_allocateClassPair(cellClass, "SWT" ~ cellClassName, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.objc_registerClassPair(cls); - return cls; -} - -void initClasses () { - if (OS.objc_lookUpClass ("SWTView") !is null) return; - - objc.IMP dialogProc3 = cast(objc.IMP) &dialogProc; - objc.IMP proc3 = cast(objc.IMP) &windowDelegateProc3; - objc.IMP proc2 = cast(objc.IMP) &windowDelegateProc2; - objc.IMP proc4 = cast(objc.IMP) &windowDelegateProc4; - objc.IMP proc5 = cast(objc.IMP) &windowDelegateProc5; - objc.IMP proc6 = cast(objc.IMP) &windowDelegateProc6; - - objc.IMP drawRectProc = OS.drawRect_CALLBACK(proc3); - objc.IMP drawInteriorWithFrameInViewProc = OS.drawInteriorWithFrame_inView_CALLBACK (proc4); - objc.IMP setFrameOriginProc = OS.setFrameOrigin_CALLBACK(proc3); - objc.IMP setFrameSizeProc = OS.setFrameSize_CALLBACK(proc3); - objc.IMP hitTestProc = OS.hitTest_CALLBACK(proc3); - objc.IMP markedRangeProc = OS.markedRange_CALLBACK(proc2); - objc.IMP selectedRangeProc = OS.selectedRange_CALLBACK(proc2); - objc.IMP highlightSelectionInClipRectProc = OS.highlightSelectionInClipRect_CALLBACK(proc3); - objc.IMP setMarkedText_selectedRangeProc = OS.setMarkedText_selectedRange_CALLBACK(proc4); - objc.IMP attributedSubstringFromRangeProc = OS.attributedSubstringFromRange_CALLBACK(proc3); - objc.IMP characterIndexForPointProc = OS.characterIndexForPoint_CALLBACK(proc3); - objc.IMP firstRectForCharacterRangeProc = OS.firstRectForCharacterRange_CALLBACK(proc3); - objc.IMP textWillChangeSelectionProc = OS.textView_willChangeSelectionFromCharacterRange_toCharacterRange_CALLBACK(proc5); - objc.IMP accessibilityHitTestProc = OS.accessibilityHitTest_CALLBACK(proc3); - - String types = "*"; - size_t size = C.PTR_SIZEOF, align_ = C.PTR_SIZEOF is 4 ? 2 : 3; - - String className = "SWTWindowDelegate"; - objc.Class cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_windowDidResize_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_windowDidMove_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_windowShouldClose_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_windowWillClose_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_windowDidResignKey_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_windowDidBecomeKey_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_timerProc_, proc3, "@:@"); - OS.objc_registerClassPair(cls); - - className = "SWTPanelDelegate"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_windowWillClose_, dialogProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_changeColor_, dialogProc3, "@:@"); - OS.class_addMethod(cls, OS.sel_changeFont_, dialogProc3, "@:@"); - OS.objc_registerClassPair(cls); + /** + * Initializes any internal resources needed by the + * device. + *

    + * This method is called after create. + *

    + * + * @see #create + */ + protected void init_ () { + super.init_ (); + initClasses (); + + /*if (!isEmbedded) { + initApplicationDelegate(); + application.finishLaunching(); + } + + timerDelegate = cast(SWTWindowDelegate)(new SWTWindowDelegate()).alloc().init(); + + NSTextView textView = cast(NSTextView)(new NSTextView()).alloc(); + textView.initWithFrame (NSRect ()); + markedAttributes = textView.markedTextAttributes (); + markedAttributes.retain (); + textView.release ();*/ + } - className = "SWTMenu"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSMenu, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_menuWillOpen_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_menuDidClose_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_menu_willHighlightItem_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_menuNeedsUpdate_, proc3, "@:@"); - OS.objc_registerClassPair(cls); - - className = "SWTView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSView, className, 0); - OS.class_addProtocol(cls, OS.objc_getProtocol("NSTextInput")); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_isFlipped, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_acceptsFirstResponder, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_isOpaque, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_hitTest_, hitTestProc, "@:{NSPoint}"); - - //NSTextInput protocol - OS.class_addMethod(cls, OS.sel_hasMarkedText, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_markedRange, markedRangeProc, "@:"); - OS.class_addMethod(cls, OS.sel_selectedRange, selectedRangeProc, "@:"); - OS.class_addMethod(cls, OS.sel_setMarkedText_selectedRange_, setMarkedText_selectedRangeProc, "@:@{NSRange}"); - OS.class_addMethod(cls, OS.sel_unmarkText, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_validAttributesForMarkedText, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_attributedSubstringFromRange_, attributedSubstringFromRangeProc, "@:{NSRange}"); - OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_characterIndexForPoint_, characterIndexForPointProc, "@:{NSPoint}"); - OS.class_addMethod(cls, OS.sel_firstRectForCharacterRange_, firstRectForCharacterRangeProc, "@:{NSRange}"); - OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); - - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTScrollView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSScrollView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendVerticalSelection, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_sendHorizontalSelection, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_pageDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_pageUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_reflectScrolledClipView_, proc3, "@:@"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTButton"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSButton, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); + void initApplicationDelegate() { + String className = "SWTApplicationDelegate"; + if (OS.objc_lookUpClass (className) is null) { + objc.IMP appProc3 = cast(objc.IMP) &applicationDelegateProc; + objc.Class cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); + OS.class_addMethod(cls, OS.sel_applicationWillFinishLaunching_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_terminate_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_orderFrontStandardAboutPanel_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_hideOtherApplications_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_hide_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_unhideAllApplications_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_applicationShouldTerminate_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_applicationWillTerminate_, appProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_applicationWillResignActive_, appProc3, "@:@"); + OS.objc_registerClassPair(cls); + } + applicationDelegate = cast(SWTApplicationDelegate)(new SWTApplicationDelegate()).alloc().init(); + application.setDelegate(applicationDelegate); + } - cls = registerCellSubclass(NSButton.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSButton.setCellClass(cls); - - className = "SWTTableView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTableView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_highlightSelectionInClipRect_, highlightSelectionInClipRectProc, "@:{NSRect}"); - OS.class_addMethod(cls, OS.sel_sendDoubleSelection, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_numberOfRowsInTableView_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_tableView_objectValueForTableColumn_row_, proc5, "@:@:@:@"); - OS.class_addMethod(cls, OS.sel_tableView_shouldEditTableColumn_row_, proc5, "@:@:@:@"); - OS.class_addMethod(cls, OS.sel_tableViewSelectionDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_tableView_willDisplayCell_forTableColumn_row_, proc6, "@:@@@i"); - OS.class_addMethod(cls, OS.sel_tableView_setObjectValue_forTableColumn_row_, proc6, "@:@@@i"); - OS.class_addMethod(cls, OS.sel_tableViewColumnDidMove_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_tableViewColumnDidResize_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_tableView_didClickTableColumn_, proc4, "@:@"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTTableHeaderCell"; - cls = OS.objc_allocateClassPair (cast(objc.Class) OS.class_NSTableHeaderCell, className, 0); - OS.class_addIvar (cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod (cls, OS.sel_drawInteriorWithFrame_inView_, drawInteriorWithFrameInViewProc, "@:{NSRect}@"); - OS.objc_registerClassPair (cls); - - className = "SWTBrowserCell"; - cls = OS.objc_allocateClassPair (cast(objc.Class) OS.class_NSBrowserCell, className, 0); - OS.class_addIvar (cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod (cls, OS.sel_drawInteriorWithFrame_inView_, drawInteriorWithFrameInViewProc, "@:{NSRect}@"); - OS.objc_registerClassPair (cls); - - className = "SWTTableHeaderView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTableHeaderView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_mouseDown_, proc3, "@:@"); - OS.objc_registerClassPair(cls); - - className = "SWTOutlineView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSOutlineView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_highlightSelectionInClipRect_, highlightSelectionInClipRectProc, "@:{NSRect}"); - OS.class_addMethod(cls, OS.sel_sendDoubleSelection, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_outlineViewSelectionDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_outlineViewItemDidExpand_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_outlineView_shouldCollapseItem_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_outlineView_shouldExpandItem_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_outlineView_child_ofItem_, proc5, "@:@i@"); - OS.class_addMethod(cls, OS.sel_outlineView_isItemExpandable_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_outlineView_numberOfChildrenOfItem_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_outlineView_objectValueForTableColumn_byItem_, proc5, "@:@@@"); - OS.class_addMethod(cls, OS.sel_outlineView_willDisplayCell_forTableColumn_item_, proc6, "@:@@@@"); - OS.class_addMethod(cls, OS.sel_outlineView_setObjectValue_forTableColumn_byItem_, proc6, "@:@@@@"); - OS.class_addMethod(cls, OS.sel_outlineViewColumnDidMove_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_outlineViewColumnDidResize_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_outlineView_didClickTableColumn_, proc4, "@:@"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTTreeItem"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.objc_registerClassPair(cls); - - className = "SWTTabView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTabView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_tabView_willSelectTabViewItem_, proc4, "@:@@"); - OS.class_addMethod(cls, OS.sel_tabView_didSelectTabViewItem_, proc4, "@:@@"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTBox"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSBox, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); + void addEventMethods (objc.Class cls, objc.IMP proc2, objc.IMP proc3, objc.IMP drawRectProc) { + OS.class_addMethod(cls, OS.sel_mouseDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_mouseUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_scrollWheel_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_rightMouseDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_rightMouseUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_otherMouseDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_otherMouseUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_mouseDragged_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_mouseMoved_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_mouseEntered_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_mouseExited_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_menuForEvent_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_resignFirstResponder, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_becomeFirstResponder, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_keyDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_keyUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_flagsChanged_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_drawRect_, drawRectProc, "@:{NSRect}"); + } - className = "SWTProgressIndicator"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSProgressIndicator, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTSlider"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSlider, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSSlider.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSSlider.setCellClass(cls); - - className = "SWTPopUpButton"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSPopUpButton, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSPopUpButton.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSPopUpButton.setCellClass(cls); - - className = "SWTComboBox"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSComboBox, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_comboBoxSelectionDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); + void addFrameMethods(objc.Class cls, objc.IMP setFrameOriginProc, objc.IMP setFrameSizeProc) { + OS.class_addMethod(cls, OS.sel_setFrameOrigin_, setFrameOriginProc, "@:{NSPoint}"); + OS.class_addMethod(cls, OS.sel_setFrameSize_, setFrameSizeProc, "@:{NSSize}"); + } - cls = registerCellSubclass(NSComboBox.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSComboBox.setCellClass(cls); - - className = "SWTDatePicker"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSDatePicker, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - className = "SWTImageView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSImageView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSImageView.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSImageView.setCellClass(cls); - - className = "SWTStepper"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSStepper, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSStepper.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSStepper.setCellClass(cls); - - className = "SWTScroller"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSScroller, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); + void addAccessibilityMethods(objc.Class cls, objc.IMP proc2, objc.IMP proc3, objc.IMP proc4, objc.IMP accessibilityHitTestProc) { + OS.class_addMethod(cls, OS.sel_accessibilityActionNames, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_accessibilityAttributeNames, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_accessibilityParameterizedAttributeNames, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_accessibilityFocusedUIElement, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_accessibilityIsIgnored, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_accessibilityAttributeValue_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_accessibilityIsAttributeSettable_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_accessibilityHitTest_, accessibilityHitTestProc, "@:{NSPoint}"); + OS.class_addMethod(cls, OS.sel_accessibilityAttributeValue_forParameter_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_accessibilityPerformAction_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_accessibilityActionDescription_, proc3, "@:@"); + } + + objc.Class registerCellSubclass(objc.Class cellClass, int size, int align_, String types) { + String cellClassName = OS.class_getName(cellClass); + objc.Class cls = OS.objc_allocateClassPair(cellClass, "SWT" ~ cellClassName, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.objc_registerClassPair(cls); + return cls; + } - className = "SWTMenuItem"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSMenuItem, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); - OS.objc_registerClassPair(cls); - - className = "SWTTextView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextView, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); - OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textView_clickedOnLink_atIndex_, proc5, "@:@@@"); - OS.objc_registerClassPair(cls); - - className = "SWTEditorView"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextView, className, 0); - OS.class_addMethod(cls, OS.sel_keyDown_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_keyUp_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); - OS.objc_registerClassPair(cls); - - className = "SWTTextField"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextField, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSTextField.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSTextField.setCellClass(cls); - - className = "SWTSearchField"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSearchField, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); - OS.objc_registerClassPair(cls); - - cls = registerCellSubclass(NSSearchField.cellClass(), size, align_, types); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - NSSearchField.setCellClass(cls); - - className = "SWTSecureTextField"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSecureTextField, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - addEventMethods(cls, proc2, proc3, drawRectProc); - addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); - OS.objc_registerClassPair(cls); - - // Don't subclass NSSecureTextFieldCell -- you'll get an NSException from [NSSecureTextField setCellClass:]! - - className = "SWTWindow"; - cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSWindow, className, 0); - OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); - OS.class_addMethod(cls, OS.sel_sendEvent_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_helpRequested_, proc3, "@:@"); - OS.class_addMethod(cls, OS.sel_canBecomeKeyWindow, proc2, "@:"); - OS.class_addMethod(cls, OS.sel_makeFirstResponder_, proc3, "@:@"); - addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); - OS.objc_registerClassPair(cls); -} - -/** - * Invokes platform specific functionality to allocate a new GC handle. - *

    - * IMPORTANT: This method is not part of the public - * API for Display. It is marked public only so that it - * can be shared within the packages provided by DWT. It is not - * available on all platforms, and should never be called from - * application code. - *

    - * - * @param data the platform specific GC data - * @return the platform specific GC handle - * - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * @exception DWTError
      - *
    • ERROR_NO_HANDLES if a handle could not be obtained for gc creation
    • - *
    - */ -public objc.id internal_new_GC (GCData data) { - if (isDisposed()) DWT.error(DWT.ERROR_DEVICE_DISPOSED); - if (screenWindow is null) { - NSWindow window = cast(NSWindow) (new NSWindow ()).alloc (); - NSRect rect = NSRect(); - window = window.initWithContentRect(rect, OS.NSBorderlessWindowMask, OS.NSBackingStoreBuffered, false); - window.setReleasedWhenClosed(false); - screenWindow = window; + void initClasses () { + if (OS.objc_lookUpClass ("SWTView") !is null) return; + + objc.IMP dialogProc3 = cast(objc.IMP) &dialogProc; + objc.IMP proc3 = cast(objc.IMP) &windowDelegateProc3; + objc.IMP proc2 = cast(objc.IMP) &windowDelegateProc2; + objc.IMP proc4 = cast(objc.IMP) &windowDelegateProc4; + objc.IMP proc5 = cast(objc.IMP) &windowDelegateProc5; + objc.IMP proc6 = cast(objc.IMP) &windowDelegateProc6; + + objc.IMP drawRectProc = OS.drawRect_CALLBACK(proc3); + objc.IMP drawInteriorWithFrameInViewProc = OS.drawInteriorWithFrame_inView_CALLBACK (proc4); + objc.IMP setFrameOriginProc = OS.setFrameOrigin_CALLBACK(proc3); + objc.IMP setFrameSizeProc = OS.setFrameSize_CALLBACK(proc3); + objc.IMP hitTestProc = OS.hitTest_CALLBACK(proc3); + objc.IMP markedRangeProc = OS.markedRange_CALLBACK(proc2); + objc.IMP selectedRangeProc = OS.selectedRange_CALLBACK(proc2); + objc.IMP highlightSelectionInClipRectProc = OS.highlightSelectionInClipRect_CALLBACK(proc3); + objc.IMP setMarkedText_selectedRangeProc = OS.setMarkedText_selectedRange_CALLBACK(proc4); + objc.IMP attributedSubstringFromRangeProc = OS.attributedSubstringFromRange_CALLBACK(proc3); + objc.IMP characterIndexForPointProc = OS.characterIndexForPoint_CALLBACK(proc3); + objc.IMP firstRectForCharacterRangeProc = OS.firstRectForCharacterRange_CALLBACK(proc3); + objc.IMP textWillChangeSelectionProc = OS.textView_willChangeSelectionFromCharacterRange_toCharacterRange_CALLBACK(proc5); + objc.IMP accessibilityHitTestProc = OS.accessibilityHitTest_CALLBACK(proc3); + + String types = "*"; + size_t size = C.PTR_SIZEOF, align_ = C.PTR_SIZEOF is 4 ? 2 : 3; + + String className = "SWTWindowDelegate"; + objc.Class cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_windowDidResize_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_windowDidMove_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_windowShouldClose_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_windowWillClose_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_windowDidResignKey_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_windowDidBecomeKey_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_timerProc_, proc3, "@:@"); + OS.objc_registerClassPair(cls); + + className = "SWTPanelDelegate"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_windowWillClose_, dialogProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_changeColor_, dialogProc3, "@:@"); + OS.class_addMethod(cls, OS.sel_changeFont_, dialogProc3, "@:@"); + OS.objc_registerClassPair(cls); + + className = "SWTMenu"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSMenu, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_menuWillOpen_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_menuDidClose_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_menu_willHighlightItem_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_menuNeedsUpdate_, proc3, "@:@"); + OS.objc_registerClassPair(cls); + + className = "SWTView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSView, className, 0); + OS.class_addProtocol(cls, OS.objc_getProtocol("NSTextInput")); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_isFlipped, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_acceptsFirstResponder, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_isOpaque, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_hitTest_, hitTestProc, "@:{NSPoint}"); + + //NSTextInput protocol + OS.class_addMethod(cls, OS.sel_hasMarkedText, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_markedRange, markedRangeProc, "@:"); + OS.class_addMethod(cls, OS.sel_selectedRange, selectedRangeProc, "@:"); + OS.class_addMethod(cls, OS.sel_setMarkedText_selectedRange_, setMarkedText_selectedRangeProc, "@:@{NSRange}"); + OS.class_addMethod(cls, OS.sel_unmarkText, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_validAttributesForMarkedText, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_attributedSubstringFromRange_, attributedSubstringFromRangeProc, "@:{NSRange}"); + OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_characterIndexForPoint_, characterIndexForPointProc, "@:{NSPoint}"); + OS.class_addMethod(cls, OS.sel_firstRectForCharacterRange_, firstRectForCharacterRangeProc, "@:{NSRange}"); + OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); + + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTScrollView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSScrollView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendVerticalSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_sendHorizontalSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_pageDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_pageUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_reflectScrolledClipView_, proc3, "@:@"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTButton"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSButton, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSButton.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSButton.setCellClass(cls); + + className = "SWTTableView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTableView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_highlightSelectionInClipRect_, highlightSelectionInClipRectProc, "@:{NSRect}"); + OS.class_addMethod(cls, OS.sel_sendDoubleSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_numberOfRowsInTableView_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_tableView_objectValueForTableColumn_row_, proc5, "@:@:@:@"); + OS.class_addMethod(cls, OS.sel_tableView_shouldEditTableColumn_row_, proc5, "@:@:@:@"); + OS.class_addMethod(cls, OS.sel_tableViewSelectionDidChange_, proc3, "@:@"); + static if ((void*).sizeof > int.sizeof) /* 64bit target*/ OS.class_addMethod(cls, OS.sel_tableView_willDisplayCell_forTableColumn_row_, proc6, "@:@@@q"); + else OS.class_addMethod(cls, OS.sel_tableView_willDisplayCell_forTableColumn_row_, proc6, "@:@@@i"); + static if ((void*).sizeof > int.sizeof) /* 64bit target*/ OS.class_addMethod(cls, OS.sel_tableView_setObjectValue_forTableColumn_row_, proc6, "@:@@@q"); + else OS.class_addMethod(cls, OS.sel_tableView_setObjectValue_forTableColumn_row_, proc6, "@:@@@i"); + OS.class_addMethod(cls, OS.sel_tableViewColumnDidMove_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_tableViewColumnDidResize_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_tableView_didClickTableColumn_, proc4, "@:@"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTTableHeaderCell"; + cls = OS.objc_allocateClassPair (cast(objc.Class) OS.class_NSTableHeaderCell, className, 0); + OS.class_addIvar (cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod (cls, OS.sel_drawInteriorWithFrame_inView_, drawInteriorWithFrameInViewProc, "@:{NSRect}@"); + OS.objc_registerClassPair (cls); + + className = "SWTBrowserCell"; + cls = OS.objc_allocateClassPair (cast(objc.Class) OS.class_NSBrowserCell, className, 0); + OS.class_addIvar (cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod (cls, OS.sel_drawInteriorWithFrame_inView_, drawInteriorWithFrameInViewProc, "@:{NSRect}@"); + OS.objc_registerClassPair (cls); + + className = "SWTTableHeaderView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTableHeaderView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_mouseDown_, proc3, "@:@"); + OS.objc_registerClassPair(cls); + + className = "SWTOutlineView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSOutlineView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_highlightSelectionInClipRect_, highlightSelectionInClipRectProc, "@:{NSRect}"); + OS.class_addMethod(cls, OS.sel_sendDoubleSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_outlineViewSelectionDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_outlineViewItemDidExpand_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_outlineView_shouldCollapseItem_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_outlineView_shouldExpandItem_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_outlineView_child_ofItem_, proc5, "@:@i@"); + OS.class_addMethod(cls, OS.sel_outlineView_isItemExpandable_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_outlineView_numberOfChildrenOfItem_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_outlineView_objectValueForTableColumn_byItem_, proc5, "@:@@@"); + OS.class_addMethod(cls, OS.sel_outlineView_willDisplayCell_forTableColumn_item_, proc6, "@:@@@@"); + OS.class_addMethod(cls, OS.sel_outlineView_setObjectValue_forTableColumn_byItem_, proc6, "@:@@@@"); + OS.class_addMethod(cls, OS.sel_outlineViewColumnDidMove_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_outlineViewColumnDidResize_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_outlineView_didClickTableColumn_, proc4, "@:@"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTTreeItem"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSObject, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.objc_registerClassPair(cls); + + className = "SWTTabView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTabView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_tabView_willSelectTabViewItem_, proc4, "@:@@"); + OS.class_addMethod(cls, OS.sel_tabView_didSelectTabViewItem_, proc4, "@:@@"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTBox"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSBox, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTProgressIndicator"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSProgressIndicator, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTSlider"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSlider, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSSlider.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSSlider.setCellClass(cls); + + className = "SWTPopUpButton"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSPopUpButton, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSPopUpButton.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSPopUpButton.setCellClass(cls); + + className = "SWTComboBox"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSComboBox, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_comboBoxSelectionDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSComboBox.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSComboBox.setCellClass(cls); + + className = "SWTDatePicker"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSDatePicker, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTImageView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSImageView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSImageView.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSImageView.setCellClass(cls); + + className = "SWTStepper"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSStepper, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSStepper.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSStepper.setCellClass(cls); + + className = "SWTScroller"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSScroller, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); + + className = "SWTMenuItem"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSMenuItem, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendSelection, proc2, "@:"); + OS.objc_registerClassPair(cls); + + className = "SWTTextView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextView, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); + OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textView_clickedOnLink_atIndex_, proc5, "@:@@@"); + OS.objc_registerClassPair(cls); + + className = "SWTEditorView"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextView, className, 0); + OS.class_addMethod(cls, OS.sel_keyDown_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_keyUp_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_insertText_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_doCommandBySelector_, proc3, "@::"); + OS.objc_registerClassPair(cls); + + className = "SWTTextField"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSTextField, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSTextField.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSTextField.setCellClass(cls); + + className = "SWTSearchField"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSearchField, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); + OS.objc_registerClassPair(cls); + + cls = registerCellSubclass(NSSearchField.cellClass(), size, align_, types); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + NSSearchField.setCellClass(cls); + + className = "SWTSecureTextField"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSSecureTextField, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + addEventMethods(cls, proc2, proc3, drawRectProc); + addFrameMethods(cls, setFrameOriginProc, setFrameSizeProc); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.class_addMethod(cls, OS.sel_textDidChange_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textViewDidChangeSelection_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_, textWillChangeSelectionProc, "@:@{NSRange}{NSRange}"); + OS.objc_registerClassPair(cls); + + // Don't subclass NSSecureTextFieldCell -- you'll get an NSException from [NSSecureTextField setCellClass:]! + + className = "SWTWindow"; + cls = OS.objc_allocateClassPair(cast(objc.Class) OS.class_NSWindow, className, 0); + OS.class_addIvar(cls, SWT_OBJECT, size, cast(byte)align_, types); + OS.class_addMethod(cls, OS.sel_sendEvent_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_helpRequested_, proc3, "@:@"); + OS.class_addMethod(cls, OS.sel_canBecomeKeyWindow, proc2, "@:"); + OS.class_addMethod(cls, OS.sel_makeFirstResponder_, proc3, "@:@"); + addAccessibilityMethods(cls, proc2, proc3, proc4, accessibilityHitTestProc); + OS.objc_registerClassPair(cls); } - NSGraphicsContext context = screenWindow.graphicsContext(); -// NSAffineTransform transform = NSAffineTransform.transform(); -// NSSize size = handle.size(); -// transform.translateXBy(0, size.height); -// transform.scaleXBy(1, -1); -// transform.set(); - if (data !is null) { - int mask = DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT; - if ((data.style & mask) is 0) { - data.style |= DWT.LEFT_TO_RIGHT; - } - data.device = this; - data.background = getSystemColor(DWT.COLOR_WHITE).handle; - data.foreground = getSystemColor(DWT.COLOR_BLACK).handle; - data.font = getSystemFont(); - } - return context.id; -} - -/** - * Invokes platform specific functionality to dispose a GC handle. - *

    - * IMPORTANT: This method is not part of the public - * API for Display. It is marked public only so that it - * can be shared within the packages provided by DWT. It is not - * available on all platforms, and should never be called from - * application code. - *

    - * - * @param hDC the platform specific GC handle - * @param data the platform specific GC data - */ -public void internal_dispose_GC (objc.id context, GCData data) { - if (isDisposed()) DWT.error(DWT.ERROR_DEVICE_DISPOSED); -} - -static bool isValidClass (ClassInfo clazz) { - String name = clazz.name; - int index = name.lastIndexOf ('.'); - name = name[0 .. index]; - index = name.lastIndexOf ('.'); - return name.substring (0, index + 1).equals (PACKAGE_PREFIX); -} - -bool isValidThread () { - return thread is Thread.getThis (); -} - -/** - * Generate a low level system event. - * - * post is used to generate low level keyboard - * and mouse events. The intent is to enable automated UI - * testing by simulating the input from the user. Most - * DWT applications should never need to call this method. - *

    - * Note that this operation can fail when the operating system - * fails to generate the event for any reason. For example, - * this can happen when there is no such key or mouse button - * or when the system event queue is full. - *

    - *

    - * Event Types: - *

    KeyDown, KeyUp - *

    The following fields in the Event apply: - *

      - *
    • (in) type KeyDown or KeyUp
    • - *

      Either one of: - *

    • (in) character a character that corresponds to a keyboard key
    • - *
    • (in) keyCode the key code of the key that was typed, - * as defined by the key code constants in class DWT
    • - *
    - *

    MouseDown, MouseUp

    - *

    The following fields in the Event apply: - *

      - *
    • (in) type MouseDown or MouseUp - *
    • (in) button the button that is pressed or released - *
    - *

    MouseMove

    - *

    The following fields in the Event apply: - *

      - *
    • (in) type MouseMove - *
    • (in) x the x coordinate to move the mouse pointer to in screen coordinates - *
    • (in) y the y coordinate to move the mouse pointer to in screen coordinates - *
    - * - * - * @param event the event to be generated - * - * @return true if the event was generated or false otherwise - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the event is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 3.0 - * - */ -public bool post(Event event) { - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - if (event is null) error (DWT.ERROR_NULL_ARGUMENT); -// int type = event.type; -// switch (type) { -// case DWT.KeyDown: -// case DWT.KeyUp: { -// int vKey = Display.untranslateKey (event.keyCode); -// if (vKey !is 0) { -// return OS.CGPostKeyboardEvent (0, vKey, type is DWT.KeyDown) is 0; -// } else { -// vKey = -1; -// int kchrPtr = OS.GetScriptManagerVariable (cast(short) OS.smKCHRCache); -// int key = -1; -// int [] state = new int [1]; -// int [] encoding = new int [1]; -// short keyScript = cast(short) OS.GetScriptManagerVariable (cast(short) OS.smKeyScript); -// short regionCode = cast(short) OS.GetScriptManagerVariable (cast(short) OS.smRegionCode); -// if (OS.UpgradeScriptInfoToTextEncoding (keyScript, cast(short) OS.kTextLanguageDontCare, regionCode, null, encoding) is OS.paramErr) { -// if (OS.UpgradeScriptInfoToTextEncoding (keyScript, cast(short) OS.kTextLanguageDontCare, cast(short) OS.kTextRegionDontCare, null, encoding) is OS.paramErr) { -// encoding [0] = OS.kTextEncodingMacRoman; -// } -// } -// int [] encodingInfo = new int [1]; -// OS.CreateUnicodeToTextInfoByEncoding (encoding [0], encodingInfo); -// if (encodingInfo [0] !is 0) { -// char [] input = {event.character}; -// byte [] buffer = new byte [2]; -// OS.ConvertFromUnicodeToPString (encodingInfo [0], 2, input, buffer); -// OS.DisposeUnicodeToTextInfo (encodingInfo); -// key = buffer [1] & 0x7f; -// } -// if (key is -1) return false; -// for (int i = 0 ; i <= 0x7F ; i++) { -// int result1 = OS.KeyTranslate (kchrPtr, cast(short) (i | 512), state); -// int result2 = OS.KeyTranslate (kchrPtr, cast(short) i, state); -// if ((result1 & 0x7f) is key || (result2 & 0x7f) is key) { -// vKey = i; -// break; -// } -// } -// if (vKey is -1) return false; -// return OS.CGPostKeyboardEvent (key, vKey, type is DWT.KeyDown) is 0; -// } -// } -// case DWT.MouseDown: -// case DWT.MouseMove: -// case DWT.MouseUp: { -// CGPoint mouseCursorPosition = new CGPoint (); -// int chord = OS.GetCurrentEventButtonState (); -// if (type is DWT.MouseMove) { -// mouseCursorPosition.x = event.x; -// mouseCursorPosition.y = event.y; -// return OS.CGPostMouseEvent (mouseCursorPosition, true, 5, (chord & 0x1) !is 0, (chord & 0x2) !is 0, (chord & 0x4) !is 0, (chord & 0x8) !is 0, (chord & 0x10) !is 0) is 0; -// } else { -// int button = event.button; -// if (button < 1 || button > 5) return false; -// bool button1 = false, button2 = false, button3 = false, button4 = false, button5 = false; -// switch (button) { -// case 1: { -// button1 = type is DWT.MouseDown; -// button2 = (chord & 0x4) !is 0; -// button3 = (chord & 0x2) !is 0; -// button4 = (chord & 0x8) !is 0; -// button5 = (chord & 0x10) !is 0; -// break; -// } -// case 2: { -// button1 = (chord & 0x1) !is 0; -// button2 = type is DWT.MouseDown; -// button3 = (chord & 0x2) !is 0; -// button4 = (chord & 0x8) !is 0; -// button5 = (chord & 0x10) !is 0; -// break; -// } -// case 3: { -// button1 = (chord & 0x1) !is 0; -// button2 = (chord & 0x4) !is 0; -// button3 = type is DWT.MouseDown; -// button4 = (chord & 0x8) !is 0; -// button5 = (chord & 0x10) !is 0; -// break; -// } -// case 4: { -// button1 = (chord & 0x1) !is 0; -// button2 = (chord & 0x4) !is 0; -// button3 = (chord & 0x2) !is 0; -// button4 = type is DWT.MouseDown; -// button5 = (chord & 0x10) !is 0; -// break; -// } -// case 5: { -// button1 = (chord & 0x1) !is 0; -// button2 = (chord & 0x4) !is 0; -// button3 = (chord & 0x2) !is 0; -// button4 = (chord & 0x8) !is 0; -// button5 = type is DWT.MouseDown; -// break; -// } -// } -// dwt.internal.carbon.Point pt = new dwt.internal.carbon.Point (); -// OS.GetGlobalMouse (pt); -// mouseCursorPosition.x = pt.h; -// mouseCursorPosition.y = pt.v; -// return OS.CGPostMouseEvent (mouseCursorPosition, true, 5, button1, button3, button2, button4, button5) is 0; -// } -// } -// case DWT.MouseWheel: { -// return OS.CGPostScrollWheelEvent (1, event.count) is 0; -// } -// } - return false; + /** + * Invokes platform specific functionality to allocate a new GC handle. + *

    + * IMPORTANT: This method is not part of the public + * API for Display. It is marked public only so that it + * can be shared within the packages provided by DWT. It is not + * available on all platforms, and should never be called from + * application code. + *

    + * + * @param data the platform specific GC data + * @return the platform specific GC handle + * + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * @exception DWTError
      + *
    • ERROR_NO_HANDLES if a handle could not be obtained for gc creation
    • + *
    + */ + public objc.id internal_new_GC (GCData data) { + if (isDisposed()) DWT.error(DWT.ERROR_DEVICE_DISPOSED); + if (screenWindow is null) { + NSWindow window = cast(NSWindow) (new NSWindow ()).alloc (); + NSRect rect = NSRect(); + window = window.initWithContentRect(rect, OS.NSBorderlessWindowMask, OS.NSBackingStoreBuffered, false); + window.setReleasedWhenClosed(false); + screenWindow = window; + } + NSGraphicsContext context = screenWindow.graphicsContext(); + // NSAffineTransform transform = NSAffineTransform.transform(); + // NSSize size = handle.size(); + // transform.translateXBy(0, size.height); + // transform.scaleXBy(1, -1); + // transform.set(); + if (data !is null) { + int mask = DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT; + if ((data.style & mask) is 0) { + data.style |= DWT.LEFT_TO_RIGHT; + } + data.device = this; + data.background = getSystemColor(DWT.COLOR_WHITE).handle; + data.foreground = getSystemColor(DWT.COLOR_BLACK).handle; + data.font = getSystemFont(); + } + return context.id; + } + + /** + * Invokes platform specific functionality to dispose a GC handle. + *

    + * IMPORTANT: This method is not part of the public + * API for Display. It is marked public only so that it + * can be shared within the packages provided by DWT. It is not + * available on all platforms, and should never be called from + * application code. + *

    + * + * @param hDC the platform specific GC handle + * @param data the platform specific GC data + */ + public void internal_dispose_GC (objc.id context, GCData data) { + if (isDisposed()) DWT.error(DWT.ERROR_DEVICE_DISPOSED); + + } + + static bool isValidClass (ClassInfo clazz) { + String name = clazz.name; + int index = name.lastIndexOf ('.'); + name = name[0 .. index]; + index = name.lastIndexOf ('.'); + return name.substring (0, index + 1).equals (PACKAGE_PREFIX); + } + + bool isValidThread () { + return thread is Thread.getThis (); } -} - -void postEvent (Event event) { - /* - * Place the event at the end of the event queue. - * This code is always called in the Display's - * thread so it must be re-enterant but does not - * need to be synchronized. - */ - if (eventQueue is null) eventQueue = new Event [4]; - int index = 0; - int length = eventQueue.length; - while (index < length) { - if (eventQueue [index] is null) break; - index++; - } - if (index is length) { - Event [] newQueue = new Event [length + 4]; - System.arraycopy (eventQueue, 0, newQueue, 0, length); - eventQueue = newQueue; - } - eventQueue [index] = event; -} - -/** - * Maps a point from one coordinate system to another. - * When the control is null, coordinates are mapped to - * the display. - *

    - * NOTE: On right-to-left platforms where the coordinate - * systems are mirrored, special care needs to be taken - * when mapping coordinates from one control to another - * to ensure the result is correctly mirrored. - * - * Mapping a point that is the origin of a rectangle and - * then adding the width and height is not equivalent to - * mapping the rectangle. When one control is mirrored - * and the other is not, adding the width and height to a - * point that was mapped causes the rectangle to extend - * in the wrong direction. Mapping the entire rectangle - * instead of just one point causes both the origin and - * the corner of the rectangle to be mapped. - *

    - * - * @param from the source Control or null - * @param to the destination Control or null - * @param point to be mapped - * @return point with mapped coordinates - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the point is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1.2 - */ -public Point map (Control from, Control to, Point point) { - checkDevice (); - if (point is null) error (DWT.ERROR_NULL_ARGUMENT); - return map (from, to, point.x, point.y); -} - -/** - * Maps a point from one coordinate system to another. - * When the control is null, coordinates are mapped to - * the display. - *

    - * NOTE: On right-to-left platforms where the coordinate - * systems are mirrored, special care needs to be taken - * when mapping coordinates from one control to another - * to ensure the result is correctly mirrored. - * - * Mapping a point that is the origin of a rectangle and - * then adding the width and height is not equivalent to - * mapping the rectangle. When one control is mirrored - * and the other is not, adding the width and height to a - * point that was mapped causes the rectangle to extend - * in the wrong direction. Mapping the entire rectangle - * instead of just one point causes both the origin and - * the corner of the rectangle to be mapped. - *

    - * - * @param from the source Control or null - * @param to the destination Control or null - * @param x coordinates to be mapped - * @param y coordinates to be mapped - * @return point with mapped coordinates - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1.2 - */ -public Point map (Control from, Control to, int x, int y) { - checkDevice (); - if (from !is null && from.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); - if (to !is null && to.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); - Point point = new Point (x, y); - if (from is to) return point; - NSPoint pt = NSPoint(); - pt.x = x; - pt.y = y; - NSWindow fromWindow = from !is null ? from.view.window() : null; - NSWindow toWindow = to !is null ? to.view.window() : null; - if (toWindow !is null && fromWindow !is null && toWindow.id is fromWindow.id) { - pt = from.view.convertPoint_toView_(pt, to.view); - } else { - NSRect primaryFrame = getPrimaryFrame(); - if (from !is null) { - NSView view = from.contentView (); - pt = view.convertPoint_toView_(pt, null); - pt = fromWindow.convertBaseToScreen(pt); - pt.y = primaryFrame.height - pt.y; - } - if (to !is null) { - NSView view = to.contentView (); - pt.y = primaryFrame.height - pt.y; - pt = toWindow.convertScreenToBase(pt); - pt = view.convertPoint_fromView_(pt, null); + + /** + * Generate a low level system event. + * + * post is used to generate low level keyboard + * and mouse events. The intent is to enable automated UI + * testing by simulating the input from the user. Most + * DWT applications should never need to call this method. + *

    + * Note that this operation can fail when the operating system + * fails to generate the event for any reason. For example, + * this can happen when there is no such key or mouse button + * or when the system event queue is full. + *

    + *

    + * Event Types: + *

    KeyDown, KeyUp + *

    The following fields in the Event apply: + *

      + *
    • (in) type KeyDown or KeyUp
    • + *

      Either one of: + *

    • (in) character a character that corresponds to a keyboard key
    • + *
    • (in) keyCode the key code of the key that was typed, + * as defined by the key code constants in class DWT
    • + *
    + *

    MouseDown, MouseUp

    + *

    The following fields in the Event apply: + *

      + *
    • (in) type MouseDown or MouseUp + *
    • (in) button the button that is pressed or released + *
    + *

    MouseMove

    + *

    The following fields in the Event apply: + *

      + *
    • (in) type MouseMove + *
    • (in) x the x coordinate to move the mouse pointer to in screen coordinates + *
    • (in) y the y coordinate to move the mouse pointer to in screen coordinates + *
    + * + * + * @param event the event to be generated + * + * @return true if the event was generated or false otherwise + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the event is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 3.0 + * + */ + public bool post(Event event) { + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + if (event is null) error (DWT.ERROR_NULL_ARGUMENT); + // int type = event.type; + // switch (type) { + // case DWT.KeyDown: + // case DWT.KeyUp: { + // int vKey = Display.untranslateKey (event.keyCode); + // if (vKey !is 0) { + // return OS.CGPostKeyboardEvent (0, vKey, type is DWT.KeyDown) is 0; + // } else { + // vKey = -1; + // int kchrPtr = OS.GetScriptManagerVariable (cast(short) OS.smKCHRCache); + // int key = -1; + // int [] state = new int [1]; + // int [] encoding = new int [1]; + // short keyScript = cast(short) OS.GetScriptManagerVariable (cast(short) OS.smKeyScript); + // short regionCode = cast(short) OS.GetScriptManagerVariable (cast(short) OS.smRegionCode); + // if (OS.UpgradeScriptInfoToTextEncoding (keyScript, cast(short) OS.kTextLanguageDontCare, regionCode, null, encoding) is OS.paramErr) { + // if (OS.UpgradeScriptInfoToTextEncoding (keyScript, cast(short) OS.kTextLanguageDontCare, cast(short) OS.kTextRegionDontCare, null, encoding) is OS.paramErr) { + // encoding [0] = OS.kTextEncodingMacRoman; + // } + // } + // int [] encodingInfo = new int [1]; + // OS.CreateUnicodeToTextInfoByEncoding (encoding [0], encodingInfo); + // if (encodingInfo [0] !is 0) { + // char [] input = {event.character}; + // byte [] buffer = new byte [2]; + // OS.ConvertFromUnicodeToPString (encodingInfo [0], 2, input, buffer); + // OS.DisposeUnicodeToTextInfo (encodingInfo); + // key = buffer [1] & 0x7f; + // } + // if (key is -1) return false; + // for (int i = 0 ; i <= 0x7F ; i++) { + // int result1 = OS.KeyTranslate (kchrPtr, cast(short) (i | 512), state); + // int result2 = OS.KeyTranslate (kchrPtr, cast(short) i, state); + // if ((result1 & 0x7f) is key || (result2 & 0x7f) is key) { + // vKey = i; + // break; + // } + // } + // if (vKey is -1) return false; + // return OS.CGPostKeyboardEvent (key, vKey, type is DWT.KeyDown) is 0; + // } + // } + // case DWT.MouseDown: + // case DWT.MouseMove: + // case DWT.MouseUp: { + // CGPoint mouseCursorPosition = new CGPoint (); + // int chord = OS.GetCurrentEventButtonState (); + // if (type is DWT.MouseMove) { + // mouseCursorPosition.x = event.x; + // mouseCursorPosition.y = event.y; + // return OS.CGPostMouseEvent (mouseCursorPosition, true, 5, (chord & 0x1) !is 0, (chord & 0x2) !is 0, (chord & 0x4) !is 0, (chord & 0x8) !is 0, (chord & 0x10) !is 0) is 0; + // } else { + // int button = event.button; + // if (button < 1 || button > 5) return false; + // bool button1 = false, button2 = false, button3 = false, button4 = false, button5 = false; + // switch (button) { + // case 1: { + // button1 = type is DWT.MouseDown; + // button2 = (chord & 0x4) !is 0; + // button3 = (chord & 0x2) !is 0; + // button4 = (chord & 0x8) !is 0; + // button5 = (chord & 0x10) !is 0; + // break; + // } + // case 2: { + // button1 = (chord & 0x1) !is 0; + // button2 = type is DWT.MouseDown; + // button3 = (chord & 0x2) !is 0; + // button4 = (chord & 0x8) !is 0; + // button5 = (chord & 0x10) !is 0; + // break; + // } + // case 3: { + // button1 = (chord & 0x1) !is 0; + // button2 = (chord & 0x4) !is 0; + // button3 = type is DWT.MouseDown; + // button4 = (chord & 0x8) !is 0; + // button5 = (chord & 0x10) !is 0; + // break; + // } + // case 4: { + // button1 = (chord & 0x1) !is 0; + // button2 = (chord & 0x4) !is 0; + // button3 = (chord & 0x2) !is 0; + // button4 = type is DWT.MouseDown; + // button5 = (chord & 0x10) !is 0; + // break; + // } + // case 5: { + // button1 = (chord & 0x1) !is 0; + // button2 = (chord & 0x4) !is 0; + // button3 = (chord & 0x2) !is 0; + // button4 = (chord & 0x8) !is 0; + // button5 = type is DWT.MouseDown; + // break; + // } + // } + // dwt.internal.carbon.Point pt = new dwt.internal.carbon.Point (); + // OS.GetGlobalMouse (pt); + // mouseCursorPosition.x = pt.h; + // mouseCursorPosition.y = pt.v; + // return OS.CGPostMouseEvent (mouseCursorPosition, true, 5, button1, button3, button2, button4, button5) is 0; + // } + // } + // case DWT.MouseWheel: { + // return OS.CGPostScrollWheelEvent (1, event.count) is 0; + // } + // } + return false; } } - point.x = cast(int)pt.x; - point.y = cast(int)pt.y; - return point; -} - -/** - * Maps a point from one coordinate system to another. - * When the control is null, coordinates are mapped to - * the display. - *

    - * NOTE: On right-to-left platforms where the coordinate - * systems are mirrored, special care needs to be taken - * when mapping coordinates from one control to another - * to ensure the result is correctly mirrored. - * - * Mapping a point that is the origin of a rectangle and - * then adding the width and height is not equivalent to - * mapping the rectangle. When one control is mirrored - * and the other is not, adding the width and height to a - * point that was mapped causes the rectangle to extend - * in the wrong direction. Mapping the entire rectangle - * instead of just one point causes both the origin and - * the corner of the rectangle to be mapped. - *

    - * - * @param from the source Control or null - * @param to the destination Control or null - * @param rectangle to be mapped - * @return rectangle with mapped coordinates - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the rectangle is null
    • - *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1.2 - */ -public Rectangle map (Control from, Control to, Rectangle rectangle) { - checkDevice (); - if (rectangle is null) error (DWT.ERROR_NULL_ARGUMENT); - return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height); -} - -/** - * Maps a point from one coordinate system to another. - * When the control is null, coordinates are mapped to - * the display. - *

    - * NOTE: On right-to-left platforms where the coordinate - * systems are mirrored, special care needs to be taken - * when mapping coordinates from one control to another - * to ensure the result is correctly mirrored. - * - * Mapping a point that is the origin of a rectangle and - * then adding the width and height is not equivalent to - * mapping the rectangle. When one control is mirrored - * and the other is not, adding the width and height to a - * point that was mapped causes the rectangle to extend - * in the wrong direction. Mapping the entire rectangle - * instead of just one point causes both the origin and - * the corner of the rectangle to be mapped. - *

    - * - * @param from the source Control or null - * @param to the destination Control or null - * @param x coordinates to be mapped - * @param y coordinates to be mapped - * @param width coordinates to be mapped - * @param height coordinates to be mapped - * @return rectangle with mapped coordinates - * - * @exception IllegalArgumentException
      - *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1.2 - */ -public Rectangle map (Control from, Control to, int x, int y, int width, int height) { - checkDevice (); - if (from !is null && from.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); - if (to !is null && to.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); - Rectangle rectangle = new Rectangle (x, y, width, height); - if (from is to) return rectangle; - NSPoint pt = NSPoint(); - pt.x = x; - pt.y = y; - NSWindow fromWindow = from !is null ? from.view.window() : null; - NSWindow toWindow = to !is null ? to.view.window() : null; - if (toWindow !is null && fromWindow !is null && toWindow.id is fromWindow.id) { - pt = from.view.convertPoint_toView_(pt, to.view); - } else { - NSRect primaryFrame = getPrimaryFrame(); - if (from !is null) { - NSView view = from.contentView (); - pt = view.convertPoint_toView_(pt, null); - pt = fromWindow.convertBaseToScreen(pt); - pt.y = primaryFrame.height - pt.y; + + void postEvent (Event event) { + /* + * Place the event at the end of the event queue. + * This code is always called in the Display's + * thread so it must be re-enterant but does not + * need to be synchronized. + */ + if (eventQueue is null) eventQueue = new Event [4]; + int index = 0; + int length = eventQueue.length; + while (index < length) { + if (eventQueue [index] is null) break; + index++; + } + if (index is length) { + Event [] newQueue = new Event [length + 4]; + System.arraycopy (eventQueue, 0, newQueue, 0, length); + eventQueue = newQueue; + } + eventQueue [index] = event; + } + + /** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + *

    + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + *

    + * + * @param from the source Control or null + * @param to the destination Control or null + * @param point to be mapped + * @return point with mapped coordinates + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the point is null
    • + *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1.2 + */ + public Point map (Control from, Control to, Point point) { + checkDevice (); + if (point is null) error (DWT.ERROR_NULL_ARGUMENT); + return map (from, to, point.x, point.y); + } + + /** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + *

    + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + *

    + * + * @param from the source Control or null + * @param to the destination Control or null + * @param x coordinates to be mapped + * @param y coordinates to be mapped + * @return point with mapped coordinates + * + * @exception IllegalArgumentException
      + *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1.2 + */ + public Point map (Control from, Control to, int x, int y) { + checkDevice (); + if (from !is null && from.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); + if (to !is null && to.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); + Point point = new Point (x, y); + if (from is to) return point; + NSPoint pt = NSPoint(); + pt.x = x; + pt.y = y; + NSWindow fromWindow = from !is null ? from.view.window() : null; + NSWindow toWindow = to !is null ? to.view.window() : null; + if (toWindow !is null && fromWindow !is null && toWindow.id is fromWindow.id) { + pt = from.view.convertPoint_toView_(pt, to.view); + } else { + NSRect primaryFrame = getPrimaryFrame(); + if (from !is null) { + NSView view = from.contentView (); + pt = view.convertPoint_toView_(pt, null); + pt = fromWindow.convertBaseToScreen(pt); + pt.y = primaryFrame.height - pt.y; + } + if (to !is null) { + NSView view = to.contentView (); + pt.y = primaryFrame.height - pt.y; + pt = toWindow.convertScreenToBase(pt); + pt = view.convertPoint_fromView_(pt, null); + } } - if (to !is null) { - NSView view = to.contentView (); - pt.y = primaryFrame.height - pt.y; - pt = toWindow.convertScreenToBase(pt); - pt = view.convertPoint_fromView_(pt, null); + point.x = cast(int)pt.x; + point.y = cast(int)pt.y; + return point; + } + + /** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + *

    + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + *

    + * + * @param from the source Control or null + * @param to the destination Control or null + * @param rectangle to be mapped + * @return rectangle with mapped coordinates + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the rectangle is null
    • + *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1.2 + */ + public Rectangle map (Control from, Control to, Rectangle rectangle) { + checkDevice (); + if (rectangle is null) error (DWT.ERROR_NULL_ARGUMENT); + return map (from, to, rectangle.x, rectangle.y, rectangle.width, rectangle.height); + } + + /** + * Maps a point from one coordinate system to another. + * When the control is null, coordinates are mapped to + * the display. + *

    + * NOTE: On right-to-left platforms where the coordinate + * systems are mirrored, special care needs to be taken + * when mapping coordinates from one control to another + * to ensure the result is correctly mirrored. + * + * Mapping a point that is the origin of a rectangle and + * then adding the width and height is not equivalent to + * mapping the rectangle. When one control is mirrored + * and the other is not, adding the width and height to a + * point that was mapped causes the rectangle to extend + * in the wrong direction. Mapping the entire rectangle + * instead of just one point causes both the origin and + * the corner of the rectangle to be mapped. + *

    + * + * @param from the source Control or null + * @param to the destination Control or null + * @param x coordinates to be mapped + * @param y coordinates to be mapped + * @param width coordinates to be mapped + * @param height coordinates to be mapped + * @return rectangle with mapped coordinates + * + * @exception IllegalArgumentException
      + *
    • ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1.2 + */ + public Rectangle map (Control from, Control to, int x, int y, int width, int height) { + checkDevice (); + if (from !is null && from.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); + if (to !is null && to.isDisposed()) error (DWT.ERROR_INVALID_ARGUMENT); + Rectangle rectangle = new Rectangle (x, y, width, height); + if (from is to) return rectangle; + NSPoint pt = NSPoint(); + pt.x = x; + pt.y = y; + NSWindow fromWindow = from !is null ? from.view.window() : null; + NSWindow toWindow = to !is null ? to.view.window() : null; + if (toWindow !is null && fromWindow !is null && toWindow.id is fromWindow.id) { + pt = from.view.convertPoint_toView_(pt, to.view); + } else { + NSRect primaryFrame = getPrimaryFrame(); + if (from !is null) { + NSView view = from.contentView (); + pt = view.convertPoint_toView_(pt, null); + pt = fromWindow.convertBaseToScreen(pt); + pt.y = primaryFrame.height - pt.y; + } + if (to !is null) { + NSView view = to.contentView (); + pt.y = primaryFrame.height - pt.y; + pt = toWindow.convertScreenToBase(pt); + pt = view.convertPoint_fromView_(pt, null); + } + } + rectangle.x = cast(int)pt.x; + rectangle.y = cast(int)pt.y; + return rectangle; + } + + /** + * Reads an event from the operating system's event queue, + * dispatches it appropriately, and returns true + * if there is potentially more work to do, or false + * if the caller can sleep until another event is placed on + * the event queue. + *

    + * In addition to checking the system event queue, this method also + * checks if any inter-thread messages (created by syncExec() + * or asyncExec()) are waiting to be processed, and if + * so handles them before returning. + *

    + * + * @return false if the caller can sleep upon return from this method + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    • ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message
    • + *
    + * + * @see #sleep + * @see #wake + */ + public bool readAndDispatch () { + checkDevice (); + if (loopCounter is 0) { + pool.release(); + pool = cast(NSAutoreleasePool)(new NSAutoreleasePool()).alloc().init(); + } + loopCounter ++; + bool events = false; + events |= runTimers (); + events |= runContexts (); + events |= runPopups (); + NSEvent event = application.nextEventMatchingMask(0, null, OS.NSDefaultRunLoopMode, true); + + try { + if (event !is null) { + events = true; + application.sendEvent(event); + } + // NSEvent event = NSEvent.otherEventWithType(OS.NSApplicationDefined, NSPoint(), 0, 0, 0, null, SWT_IDLE_TYPE, 0, 0); + // application.postEvent(event, false); + // idle = true; + // application.run(); + // events |= !idle; + if (events) { + runDeferredEvents (); + return true; + } + return runAsyncMessages (false); + } finally { + loopCounter --; + } + + } + + static void register (Display display) { + synchronized (Device.classinfo) { + for (int i=0; itrue - * if there is potentially more work to do, or false - * if the caller can sleep until another event is placed on - * the event queue. - *

    - * In addition to checking the system event queue, this method also - * checks if any inter-thread messages (created by syncExec() - * or asyncExec()) are waiting to be processed, and if - * so handles them before returning. - *

    - * - * @return false if the caller can sleep upon return from this method - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message
    • - *
    - * - * @see #sleep - * @see #wake - */ -public bool readAndDispatch () { - checkDevice (); - if (loopCounter is 0) { - pool.release(); - pool = cast(NSAutoreleasePool)(new NSAutoreleasePool()).alloc().init(); - } - loopCounter ++; - bool events = false; - events |= runTimers (); - events |= runContexts (); - events |= runPopups (); - NSEvent event = application.nextEventMatchingMask(0, null, OS.NSDefaultRunLoopMode, true); - try { - if (event !is null) { - events = true; - application.sendEvent(event); - } -// NSEvent event = NSEvent.otherEventWithType(OS.NSApplicationDefined, NSPoint(), 0, 0, 0, null, SWT_IDLE_TYPE, 0, 0); -// application.postEvent(event, false); -// idle = true; -// application.run(); -// events |= !idle; - if (events) { - runDeferredEvents (); - return true; + /** + * Releases any internal resources back to the operating + * system and clears all fields except the device handle. + *

    + * Disposes all shells which are currently open on the display. + * After this method has been invoked, all related related shells + * will answer true when sent the message + * isDisposed(). + *

    + * 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 release. 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 destroy. + *

    + * This method is called before destroy. + * + * @see Device#dispose + * @see #destroy + */ + protected void release () { + disposing = true; + sendEvent (DWT.Dispose, new Event ()); + Shell [] shells = getShells (); + for (int i=0; iDWT. + * + * @param eventType the type of event to listen for + * @param listener the listener which should no longer be notified when the event occurs + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    + * + * @see Listener + * @see DWT + * @see #addFilter + * @see #addListener + * + * @since 3.0 + */ + public void removeFilter (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); + if (filterTable is null) return; + filterTable.unhook (eventType, listener); + if (filterTable.size () is 0) filterTable = null; + } + + /** + * Removes the listener from the collection of listeners who will + * be notified when an event of the given type occurs. The event type + * is one of the event constants defined in class DWT. + * + * @param eventType the type of event to listen for + * @param listener the listener which should no longer be notified + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see Listener + * @see DWT + * @see #addListener + * + * @since 2.0 + */ + public void removeListener (int eventType, Listener listener) { + checkDevice (); + if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); + if (eventTable is null) return; + eventTable.unhook (eventType, listener); + } + + Widget removeWidget (NSObject view) { + if (view is null) return null; + void* jniRef; + OS.object_getInstanceVariable(view.id, SWT_OBJECT, jniRef); + if (jniRef is null) return null; + Widget widget = cast(Widget)OS.JNIGetObject(jniRef); + OS.object_setInstanceVariable(view.id, SWT_OBJECT, null); + return widget; + } + + void removeMenu (Menu menu) { + if (menus is null) return; + for (int i = 0; i < menus.length; i++) { + if (menus [i] is menu) { + menus[i] = null; + break; + } + } + } + + void removePopup (Menu menu) { + if (popups is null) return; + for (int i=0; i - * Disposes all shells which are currently open on the display. - * After this method has been invoked, all related related shells - * will answer true when sent the message - * isDisposed(). - *

    - * 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 release. 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 destroy. - *

    - * This method is called before destroy. - * - * @see Device#dispose - * @see #destroy - */ -protected void release () { - disposing = true; - sendEvent (DWT.Dispose, new Event ()); - Shell [] shells = getShells (); - for (int i=0; inull for the name clears it. + * + * @param name the new app name or null + */ + public static void setAppName (String name) { + APP_NAME = name; + } + + //TODO use custom timer instead of timerExec + Runnable hoverTimer; + + //TODO - use custom timer instead of timerExec + Runnable caretTimer; + + void setCurrentCaret (Caret caret) { + // if (caretID !is 0) OS.RemoveEventLoopTimer (caretID); + // caretID = 0; + currentCaret = caret; + if (currentCaret !is null) { + int blinkRate = currentCaret.blinkRate; + timerExec (blinkRate, caretTimer); } } - disposeList = null; - synchronizer.releaseSynchronizer (); - synchronizer = null; - releaseDisplay (); - super.release (); -} - -void releaseDisplay () { - /* Release the System Images */ - if (errorImage !is null) errorImage.dispose (); - if (infoImage !is null) infoImage.dispose (); - if (warningImage !is null) warningImage.dispose (); - errorImage = infoImage = warningImage = null; + + void setCursor (Control control) { + Cursor cursor = null; + if (control !is null) cursor = control.findCursor (); + if (cursor is null) cursor = getSystemCursor (DWT.CURSOR_ARROW); + cursor.handle.set (); + } + + /** + * Sets the location of the on-screen pointer relative to the top left corner + * of the screen. Note: It is typically considered bad practice for a + * program to move the on-screen pointer location. + * + * @param x the new x coordinate for the cursor + * @param y the new y coordinate for the cursor + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.1 + */ + public void setCursorLocation (int x, int y) { + checkDevice (); + CGPoint pt = CGPoint (); + pt.x = x; pt.y = y; + OS.CGWarpMouseCursorPosition (pt); + } - currentCaret = null; + /** + * Sets the location of the on-screen pointer relative to the top left corner + * of the screen. Note: It is typically considered bad practice for a + * program to move the on-screen pointer location. + * + * @param point new position + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_NULL_ARGUMENT - if the point is null + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @since 2.0 + */ + public void setCursorLocation (Point point) { + checkDevice (); + if (point is null) error (DWT.ERROR_NULL_ARGUMENT); + setCursorLocation (point.x, point.y); + } - /* Release Timers */ - if (hoverTimer !is null) timerExec(-1, hoverTimer); - hoverTimer = null; - if (caretTimer !is null) timerExec(-1, caretTimer); - caretTimer = null; - if (nsTimers !is null) { - for (int i=0; i + * Applications may have associated arbitrary objects with the + * receiver in this fashion. If the objects stored in the + * properties need to be notified when the display is disposed + * of, it is the application's responsibility provide a + * disposeExec() handler which does so. + *

    + * + * @param key the name of the property + * @param value the new value for the property + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the key is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #getData(String) + * @see #disposeExec(Runnable) + */ + public void setData (String key, Object value) { + checkDevice (); + //if (key is null) error (DWT.ERROR_NULL_ARGUMENT); + + if (key.equals (ADD_WIDGET_KEY)) { + auto wrap = cast(ArrayWrapperObject) value; + + if (wrap is null) + DWT.error(DWT.ERROR_INVALID_ARGUMENT, null, " []"); + + Object [] data = wrap.array; + NSObject object = cast(NSObject)data [0]; + Widget widget = cast(Widget)data [1]; + if (widget is null) { + removeWidget (object); + } else { + addWidget (object, widget); } } - } - nsTimers = null; - if (timerDelegate !is null) timerDelegate.release(); - timerDelegate = null; - - /* Release the System Cursors */ - for (int i = 0; i < cursors.length; i++) { - if (cursors [i] !is null) cursors [i].dispose (); + + /* Remove the key/value pair */ + if (value is null) { + if (keys is null) return; + int index = 0; + while (index < keys.length && !keys [index].equals (key)) index++; + if (index is keys.length) return; + if (keys.length is 1) { + keys = null; + values = null; + } else { + String [] newKeys = new String [keys.length - 1]; + Object [] newValues = new Object [values.length - 1]; + System.arraycopy (keys, 0, newKeys, 0, index); + System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index); + System.arraycopy (values, 0, newValues, 0, index); + System.arraycopy (values, index + 1, newValues, index, newValues.length - index); + keys = newKeys; + values = newValues; + } + return; + } + + /* Add the key/value pair */ + if (keys is null) { + keys = [key]; + values = [value]; + return; + } + for (int i=0; i 1) { + menubar.removeItemAtIndex(count - 1); + count--; + } + //set parent of each item to NULL and add them to menubar + if (menu !is null) { + MenuItem[] items = menu.getItems(); + for (int i = 0; i < items.length; i++) { + items[i].nsItem.setMenu(null); + menubar.addItem(items[i].nsItem); } } } - if (count is 0) contexts = null; -} - -/** - * Removes the listener from the collection of listeners who will - * be notified when an event of the given type occurs anywhere in - * a widget. The event type is one of the event constants defined - * in class DWT. - * - * @param eventType the type of event to listen for - * @param listener the listener which should no longer be notified when the event occurs - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    - * - * @see Listener - * @see DWT - * @see #addFilter - * @see #addListener - * - * @since 3.0 - */ -public void removeFilter (int eventType, Listener listener) { - checkDevice (); - if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); - if (filterTable is null) return; - filterTable.unhook (eventType, listener); - if (filterTable.size () is 0) filterTable = null; -} - -/** - * Removes the listener from the collection of listeners who will - * be notified when an event of the given type occurs. The event type - * is one of the event constants defined in class DWT. - * - * @param eventType the type of event to listen for - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the listener is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see Listener - * @see DWT - * @see #addListener - * - * @since 2.0 - */ -public void removeListener (int eventType, Listener listener) { - checkDevice (); - if (listener is null) error (DWT.ERROR_NULL_ARGUMENT); - if (eventTable is null) return; - eventTable.unhook (eventType, listener); -} - -Widget removeWidget (NSObject view) { - if (view is null) return null; - void* jniRef; - OS.object_getInstanceVariable(view.id, SWT_OBJECT, jniRef); - if (jniRef is null) return null; - Widget widget = cast(Widget)OS.JNIGetObject(jniRef); - OS.object_setInstanceVariable(view.id, SWT_OBJECT, null); - return widget; -} - -void removeMenu (Menu menu) { - if (menus is null) return; - for (int i = 0; i < menus.length; i++) { - if (menus [i] is menu) { - menus[i] = null; - break; + + void setModalShell (Shell shell) { + if (modalShells is null) modalShells = new Shell [4]; + int index = 0, length = modalShells.length; + while (index < length) { + if (modalShells [index] is shell) return; + if (modalShells [index] is null) break; + index++; + } + if (index is length) { + Shell [] newModalShells = new Shell [length + 4]; + System.arraycopy (modalShells, 0, newModalShells, 0, length); + modalShells = newModalShells; } - } -} - -void removePopup (Menu menu) { - if (popups is null) return; - for (int i=0; idisplay specific data is a single, + * unnamed field that is stored with every display. + *

    + * Applications may put arbitrary objects in this field. If + * the object stored in the display specific data needs to + * be notified when the display is disposed of, it is the + * application's responsibility provide a + * disposeExec() handler which does so. + *

    + * + * @param data the new display specific data + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #getData() + * @see #disposeExec(Runnable) + */ + public void setData (Object data) { + checkDevice (); + this.data = data; + } + + /** + * Sets the synchronizer used by the display to be + * the argument, which can not be null. + * + * @param synchronizer the new synchronizer for the display (must not be null) + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the synchronizer is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    • ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message
    • + *
    + */ + public void setSynchronizer (Synchronizer synchronizer) { + checkDevice (); + if (synchronizer is null) error (DWT.ERROR_NULL_ARGUMENT); + if (synchronizer is this.synchronizer) return; + Synchronizer oldSynchronizer; + synchronized (Device.classinfo) { + oldSynchronizer = this.synchronizer; + this.synchronizer = synchronizer; + } + if (oldSynchronizer !is null) { + oldSynchronizer.runAsyncMessages(true); } } - return false; -} - -bool runDeferredEvents () { - /* - * Run deferred events. This code is always - * called in the Display's thread so it must - * be re-enterant need not be synchronized. - */ - while (eventQueue !is null) { - - /* Take an event off the queue */ - Event event = eventQueue [0]; - if (event is null) break; - int length_ = eventQueue.length; - System.arraycopy (eventQueue, 1, eventQueue, 0, --length_); - eventQueue [length_] = null; - - /* Run the event */ - Widget widget = event.widget; - if (widget !is null && !widget.isDisposed ()) { - Widget item = event.item; - if (item is null || !item.isDisposed ()) { - widget.notifyListeners (event.type, event); - } + + /** + * Causes the user-interface thread to sleep (that is, + * to be put in a state where it does not consume CPU cycles) + * until an event is received or it is otherwise awakened. + * + * @return true if an event requiring dispatching was placed on the queue. + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #wake + */ + public bool sleep () { + checkDevice (); + if (getMessageCount () !is 0) return true; + if (loopCounter is 0) { + pool.release(); + pool = cast(NSAutoreleasePool)(new NSAutoreleasePool()).alloc().init(); } - - /* - * At this point, the event queue could - * be null due to a recursive invokation - * when running the event. - */ + allowTimers = runAsyncMessages = false; + NSRunLoop.currentRunLoop().runMode(OS.NSDefaultRunLoopMode, NSDate.distantFuture()); + allowTimers = runAsyncMessages = true; + return true; + } + + int sourceProc (int info) { + return 0; } - - /* Clear the queue */ - eventQueue = null; - return true; -} - -bool runPopups () { - if (popups is null) return false; - bool result = false; - while (popups !is null) { - Menu menu = popups [0]; - if (menu is null) break; - int length_ = popups.length; - System.arraycopy (popups, 1, popups, 0, --length_); - popups [length_] = null; -// clearMenuFlags (); - runDeferredEvents (); - if (!menu.isDisposed ()) menu._setVisible (true); -// clearMenuFlags (); - result = true; - } - popups = null; - return result; -} - -bool runTimers () { - if (timerList is null) return false; - bool result = false; - for (int i=0; irun() method of the runnable to + * be invoked by the user-interface thread at the next + * reasonable opportunity. The thread which calls this method + * is suspended until the runnable completes. Specifying null + * as the runnable simply wakes the user-interface thread. + *

    + * Note that at the time the runnable is invoked, widgets + * that have the receiver as their display may have been + * disposed. Therefore, it is necessary to check for this + * case inside the runnable before accessing the widget. + *

    + * + * @param runnable code to run on the user-interface thread or null + * + * @exception DWTException
      + *
    • ERROR_FAILED_EXEC - if an exception occurred when executing the runnable
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #asyncExec + */ + public void syncExec (Runnable runnable) { + Synchronizer synchronizer; + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + synchronizer = this.synchronizer; } - } - return result; -} - -void sendEvent (int eventType, Event event) { - if (eventTable is null && filterTable is null) { - return; - } - if (event is null) event = new Event (); - event.display = this; - event.type = eventType; - if (event.time is 0) event.time = getLastEventTime (); - if (!filterEvent (event)) { - if (eventTable !is null) eventTable.sendEvent (event); + synchronizer.syncExec (runnable); } -} - -/** - * On platforms which support it, sets the application name - * to be the argument. On Motif, for example, this can be used - * to set the name used for resource lookup. Specifying - * null for the name clears it. - * - * @param name the new app name or null - */ -public static void setAppName (String name) { - APP_NAME = name; -} - -//TODO use custom timer instead of timerExec -Runnable hoverTimer; - -//TODO - use custom timer instead of timerExec -Runnable caretTimer; -void setCurrentCaret (Caret caret) { -// if (caretID !is 0) OS.RemoveEventLoopTimer (caretID); -// caretID = 0; - currentCaret = caret; - if (currentCaret !is null) { - int blinkRate = currentCaret.blinkRate; - timerExec (blinkRate, caretTimer); - } -} - -void setCursor (Control control) { - Cursor cursor = null; - if (control !is null) cursor = control.findCursor (); - if (cursor is null) cursor = getSystemCursor (DWT.CURSOR_ARROW); - cursor.handle.set (); -} - -/** - * Sets the location of the on-screen pointer relative to the top left corner - * of the screen. Note: It is typically considered bad practice for a - * program to move the on-screen pointer location. - * - * @param x the new x coordinate for the cursor - * @param y the new y coordinate for the cursor - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.1 - */ -public void setCursorLocation (int x, int y) { - checkDevice (); - CGPoint pt = CGPoint (); - pt.x = x; pt.y = y; - OS.CGWarpMouseCursorPosition (pt); -} - -/** - * Sets the location of the on-screen pointer relative to the top left corner - * of the screen. Note: It is typically considered bad practice for a - * program to move the on-screen pointer location. - * - * @param point new position - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_NULL_ARGUMENT - if the point is null - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @since 2.0 - */ -public void setCursorLocation (Point point) { - checkDevice (); - if (point is null) error (DWT.ERROR_NULL_ARGUMENT); - setCursorLocation (point.x, point.y); -} - -/** - * Sets the application defined property of the receiver - * with the specified name to the given argument. - *

    - * Applications may have associated arbitrary objects with the - * receiver in this fashion. If the objects stored in the - * properties need to be notified when the display is disposed - * of, it is the application's responsibility provide a - * disposeExec() handler which does so. - *

    - * - * @param key the name of the property - * @param value the new value for the property - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the key is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #getData(String) - * @see #disposeExec(Runnable) - */ -public void setData (String key, Object value) { - checkDevice (); - //if (key is null) error (DWT.ERROR_NULL_ARGUMENT); - - if (key.equals (ADD_WIDGET_KEY)) { - auto wrap = cast(ArrayWrapperObject) value; - - if (wrap is null) - DWT.error(DWT.ERROR_INVALID_ARGUMENT, null, " []"); - - Object [] data = wrap.array; - NSObject object = cast(NSObject)data [0]; - Widget widget = cast(Widget)data [1]; - if (widget is null) { - removeWidget (object); - } else { - addWidget (object, widget); + /** + * Causes the run() method of the runnable to + * be invoked by the user-interface thread after the specified + * number of milliseconds have elapsed. If milliseconds is less + * than zero, the runnable is not executed. + *

    + * Note that at the time the runnable is invoked, widgets + * that have the receiver as their display may have been + * disposed. Therefore, it is necessary to check for this + * case inside the runnable before accessing the widget. + *

    + * + * @param milliseconds the delay before running the runnable + * @param runnable code to run on the user-interface thread + * + * @exception IllegalArgumentException
      + *
    • ERROR_NULL_ARGUMENT - if the runnable is null
    • + *
    + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #asyncExec + */ + public void timerExec (int milliseconds, Runnable runnable) { + checkDevice (); + //TODO - remove a timer, reschedule a timer not tested + if (runnable is null) error (DWT.ERROR_NULL_ARGUMENT); + if (timerList is null) timerList = new Runnable [4]; + if (nsTimers is null) nsTimers = new NSTimer [4]; + int index = 0; + while (index < timerList.length) { + if (timerList [index] is runnable) break; + index++; + } + if (index !is timerList.length) { + NSTimer timer = nsTimers [index]; + if (timer is null) { + timerList [index] = null; + } else { + if (milliseconds < 0) { + timer.invalidate(); + timerList [index] = null; + nsTimers [index] = null; + } else { + timer.setFireDate(NSDate.dateWithTimeIntervalSinceNow (milliseconds / 1000.0)); + } + return; + } + } + if (milliseconds < 0) return; + index = 0; + while (index < timerList.length) { + if (timerList [index] is null) break; + index++; + } + if (index is timerList.length) { + Runnable [] newTimerList = new Runnable [timerList.length + 4]; + SimpleType!(Runnable).arraycopy (timerList, 0, newTimerList, 0, timerList.length); + timerList = newTimerList; + NSTimer [] newTimerIds = new NSTimer [nsTimers.length + 4]; + System.arraycopy (nsTimers, 0, newTimerIds, 0, nsTimers.length); + nsTimers = newTimerIds; + } + NSNumber userInfo = NSNumber.numberWithInt(index); + NSTimer timer = NSTimer.scheduledTimerWithTimeInterval(milliseconds / 1000.0, timerDelegate, OS.sel_timerProc_, userInfo, false); + timer.retain(); + if (timer !is null) { + nsTimers [index] = timer; + timerList [index] = runnable; } } - /* Remove the key/value pair */ - if (value is null) { - if (keys is null) return; - int index = 0; - while (index < keys.length && !keys [index].equals (key)) index++; - if (index is keys.length) return; - if (keys.length is 1) { - keys = null; - values = null; - } else { - String [] newKeys = new String [keys.length - 1]; - Object [] newValues = new Object [values.length - 1]; - System.arraycopy (keys, 0, newKeys, 0, index); - System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index); - System.arraycopy (values, 0, newValues, 0, index); - System.arraycopy (values, index + 1, newValues, index, newValues.length - index); - keys = newKeys; - values = newValues; + objc.id timerProc (objc.id id, objc.SEL sel, objc.id timerID) { + NSTimer timer = new NSTimer (timerID); + NSNumber number = new NSNumber(timer.userInfo()); + int index = number.intValue(); + if (timerList is null) return null; + if (0 <= index && index < timerList.length) { + if (allowTimers) { + Runnable runnable = timerList [index]; + timerList [index] = null; + nsTimers [index] = null; + if (runnable !is null) runnable.run (); + } else { + nsTimers [index] = null; + wakeThread (); + } } - return; + timer.release(); + return null; } - /* Add the key/value pair */ - if (keys is null) { - keys = [key]; - values = [value]; - return; - } - for (int i=0; i 1) { - menubar.removeItemAtIndex(count - 1); - count--; - } - //set parent of each item to NULL and add them to menubar - if (menu !is null) { - MenuItem[] items = menu.getItems(); - for (int i = 0; i < items.length; i++) { - items[i].nsItem.setMenu(null); - menubar.addItem(items[i].nsItem); - } - } -} - -void setModalShell (Shell shell) { - if (modalShells is null) modalShells = new Shell [4]; - int index = 0, length = modalShells.length; - while (index < length) { - if (modalShells [index] is shell) return; - if (modalShells [index] is null) break; - index++; - } - if (index is length) { - Shell [] newModalShells = new Shell [length + 4]; - System.arraycopy (modalShells, 0, newModalShells, 0, length); - modalShells = newModalShells; - } - modalShells [index] = shell; - Shell [] shells = getShells (); - for (int i=0; idisplay specific data is a single, - * unnamed field that is stored with every display. - *

    - * Applications may put arbitrary objects in this field. If - * the object stored in the display specific data needs to - * be notified when the display is disposed of, it is the - * application's responsibility provide a - * disposeExec() handler which does so. - *

    - * - * @param data the new display specific data - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #getData() - * @see #disposeExec(Runnable) - */ -public void setData (Object data) { - checkDevice (); - this.data = data; -} - -/** - * Sets the synchronizer used by the display to be - * the argument, which can not be null. - * - * @param synchronizer the new synchronizer for the display (must not be null) - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the synchronizer is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    • ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message
    • - *
    - */ -public void setSynchronizer (Synchronizer synchronizer) { - checkDevice (); - if (synchronizer is null) error (DWT.ERROR_NULL_ARGUMENT); - if (synchronizer is this.synchronizer) return; - Synchronizer oldSynchronizer; - synchronized (Device.classinfo) { - oldSynchronizer = this.synchronizer; - this.synchronizer = synchronizer; - } - if (oldSynchronizer !is null) { - oldSynchronizer.runAsyncMessages(true); + /** + * Forces all outstanding paint requests for the display + * to be processed before this method returns. + * + * @exception DWTException
      + *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see Control#update() + */ + public void update () { + checkDevice (); + // Shell [] shells = getShells (); + // for (int i=0; isleep (that is, - * to be put in a state where it does not consume CPU cycles) - * until an event is received or it is otherwise awakened. - * - * @return true if an event requiring dispatching was placed on the queue. - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #wake - */ -public bool sleep () { - checkDevice (); - if (getMessageCount () !is 0) return true; - if (loopCounter is 0) { - pool.release(); - pool = cast(NSAutoreleasePool)(new NSAutoreleasePool()).alloc().init(); - } - allowTimers = runAsyncMessages = false; - NSRunLoop.currentRunLoop().runMode(OS.NSDefaultRunLoopMode, NSDate.distantFuture()); - allowTimers = runAsyncMessages = true; - return true; -} - -int sourceProc (int info) { - return 0; -} - -/** - * Causes the run() method of the runnable to - * be invoked by the user-interface thread at the next - * reasonable opportunity. The thread which calls this method - * is suspended until the runnable completes. Specifying null - * as the runnable simply wakes the user-interface thread. - *

    - * Note that at the time the runnable is invoked, widgets - * that have the receiver as their display may have been - * disposed. Therefore, it is necessary to check for this - * case inside the runnable before accessing the widget. - *

    - * - * @param runnable code to run on the user-interface thread or null - * - * @exception DWTException
      - *
    • ERROR_FAILED_EXEC - if an exception occurred when executing the runnable
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #asyncExec - */ -public void syncExec (Runnable runnable) { - Synchronizer synchronizer; - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - synchronizer = this.synchronizer; - } - synchronizer.syncExec (runnable); -} - -/** - * Causes the run() method of the runnable to - * be invoked by the user-interface thread after the specified - * number of milliseconds have elapsed. If milliseconds is less - * than zero, the runnable is not executed. - *

    - * Note that at the time the runnable is invoked, widgets - * that have the receiver as their display may have been - * disposed. Therefore, it is necessary to check for this - * case inside the runnable before accessing the widget. - *

    - * - * @param milliseconds the delay before running the runnable - * @param runnable code to run on the user-interface thread - * - * @exception IllegalArgumentException
      - *
    • ERROR_NULL_ARGUMENT - if the runnable is null
    • - *
    - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #asyncExec - */ -public void timerExec (int milliseconds, Runnable runnable) { - checkDevice (); - //TODO - remove a timer, reschedule a timer not tested - if (runnable is null) error (DWT.ERROR_NULL_ARGUMENT); - if (timerList is null) timerList = new Runnable [4]; - if (nsTimers is null) nsTimers = new NSTimer [4]; - int index = 0; - while (index < timerList.length) { - if (timerList [index] is runnable) break; - index++; - } - if (index !is timerList.length) { - NSTimer timer = nsTimers [index]; - if (timer is null) { - timerList [index] = null; - } else { - if (milliseconds < 0) { - timer.invalidate(); - timerList [index] = null; - nsTimers [index] = null; - } else { - timer.setFireDate(NSDate.dateWithTimeIntervalSinceNow (milliseconds / 1000.0)); - } - return; - } - } - if (milliseconds < 0) return; - index = 0; - while (index < timerList.length) { - if (timerList [index] is null) break; - index++; - } - if (index is timerList.length) { - Runnable [] newTimerList = new Runnable [timerList.length + 4]; - SimpleType!(Runnable).arraycopy (timerList, 0, newTimerList, 0, timerList.length); - timerList = newTimerList; - NSTimer [] newTimerIds = new NSTimer [nsTimers.length + 4]; - System.arraycopy (nsTimers, 0, newTimerIds, 0, nsTimers.length); - nsTimers = newTimerIds; - } - NSNumber userInfo = NSNumber.numberWithInt(index); - NSTimer timer = NSTimer.scheduledTimerWithTimeInterval(milliseconds / 1000.0, timerDelegate, OS.sel_timerProc_, userInfo, false); - timer.retain(); - if (timer !is null) { - nsTimers [index] = timer; - timerList [index] = runnable; - } -} - -objc.id timerProc (objc.id id, objc.SEL sel, objc.id timerID) { - NSTimer timer = new NSTimer (timerID); - NSNumber number = new NSNumber(timer.userInfo()); - int index = number.intValue(); - if (timerList is null) return null; - if (0 <= index && index < timerList.length) { - if (allowTimers) { - Runnable runnable = timerList [index]; - timerList [index] = null; - nsTimers [index] = null; - if (runnable !is null) runnable.run (); - } else { - nsTimers [index] = null; + + /** + * If the receiver's user-interface thread was sleeping, + * causes it to be awakened and start running again. Note that this + * method may be called from any thread. + * + * @exception DWTException
      + *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • + *
    + * + * @see #sleep + */ + public void wake () { + synchronized (Device.classinfo) { + if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); + if (thread is Thread.getThis ()) return; wakeThread (); } } - timer.release(); - return null; -} - -/** - * Forces all outstanding paint requests for the display - * to be processed before this method returns. - * - * @exception DWTException
      - *
    • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
    • - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see Control#update() - */ -public void update () { - checkDevice (); -// Shell [] shells = getShells (); -// for (int i=0; isleeping, - * causes it to be awakened and start running again. Note that this - * method may be called from any thread. - * - * @exception DWTException
      - *
    • ERROR_DEVICE_DISPOSED - if the receiver has been disposed
    • - *
    - * - * @see #sleep - */ -public void wake () { - synchronized (Device.classinfo) { - if (isDisposed ()) error (DWT.ERROR_DEVICE_DISPOSED); - if (thread is Thread.getThis ()) return; - wakeThread (); + + void wakeThread () { + NSObject object = (new NSObject()).alloc().init(); + object.performSelectorOnMainThread(OS.sel_release, null, false); } -} - -void wakeThread () { - NSObject object = (new NSObject()).alloc().init(); - object.performSelectorOnMainThread(OS.sel_release, null, false); -} - -Control findControl (NSEvent nsEvent, bool checkGrab, bool checkTrim, bool checkWindows) { - if (checkGrab && grabControl !is null && !grabControl.isDisposed()) return grabControl; - NSPoint point = NSEvent.mouseLocation(); - NSView view = null; - NSWindow window = nsEvent !is null ? nsEvent.window() : null; - if (window !is null) { - view = window.contentView().hitTest (window.convertScreenToBase(point)); + + Control findControl (NSEvent nsEvent, bool checkGrab, bool checkTrim, bool checkWindows) { + if (checkGrab && grabControl !is null && !grabControl.isDisposed()) return grabControl; + NSPoint point = NSEvent.mouseLocation(); + NSView view = null; + NSWindow window = nsEvent !is null ? nsEvent.window() : null; + if (window !is null) { + view = window.contentView().hitTest (window.convertScreenToBase(point)); + } + if (view is null && checkWindows) { + NSArray windows = application.orderedWindows(); + for (int i = 0; i < windows.count() && view is null; i++) { + window = new NSWindow(windows.objectAtIndex(i)); + NSView contentView = window.contentView(); + if (contentView !is null) view = contentView.hitTest (window.convertScreenToBase(point)); + } + } + Control control = null; + if (view !is null) { + do { + Widget widget = getWidget (view); + if (cast(Control) widget) { + control = cast(Control)widget; + break; + } + view = view.superview(); + } while (view !is null); + } + if (checkTrim) { + if (control !is null && control.isTrim (view)) control = null; + } + return control; } - if (view is null && checkWindows) { - NSArray windows = application.orderedWindows(); - for (int i = 0; i < windows.count() && view is null; i++) { - window = new NSWindow(windows.objectAtIndex(i)); - NSView contentView = window.contentView(); - if (contentView !is null) view = contentView.hitTest (window.convertScreenToBase(point)); + + objc.id applicationNextEventMatchingMask (objc.id id, objc.SEL sel, objc.id mask, objc.id expiration, objc.id mode, objc.id dequeue) { + objc_super super_struct = objc_super(); + super_struct.receiver = id; + super_struct.super_class = cast(objc.Class) OS.objc_msgSend(id, OS.sel_superclass); + objc.id result = OS.objc_msgSendSuper(&super_struct, sel, mask, expiration, mode, dequeue !is null); + if (result !is null) { + if (trackingControl !is null && dequeue !is null) { + NSEvent nsEvent = new NSEvent(result); + applicationSendMouseEvent(nsEvent, true); + } } + return result; } - Control control = null; - if (view !is null) { - do { - Widget widget = getWidget (view); - if (cast(Control) widget) { - control = cast(Control)widget; + + void applicationSendMouseEvent (NSEvent nsEvent, bool send) { + if (send) runDeferredEvents(); + bool up = false; + NSEventType type = nsEvent.type(); + switch (type) { + case OS.NSLeftMouseDown: + case OS.NSRightMouseDown: + case OS.NSOtherMouseDown: { + Control control = grabControl = findControl(nsEvent, false, true, false); + if (control !is null) { + if (nsEvent.clickCount() is 1 && (control.state & Widget.DRAG_DETECT) !is 0 && control.hooks (DWT.DragDetect) && control.dragDetect()) { + dragging = true; + } + control.sendMouseEvent (nsEvent, DWT.MouseDown, send); + if (nsEvent.clickCount() is 2) { + control.sendMouseEvent (nsEvent, DWT.MouseDoubleClick, send); + } + } break; } - view = view.superview(); - } while (view !is null); - } - if (checkTrim) { - if (control !is null && control.isTrim (view)) control = null; - } - return control; -} - -objc.id applicationNextEventMatchingMask (objc.id id, objc.SEL sel, objc.id mask, objc.id expiration, objc.id mode, objc.id dequeue) { - objc_super super_struct = objc_super(); - super_struct.receiver = id; - super_struct.super_class = cast(objc.Class) OS.objc_msgSend(id, OS.sel_superclass); - objc.id result = OS.objc_msgSendSuper(&super_struct, sel, mask, expiration, mode, dequeue !is null); - if (result !is null) { - if (trackingControl !is null && dequeue !is null) { - NSEvent nsEvent = new NSEvent(result); - applicationSendMouseEvent(nsEvent, true); - } - } - return result; -} - -void applicationSendMouseEvent (NSEvent nsEvent, bool send) { - if (send) runDeferredEvents(); - bool up = false; - int type = cast(int)/*64*/nsEvent.type(); - switch (type) { - case OS.NSLeftMouseDown: - case OS.NSRightMouseDown: - case OS.NSOtherMouseDown: { - Control control = grabControl = findControl(nsEvent, false, true, false); - if (control !is null) { - if (nsEvent.clickCount() is 1 && (control.state & Widget.DRAG_DETECT) !is 0 && control.hooks (DWT.DragDetect) && control.dragDetect()) { - dragging = true; - } - control.sendMouseEvent (nsEvent, DWT.MouseDown, send); - if (nsEvent.clickCount() is 2) { - control.sendMouseEvent (nsEvent, DWT.MouseDoubleClick, send); + case OS.NSLeftMouseUp: + case OS.NSRightMouseUp: + case OS.NSOtherMouseUp: { + Control control = findControl(nsEvent, true, true, false); + if (control !is null) { + control.sendMouseEvent (nsEvent, DWT.MouseUp, send); } - } - break; - } - case OS.NSLeftMouseUp: - case OS.NSRightMouseUp: - case OS.NSOtherMouseUp: { - Control control = findControl(nsEvent, true, true, false); - if (control !is null) { - control.sendMouseEvent (nsEvent, DWT.MouseUp, send); + grabControl = null; + up = true; + //FALL THROUGH } - grabControl = null; - up = true; - //FALL THROUGH - } - case OS.NSLeftMouseDragged: - case OS.NSRightMouseDragged: - case OS.NSOtherMouseDragged: - case OS.NSMouseMoved: { - Control control = findControl(nsEvent, true, true, type is OS.NSMouseMoved); - if (dragging) { - dragging = false; - control.sendDragEvent(nsEvent); + case OS.NSLeftMouseDragged: + case OS.NSRightMouseDragged: + case OS.NSOtherMouseDragged: + case OS.NSMouseMoved: { + Control control = findControl(nsEvent, true, true, type is OS.NSMouseMoved); + if (dragging) { + dragging = false; + control.sendDragEvent(nsEvent); + } + if (control !is currentControl) { + if (currentControl !is null) { + currentControl.sendMouseEvent (nsEvent, DWT.MouseExit, send); + } + currentControl = control; + if (control !is null) { + control.sendMouseEvent (nsEvent, DWT.MouseEnter, send); + if (up) timerExec (getToolTipTime (), hoverTimer); + } + setCursor (control); + } + if (!up && control !is null) { + timerExec (getToolTipTime (), hoverTimer); + control.sendMouseEvent (nsEvent, DWT.MouseMove, send); + } + break; } - if (control !is currentControl) { - if (currentControl !is null) { - currentControl.sendMouseEvent (nsEvent, DWT.MouseExit, send); - } - currentControl = control; - if (control !is null) { - control.sendMouseEvent (nsEvent, DWT.MouseEnter, send); - if (up) timerExec (getToolTipTime (), hoverTimer); - } - setCursor (control); - } - if (!up && control !is null) { - timerExec (getToolTipTime (), hoverTimer); - control.sendMouseEvent (nsEvent, DWT.MouseMove, send); - } - break; + default: } } -} - -void applicationSendEvent (objc.id id, objc.SEL sel, objc.id event) { - NSEvent nsEvent = new NSEvent(event); - int type = nsEvent.type (); - bool beep_ = false; - switch (type) { - case OS.NSLeftMouseDown: - case OS.NSRightMouseDown: - case OS.NSOtherMouseDown: - beep_ = true; - case OS.NSLeftMouseUp: - case OS.NSRightMouseUp: - case OS.NSMouseMoved: - case OS.NSLeftMouseDragged: - case OS.NSRightMouseDragged: - case OS.NSMouseEntered: - case OS.NSMouseExited: - case OS.NSKeyDown: - case OS.NSKeyUp: - case OS.NSOtherMouseUp: - case OS.NSOtherMouseDragged: - case OS.NSScrollWheel: - NSWindow window = nsEvent.window (); - if (window !is null) { - Shell shell = cast(Shell) getWidget (window.id); - if (shell !is null && shell.getModalShell () !is null) { - if (beep_) beep (); - return; + + void applicationSendEvent (objc.id id, objc.SEL sel, objc.id event) { + NSEvent nsEvent = new NSEvent(event); + NSEventType type = nsEvent.type (); + bool beep_ = false; + switch (type) { + case OS.NSLeftMouseDown: + case OS.NSRightMouseDown: + case OS.NSOtherMouseDown: + beep_ = true; + case OS.NSLeftMouseUp: + case OS.NSRightMouseUp: + case OS.NSMouseMoved: + case OS.NSLeftMouseDragged: + case OS.NSRightMouseDragged: + case OS.NSMouseEntered: + case OS.NSMouseExited: + case OS.NSKeyDown: + case OS.NSKeyUp: + case OS.NSOtherMouseUp: + case OS.NSOtherMouseDragged: + case OS.NSScrollWheel: + NSWindow window = nsEvent.window (); + if (window !is null) { + Shell shell = cast(Shell) getWidget (window.id); + if (shell !is null && shell.getModalShell () !is null) { + if (beep_) beep (); + return; + } } - } - break; + break; + default: + } + applicationSendMouseEvent (nsEvent, false); + objc_super super_struct = objc_super (); + super_struct.receiver = id; + super_struct.super_class = cast(objc.Class) OS.objc_msgSend (id, OS.sel_superclass); + OS.objc_msgSendSuper (&super_struct, sel, event); + // if (nsEvent.type() is OS.NSApplicationDefined && nsEvent.subtype() is SWT_IDLE_TYPE) { + // idle = true; + // } else { + // idle = false; + // } + // application.stop(null); } - applicationSendMouseEvent (nsEvent, false); - objc_super super_struct = objc_super (); - super_struct.receiver = id; - super_struct.super_class = cast(objc.Class) OS.objc_msgSend (id, OS.sel_superclass); - OS.objc_msgSendSuper (&super_struct, sel, event); -// if (nsEvent.type() is OS.NSApplicationDefined && nsEvent.subtype() is SWT_IDLE_TYPE) { -// idle = true; -// } else { -// idle = false; -// } -// application.stop(null); -} - -extern (C): - -// #245724: [NSApplication isRunning] must return true to allow the AWT to load correctly. -static objc.id applicationProc2(objc.id id, objc.SEL sel) {println("applicationProc2"); - //TODO optimize getting the display - Display display = getCurrent (); - if (display is null) return null; - if (sel is OS.sel_isRunning) { - return cast(objc.id) (display.isDisposed() ? null : cast(objc.id) 1); - } - return null; -} - -static objc.id applicationProc3(objc.id id, objc.SEL sel, objc.id event) {println("applicationProc3"); - //TODO optimize getting the display - Display display = getCurrent (); - if (display is null) return null; - if (sel is OS.sel_sendEvent_) { - display.applicationSendEvent (id, sel, event); + + extern (C): + + // #245724: [NSApplication isRunning] must return true to allow the AWT to load correctly. + static objc.id applicationProc2(objc.id id, objc.SEL sel) { + //TODO optimize getting the display + Display display = getCurrent (); + if (display is null) return null; + if (sel is OS.sel_isRunning) { + return cast(objc.id) (display.isDisposed() ? null : cast(objc.id) 1); + } return null; } - return null; -} - -static objc.id applicationProc6(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2, objc.id arg3) {println("applicationProc6"); - //TODO optimize getting the display - Display display = getCurrent (); - if (display is null) return null; - if (sel is OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_) { - return display.applicationNextEventMatchingMask(id, sel, arg0, arg1, arg2, arg3); - } - return null; -} - -static objc.id applicationDelegateProc(objc.id id, objc.SEL sel, objc.id arg0) { - //TODO optimize getting the display - Display display = getCurrent (); - if (display is null) return null; - cocoa.id applicationDelegate = display.applicationDelegate; - NSApplication application = display.application; - if (sel is OS.sel_applicationWillFinishLaunching_) { - NSDictionary dict = NSDictionary.dictionaryWithObject(applicationDelegate, NSString.stringWith("NSOwner")); - NSString nibFile = NSString.stringWith("/System/Library/Frameworks/JavaVM.framework/Resources/English.lproj/DefaultApp.nib"); - if (!NSBundle.loadNibFile(nibFile, dict, null)) { - nibFile = NSString.stringWith("/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Resources/English.lproj/DefaultApp.nib"); - NSBundle.loadNibFile(nibFile, dict, null); + + static objc.id applicationProc3(objc.id id, objc.SEL sel, objc.id event) { + //TODO optimize getting the display + Display display = getCurrent (); + if (display is null) return null; + if (sel is OS.sel_sendEvent_) { + display.applicationSendEvent (id, sel, event); + return null; } - //replace %@ with application name - NSMenu mainmenu = application.mainMenu(); - NSMenuItem appitem = mainmenu.itemAtIndex(0); - if (appitem !is null) { - NSMenu sm = appitem.submenu(); - NSArray ia = sm.itemArray(); - for(int i = 0; i < ia.count(); i++) { - NSMenuItem ni = new NSMenuItem(ia.objectAtIndex(i)); - NSString title = ni.title().stringByReplacingOccurrencesOfString(NSString.stringWith("%@"), NSString.stringWith(APP_NAME)); - ni.setTitle(title); - } - } - } else if (sel is OS.sel_terminate_) { - application.terminate(application); - } else if (sel is OS.sel_orderFrontStandardAboutPanel_) { -// Event event = new Event (); -// sendEvent (DWT.ABORT, event); - } else if (sel is OS.sel_hideOtherApplications_) { - application.hideOtherApplications(application); - } else if (sel is OS.sel_hide_) { - application.hide(application); - } else if (sel is OS.sel_unhideAllApplications_) { - application.unhideAllApplications(application); - } else if (sel is OS.sel_applicationShouldTerminate_) { - if (!display.disposing) { - Event event = new Event (); - display.sendEvent (DWT.Close, event); - if (event.doit) { - return cast(objc.id) OS.NSTerminateNow; - } - } - return cast(objc.id) OS.NSTerminateCancel; - } else if (sel is OS.sel_applicationWillTerminate_) { - display.dispose(); - } else if (sel is OS.sel_applicationWillResignActive_) { - Shell[] shells = display.getShells(); - for (int i = 0; i < shells.length; i++) { - shells[i].clearLevel(); - } + return null; } - return null; -} - -static objc.id dialogProc(objc.id id, objc.SEL sel, objc.id arg0) { - void* jniRef; - OS.object_getInstanceVariable(id, SWT_OBJECT, jniRef); - if (jniRef is null) return null; - if (sel is OS.sel_changeColor_) { - ColorDialog dialog = cast(ColorDialog)OS.JNIGetObject(jniRef); - if (jniRef is null) return null; - dialog.changeColor(id, sel, arg0); - } else if (sel is OS.sel_changeFont_) { - FontDialog dialog = cast(FontDialog)OS.JNIGetObject(jniRef); - if (dialog is null) return null; - dialog.changeFont(id, sel, arg0); - } else if (sel is OS.sel_windowWillClose_) { - Object object = OS.JNIGetObject(jniRef); - if (cast(FontDialog) object) { - (cast(FontDialog)object).windowWillClose(id, sel, arg0); - } else if (cast(ColorDialog) object) { - (cast(ColorDialog)object).windowWillClose(id, sel, arg0); + + static objc.id applicationProc6(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2, objc.id arg3) { + //TODO optimize getting the display + Display display = getCurrent (); + if (display is null) return null; + if (sel is OS.sel_nextEventMatchingMask_untilDate_inMode_dequeue_) { + return display.applicationNextEventMatchingMask(id, sel, arg0, arg1, arg2, arg3); } + return null; } - return null; -} - -static objc.id windowDelegateProc2(objc.id id, objc.SEL sel) { - Widget widget = GetWidget(id); - if (widget is null) return null; - if (sel is OS.sel_sendSelection) { - widget.sendSelection(); - } else if (sel is OS.sel_sendDoubleSelection) { - widget.sendDoubleSelection(); - } else if (sel is OS.sel_sendVerticalSelection) { - widget.sendVerticalSelection(); - } else if (sel is OS.sel_sendHorizontalSelection) { - widget.sendHorizontalSelection(); - } else if (sel is OS.sel_acceptsFirstResponder) { - return widget.acceptsFirstResponder(id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_becomeFirstResponder) { - return widget.becomeFirstResponder(id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_resignFirstResponder) { - return widget.resignFirstResponder(id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_isFlipped) { - return widget.isFlipped(id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_isOpaque) { - return widget.isOpaque(id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_unmarkText) { - //TODO not called? - } else if (sel is OS.sel_validAttributesForMarkedText) { - return widget.validAttributesForMarkedText (id, sel); - } else if (sel is OS.sel_markedRange) { - NSRange range = widget.markedRange (id, sel); - /* NOTE that this is freed in C */ - objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); - OS.memmove (result, &range, NSRange.sizeof); - return result; - } else if (sel is OS.sel_selectedRange) { - NSRange range = widget.selectedRange (id, sel); - /* NOTE that this is freed in C */ - objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); - OS.memmove (result, &range, NSRange.sizeof); - return result; - } else if (sel is OS.sel_hasMarkedText) { - return widget.hasMarkedText (id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_canBecomeKeyWindow) { - return widget.canBecomeKeyWindow (id, sel) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_accessibilityActionNames) { - return widget.accessibilityActionNames(id, sel); - } else if (sel is OS.sel_accessibilityAttributeNames) { - return widget.accessibilityAttributeNames(id, sel); - } else if (sel is OS.sel_accessibilityParameterizedAttributeNames) { - return widget.accessibilityParameterizedAttributeNames(id, sel); - } else if (sel is OS.sel_accessibilityFocusedUIElement) { - return widget.accessibilityFocusedUIElement(id, sel); - } else if (sel is OS.sel_accessibilityIsIgnored) { - return (widget.accessibilityIsIgnored(id, sel) ? cast(objc.id) 1 : null); - } - return null; -} - -static objc.id windowDelegateProc3(objc.id id, objc.SEL sel, objc.id arg0) { - if (sel is OS.sel_timerProc_) { + + static objc.id applicationDelegateProc(objc.id id, objc.SEL sel, objc.id arg0) { //TODO optimize getting the display Display display = getCurrent (); if (display is null) return null; - return display.timerProc (id, sel, arg0); + cocoa.id applicationDelegate = display.applicationDelegate; + NSApplication application = display.application; + if (sel is OS.sel_applicationWillFinishLaunching_) { + NSDictionary dict = NSDictionary.dictionaryWithObject(applicationDelegate, NSString.stringWith("NSOwner")); + NSString nibFile = NSString.stringWith("/System/Library/Frameworks/JavaVM.framework/Resources/English.lproj/DefaultApp.nib"); + if (!NSBundle.loadNibFile(nibFile, dict, null)) { + nibFile = NSString.stringWith("/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Resources/English.lproj/DefaultApp.nib"); + NSBundle.loadNibFile(nibFile, dict, null); + } + //replace %@ with application name + NSMenu mainmenu = application.mainMenu(); + NSMenuItem appitem = mainmenu.itemAtIndex(0); + if (appitem !is null) { + NSMenu sm = appitem.submenu(); + NSArray ia = sm.itemArray(); + for(int i = 0; i < ia.count(); i++) { + NSMenuItem ni = new NSMenuItem(ia.objectAtIndex(i)); + NSString title = ni.title().stringByReplacingOccurrencesOfString(NSString.stringWith("%@"), NSString.stringWith(APP_NAME)); + ni.setTitle(title); + } + } + } else if (sel is OS.sel_terminate_) { + application.terminate(application); + } else if (sel is OS.sel_orderFrontStandardAboutPanel_) { + // Event event = new Event (); + // sendEvent (DWT.ABORT, event); + } else if (sel is OS.sel_hideOtherApplications_) { + application.hideOtherApplications(application); + } else if (sel is OS.sel_hide_) { + application.hide(application); + } else if (sel is OS.sel_unhideAllApplications_) { + application.unhideAllApplications(application); + } else if (sel is OS.sel_applicationShouldTerminate_) { + if (!display.disposing) { + Event event = new Event (); + display.sendEvent (DWT.Close, event); + if (event.doit) { + return cast(objc.id) OS.NSTerminateNow; + } + } + return cast(objc.id) OS.NSTerminateCancel; + } else if (sel is OS.sel_applicationWillTerminate_) { + display.dispose(); + } else if (sel is OS.sel_applicationWillResignActive_) { + Shell[] shells = display.getShells(); + for (int i = 0; i < shells.length; i++) { + shells[i].clearLevel(); + } + } + return null; } - Widget widget = GetWidget(id); - if (widget is null && (sel is OS.sel_keyDown_ ||sel is OS.sel_keyUp_ ||sel is OS.sel_insertText_ ||sel is OS.sel_doCommandBySelector_)) { - widget = GetFocusControl ((new NSView (id)).window ()); + + static objc.id dialogProc(objc.id id, objc.SEL sel, objc.id arg0) { + void* jniRef; + OS.object_getInstanceVariable(id, SWT_OBJECT, jniRef); + if (jniRef is null) return null; + if (sel is OS.sel_changeColor_) { + ColorDialog dialog = cast(ColorDialog)OS.JNIGetObject(jniRef); + if (jniRef is null) return null; + dialog.changeColor(id, sel, arg0); + } else if (sel is OS.sel_changeFont_) { + FontDialog dialog = cast(FontDialog)OS.JNIGetObject(jniRef); + if (dialog is null) return null; + dialog.changeFont(id, sel, arg0); + } else if (sel is OS.sel_windowWillClose_) { + Object object = OS.JNIGetObject(jniRef); + if (cast(FontDialog) object) { + (cast(FontDialog)object).windowWillClose(id, sel, arg0); + } else if (cast(ColorDialog) object) { + (cast(ColorDialog)object).windowWillClose(id, sel, arg0); + } + } + return null; + } + + static objc.id windowDelegateProc2(objc.id id, objc.SEL sel) { + Widget widget = GetWidget(id); + if (widget is null) return null; + if (sel is OS.sel_sendSelection) { + widget.sendSelection(); + } else if (sel is OS.sel_sendDoubleSelection) { + widget.sendDoubleSelection(); + } else if (sel is OS.sel_sendVerticalSelection) { + widget.sendVerticalSelection(); + } else if (sel is OS.sel_sendHorizontalSelection) { + widget.sendHorizontalSelection(); + } else if (sel is OS.sel_acceptsFirstResponder) { + return widget.acceptsFirstResponder(id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_becomeFirstResponder) { + return widget.becomeFirstResponder(id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_resignFirstResponder) { + return widget.resignFirstResponder(id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_isFlipped) { + return widget.isFlipped(id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_isOpaque) { + return widget.isOpaque(id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_unmarkText) { + //TODO not called? + } else if (sel is OS.sel_validAttributesForMarkedText) { + return widget.validAttributesForMarkedText (id, sel); + } else if (sel is OS.sel_markedRange) { + NSRange range = widget.markedRange (id, sel); + /* NOTE that this is freed in C */ + objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); + OS.memmove (result, &range, NSRange.sizeof); + return result; + } else if (sel is OS.sel_selectedRange) { + NSRange range = widget.selectedRange (id, sel); + /* NOTE that this is freed in C */ + objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); + OS.memmove (result, &range, NSRange.sizeof); + return result; + } else if (sel is OS.sel_hasMarkedText) { + return widget.hasMarkedText (id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_canBecomeKeyWindow) { + return widget.canBecomeKeyWindow (id, sel) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_accessibilityActionNames) { + return widget.accessibilityActionNames(id, sel); + } else if (sel is OS.sel_accessibilityAttributeNames) { + return widget.accessibilityAttributeNames(id, sel); + } else if (sel is OS.sel_accessibilityParameterizedAttributeNames) { + return widget.accessibilityParameterizedAttributeNames(id, sel); + } else if (sel is OS.sel_accessibilityFocusedUIElement) { + return widget.accessibilityFocusedUIElement(id, sel); + } else if (sel is OS.sel_accessibilityIsIgnored) { + return (widget.accessibilityIsIgnored(id, sel) ? cast(objc.id) 1 : null); + } + return null; } - if (widget is null) return null; - if (sel is OS.sel_windowWillClose_) { - widget.windowWillClose(id, sel, arg0); - } else if (sel is OS.sel_drawRect_) { - NSRect rect = NSRect(); - OS.memmove(&rect, arg0, NSRect.sizeof); - widget.drawRect(id, sel, rect); - } else if (sel is OS.sel_setFrameOrigin_) { - NSPoint point = NSPoint(); - OS.memmove(&point, arg0, NSPoint.sizeof); - widget.setFrameOrigin(id, sel, point); - } else if (sel is OS.sel_setFrameSize_) { - NSSize size = NSSize(); - OS.memmove(&size, arg0, NSSize.sizeof); - widget.setFrameSize(id, sel, size); - } else if (sel is OS.sel_hitTest_) { - NSPoint point = NSPoint(); - OS.memmove(&point, arg0, NSPoint.sizeof); - return widget.hitTest(id, sel, point); - } else if (sel is OS.sel_windowShouldClose_) { - return widget.windowShouldClose(id, sel, arg0) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_mouseDown_) { - widget.mouseDown(id, sel, arg0); - } else if (sel is OS.sel_keyDown_) { - widget.keyDown(id, sel, arg0); - } else if (sel is OS.sel_keyUp_) { - widget.keyUp(id, sel, arg0); - } else if (sel is OS.sel_flagsChanged_) { - widget.flagsChanged(id, sel, arg0); - } else if (sel is OS.sel_mouseUp_) { - widget.mouseUp(id, sel, arg0); - } else if (sel is OS.sel_rightMouseDown_) { - widget.rightMouseDown(id, sel, arg0); - } else if (sel is OS.sel_rightMouseUp_) { - widget.rightMouseUp(id, sel, arg0); - } else if (sel is OS.sel_otherMouseDown_) { - widget.otherMouseDown(id, sel, arg0); - } else if (sel is OS.sel_otherMouseUp_) { - widget.otherMouseUp(id, sel, arg0); - } else if (sel is OS.sel_mouseMoved_) { - widget.mouseMoved(id, sel, arg0); - } else if (sel is OS.sel_mouseDragged_) { - widget.mouseDragged(id, sel, arg0); - } else if (sel is OS.sel_mouseEntered_) { - widget.mouseEntered(id, sel, arg0); - } else if (sel is OS.sel_mouseExited_) { - widget.mouseExited(id, sel, arg0); - } else if (sel is OS.sel_menuForEvent_) { - return widget.menuForEvent(id, sel, arg0); - } else if (sel is OS.sel_numberOfRowsInTableView_) { - return cast(objc.id) widget.numberOfRowsInTableView(id, sel, arg0); - } else if (sel is OS.sel_comboBoxSelectionDidChange_) { - widget.comboBoxSelectionDidChange(id, sel, arg0); - } else if (sel is OS.sel_tableViewSelectionDidChange_) { - widget.tableViewSelectionDidChange(id, sel, arg0); - } else if (sel is OS.sel_windowDidResignKey_) { - widget.windowDidResignKey(id, sel, arg0); - } else if (sel is OS.sel_windowDidBecomeKey_) { - widget.windowDidBecomeKey(id, sel, arg0); - } else if (sel is OS.sel_windowDidResize_) { - widget.windowDidResize(id, sel, arg0); - } else if (sel is OS.sel_windowDidMove_) { - widget.windowDidMove(id, sel, arg0); - } else if (sel is OS.sel_menuWillOpen_) { - widget.menuWillOpen(id, sel, arg0); - } else if (sel is OS.sel_menuDidClose_) { - widget.menuDidClose(id, sel, arg0); - } else if (sel is OS.sel_menuNeedsUpdate_) { - widget.menuNeedsUpdate(id, sel, arg0); - } else if (sel is OS.sel_outlineViewSelectionDidChange_) { - widget.outlineViewSelectionDidChange(id, sel, arg0); - } else if (sel is OS.sel_outlineViewItemDidExpand_) { - widget.outlineViewItemDidExpand(id, sel, arg0); - } else if (sel is OS.sel_sendEvent_) { - widget.windowSendEvent(id, sel, arg0); - } else if (sel is OS.sel_helpRequested_) { - widget.helpRequested(id, sel, arg0); - } else if (sel is OS.sel_scrollWheel_) { - widget.scrollWheel(id, sel, arg0); - } else if (sel is OS.sel_pageDown_) { - widget.pageDown(id, sel, arg0); - } else if (sel is OS.sel_pageUp_) { - widget.pageUp(id, sel, arg0); - } else if (sel is OS.sel_textViewDidChangeSelection_) { - widget.textViewDidChangeSelection(id, sel, arg0); - } else if (sel is OS.sel_textDidChange_) { - widget.textDidChange(id, sel, arg0); - } else if (sel is OS.sel_attributedSubstringFromRange_) { - return widget.attributedSubstringFromRange (id, sel, arg0); - } else if (sel is OS.sel_characterIndexForPoint_) { - return cast(objc.id) widget.characterIndexForPoint (id, sel, arg0); - } else if (sel is OS.sel_firstRectForCharacterRange_) { - NSRect rect = widget.firstRectForCharacterRange (id, sel, arg0); - /* NOTE that this is freed in C */ - objc.id result = cast(objc.id) OS.malloc (NSRect.sizeof); - OS.memmove (result, &rect, NSRect.sizeof); - return result; - } else if (sel is OS.sel_insertText_) { - widget.insertText (id, sel, arg0); - } else if (sel is OS.sel_doCommandBySelector_) { - widget.doCommandBySelector (id, sel, cast(char*) arg0); - } else if (sel is OS.sel_highlightSelectionInClipRect_) { - widget.highlightSelectionInClipRect (id, sel, arg0); - } else if (sel is OS.sel_reflectScrolledClipView_) { - widget.reflectScrolledClipView (id, sel, arg0); - } else if (sel is OS.sel_accessibilityHitTest_) { - NSPoint point = NSPoint(); - OS.memmove(&point, arg0, NSPoint.sizeof); - return widget.accessibilityHitTest(id, sel, point); - } else if (sel is OS.sel_accessibilityAttributeValue_) { - return widget.accessibilityAttributeValue(id, sel, arg0); - } else if (sel is OS.sel_accessibilityIsAttributeSettable_) { - return (widget.accessibilityIsAttributeSettable(id, sel, arg0) ? cast(objc.id) 1 : null); - } else if (sel is OS.sel_accessibilityPerformAction_) { - widget.accessibilityPerformAction(id, sel, arg0); - } else if (sel is OS.sel_accessibilityActionDescription_) { - widget.accessibilityActionDescription(id, sel, arg0); - } else if (sel is OS.sel_makeFirstResponder_) { - return widget.makeFirstResponder(id, sel, arg0) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_tableViewColumnDidMove_) { - widget.tableViewColumnDidMove(id, sel, arg0); - } else if (sel is OS.sel_tableViewColumnDidResize_) { - widget.tableViewColumnDidResize(id, sel, arg0); - } else if (sel is OS.sel_outlineViewColumnDidMove_) { - widget.outlineViewColumnDidMove(id, sel, arg0); - } else if (sel is OS.sel_outlineViewColumnDidResize_) { - widget.outlineViewColumnDidResize(id, sel, arg0); + + static objc.id windowDelegateProc3(objc.id id, objc.SEL sel, objc.id arg0) { + if (sel is OS.sel_timerProc_) { + //TODO optimize getting the display + Display display = getCurrent (); + if (display is null) return null; + return display.timerProc (id, sel, arg0); + } + Widget widget = GetWidget(id); + if (widget is null && (sel is OS.sel_keyDown_ ||sel is OS.sel_keyUp_ ||sel is OS.sel_insertText_ ||sel is OS.sel_doCommandBySelector_)) { + widget = GetFocusControl ((new NSView (id)).window ()); + } + if (widget is null) return null; + if (sel is OS.sel_windowWillClose_) { + widget.windowWillClose(id, sel, arg0); + } else if (sel is OS.sel_drawRect_) { + NSRect rect = NSRect(); + OS.memmove(&rect, arg0, NSRect.sizeof); + widget.drawRect(id, sel, rect); + } else if (sel is OS.sel_setFrameOrigin_) { + NSPoint point = NSPoint(); + OS.memmove(&point, arg0, NSPoint.sizeof); + widget.setFrameOrigin(id, sel, point); + } else if (sel is OS.sel_setFrameSize_) { + NSSize size = NSSize(); + OS.memmove(&size, arg0, NSSize.sizeof); + widget.setFrameSize(id, sel, size); + } else if (sel is OS.sel_hitTest_) { + NSPoint point = NSPoint(); + OS.memmove(&point, arg0, NSPoint.sizeof); + return widget.hitTest(id, sel, point); + } else if (sel is OS.sel_windowShouldClose_) { + return widget.windowShouldClose(id, sel, arg0) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_mouseDown_) { + widget.mouseDown(id, sel, arg0); + } else if (sel is OS.sel_keyDown_) { + widget.keyDown(id, sel, arg0); + } else if (sel is OS.sel_keyUp_) { + widget.keyUp(id, sel, arg0); + } else if (sel is OS.sel_flagsChanged_) { + widget.flagsChanged(id, sel, arg0); + } else if (sel is OS.sel_mouseUp_) { + widget.mouseUp(id, sel, arg0); + } else if (sel is OS.sel_rightMouseDown_) { + widget.rightMouseDown(id, sel, arg0); + } else if (sel is OS.sel_rightMouseUp_) { + widget.rightMouseUp(id, sel, arg0); + } else if (sel is OS.sel_otherMouseDown_) { + widget.otherMouseDown(id, sel, arg0); + } else if (sel is OS.sel_otherMouseUp_) { + widget.otherMouseUp(id, sel, arg0); + } else if (sel is OS.sel_mouseMoved_) { + widget.mouseMoved(id, sel, arg0); + } else if (sel is OS.sel_mouseDragged_) { + widget.mouseDragged(id, sel, arg0); + } else if (sel is OS.sel_mouseEntered_) { + widget.mouseEntered(id, sel, arg0); + } else if (sel is OS.sel_mouseExited_) { + widget.mouseExited(id, sel, arg0); + } else if (sel is OS.sel_menuForEvent_) { + return widget.menuForEvent(id, sel, arg0); + } else if (sel is OS.sel_numberOfRowsInTableView_) { + return cast(objc.id) widget.numberOfRowsInTableView(id, sel, arg0); + } else if (sel is OS.sel_comboBoxSelectionDidChange_) { + widget.comboBoxSelectionDidChange(id, sel, arg0); + } else if (sel is OS.sel_tableViewSelectionDidChange_) { + widget.tableViewSelectionDidChange(id, sel, arg0); + } else if (sel is OS.sel_windowDidResignKey_) { + widget.windowDidResignKey(id, sel, arg0); + } else if (sel is OS.sel_windowDidBecomeKey_) { + widget.windowDidBecomeKey(id, sel, arg0); + } else if (sel is OS.sel_windowDidResize_) { + widget.windowDidResize(id, sel, arg0); + } else if (sel is OS.sel_windowDidMove_) { + widget.windowDidMove(id, sel, arg0); + } else if (sel is OS.sel_menuWillOpen_) { + widget.menuWillOpen(id, sel, arg0); + } else if (sel is OS.sel_menuDidClose_) { + widget.menuDidClose(id, sel, arg0); + } else if (sel is OS.sel_menuNeedsUpdate_) { + widget.menuNeedsUpdate(id, sel, arg0); + } else if (sel is OS.sel_outlineViewSelectionDidChange_) { + widget.outlineViewSelectionDidChange(id, sel, arg0); + } else if (sel is OS.sel_outlineViewItemDidExpand_) { + widget.outlineViewItemDidExpand(id, sel, arg0); + } else if (sel is OS.sel_sendEvent_) { + widget.windowSendEvent(id, sel, arg0); + } else if (sel is OS.sel_helpRequested_) { + widget.helpRequested(id, sel, arg0); + } else if (sel is OS.sel_scrollWheel_) { + widget.scrollWheel(id, sel, arg0); + } else if (sel is OS.sel_pageDown_) { + widget.pageDown(id, sel, arg0); + } else if (sel is OS.sel_pageUp_) { + widget.pageUp(id, sel, arg0); + } else if (sel is OS.sel_textViewDidChangeSelection_) { + widget.textViewDidChangeSelection(id, sel, arg0); + } else if (sel is OS.sel_textDidChange_) { + widget.textDidChange(id, sel, arg0); + } else if (sel is OS.sel_attributedSubstringFromRange_) { + return widget.attributedSubstringFromRange (id, sel, arg0); + } else if (sel is OS.sel_characterIndexForPoint_) { + return cast(objc.id) widget.characterIndexForPoint (id, sel, arg0); + } else if (sel is OS.sel_firstRectForCharacterRange_) { + NSRect rect = widget.firstRectForCharacterRange (id, sel, arg0); + /* NOTE that this is freed in C */ + objc.id result = cast(objc.id) OS.malloc (NSRect.sizeof); + OS.memmove (result, &rect, NSRect.sizeof); + return result; + } else if (sel is OS.sel_insertText_) { + widget.insertText (id, sel, arg0); + } else if (sel is OS.sel_doCommandBySelector_) { + widget.doCommandBySelector (id, sel, cast(char*) arg0); + } else if (sel is OS.sel_highlightSelectionInClipRect_) { + widget.highlightSelectionInClipRect (id, sel, arg0); + } else if (sel is OS.sel_reflectScrolledClipView_) { + widget.reflectScrolledClipView (id, sel, arg0); + } else if (sel is OS.sel_accessibilityHitTest_) { + NSPoint point = NSPoint(); + OS.memmove(&point, arg0, NSPoint.sizeof); + return widget.accessibilityHitTest(id, sel, point); + } else if (sel is OS.sel_accessibilityAttributeValue_) { + return widget.accessibilityAttributeValue(id, sel, arg0); + } else if (sel is OS.sel_accessibilityIsAttributeSettable_) { + return (widget.accessibilityIsAttributeSettable(id, sel, arg0) ? cast(objc.id) 1 : null); + } else if (sel is OS.sel_accessibilityPerformAction_) { + widget.accessibilityPerformAction(id, sel, arg0); + } else if (sel is OS.sel_accessibilityActionDescription_) { + widget.accessibilityActionDescription(id, sel, arg0); + } else if (sel is OS.sel_makeFirstResponder_) { + return widget.makeFirstResponder(id, sel, arg0) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_tableViewColumnDidMove_) { + widget.tableViewColumnDidMove(id, sel, arg0); + } else if (sel is OS.sel_tableViewColumnDidResize_) { + widget.tableViewColumnDidResize(id, sel, arg0); + } else if (sel is OS.sel_outlineViewColumnDidMove_) { + widget.outlineViewColumnDidMove(id, sel, arg0); + } else if (sel is OS.sel_outlineViewColumnDidResize_) { + widget.outlineViewColumnDidResize(id, sel, arg0); + } + return null; } - return null; -} - -static objc.id windowDelegateProc4(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1) { - Widget widget = GetWidget(id); - if (widget is null) return null; - if (sel is OS.sel_tabView_willSelectTabViewItem_) { - widget.tabView_willSelectTabViewItem(id, sel, arg0, arg1); - } else if (sel is OS.sel_tabView_didSelectTabViewItem_) { - widget.tabView_didSelectTabViewItem(id, sel, arg0, arg1); - } else if (sel is OS.sel_outlineView_isItemExpandable_) { - return widget.outlineView_isItemExpandable(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_outlineView_numberOfChildrenOfItem_) { - return cast(objc.id) widget.outlineView_numberOfChildrenOfItem(id, sel, arg0, arg1); - } else if (sel is OS.sel_outlineView_shouldCollapseItem_) { - return widget.outlineView_shouldCollapseItem(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_outlineView_shouldExpandItem_) { - return widget.outlineView_shouldExpandItem(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_menu_willHighlightItem_) { - widget.menu_willHighlightItem(id, sel, arg0, arg1); - } else if (sel is OS.sel_setMarkedText_selectedRange_) { - widget.setMarkedText_selectedRange (id, sel, arg0, arg1); - } else if (sel is OS.sel_drawInteriorWithFrame_inView_) { - widget.drawInteriorWithFrame_inView (id, sel, arg0, arg1); - } else if (sel is OS.sel_accessibilityAttributeValue_forParameter_) { - return widget.accessibilityAttributeValue_forParameter(id, sel, arg0, arg1); - } else if (sel is OS.sel_tableView_didClickTableColumn_) { - widget.tableView_didClickTableColumn (id, sel, arg0, arg1); - } else if (sel is OS.sel_outlineView_didClickTableColumn_) { - widget.outlineView_didClickTableColumn (id, sel, arg0, arg1); + + static objc.id windowDelegateProc4(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1) { + Widget widget = GetWidget(id); + if (widget is null) return null; + if (sel is OS.sel_tabView_willSelectTabViewItem_) { + widget.tabView_willSelectTabViewItem(id, sel, arg0, arg1); + } else if (sel is OS.sel_tabView_didSelectTabViewItem_) { + widget.tabView_didSelectTabViewItem(id, sel, arg0, arg1); + } else if (sel is OS.sel_outlineView_isItemExpandable_) { + return widget.outlineView_isItemExpandable(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_outlineView_numberOfChildrenOfItem_) { + return cast(objc.id) widget.outlineView_numberOfChildrenOfItem(id, sel, arg0, arg1); + } else if (sel is OS.sel_outlineView_shouldCollapseItem_) { + return widget.outlineView_shouldCollapseItem(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_outlineView_shouldExpandItem_) { + return widget.outlineView_shouldExpandItem(id, sel, arg0, arg1) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_menu_willHighlightItem_) { + widget.menu_willHighlightItem(id, sel, arg0, arg1); + } else if (sel is OS.sel_setMarkedText_selectedRange_) { + widget.setMarkedText_selectedRange (id, sel, arg0, arg1); + } else if (sel is OS.sel_drawInteriorWithFrame_inView_) { + widget.drawInteriorWithFrame_inView (id, sel, arg0, arg1); + } else if (sel is OS.sel_accessibilityAttributeValue_forParameter_) { + return widget.accessibilityAttributeValue_forParameter(id, sel, arg0, arg1); + } else if (sel is OS.sel_tableView_didClickTableColumn_) { + widget.tableView_didClickTableColumn (id, sel, arg0, arg1); + } else if (sel is OS.sel_outlineView_didClickTableColumn_) { + widget.outlineView_didClickTableColumn (id, sel, arg0, arg1); + } + return null; } - return null; -} - -static objc.id windowDelegateProc5(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2) { - Widget widget = GetWidget(id); - if (widget is null) return null; - if (sel is OS.sel_tableView_objectValueForTableColumn_row_) { - return widget.tableView_objectValueForTableColumn_row(id, sel, arg0, arg1, arg2); - } else if (sel is OS.sel_tableView_shouldEditTableColumn_row_) { - return widget.tableView_shouldEditTableColumn_row(id, sel, arg0, arg1, arg2) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_textView_clickedOnLink_atIndex_) { - return widget.textView_clickOnLink_atIndex(id, sel, arg0, arg1, arg2) ? cast(objc.id) 1 : null; - } else if (sel is OS.sel_outlineView_child_ofItem_) { - return widget.outlineView_child_ofItem(id, sel, arg0, arg1, arg2); - } else if (sel is OS.sel_outlineView_objectValueForTableColumn_byItem_) { - return widget.outlineView_objectValueForTableColumn_byItem(id, sel, arg0, arg1, arg2); - } else if (sel is OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_) { - NSRange range = widget.textView_willChangeSelectionFromCharacterRange_toCharacterRange(id, sel, arg0, arg1, arg2); - /* NOTE that this is freed in C */ - objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); - OS.memmove (result, &range, NSRange.sizeof); - return result; + + static objc.id windowDelegateProc5(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2) { + Widget widget = GetWidget(id); + if (widget is null) return null; + if (sel is OS.sel_tableView_objectValueForTableColumn_row_) { + return widget.tableView_objectValueForTableColumn_row(id, sel, arg0, arg1, arg2); + } else if (sel is OS.sel_tableView_shouldEditTableColumn_row_) { + return widget.tableView_shouldEditTableColumn_row(id, sel, arg0, arg1, arg2) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_textView_clickedOnLink_atIndex_) { + return widget.textView_clickOnLink_atIndex(id, sel, arg0, arg1, arg2) ? cast(objc.id) 1 : null; + } else if (sel is OS.sel_outlineView_child_ofItem_) { + return widget.outlineView_child_ofItem(id, sel, arg0, arg1, arg2); + } else if (sel is OS.sel_outlineView_objectValueForTableColumn_byItem_) { + return widget.outlineView_objectValueForTableColumn_byItem(id, sel, arg0, arg1, arg2); + } else if (sel is OS.sel_textView_willChangeSelectionFromCharacterRange_toCharacterRange_) { + NSRange range = widget.textView_willChangeSelectionFromCharacterRange_toCharacterRange(id, sel, arg0, arg1, arg2); + /* NOTE that this is freed in C */ + objc.id result = cast(objc.id) OS.malloc (NSRange.sizeof); + OS.memmove (result, &range, NSRange.sizeof); + return result; + } + return null; } - return null; -} - -static objc.id windowDelegateProc6(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2, objc.id arg3) { - Widget widget = GetWidget(id); - if (widget is null) return null; - if (sel is OS.sel_tableView_willDisplayCell_forTableColumn_row_) { - widget.tableView_willDisplayCell_forTableColumn_row(id, sel, arg0, arg1, arg2, arg3); - } else if (sel is OS.sel_outlineView_willDisplayCell_forTableColumn_item_) { - widget.outlineView_willDisplayCell_forTableColumn_item(id, sel, arg0, arg1, arg2, arg3); - } else if (sel is OS.sel_outlineView_setObjectValue_forTableColumn_byItem_) { - widget.outlineView_setObjectValue_forTableColumn_byItem(id, sel, arg0, arg1, arg2, arg3); - } else if (sel is OS.sel_tableView_setObjectValue_forTableColumn_row_) { - widget.tableView_setObjectValue_forTableColumn_row(id, sel, arg0, arg1, arg2, arg3); + + static objc.id windowDelegateProc6(objc.id id, objc.SEL sel, objc.id arg0, objc.id arg1, objc.id arg2, objc.id arg3) { + Widget widget = GetWidget(id); + if (widget is null) return null; + if (sel is OS.sel_tableView_willDisplayCell_forTableColumn_row_) { + widget.tableView_willDisplayCell_forTableColumn_row(id, sel, arg0, arg1, arg2, arg3); + } else if (sel is OS.sel_outlineView_willDisplayCell_forTableColumn_item_) { + widget.outlineView_willDisplayCell_forTableColumn_item(id, sel, arg0, arg1, arg2, arg3); + } else if (sel is OS.sel_outlineView_setObjectValue_forTableColumn_byItem_) { + widget.outlineView_setObjectValue_forTableColumn_byItem(id, sel, arg0, arg1, arg2, arg3); + } else if (sel is OS.sel_tableView_setObjectValue_forTableColumn_row_) { + widget.tableView_setObjectValue_forTableColumn_row(id, sel, arg0, arg1, arg2, arg3); + } + return null; } - return null; -} -} + } diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/FontDialog.d --- a/dwt/widgets/FontDialog.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/FontDialog.d Tue Dec 23 00:35:24 2008 +0100 @@ -29,6 +29,7 @@ import dwt.dwthelper.utils; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Dialog; import dwt.widgets.Display; import dwt.widgets.Shell; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/IME.d --- a/dwt/widgets/IME.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/IME.d Tue Dec 23 00:35:24 2008 +0100 @@ -35,6 +35,7 @@ import dwt.dwthelper.utils; import dwt.internal.c.Carbon; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Canvas; import dwt.widgets.Caret; import dwt.widgets.Event; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Menu.d --- a/dwt/widgets/Menu.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Menu.d Tue Dec 23 00:35:24 2008 +0100 @@ -33,6 +33,7 @@ import dwt.dwthelper.System; import dwt.dwthelper.utils; import dwt.internal.objc.cocoa.Cocoa; +import objc = dwt.internal.objc.runtime; import dwt.widgets.TypedListener; import dwt.widgets.Event; import dwt.widgets.MenuItem; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/ScrollBar.d --- a/dwt/widgets/ScrollBar.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/ScrollBar.d Tue Dec 23 00:35:24 2008 +0100 @@ -26,6 +26,7 @@ import dwt.dwthelper.utils; import Carbon = dwt.internal.c.Carbon; +import objc = dwt.internal.objc.runtime; import dwt.internal.cocoa.NSScroller; import dwt.widgets.Event; import dwt.widgets.Scrollable; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Scrollable.d --- a/dwt/widgets/Scrollable.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Scrollable.d Tue Dec 23 00:35:24 2008 +0100 @@ -26,6 +26,7 @@ import dwt.internal.cocoa.SWTScroller; import dwt.dwthelper.utils; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Composite; import dwt.widgets.Control; import dwt.widgets.Display; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/TrayItem.d --- a/dwt/widgets/TrayItem.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/TrayItem.d Tue Dec 23 00:35:24 2008 +0100 @@ -34,6 +34,7 @@ import dwt.dwthelper.utils; import dwt.internal.cocoa.NSView; +import objc = dwt.internal.objc.runtime; import dwt.widgets.Item; import dwt.widgets.ToolTip; import dwt.widgets.Tray; diff -r 62202ce0039f -r c74ba20de292 dwt/widgets/Widget.d --- a/dwt/widgets/Widget.d Mon Dec 22 15:10:19 2008 +0100 +++ b/dwt/widgets/Widget.d Tue Dec 23 00:35:24 2008 +0100 @@ -1308,11 +1308,11 @@ if ((modifierFlags & OS.NSControlKeyMask) !is 0) event.stateMask |= DWT.CONTROL; if ((modifierFlags & OS.NSCommandKeyMask) !is 0) event.stateMask |= DWT.COMMAND; //TODO multiple mouse buttons pressed - switch (cast(int)/*64*/nsEvent.type()) { + switch (nsEvent.type()) { case OS.NSLeftMouseDragged: case OS.NSRightMouseDragged: case OS.NSOtherMouseDragged: - switch (cast(int)/*64*/nsEvent.buttonNumber()) { + switch (nsEvent.buttonNumber()) { case 0: event.stateMask |= DWT.BUTTON1; break; case 1: event.stateMask |= DWT.BUTTON3; break; case 2: event.stateMask |= DWT.BUTTON2; break; @@ -1330,6 +1330,7 @@ if ((state & 0x8) !is 0) event.stateMask |= DWT.BUTTON4; if ((state & 0x10) !is 0) event.stateMask |= DWT.BUTTON5; break; + default: } switch (type) { case DWT.MouseDown: @@ -1360,6 +1361,7 @@ if (event.keyCode is DWT.CONTROL) event.stateMask |= DWT.CONTROL; if (event.keyCode is DWT.COMMAND) event.stateMask |= DWT.COMMAND; break; + default: } return true; }