changeset 61:c74ba20de292

Fix: The application responds to events now
author Jacob Carlborg <doob@me.com>
date Tue, 23 Dec 2008 00:35:24 +0100
parents 62202ce0039f
children 10eaa644646f
files dwt/DWT.d dwt/accessibility/Accessible.d dwt/accessibility/SWTAccessibleDelegate.d dwt/dwthelper/FileInputStream.d dwt/dwthelper/ResourceBundle.d dwt/dwthelper/System.d dwt/dwthelper/utils.d dwt/graphics/Device.d dwt/graphics/Region.d dwt/internal/cocoa/NSBundle.d dwt/internal/cocoa/NSEvent.d dwt/internal/cocoa/OS.d dwt/widgets/Canvas.d dwt/widgets/ColorDialog.d dwt/widgets/Composite.d dwt/widgets/Control.d dwt/widgets/Display.d dwt/widgets/FontDialog.d dwt/widgets/IME.d dwt/widgets/Menu.d dwt/widgets/ScrollBar.d dwt/widgets/Scrollable.d dwt/widgets/TrayItem.d dwt/widgets/Widget.d
diffstat 24 files changed, 3787 insertions(+), 3723 deletions(-) [+]
line wrap: on
line diff
--- 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) */
--- 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;
--- 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) {
--- 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;
--- 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;
--- 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;
 }
--- 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 ){
--- 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;
 
--- 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
--- 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;
--- 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() {
--- 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;
--- 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;
--- 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;
--- 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;
--- 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;
 }
--- 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; i<length; i++) {
+         buffer [i] = cast(byte) chars [i];
+         }
+         return buffer;*/
+        return name.toStringz();
+    }
+    
+    static int translateKey (int key) {
+        for (int i=0; i<KeyTable.length; i++) {
+            if (KeyTable [i] [0] is key) return KeyTable [i] [1];
+        }
+        return 0;
+    }
+    
+    static int untranslateKey (int key) {
+        for (int i=0; i<KeyTable.length; i++) {
+            if (KeyTable [i] [1] is key) return KeyTable [i] [0];
+        }
+        return 0;
+    }
+    
+    void addContext (NSGraphicsContext context) {
+        if (contexts is null) contexts = new NSGraphicsContext [12];
+        for (int i=0; i<contexts.length; i++) {
+            if (contexts[i] !is null && contexts [i].id is context.id) {
+                contexts [i] = context;
+                return;
+            }
+        }
+        NSGraphicsContext [] newContexts = new NSGraphicsContext [contexts.length + 12];
+        newContexts [contexts.length] = context;
+        System.arraycopy (contexts, 0, newContexts, 0, contexts.length);
+        contexts = newContexts;
+    }
+    
+    /**
+     * Adds the listener to 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 <code>DWT</code>. When the event does occur,
+     * the listener is notified by sending it the <code>handleEvent()</code>
+     * message.
+     * <p>
+     * Setting the type of an event to <code>DWT.None</code> from
+     * within the <code>handleEvent()</code> 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.
+     * </p>
+     * 
+     * @param eventType the type of event to listen for
+     * @param listener the listener which should be notified when the event occurs
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <code>DWT</code>.
+     * When the event does occur in the display, the listener is notified by
+     * sending it the <code>handleEvent()</code> message.
+     *
+     * @param eventType the type of event to listen for
+     * @param listener the listener which should be notified when the event occurs
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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; i<menus.length; i++) {
+            if (menus [i] is null) {
+                menus [i] = menu;
+                return;
+            }
+        }
+        Menu [] newMenus = new Menu [menus.length + 12];
+        newMenus [menus.length] = menu;
+        System.arraycopy (menus, 0, newMenus, 0, menus.length);
+        menus = newMenus;
+    }
+    
+    void addPopup (Menu menu) {
+        if (popups is null) popups = new Menu [4];
+        int length = popups.length;
+        for (int i=0; i<length; i++) {
+            if (popups [i] is menu) return;
+        }
+        int index = 0;
+        while (index < length) {
+            if (popups [index] is null) break;
+            index++;
+        }
+        if (index is length) {
+            Menu [] newPopups = new Menu [length + 4];
+            System.arraycopy (popups, 0, newPopups, 0, length);
+            popups = newPopups;
+        }
+        popups [index] = menu;
+    }
+    
+    void addWidget (NSObject view, Widget widget) {
+        if (view is null) return;
+        OS.object_setInstanceVariable (view.id, SWT_OBJECT, widget.jniRef);
+    }
+    
+    /**
+     * Causes the <code>run()</code> 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 <code>null</code> as the
+     * runnable simply wakes the user-interface thread when run.
+     * <p>
+     * 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.
+     * </p>
+     *
+     * @param runnable code to run on the user-interface thread or <code>null</code>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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.
+     * <p>
+     * IMPORTANT: See the comment in <code>Widget.checkSubclass()</code>.
+     * </p>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
+     * </ul>
+     *
+     * @see Widget#checkSubclass
+     */
+    protected void checkSubclass () {
+        if (!Display.isValidClass (this.classinfo)) error (DWT.ERROR_INVALID_SUBCLASS);
+    }
+    
+    /**
+     * Constructs a new instance of this class.
+     * <p>
+     * Note: The resulting display is marked as the <em>current</em>
+     * display. If this is the first display which has been 
+     * constructed since the application started, it is also
+     * marked as the <em>default</em> display.
+     * </p>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if called from a thread that already created an existing display</li>
+     *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
+     * </ul>
+     *
+     * @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; i<length; i++) {
-        buffer [i] = cast(byte) chars [i];
-    }
-    return buffer;*/
-    return name.toStringz();
-}
-
-static int translateKey (int key) {
-    for (int i=0; i<KeyTable.length; i++) {
-        if (KeyTable [i] [0] is key) return KeyTable [i] [1];
-    }
-    return 0;
-}
-
-static int untranslateKey (int key) {
-    for (int i=0; i<KeyTable.length; i++) {
-        if (KeyTable [i] [1] is key) return KeyTable [i] [0];
-    }
-    return 0;
-}
-
-void addContext (NSGraphicsContext context) {
-    if (contexts is null) contexts = new NSGraphicsContext [12];
-    for (int i=0; i<contexts.length; i++) {
-        if (contexts[i] !is null && contexts [i].id is context.id) {
-            contexts [i] = context;
-            return;
-        }
-    }
-    NSGraphicsContext [] newContexts = new NSGraphicsContext [contexts.length + 12];
-    newContexts [contexts.length] = context;
-    System.arraycopy (contexts, 0, newContexts, 0, contexts.length);
-    contexts = newContexts;
-}
-
-/**
- * Adds the listener to 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 <code>DWT</code>. When the event does occur,
- * the listener is notified by sending it the <code>handleEvent()</code>
- * message.
- * <p>
- * Setting the type of an event to <code>DWT.None</code> from
- * within the <code>handleEvent()</code> 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.
- * </p>
- * 
- * @param eventType the type of event to listen for
- * @param listener the listener which should be notified when the event occurs
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>DWT</code>.
- * When the event does occur in the display, the listener is notified by
- * sending it the <code>handleEvent()</code> message.
- *
- * @param eventType the type of event to listen for
- * @param listener the listener which should be notified when the event occurs
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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; i<menus.length; i++) {
-        if (menus [i] is null) {
-            menus [i] = menu;
-            return;
+    static void checkDisplay (Thread thread, bool multiple) {
+        synchronized (Device.classinfo) {
+            for (int i=0; i<Displays.length; i++) {
+                if (Displays [i] !is null) {
+                    if (!multiple) DWT.error (DWT.ERROR_NOT_IMPLEMENTED, null, " [multiple displays]");
+                    if (Displays [i].thread is thread) DWT.error (DWT.ERROR_THREAD_INVALID_ACCESS);
+                }
+            }
         }
     }
-    Menu [] newMenus = new Menu [menus.length + 12];
-    newMenus [menus.length] = menu;
-    System.arraycopy (menus, 0, newMenus, 0, menus.length);
-    menus = newMenus;
-}
-
-void addPopup (Menu menu) {
-    if (popups is null) popups = new Menu [4];
-    int length = popups.length;
-    for (int i=0; i<length; i++) {
-        if (popups [i] is menu) return;
-    }
-    int index = 0;
-    while (index < length) {
-        if (popups [index] is null) break;
-        index++;
-    }
-    if (index is length) {
-        Menu [] newPopups = new Menu [length + 4];
-        System.arraycopy (popups, 0, newPopups, 0, length);
-        popups = newPopups;
+    
+    static String convertToLf(String text) {
+        char Cr = '\r';
+        char Lf = '\n';
+        int length = text.length ();
+        if (length is 0) return text;
+        
+        /* Check for an LF or CR/LF.  Assume the rest of the string 
+         * is formated that way.  This will not work if the string 
+         * contains mixed delimiters. */
+        int i = text.indexOf (Lf, 0);
+        if (i is -1 || i is 0) return text;
+        if (text.charAt (i - 1) !is Cr) return text;
+        
+        /* The string is formatted with CR/LF.
+         * Create a new string with the LF line delimiter. */
+        i = 0;
+        StringBuffer result = new StringBuffer ();
+        while (i < length) {
+            int j = text.indexOf (Cr, i);
+            if (j is -1) j = length;
+            String s = text.substring (i, j);
+            result.append (s);
+            i = j + 2;
+            result.append (Lf);
+        }
+        return result.toString ();
     }
-    popups [index] = menu;
-}
-
-void addWidget (NSObject view, Widget widget) {
-    if (view is null) return;
-    OS.object_setInstanceVariable (view.id, SWT_OBJECT, widget.jniRef);
-}
-
-/**
- * Causes the <code>run()</code> 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 <code>null</code> as the
- * runnable simply wakes the user-interface thread when run.
- * <p>
- * 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.
- * </p>
- *
- * @param runnable code to run on the user-interface thread or <code>null</code>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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<shells.length; i++) shells [i].updateModal ();
     }
-}
-
-/**
- * Causes the system hardware to emit a short sound
- * (if it supports this capability).
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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.
- * <p>
- * IMPORTANT: See the comment in <code>Widget.checkSubclass()</code>.
- * </p>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @see Widget#checkSubclass
- */
-protected void checkSubclass () {
-    if (!Display.isValidClass (this.classinfo)) error (DWT.ERROR_INVALID_SUBCLASS);
-}
-
-/**
- * Constructs a new instance of this class.
- * <p>
- * Note: The resulting display is marked as the <em>current</em>
- * display. If this is the first display which has been 
- * constructed since the application started, it is also
- * marked as the <em>default</em> display.
- * </p>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if called from a thread that already created an existing display</li>
- *    <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
- * </ul>
- *
- * @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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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.
+     * <p>
+     * This method is called before <code>init</code>.
+     * </p>
+     *
+     * @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<Displays.length; i++) {
-            if (Displays [i] !is null) {
-                if (!multiple) DWT.error (DWT.ERROR_NOT_IMPLEMENTED, null, " [multiple displays]");
-                if (Displays [i].thread is thread) DWT.error (DWT.ERROR_THREAD_INVALID_ACCESS);
+        //  application = new NSApplication(OS.objc_msgSend(cls, OS.sel_sharedApplication));
+    }
+    
+    static void deregister (Display display) {
+        synchronized (Device.classinfo) {
+            for (int i=0; i<Displays.length; i++) {
+                if (display is Displays [i]) Displays [i] = null;
             }
         }
     }
-}
-
-static String convertToLf(String text) {
-    char Cr = '\r';
-    char Lf = '\n';
-    int length = text.length ();
-    if (length is 0) return text;
     
-    /* Check for an LF or CR/LF.  Assume the rest of the string 
-     * is formated that way.  This will not work if the string 
-     * contains mixed delimiters. */
-    int i = text.indexOf (Lf, 0);
-    if (i is -1 || i is 0) return text;
-    if (text.charAt (i - 1) !is Cr) return text;
-
-    /* The string is formatted with CR/LF.
-     * Create a new string with the LF line delimiter. */
-    i = 0;
-    StringBuffer result = new StringBuffer ();
-    while (i < length) {
-        int j = text.indexOf (Cr, i);
-        if (j is -1) j = length;
-        String s = text.substring (i, j);
-        result.append (s);
-        i = j + 2;
-        result.append (Lf);
+    /**
+     * Destroys the device in the operating system and releases
+     * the device's handle.  If the device does not have a handle,
+     * this method may do nothing depending on the device.
+     * <p>
+     * This method is called after <code>release</code>.
+     * </p>
+     * @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<shells.length; i++) shells [i].updateModal ();
-}
-
-/**
- * Requests that the connection between DWT and the underlying
- * operating system be closed.
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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.
- * <p>
- * This method is called before <code>init</code>.
- * </p>
- *
- * @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 <code>run()</code> method of the runnable to
+     * be invoked by the user-interface thread just before the
+     * receiver is disposed.  Specifying a <code>null</code> runnable
+     * is ignored.
+     *
+     * @param runnable code to run at dispose time.
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
      */
-    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<disposeList.length; i++) {
+            if (disposeList [i] is null) {
+                disposeList [i] = runnable;
+                return;
             }
         }
-
-        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_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;
+        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; i<Displays.length; i++) {
-            if (display is Displays [i]) Displays [i] = null;
-        }
+    /**
+     * Given the operating system handle for a widget, returns
+     * the instance of the <code>Widget</code> subclass which
+     * represents it in the currently running application, if
+     * such exists, or null if no matching widget can be found.
+     * <p>
+     * <b>IMPORTANT:</b> This method should not be called from
+     * application code. The arguments are platform-specific.
+     * </p>
+     *
+     * @param handle the handle for the widget
+     * @return the DWT widget that the handle represents
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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.
- * <p>
- * This method is called after <code>release</code>.
- * </p>
- * @see Device#dispose
- * @see #release
- */
-protected void destroy () {
-    if (this is Default) Default = null;
-    deregister (this);
-    destroyDisplay ();
-}
-
-void destroyDisplay () {
-    application = null;
-}
-
-/**
- * Causes the <code>run()</code> method of the runnable to
- * be invoked by the user-interface thread just before the
- * receiver is disposed.  Specifying a <code>null</code> runnable
- * is ignored.
- *
- * @param runnable code to run at dispose time.
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-public void disposeExec (Runnable runnable) {
-    checkDevice ();
-    if (disposeList is null) disposeList = new Runnable [4];
-    for (int i=0; i<disposeList.length; i++) {
-        if (disposeList [i] is null) {
-            disposeList [i] = runnable;
-            return;
+    
+    /**
+     * Given the operating system handle for a widget,
+     * and widget-specific id, returns the instance of
+     * the <code>Widget</code> subclass which represents
+     * the handle/id pair in the currently running application,
+     * if such exists, or null if no matching widget can be found.
+     * <p>
+     * <b>IMPORTANT:</b> This method should not be called from
+     * application code. The arguments are platform-specific.
+     * </p>
+     *
+     * @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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <code>Widget</code> 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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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
+     * <code>null</code> as the thread will return <code>null</code>
+     * 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; i<Displays.length; i++) {
+                Display display = Displays [i];
+                if (display !is null && display.thread is thread) {
+                    return display;
+                }
+            }
+            return null;
         }
     }
-    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);
-}
-
-/**
- * Given the operating system handle for a widget, returns
- * the instance of the <code>Widget</code> subclass which
- * represents it in the currently running application, if
- * such exists, or null if no matching widget can be found.
- * <p>
- * <b>IMPORTANT:</b> This method should not be called from
- * application code. The arguments are platform-specific.
- * </p>
- *
- * @param handle the handle for the widget
- * @return the DWT widget that the handle represents
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <code>Widget</code> subclass which represents
- * the handle/id pair in the currently running application,
- * if such exists, or null if no matching widget can be found.
- * <p>
- * <b>IMPORTANT:</b> This method should not be called from
- * application code. The arguments are platform-specific.
- * </p>
- *
- * @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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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 <code>Widget</code> 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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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
- * <code>null</code> as the thread will return <code>null</code>
- * 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; i<Displays.length; i++) {
-            Display display = Displays [i];
-            if (display !is null && display.thread is thread) {
-                return display;
+    
+    /**
+     * Returns the currently active <code>Shell</code>, or null
+     * if no shell belonging to the currently running application
+     * is active.
+     *
+     * @return the active shell or null
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <code>Shell</code>, or null
- * if no shell belonging to the currently running application
- * is active.
- *
- * @return the active shell or null
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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.
+     * <p>
+     * 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
+     * <code>disposeExec()</code> handler which does so.
+     * </p>
+     *
+     * @param key the name of the property
+     * @return the value of the property or null if it has not been set
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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<keys.length; i++) {
+            if (keys [i].equals (key)) return values [i];
+        }
+        return null;
     }
-    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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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 <em>display specific data</em> is a single,
+     * unnamed field that is stored with every display. 
+     * <p>
+     * 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
+     * <code>disposeExec()</code> handler which does so.
+     * </p>
+     *
+     * @return the display specific data
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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.
- * <p>
- * 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
- * <code>disposeExec()</code> handler which does so.
- * </p>
- *
- * @param key the name of the property
- * @return the value of the property or null if it has not been set
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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<keys.length; i++) {
-        if (keys [i].equals (key)) return values [i];
+    
+    /**
+     * Returns the button dismissal align_ment, one of <code>LEFT</code> or <code>RIGHT</code>.
+     * 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 <code>LEFT</code>, the
+     * button ordering should be OK/CANCEL.  When button dismissal align_ment is <code>RIGHT</code>,
+     * the button ordering should be CANCEL/OK.
+     *
+     * @return the button dismissal order
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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
+     * <em>double click</em> by the underlying operating system.
+     *
+     * @return the double click time
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <em>display specific data</em> is a single,
- * unnamed field that is stored with every display. 
- * <p>
- * 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
- * <code>disposeExec()</code> handler which does so.
- * </p>
- *
- * @return the display specific data
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @see #setData(Object)
- * @see #disposeExec(Runnable)
- */
-public Object getData () {
-    checkDevice ();
-    return data;
-}
-
-/**
- * Returns the button dismissal align_ment, one of <code>LEFT</code> or <code>RIGHT</code>.
- * 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 <code>LEFT</code>, the
- * button ordering should be OK/CANCEL.  When button dismissal align_ment is <code>RIGHT</code>,
- * the button ordering should be CANCEL/OK.
- *
- * @return the button dismissal order
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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
- * <em>double click</em> by the underlying operating system.
- *
- * @return the double click time
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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.
+     * <p>
+     * Note: This operation is a hint and is not supported on
+     * platforms that do not have this concept.
+     * </p>
+     *
+     * @return the high contrast mode
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @see Device#getDepth
+     */
+    public int getIconDepth () {
+        return getDepth ();
+    }
+    
+    /**
+     * Returns an array containing the recommended icon sizes.
+     *
+     * @return the array of icon sizes
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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.
- * <p>
- * Note: This operation is a hint and is not supported on
- * platforms that do not have this concept.
- * </p>
- *
- * @return the high contrast mode
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @see Device#getDepth
- */
-public int getIconDepth () {
-    return getDepth ();
-}
-
-/**
- * Returns an array containing the recommended icon sizes.
- *
- * @return the array of icon sizes
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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<count; i++) {
+            dwt.widgets.Monitor.Monitor monitor = new dwt.widgets.Monitor.Monitor ();
+            NSScreen screen = new NSScreen(screens.objectAtIndex(i));
+            NSRect frame = screen.frame();
+            monitor.x = cast(int)frame.x;
+            monitor.y = cast(int)(primaryFrame.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)(primaryFrame.height - (visibleFrame.y + visibleFrame.height));
+            monitor.clientWidth = cast(int)visibleFrame.width;
+            monitor.clientHeight = cast(int)visibleFrame.height;
+            monitors [i] = monitor;
         }
+        return monitors;
     }
-    return result;
-}
-
-int getMessageCount () {
-    return synchronizer.getMessageCount ();
-}
-
-/**
- * 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<count; i++) {
+    
+    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 ();
-        NSScreen screen = new NSScreen(screens.objectAtIndex(i));
+        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)(primaryFrame.height - (frame.y + frame.height));
+        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)(primaryFrame.height - (visibleFrame.y + visibleFrame.height));
+        monitor.clientY = cast(int)(frame.height - (visibleFrame.y + visibleFrame.height));
         monitor.clientWidth = cast(int)visibleFrame.width;
         monitor.clientHeight = cast(int)visibleFrame.height;
-        monitors [i] = monitor;
+        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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @since 3.4
+     */
+    public Synchronizer getSynchronizer () {
+        checkDevice ();
+        return synchronizer;
+    }
+    
+    /**
+     * Returns the thread that has invoked <code>syncExec</code>
+     * or null if no such runnable is currently being invoked by
+     * the user-interface thread.
+     * <p>
+     * Note: If a runnable invoked by asyncExec is currently
+     * running, this method will return null.
+     * </p>
+     *
+     * @return the receiver's sync-interface thread
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @since 3.4
- */
-public Synchronizer getSynchronizer () {
-    checkDevice ();
-    return synchronizer;
-}
-
-/**
- * Returns the thread that has invoked <code>syncExec</code>
- * or null if no such runnable is currently being invoked by
- * the user-interface thread.
- * <p>
- * Note: If a runnable invoked by asyncExec is currently
- * running, this method will return null.
- * </p>
- *
- * @return the receiver's sync-interface thread
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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 <code>DWT</code>. 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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>DWT</code>. 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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <code>DWT</code>. This cursor should
- * not be free'd because it was allocated by the system,
- * not the application.  A value of <code>null</code> will
- * be returned if the supplied constant is not an DWT cursor
- * constant. 
- *
- * @param id the DWT cursor constant
- * @return the corresponding cursor or <code>null</code>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>DWT</code>. This cursor should
+     * not be free'd because it was allocated by the system,
+     * not the application.  A value of <code>null</code> will
+     * be returned if the supplied constant is not an DWT cursor
+     * constant. 
+     *
+     * @param id the DWT cursor constant
+     * @return the corresponding cursor or <code>null</code>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <code>DWT</code>. This image should
- * not be free'd because it was allocated by the system,
- * not the application.  A value of <code>null</code> 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 <code>null</code>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>DWT</code>. This image should
+     * not be free'd because it was allocated by the system,
+     * not the application.  A value of <code>null</code> 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 <code>null</code>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <code>null</code>
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     */
+    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 <code>null</code>
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- */
-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.
- * <p>
- * This method is called after <code>create</code>.
- * </p>
- * 
- * @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.
+     * <p>
+     * This method is called after <code>create</code>.
+     * </p>
+     * 
+     * @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.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Display</code>. 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.
- * </p>
- *
- * @param data the platform specific GC data 
- * @return the platform specific GC handle
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * @exception DWTError <ul>
- *    <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li>
- * </ul>
- */
-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.
- * <p>
- * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
- * API for <code>Display</code>. 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.
- * </p>
- *
- * @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.
- * 
- * <code>post</code> 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.
- * <p>
- * 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.
- * </p>
- * <p>
- * <b>Event Types:</b>
- * <p>KeyDown, KeyUp
- * <p>The following fields in the <code>Event</code> apply:
- * <ul>
- * <li>(in) type KeyDown or KeyUp</li>
- * <p> Either one of:
- * <li>(in) character a character that corresponds to a keyboard key</li>
- * <li>(in) keyCode the key code of the key that was typed,
- *          as defined by the key code constants in class <code>DWT</code></li>
- * </ul>
- * <p>MouseDown, MouseUp</p>
- * <p>The following fields in the <code>Event</code> apply:
- * <ul>
- * <li>(in) type MouseDown or MouseUp
- * <li>(in) button the button that is pressed or released
- * </ul>
- * <p>MouseMove</p>
- * <p>The following fields in the <code>Event</code> apply:
- * <ul>
- * <li>(in) type MouseMove
- * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates
- * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates
- * </ul>
- * </dl>
- * 
- * @param event the event to be generated
- * 
- * @return true if the event was generated or false otherwise
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the event is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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.
+     * <p>
+     * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
+     * API for <code>Display</code>. 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.
+     * </p>
+     *
+     * @param data the platform specific GC data 
+     * @return the platform specific GC handle
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * @exception DWTError <ul>
+     *    <li>ERROR_NO_HANDLES if a handle could not be obtained for gc creation</li>
+     * </ul>
+     */
+    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.
+     * <p>
+     * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
+     * API for <code>Display</code>. 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.
+     * </p>
+     *
+     * @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.
- * <p>
- * 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.
- * </p>
- * 
- * @param from the source <code>Control</code> or <code>null</code>
- * @param to the destination <code>Control</code> or <code>null</code>
- * @param point to be mapped 
- * @return point with mapped coordinates 
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the point is null</li>
- *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.
- * <p>
- * 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.
- * </p>
- * 
- * @param from the source <code>Control</code> or <code>null</code>
- * @param to the destination <code>Control</code> or <code>null</code>
- * @param x coordinates to be mapped
- * @param y coordinates to be mapped
- * @return point with mapped coordinates
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.
+     * 
+     * <code>post</code> 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.
+     * <p>
+     * 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.
+     * </p>
+     * <p>
+     * <b>Event Types:</b>
+     * <p>KeyDown, KeyUp
+     * <p>The following fields in the <code>Event</code> apply:
+     * <ul>
+     * <li>(in) type KeyDown or KeyUp</li>
+     * <p> Either one of:
+     * <li>(in) character a character that corresponds to a keyboard key</li>
+     * <li>(in) keyCode the key code of the key that was typed,
+     *          as defined by the key code constants in class <code>DWT</code></li>
+     * </ul>
+     * <p>MouseDown, MouseUp</p>
+     * <p>The following fields in the <code>Event</code> apply:
+     * <ul>
+     * <li>(in) type MouseDown or MouseUp
+     * <li>(in) button the button that is pressed or released
+     * </ul>
+     * <p>MouseMove</p>
+     * <p>The following fields in the <code>Event</code> apply:
+     * <ul>
+     * <li>(in) type MouseMove
+     * <li>(in) x the x coordinate to move the mouse pointer to in screen coordinates
+     * <li>(in) y the y coordinate to move the mouse pointer to in screen coordinates
+     * </ul>
+     * </dl>
+     * 
+     * @param event the event to be generated
+     * 
+     * @return true if the event was generated or false otherwise
+     * 
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the event is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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.
- * <p>
- * 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.
- * </p>
- * 
- * @param from the source <code>Control</code> or <code>null</code>
- * @param to the destination <code>Control</code> or <code>null</code>
- * @param rectangle to be mapped
- * @return rectangle with mapped coordinates
- * 
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li>
- *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.
- * <p>
- * 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.
- * </p>
- * 
- * @param from the source <code>Control</code> or <code>null</code>
- * @param to the destination <code>Control</code> or <code>null</code>
- * @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 <ul>
- *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param from the source <code>Control</code> or <code>null</code>
+     * @param to the destination <code>Control</code> or <code>null</code>
+     * @param point to be mapped 
+     * @return point with mapped coordinates 
+     * 
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the point is null</li>
+     *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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.
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param from the source <code>Control</code> or <code>null</code>
+     * @param to the destination <code>Control</code> or <code>null</code>
+     * @param x coordinates to be mapped
+     * @param y coordinates to be mapped
+     * @return point with mapped coordinates
+     * 
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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.
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param from the source <code>Control</code> or <code>null</code>
+     * @param to the destination <code>Control</code> or <code>null</code>
+     * @param rectangle to be mapped
+     * @return rectangle with mapped coordinates
+     * 
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the rectangle is null</li>
+     *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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.
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param from the source <code>Control</code> or <code>null</code>
+     * @param to the destination <code>Control</code> or <code>null</code>
+     * @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 <ul>
+     *    <li>ERROR_INVALID_ARGUMENT - if the Control from or the Control to have been disposed</li> 
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <code>true</code>
+     * if there is potentially more work to do, or <code>false</code>
+     * if the caller can sleep until another event is placed on
+     * the event queue.
+     * <p>
+     * In addition to checking the system event queue, this method also
+     * checks if any inter-thread messages (created by <code>syncExec()</code>
+     * or <code>asyncExec()</code>) are waiting to be processed, and if
+     * so handles them before returning.
+     * </p>
+     *
+     * @return <code>false</code> if the caller can sleep upon return from this method
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
+     * </ul>
+     *
+     * @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; i<Displays.length; i++) {
+                if (Displays [i] is null) {
+                    Displays [i] = display;
+                    return;
+                }
+            }
+            Display [] newDisplays = new Display [Displays.length + 4];
+            System.arraycopy (Displays, 0, newDisplays, 0, Displays.length);
+            newDisplays [Displays.length] = display;
+            Displays = newDisplays;
         }
     }
-    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 <code>true</code>
- * if there is potentially more work to do, or <code>false</code>
- * if the caller can sleep until another event is placed on
- * the event queue.
- * <p>
- * In addition to checking the system event queue, this method also
- * checks if any inter-thread messages (created by <code>syncExec()</code>
- * or <code>asyncExec()</code>) are waiting to be processed, and if
- * so handles them before returning.
- * </p>
- *
- * @return <code>false</code> if the caller can sleep upon return from this method
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
- * </ul>
- *
- * @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.
+     * <p>
+     * Disposes all shells which are currently open on the display. 
+     * After this method has been invoked, all related related shells
+     * will answer <code>true</code> when sent the message
+     * <code>isDisposed()</code>.
+     * </p><p>
+     * When a device is destroyed, resources that were acquired
+     * on behalf of the programmer need to be returned to the
+     * operating system.  For example, if the device allocated a
+     * font to be used as the system font, this font would be
+     * freed in <code>release</code>.  Also,to assist the garbage
+     * collector and minimize the amount of memory that is not
+     * reclaimed when the programmer keeps a reference to a
+     * disposed device, all fields except the handle are zero'd.
+     * The handle is needed by <code>destroy</code>.
+     * </p>
+     * This method is called before <code>destroy</code>.
+     * 
+     * @see Device#dispose
+     * @see #destroy
+     */
+    protected void release () {
+        disposing = true;
+        sendEvent (DWT.Dispose, new Event ());
+        Shell [] shells = getShells ();
+        for (int i=0; i<shells.length; i++) {
+            Shell shell = shells [i];
+            if (!shell.isDisposed ()) shell.dispose ();
         }
-        return runAsyncMessages (false);
-    } finally {
-        loopCounter --;
+        if (tray !is null) tray.dispose ();
+        tray = null;
+        while (readAndDispatch ()) {}
+        if (disposeList !is null) {
+            for (int i=0; i<disposeList.length; i++) {
+                if (disposeList [i] !is null) disposeList [i].run ();
+            }
+        }
+        disposeList = null;
+        synchronizer.releaseSynchronizer ();
+        synchronizer = null;
+        releaseDisplay ();
+        super.release ();
     }
     
-}
-
-static void register (Display display) {
-    synchronized (Device.classinfo) {
-        for (int i=0; i<Displays.length; i++) {
-            if (Displays [i] is null) {
-                Displays [i] = display;
+    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;
+        
+        currentCaret = null;
+        
+        /* 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<nsTimers.length; i++) {
+                if (nsTimers [i] !is null) {
+                    nsTimers [i].invalidate();
+                    nsTimers [i].release();
+                }
+            }
+        }
+        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 ();
+        }
+        cursors = null;
+        
+        /* Release Dock image */
+        if (dockImage !is null) dockImage.release();
+        dockImage = null;
+        
+        if (screenWindow !is null) screenWindow.release();
+        screenWindow = null;
+        
+        modalShells = null;
+        menuBar = null;
+        menus = null;
+        
+        if (markedAttributes !is null) markedAttributes.release();
+        markedAttributes = null;
+        
+        /* The release pool needs to be released before the call backs. */
+        if (pool !is null) pool.release();
+        pool = null;
+        
+        if (application !is null && applicationClass !is null) {
+            OS.object_setClass (application.id, applicationClass);
+        }
+        application = null;
+        applicationClass = null;
+    }
+    
+    void removeContext (NSGraphicsContext context) {
+        if (contexts is null) return;
+        int count = 0;
+        for (int i = 0; i < contexts.length; i++) {
+            if (contexts[i] !is null) {
+                if (contexts [i].id is context.id) {
+                    contexts[i] = null;
+                } else {
+                    count++;
+                }
+            }
+        }
+        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 <code>DWT</code>.
+     *
+     * @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 <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     * </ul>
+     *
+     * @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 <code>DWT</code>.
+     *
+     * @param eventType the type of event to listen for
+     * @param listener the listener which should no longer be notified
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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<popups.length; i++) {
+            if (popups [i] is menu) {
+                popups [i] = null;
                 return;
             }
         }
-        Display [] newDisplays = new Display [Displays.length + 4];
-        System.arraycopy (Displays, 0, newDisplays, 0, Displays.length);
-        newDisplays [Displays.length] = display;
-        Displays = newDisplays;
+    }
+    
+    bool runAsyncMessages (bool all) {
+        return synchronizer.runAsyncMessages (all);
+    }
+    
+    bool runContexts () {
+        if (contexts !is null) {
+            for (int i = 0; i < contexts.length; i++) {
+                if (contexts[i] !is null) contexts[i].flushGraphics();
+            }
+        }
+        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);
+                }
+            }
+            
+            /*
+             * At this point, the event queue could
+             * be null due to a recursive invokation
+             * when running the event.
+             */
+        }
+        
+        /* Clear the queue */
+        eventQueue = null;
+        return true;
     }
-}
-
-/**
- * Releases any internal resources back to the operating
- * system and clears all fields except the device handle.
- * <p>
- * Disposes all shells which are currently open on the display. 
- * After this method has been invoked, all related related shells
- * will answer <code>true</code> when sent the message
- * <code>isDisposed()</code>.
- * </p><p>
- * When a device is destroyed, resources that were acquired
- * on behalf of the programmer need to be returned to the
- * operating system.  For example, if the device allocated a
- * font to be used as the system font, this font would be
- * freed in <code>release</code>.  Also,to assist the garbage
- * collector and minimize the amount of memory that is not
- * reclaimed when the programmer keeps a reference to a
- * disposed device, all fields except the handle are zero'd.
- * The handle is needed by <code>destroy</code>.
- * </p>
- * This method is called before <code>destroy</code>.
- * 
- * @see Device#dispose
- * @see #destroy
- */
-protected void release () {
-    disposing = true;
-    sendEvent (DWT.Dispose, new Event ());
-    Shell [] shells = getShells ();
-    for (int i=0; i<shells.length; i++) {
-        Shell shell = shells [i];
-        if (!shell.isDisposed ()) shell.dispose ();
+    
+    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; i<timerList.length; i++) {
+            if (nsTimers [i] is null && timerList [i] !is null) {
+                Runnable runnable = timerList [i];
+                timerList [i] = null;
+                if (runnable !is null) {
+                    result = true;
+                    runnable.run ();
+                }
+            }
+        }
+        return result;
     }
-    if (tray !is null) tray.dispose ();
-    tray = null;
-    while (readAndDispatch ()) {}
-    if (disposeList !is null) {
-        for (int i=0; i<disposeList.length; i++) {
-            if (disposeList [i] !is null) disposeList [i].run ();
+    
+    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);
+        }
+    }
+    
+    /**
+     * 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
+     * <code>null</code> for the name clears it.
+     *
+     * @param name the new app name or <code>null</code>
+     */
+    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.  <b>Note: It is typically considered bad practice for a
+     * program to move the on-screen pointer location.</b>
+     *
+     * @param x the new x coordinate for the cursor
+     * @param y the new y coordinate for the cursor
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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.  <b>Note: It is typically considered bad practice for a
+     * program to move the on-screen pointer location.</b>
+     *
+     * @param point new position
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_NULL_ARGUMENT - if the point is null
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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<nsTimers.length; i++) {
-            if (nsTimers [i] !is null) {
-                nsTimers [i].invalidate();
-                nsTimers [i].release();
+    /**
+     * Sets the application defined property of the receiver
+     * with the specified name to the given argument.
+     * <p>
+     * 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
+     * <code>disposeExec()</code> handler which does so.
+     * </p>
+     *
+     * @param key the name of the property
+     * @param value the new value for the property
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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<keys.length; i++) {
+            if (keys [i].equals (key)) {
+                values [i] = value;
+                return;
+            }
+        }
+        String [] newKeys = new String [keys.length + 1];
+        Object [] newValues = new Object [values.length + 1];
+        System.arraycopy (keys, 0, newKeys, 0, keys.length);
+        System.arraycopy (values, 0, newValues, 0, values.length);
+        newKeys [keys.length] = key;
+        newValues [values.length] = value;
+        keys = newKeys;
+        values = newValues;
     }
-    cursors = null;
-    
-    /* Release Dock image */
-    if (dockImage !is null) dockImage.release();
-    dockImage = null;
-
-    if (screenWindow !is null) screenWindow.release();
-    screenWindow = null;
-    
-    modalShells = null;
-    menuBar = null;
-    menus = null;
     
-    if (markedAttributes !is null) markedAttributes.release();
-    markedAttributes = null;
-
-    /* The release pool needs to be released before the call backs. */
-    if (pool !is null) pool.release();
-    pool = null;
-
-    if (application !is null && applicationClass !is null) {
-        OS.object_setClass (application.id, applicationClass);
-    }
-    application = null;
-    applicationClass = null;
-}
-
-void removeContext (NSGraphicsContext context) {
-    if (contexts is null) return;
-    int count = 0;
-    for (int i = 0; i < contexts.length; i++) {
-        if (contexts[i] !is null) {
-            if (contexts [i].id is context.id) {
-                contexts[i] = null;
-            } else {
-                count++;
+    void setMenuBar (Menu menu) {
+        if (menu is menuBar) return;
+        menuBar = menu;
+        //remove all existing menu items except the application menu
+        NSMenu menubar = application.mainMenu();
+        NSInteger count = menubar.numberOfItems();
+        while (count > 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 <code>DWT</code>.
- *
- * @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 <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- * </ul>
- *
- * @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 <code>DWT</code>.
- *
- * @param eventType the type of event to listen for
- * @param listener the listener which should no longer be notified
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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; i<popups.length; i++) {
-        if (popups [i] is menu) {
-            popups [i] = null;
-            return;
-        }
+        modalShells [index] = shell;
+        Shell [] shells = getShells ();
+        for (int i=0; i<shells.length; i++) shells [i].updateModal ();
     }
-}
-
-bool runAsyncMessages (bool all) {
-    return synchronizer.runAsyncMessages (all);
-}
-
-bool runContexts () {
-    if (contexts !is null) {
-        for (int i = 0; i < contexts.length; i++) {
-            if (contexts[i] !is null) contexts[i].flushGraphics();
+    
+    /**
+     * Sets the application defined, display specific data
+     * associated with the receiver, to the argument.
+     * The <em>display specific data</em> is a single,
+     * unnamed field that is stored with every display. 
+     * <p>
+     * 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
+     * <code>disposeExec()</code> handler which does so.
+     * </p>
+     *
+     * @param data the new display specific data
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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 <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
+     * </ul>
+     */
+    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 <em>sleep</em> (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 <code>true</code> if an event requiring dispatching was placed on the queue.
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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; i<timerList.length; i++) {
-        if (nsTimers [i] is null && timerList [i] !is null) {
-            Runnable runnable = timerList [i];
-            timerList [i] = null;
-            if (runnable !is null) {
-                result = true;
-                runnable.run ();
-            }
+    
+    /**
+     * Causes the <code>run()</code> 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 <code>null</code>
+     * as the runnable simply wakes the user-interface thread.
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param runnable code to run on the user-interface thread or <code>null</code>
+     *
+     * @exception DWTException <ul>
+     *    <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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
- * <code>null</code> for the name clears it.
- *
- * @param name the new app name or <code>null</code>
- */
-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.  <b>Note: It is typically considered bad practice for a
- * program to move the on-screen pointer location.</b>
- *
- * @param x the new x coordinate for the cursor
- * @param y the new y coordinate for the cursor
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.  <b>Note: It is typically considered bad practice for a
- * program to move the on-screen pointer location.</b>
- *
- * @param point new position
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_NULL_ARGUMENT - if the point is null
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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.
- * <p>
- * 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
- * <code>disposeExec()</code> handler which does so.
- * </p>
- *
- * @param key the name of the property
- * @param value the new value for the property
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>run()</code> 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.
+     * <p>
+     * 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.
+     * </p>
+     *
+     * @param milliseconds the delay before running the runnable
+     * @param runnable code to run on the user-interface thread
+     *
+     * @exception IllegalArgumentException <ul>
+     *    <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
+     * </ul>
+     * @exception DWTException <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     *
+     * @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<keys.length; i++) {
-        if (keys [i].equals (key)) {
-            values [i] = value;
-            return;
-        }
-    }
-    String [] newKeys = new String [keys.length + 1];
-    Object [] newValues = new Object [values.length + 1];
-    System.arraycopy (keys, 0, newKeys, 0, keys.length);
-    System.arraycopy (values, 0, newValues, 0, values.length);
-    newKeys [keys.length] = key;
-    newValues [values.length] = value;
-    keys = newKeys;
-    values = newValues;
-}
-
-void setMenuBar (Menu menu) {
-    if (menu is menuBar) return;
-    menuBar = menu;
-    //remove all existing menu items except the application menu
-    NSMenu menubar = application.mainMenu();
-    NSInteger count = menubar.numberOfItems();
-    while (count > 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; i<shells.length; i++) shells [i].updateModal ();
-}
-
-/**
- * Sets the application defined, display specific data
- * associated with the receiver, to the argument.
- * The <em>display specific data</em> is a single,
- * unnamed field that is stored with every display. 
- * <p>
- * 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
- * <code>disposeExec()</code> handler which does so.
- * </p>
- *
- * @param data the new display specific data
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the synchronizer is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- *    <li>ERROR_FAILED_EXEC - if an exception occurred while running an inter-thread message</li>
- * </ul>
- */
-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 <ul>
+     *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @see Control#update()
+     */
+    public void update () {
+        checkDevice (); 
+        //  Shell [] shells = getShells ();
+        //  for (int i=0; i<shells.length; i++) {
+        //      Shell shell = shells [i];
+        //      if (!shell.isDisposed ()) shell.update (true);
+        //  }
+        
     }
-}
-
-/**
- * Causes the user-interface thread to <em>sleep</em> (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 <code>true</code> if an event requiring dispatching was placed on the queue.
- *
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>run()</code> 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 <code>null</code>
- * as the runnable simply wakes the user-interface thread.
- * <p>
- * 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.
- * </p>
- * 
- * @param runnable code to run on the user-interface thread or <code>null</code>
- *
- * @exception DWTException <ul>
- *    <li>ERROR_FAILED_EXEC - if an exception occurred when executing the runnable</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>run()</code> 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.
- * <p>
- * 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.
- * </p>
- *
- * @param milliseconds the delay before running the runnable
- * @param runnable code to run on the user-interface thread
- *
- * @exception IllegalArgumentException <ul>
- *    <li>ERROR_NULL_ARGUMENT - if the runnable is null</li>
- * </ul>
- * @exception DWTException <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- *
- * @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 <code>sleep</code>ing, 
+     * causes it to be awakened and start running again. Note that this
+     * method may be called from any thread.
+     * 
+     * @exception DWTException <ul>
+     *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
+     * </ul>
+     * 
+     * @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 <ul>
- *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @see Control#update()
- */
-public void update () {
-    checkDevice (); 
-//  Shell [] shells = getShells ();
-//  for (int i=0; i<shells.length; i++) {
-//      Shell shell = shells [i];
-//      if (!shell.isDisposed ()) shell.update (true);
-//  }
-
-}
-
-/**
- * If the receiver's user-interface thread was <code>sleep</code>ing, 
- * causes it to be awakened and start running again. Note that this
- * method may be called from any thread.
- * 
- * @exception DWTException <ul>
- *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
- * </ul>
- * 
- * @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;
-}
-}
+    }
--- 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;
--- 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;
--- 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;
--- 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;
--- 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;
--- 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;
--- 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;
 }