From 519cb848a8f4c91c73421bb75314754284e593a4 Mon Sep 17 00:00:00 2001
From: Stefan Csomor <csomor@advancedconcepts.ch>
Date: Fri, 5 Nov 1999 09:16:09 +0000
Subject: [PATCH] CW5.2 Pro Adaptions, wxMac starting to move in

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4366 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/splitter.gif             |  Bin 76432 -> 12325 bytes
 include/wx/defs.h                      |   38 +
 include/wx/gdicmn.h                    |    6 +
 include/wx/mac/app.h                   |   81 +-
 include/wx/mac/bitmap.h                |   22 +-
 include/wx/mac/bmpbuttn.h              |    2 +
 include/wx/mac/button.h                |    4 +-
 include/wx/mac/checkbox.h              |    4 +-
 include/wx/mac/choice.h                |    2 +
 include/wx/mac/clipbrd.h               |   11 -
 include/wx/mac/colour.h                |    9 +-
 include/wx/mac/combobox.h              |    4 +
 include/wx/mac/control.h               |   76 +-
 include/wx/mac/cursor.h                |   12 +-
 include/wx/mac/dc.h                    |   85 +-
 include/wx/mac/dcclient.h              |   98 +-
 include/wx/mac/dcmemory.h              |    3 +-
 include/wx/mac/dcprint.h               |   12 +-
 include/wx/mac/dialog.h                |   18 +-
 include/wx/mac/dnd.h                   |    2 +-
 include/wx/mac/font.h                  |  147 +-
 include/wx/mac/frame.h                 |   34 +-
 include/wx/mac/gauge.h                 |    2 -
 include/wx/mac/icon.h                  |   37 +-
 include/wx/mac/listbox.h               |   29 +-
 include/wx/mac/macsock.h               | 1058 ------------
 include/wx/mac/mdi.h                   |    1 +
 include/wx/mac/menu.h                  |   25 +-
 include/wx/mac/menuitem.h              |   83 +-
 include/wx/mac/metafile.h              |  133 +-
 include/wx/mac/notebook.h              |    1 +
 include/wx/mac/palette.h               |    5 +-
 include/wx/mac/radiobox.h              |  131 +-
 include/wx/mac/region.h                |    3 +-
 include/wx/mac/scrolbar.h              |    1 +
 include/wx/mac/setup.h                 |   77 +-
 include/wx/mac/slider.h                |    8 +-
 include/wx/mac/spinbutt.h              |    2 +
 include/wx/mac/statbmp.h               |    4 +-
 include/wx/mac/statbox.h               |    4 +-
 include/wx/mac/stattext.h              |    5 +-
 include/wx/mac/statusbr.h              |    3 +-
 include/wx/mac/textctrl.h              |    3 +-
 include/wx/mac/timer.h                 |    4 -
 include/wx/mac/toolbar.h               |   10 +-
 include/wx/mac/window.h                |  832 ++++-----
 include/wx/msw/gsockmsw.h              |    2 +-
 include/wx/wx_cw.h                     |   25 +-
 include/wx/wx_cw_cm.h                  |   15 +-
 include/wx/wx_cw_d.h                   |    4 +
 include/wx_cw.pch                      |   18 +-
 include/wx_cw.pch++                    |   19 +-
 include/wx_cw_d.pch                    |   12 +-
 include/wx_cw_d.pch++                  |   17 +-
 samples/help/doc/ClassGraph.class      |  Bin 1146 -> 78 bytes
 samples/help/doc/ClassGraphPanel.class |  Bin 4084 -> 142 bytes
 samples/help/doc/ClassLayout.class     |  Bin 2412 -> 1659 bytes
 samples/help/doc/NavigatorButton.class |  Bin 1741 -> 1553 bytes
 src/common/db.cpp                      |    4 +
 src/common/dbtable.cpp                 |    5 +
 src/common/socket.cpp                  |    2 +-
 src/jpeg/jconfig.h                     |   10 +
 src/mac/app.cpp                        | 1652 +++++++++---------
 src/mac/apprsrc.r                      |  604 +------
 src/mac/bitmap.cpp                     |  483 +++++-
 src/mac/brush.cpp                      |    8 +-
 src/mac/button.cpp                     |   64 +-
 src/mac/carbon/app.cpp                 | 1652 +++++++++---------
 src/mac/carbon/apprsrc.r               |  604 +------
 src/mac/carbon/bitmap.cpp              |  483 +++++-
 src/mac/carbon/brush.cpp               |    8 +-
 src/mac/carbon/button.cpp              |   64 +-
 src/mac/carbon/checkbox.cpp            |   45 +-
 src/mac/carbon/choice.cpp              |   83 +-
 src/mac/carbon/clipbrd.cpp             |    9 +-
 src/mac/carbon/colordlg.cpp            |   18 +-
 src/mac/carbon/colour.cpp              |   49 +-
 src/mac/carbon/combobox.cpp            |  104 +-
 src/mac/carbon/control.cpp             |  614 ++++++-
 src/mac/carbon/corersrc.r              |  168 +-
 src/mac/carbon/cursor.cpp              |   87 +-
 src/mac/carbon/data.cpp                |    2 +-
 src/mac/carbon/dc.cpp                  | 1204 ++++++++++++-
 src/mac/carbon/dcclient.cpp            |  616 +------
 src/mac/carbon/dcmemory.cpp            |   12 +
 src/mac/carbon/dcscreen.cpp            |    4 +-
 src/mac/carbon/dialog.cpp              |  274 ++-
 src/mac/carbon/dirdlg.cpp              |  431 ++++-
 src/mac/carbon/filedlg.cpp             |  403 ++++-
 src/mac/carbon/font.cpp                |   68 +-
 src/mac/carbon/fontdlg.cpp             |    2 +-
 src/mac/carbon/frame.cpp               |  217 +--
 src/mac/carbon/gauge.cpp               |   52 +-
 src/mac/carbon/icon.cpp                |   51 +-
 src/mac/carbon/listbox.cpp             |  390 ++++-
 src/mac/carbon/makefile.unx            |    1 -
 src/mac/carbon/menu.cpp                |  668 +++++++-
 src/mac/carbon/menuitem.cpp            |   53 +-
 src/mac/carbon/metafile.cpp            |  279 ++-
 src/mac/carbon/msgdlg.cpp              |  259 ++-
 src/mac/carbon/notebook.cpp            |   83 +-
 src/mac/carbon/palette.cpp             |   47 +-
 src/mac/carbon/print.cpp               |    4 +-
 src/mac/carbon/printdlg.cpp            |   72 +-
 src/mac/carbon/radiobox.cpp            |    5 +-
 src/mac/carbon/region.cpp              |  113 +-
 src/mac/carbon/scrolbar.cpp            |  108 +-
 src/mac/carbon/settings.cpp            |  150 +-
 src/mac/carbon/slider.cpp              |  156 +-
 src/mac/carbon/spinbutt.cpp            |   82 +-
 src/mac/carbon/statbmp.cpp             |   20 +-
 src/mac/carbon/statbox.cpp             |   32 +-
 src/mac/carbon/stattext.cpp            |   49 +-
 src/mac/carbon/statusbr.cpp            |    2 +-
 src/mac/carbon/tabctrl.cpp             |   23 +-
 src/mac/carbon/textctrl.cpp            |  256 ++-
 src/mac/carbon/toolbar.cpp             |  192 ++-
 src/mac/carbon/utils.cpp               |   37 +-
 src/mac/carbon/wave.cpp                |    2 +-
 src/mac/carbon/window.cpp              | 2174 +++++++++++++++++++-----
 src/mac/checkbox.cpp                   |   45 +-
 src/mac/choice.cpp                     |   83 +-
 src/mac/clipbrd.cpp                    |    9 +-
 src/mac/colordlg.cpp                   |   18 +-
 src/mac/colour.cpp                     |   49 +-
 src/mac/combobox.cpp                   |  104 +-
 src/mac/control.cpp                    |  614 ++++++-
 src/mac/corersrc.r                     |  168 +-
 src/mac/cursor.cpp                     |   87 +-
 src/mac/data.cpp                       |    2 +-
 src/mac/dc.cpp                         | 1204 ++++++++++++-
 src/mac/dcclient.cpp                   |  616 +------
 src/mac/dcmemory.cpp                   |   12 +
 src/mac/dcscreen.cpp                   |    4 +-
 src/mac/dialog.cpp                     |  274 ++-
 src/mac/dirdlg.cpp                     |  431 ++++-
 src/mac/filedlg.cpp                    |  403 ++++-
 src/mac/font.cpp                       |   68 +-
 src/mac/fontdlg.cpp                    |    2 +-
 src/mac/frame.cpp                      |  217 +--
 src/mac/gauge.cpp                      |   52 +-
 src/mac/icon.cpp                       |   51 +-
 src/mac/listbox.cpp                    |  390 ++++-
 src/mac/makefile.unx                   |    1 -
 src/mac/menu.cpp                       |  668 +++++++-
 src/mac/menuitem.cpp                   |   53 +-
 src/mac/metafile.cpp                   |  279 ++-
 src/mac/msgdlg.cpp                     |  259 ++-
 src/mac/notebook.cpp                   |   83 +-
 src/mac/palette.cpp                    |   47 +-
 src/mac/print.cpp                      |    4 +-
 src/mac/printdlg.cpp                   |   72 +-
 src/mac/radiobox.cpp                   |    5 +-
 src/mac/region.cpp                     |  113 +-
 src/mac/scrolbar.cpp                   |  108 +-
 src/mac/settings.cpp                   |  150 +-
 src/mac/slider.cpp                     |  156 +-
 src/mac/spinbutt.cpp                   |   82 +-
 src/mac/statbmp.cpp                    |   20 +-
 src/mac/statbox.cpp                    |   32 +-
 src/mac/stattext.cpp                   |   49 +-
 src/mac/statusbr.cpp                   |    2 +-
 src/mac/tabctrl.cpp                    |   23 +-
 src/mac/textctrl.cpp                   |  256 ++-
 src/mac/toolbar.cpp                    |  192 ++-
 src/mac/utils.cpp                      |   37 +-
 src/mac/wave.cpp                       |    2 +-
 src/mac/window.cpp                     | 2174 +++++++++++++++++++-----
 src/msw/iniconf.cpp                    |   10 +-
 user/wxTest/horse.png                  |  Bin 68850 -> 5 bytes
 utils/dialoged/docs/books.gif          |  Bin 438 -> 243 bytes
 utils/dialoged/docs/dialog.gif         |  Bin 233 -> 146 bytes
 utils/dialoged/docs/forward.gif        |  Bin 164 -> 109 bytes
 utils/dialoged/docs/gauge.gif          |  Bin 212 -> 160 bytes
 utils/dialoged/docs/tofront.gif        |  Bin 137 -> 107 bytes
 utils/dialoged/docs/up.gif             |  Bin 137 -> 6 bytes
 176 files changed, 19299 insertions(+), 9137 deletions(-)

diff --git a/docs/latex/wx/splitter.gif b/docs/latex/wx/splitter.gif
index 04bfd9fe488d5519e7089a788316be1c84cba60f..53bd095bd0917bb6f1606e9f18363cc91b8d24f5 100644
GIT binary patch
delta 8
PcmbPmm1Swd22}$95w-(#

literal 76432
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
F{~vQNaI^pb

diff --git a/include/wx/defs.h b/include/wx/defs.h
index 422f97d30a..1cf504cb50 100644
--- a/include/wx/defs.h
+++ b/include/wx/defs.h
@@ -1534,6 +1534,44 @@ typedef enum {
 // platform specific (implementation) parts of the headers
 // ---------------------------------------------------------------------------
 
+#ifdef __WXMAC__
+
+typedef WindowPtr   	WXHWND;
+typedef Handle   			WXHANDLE;
+typedef CIconHandle		WXHICON;
+//typedef unsigned long   WXHFONT;
+typedef MenuHandle   	WXHMENU;
+//typedef unsigned long   WXHPEN;
+//typedef unsigned long   WXHBRUSH;
+//typedef unsigned long   WXHPALETTE;
+typedef CursHandle   	WXHCURSOR;
+typedef RgnHandle   	WXHRGN;
+//typedef unsigned long   WXHACCEL;
+//typedef unsigned long   WXHINSTANCE;
+typedef GWorldPtr   WXHBITMAP;
+//typedef unsigned long   WXHIMAGELIST;
+//typedef unsigned long   WXHGLOBAL;
+typedef GrafPtr   		WXHDC;
+typedef unsigned int    WXUINT;
+typedef unsigned long   WXDWORD;
+typedef unsigned short  WXWORD;
+//typedef unsigned int    WXWPARAM;
+//typedef long            WXLPARAM;
+typedef RGBColor   		WXCOLORREF;
+//typedef void *          WXRGNDATA;
+//typedef void *          WXMSG;
+//typedef unsigned long   WXHCONV;
+//typedef unsigned long   WXHKEY;
+//typedef void *          WXDRAWITEMSTRUCT;
+//typedef void *          WXMEASUREITEMSTRUCT;
+//typedef void *          WXLPCREATESTRUCT;
+typedef int (*WXFARPROC)();
+
+typedef WindowPtr           WXWindow;
+typedef ControlHandle       WXWidget;
+
+#endif
+
 #if defined(__WXMSW__) || defined(__WXPM__)
 // Stand-ins for Windows types or OS/2, to avoid #including all of windows.h or os2.h
 typedef unsigned long   WXHWND;
diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h
index c1439e0216..0fcea7fdcc 100644
--- a/include/wx/gdicmn.h
+++ b/include/wx/gdicmn.h
@@ -72,6 +72,12 @@ enum
     wxBITMAP_TYPE_PNM_RESOURCE,
     wxBITMAP_TYPE_PCX,
     wxBITMAP_TYPE_PCX_RESOURCE,
+	wxBITMAP_TYPE_PICT,
+	wxBITMAP_TYPE_PICT_RESOURCE,
+	wxBITMAP_TYPE_ICON,
+	wxBITMAP_TYPE_ICON_RESOURCE,
+	wxBITMAP_TYPE_MACCURSOR	,
+	wxBITMAP_TYPE_MACCURSOR_RESOURCE,
     wxBITMAP_TYPE_ANY = 50
 };
 
diff --git a/include/wx/mac/app.h b/include/wx/mac/app.h
index 7cab45cffa..4d50c75d06 100644
--- a/include/wx/mac/app.h
+++ b/include/wx/mac/app.h
@@ -67,11 +67,6 @@ class WXDLLEXPORT wxApp: public wxEvtHandler
   virtual int OnRun() { return MainLoop(); };
   virtual int OnExit() { return 0; }
 
-
-  /** Returns the standard icons for the msg dialogs, implemented in 
-      src/generic/msgdlgg.cpp and src/gtk/app.cpp. */
-  virtual wxIcon GetStdIcon(int which) const;
-
   inline void SetPrintMode(int mode) { m_printMode = mode; }
   inline int GetPrintMode() const { return m_printMode; }
 
@@ -141,6 +136,11 @@ public:
 
 public:
   static long           sm_lastMessageTime;
+  static wxWindow*			s_captureWindow ;
+  static int						s_lastMouseDown ; // 0 = none , 1 = left , 2 = right
+  static RgnHandle			s_macCursorRgn ;
+	EventRecord*					m_macCurrentEvent ;
+  
   int                   m_nCmdShow;
 
 protected:
@@ -149,23 +149,54 @@ protected:
 // mac specifics
 
 public :
-
-	void									MacDoOneEvent() ;
+	static bool						s_macDefaultEncodingIsPC ;
+	static bool						s_macSupportPCMenuShortcuts ;
+	static long						s_macAboutMenuItemId ;
+	static wxString				s_macHelpMenuTitleName ;
+
+  static bool						s_macHasAppearance ;
+  static long						s_macAppearanceVersion ;
+  static bool						s_macHasNavigation ;
+  static bool						s_macNavigationVersion ;
+  static bool						s_macHasWindowManager ;
+  static long						s_macWindowManagerVersion ;
+  static bool						s_macHasMenuManager ;
+  static long						s_macMenuManagerVersion ;
+  static bool						s_macHasDialogManager ;
+  static long						s_macDialogManagerVersion ;
+
+	RgnHandle							m_macCursorRgn ;
+	RgnHandle							m_macSleepRgn ;
+	RgnHandle							m_macHelpRgn ;
 	
-	void									MacHandleOneEvent( EventRecord *ev ) ;
-  void                  MacHandleNullEvent( EventRecord *ev ) ;
-  void                  MacHandleHighLevelEvent( EventRecord *ev ) ;
-  void                  MacHandleMouseDownEvent( EventRecord *ev ) ;
-  void                  MacHandleMouseUpEvent( EventRecord *ev ) ;
-  void                  MacHandleKeyDownEvent( EventRecord *ev ) ;
-  void                  MacHandleKeyUpEvent( EventRecord *ev ) ;
-  void                  MacHandleAutoKeyEvent( EventRecord *ev ) ;
-  void                  MacHandleActivateEvent( EventRecord *ev ) ;
-  void                  MacHandleUpdateEvent( EventRecord *ev ) ;
-  void                  MacHandleDiskEvent( EventRecord *ev ) ;
-  void                  MacHandleOSEvent( EventRecord *ev ) ;
+  virtual void          MacSuspend( bool convertClipboard ) ;
+  virtual void          MacResume( bool convertClipboard ) ;
 
+	virtual void					MacConvertPrivateToPublicScrap() ;
+	virtual void					MacConvertPublicToPrivateScrap() ;
+
+	// event main methods
+
+	void									MacDoOneEvent() ;	
+	void									MacHandleOneEvent( EventRecord *ev ) ;
+	EventRecord*					MacGetCurrentEvent() { return m_macCurrentEvent ; }
+	// primary events
 	
+  virtual void          MacHandleMouseDownEvent( EventRecord *ev ) ;
+  virtual void          MacHandleMouseUpEvent( EventRecord *ev ) ;
+ 	virtual void          MacHandleActivateEvent( EventRecord *ev ) ;
+  virtual void          MacHandleUpdateEvent( EventRecord *ev ) ;
+  virtual void          MacHandleKeyDownEvent( EventRecord *ev ) ;
+  virtual void          MacHandleKeyUpEvent( EventRecord *ev ) ;
+  virtual void          MacHandleDiskEvent( EventRecord *ev ) ;
+  virtual void          MacHandleOSEvent( EventRecord *ev ) ;
+  virtual void   				MacHandleHighLevelEvent( EventRecord *ev ) ;
+ 	virtual void					MacHandleMenuSelect( int menuid , int menuitem ) ;
+
+	virtual OSErr					MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) ;
+	virtual OSErr					MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) ;
+	virtual OSErr					MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) ;
+	virtual OSErr					MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) ;
 
 DECLARE_EVENT_TABLE()
 };
@@ -173,6 +204,18 @@ DECLARE_EVENT_TABLE()
 // TODO: add platform-specific arguments
 int WXDLLEXPORT wxEntry( int argc, char *argv[] );
 
+void wxMacConvertFromPCForControls( char * p ) ;
+
+void wxMacConvertToPC( const char *from , char *to , int len ) ;
+void wxMacConvertFromPC( const char *from , char *to , int len ) ;
+void wxMacConvertToPC( const char *from , char *to , int len ) ;
+void wxMacConvertFromPC( char * p ) ;
+void wxMacConvertFromPC( unsigned char *p ) ;
+wxString wxMacMakeMacStringFromPC( const char * p ) ;
+void wxMacConvertToPC( char * p ) ;
+void wxMacConvertToPC( unsigned char *p ) ;
+wxString wxMacMakePCStringFromMac( const char * p ) ;
+
 #endif
     // _WX_APP_H_
 
diff --git a/include/wx/mac/bitmap.h b/include/wx/mac/bitmap.h
index 1d2f5417e5..92eda5882d 100644
--- a/include/wx/mac/bitmap.h
+++ b/include/wx/mac/bitmap.h
@@ -28,6 +28,12 @@ class WXDLLEXPORT wxBitmapHandler;
 class WXDLLEXPORT wxIcon;
 class WXDLLEXPORT wxCursor;
 
+GWorldPtr 	wxMacCreateGWorld( int height , int widtdh , int depth ) ;
+void 				wxMacDestroyGWorld( GWorldPtr gw ) ;
+PicHandle 	wxMacCreatePict( GWorldPtr gw , GWorldPtr mask = NULL ) ;
+void 				wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green ,  int blue ) ;
+CTabHandle 	wxMacCreateColorTable( int numColors ) ;
+
 // A mask is a mono bitmap used for drawing bitmaps
 // transparently.
 class WXDLLEXPORT wxMask: public wxObject
@@ -54,15 +60,15 @@ public:
   bool Create(const wxBitmap& bitmap, int paletteIndex);
   bool Create(const wxBitmap& bitmap);
 
-/* TODO: platform-specific data access
   // Implementation
   inline WXHBITMAP GetMaskBitmap() const { return m_maskBitmap; }
   inline void SetMaskBitmap(WXHBITMAP bmp) { m_maskBitmap = bmp; }
 protected:
   WXHBITMAP m_maskBitmap;
-*/
 };
 
+enum { kMacBitmapTypeUnknownType , kMacBitmapTypeGrafWorld, kMacBitmapTypePict } ;
+
 class WXDLLEXPORT wxBitmapRefData: public wxGDIRefData
 {
     friend class WXDLLEXPORT wxBitmap;
@@ -81,7 +87,9 @@ public:
   wxPalette     m_bitmapPalette;
   int           m_quality;
 
-/*  WXHBITMAP     m_hBitmap; TODO: platform-specific handle */
+	int						m_bitmapType ;
+	PicHandle			m_hPict ;
+	WXHBITMAP     m_hBitmap;
   wxMask *      m_bitmapMask; // Optional mask
 };
 
@@ -128,14 +136,11 @@ public:
   // Initialize with raw data.
   wxBitmap(const char bits[], int width, int height, int depth = 1);
 
-/* TODO: maybe implement XPM reading
   // Initialize with XPM data
   wxBitmap(const char **data);
-*/
 
   // Load a file or resource
-  // TODO: make default type whatever's appropriate for the platform.
-  wxBitmap(const wxString& name, long type = wxBITMAP_TYPE_BMP_RESOURCE);
+  wxBitmap(const wxString& name, long type = wxBITMAP_TYPE_PICT_RESOURCE);
 
   // Constructor for generalised creation from data
   wxBitmap(void *data, long type, int width, int height, int depth = 1);
@@ -184,14 +189,11 @@ public:
 protected:
   static wxList sm_handlers;
 
-/*
   // TODO: Implementation
 public:
   void SetHBITMAP(WXHBITMAP bmp);
   inline WXHBITMAP GetHBITMAP() const { return (M_BITMAPDATA ? M_BITMAPDATA->m_hBitmap : 0); }
   bool FreeResource(bool force = FALSE);
-*/
-
 };
 #endif
   // _WX_BITMAP_H_
diff --git a/include/wx/mac/bmpbuttn.h b/include/wx/mac/bmpbuttn.h
index defe39e438..8c0ec5efae 100644
--- a/include/wx/mac/bmpbuttn.h
+++ b/include/wx/mac/bmpbuttn.h
@@ -47,6 +47,8 @@ class WXDLLEXPORT wxBitmapButton: public wxButton
     SetBitmapLabel(bitmap);
   }
 
+	virtual void SetLabel( const wxString &name ) {} 
+
   virtual void SetBitmapLabel(const wxBitmap& bitmap);
 
   inline wxBitmap& GetBitmapLabel() const { return (wxBitmap&) m_buttonBitmap; }
diff --git a/include/wx/mac/button.h b/include/wx/mac/button.h
index 68b67d8c96..3f4d688452 100644
--- a/include/wx/mac/button.h
+++ b/include/wx/mac/button.h
@@ -42,10 +42,8 @@ class WXDLLEXPORT wxButton: public wxControl
            const wxValidator& validator = wxDefaultValidator,
            const wxString& name = wxButtonNameStr);
 
-  virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
+	virtual void MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
   virtual void SetDefault();
-  virtual void SetLabel(const wxString& label);
-  virtual wxString GetLabel() const ;
   virtual void Command(wxCommandEvent& event);
 };
 
diff --git a/include/wx/mac/checkbox.h b/include/wx/mac/checkbox.h
index 8bf41d9958..94a2fdceeb 100644
--- a/include/wx/mac/checkbox.h
+++ b/include/wx/mac/checkbox.h
@@ -44,8 +44,7 @@ class WXDLLEXPORT wxCheckBox: public wxControl
            const wxString& name = wxCheckBoxNameStr);
   virtual void SetValue(bool);
   virtual bool GetValue() const ;
-  virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  virtual void SetLabel(const wxString& label);
+	virtual void 						MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
   virtual void Command(wxCommandEvent& event);
 };
 
@@ -76,6 +75,7 @@ class WXDLLEXPORT wxBitmapCheckBox: public wxCheckBox
   virtual bool GetValue() const ;
   virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
   virtual void SetLabel(const wxBitmap *bitmap);
+	virtual void SetLabel( const wxString &name ) {} 
 };
 #endif
     // _WX_CHECKBOX_H_
diff --git a/include/wx/mac/choice.h b/include/wx/mac/choice.h
index 7f360ed5cc..4682944941 100644
--- a/include/wx/mac/choice.h
+++ b/include/wx/mac/choice.h
@@ -63,9 +63,11 @@ class WXDLLEXPORT wxChoice: public wxControl
 
   virtual inline void SetColumns(int WXUNUSED(n) = 1 ) { /* No effect */ } ;
   virtual inline int GetColumns() const { return 1 ; };
+	void		MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
 
 protected:
   int m_noStrings;
+  MenuHandle	m_macPopUpMenuHandle ;
 };
 
 #endif
diff --git a/include/wx/mac/clipbrd.h b/include/wx/mac/clipbrd.h
index 697dc9d939..4d3658ed3c 100644
--- a/include/wx/mac/clipbrd.h
+++ b/include/wx/mac/clipbrd.h
@@ -24,17 +24,6 @@
 
 #include "wx/list.h"
 
-bool WXDLLEXPORT wxOpenClipboard();
-bool WXDLLEXPORT wxClipboardOpen();
-bool WXDLLEXPORT wxCloseClipboard();
-bool WXDLLEXPORT wxEmptyClipboard();
-bool WXDLLEXPORT wxIsClipboardFormatAvailable(int dataFormat);
-bool WXDLLEXPORT wxSetClipboardData(int dataFormat, wxObject *obj, int width = 0, int height = 0);
-wxObject* WXDLLEXPORT wxGetClipboardData(int dataFormat, long *len = NULL);
-int  WXDLLEXPORT wxEnumClipboardFormats(int dataFormat);
-int  WXDLLEXPORT wxRegisterClipboardFormat(char *formatName);
-bool WXDLLEXPORT wxGetClipboardFormatName(int dataFormat, char *formatName, int maxCount);
-
 /* A clipboard client holds data belonging to the clipboard.
    For plain text, a client is not necessary. */
 class WXDLLEXPORT wxClipboardClient : public wxObject
diff --git a/include/wx/mac/colour.h b/include/wx/mac/colour.h
index 16ffdac9aa..407c0140ca 100644
--- a/include/wx/mac/colour.h
+++ b/include/wx/mac/colour.h
@@ -74,9 +74,7 @@ public:
 
   void InitFromName(const wxString& col);
 
-/* TODO
-  WXCOLORREF GetPixel() const { return m_pixel; };
-*/
+  const WXCOLORREF GetPixel() const { return m_pixel; };
 
 private:
   bool          m_isInit;
@@ -85,9 +83,8 @@ private:
   unsigned char m_green;
 
 public:
-  /* TODO: implementation
-     WXCOLORREF m_pixel ;
-   */
+  WXCOLORREF m_pixel ;
+  void Set( WXCOLORREF color ) { m_pixel = color ; m_red = m_pixel.red>>8 ;m_blue = m_pixel.blue>>8 ;m_green = m_pixel.green>>8 ;}
 
 private:
   DECLARE_DYNAMIC_CLASS(wxColour)
diff --git a/include/wx/mac/combobox.h b/include/wx/mac/combobox.h
index 07054af74e..6fda37448e 100644
--- a/include/wx/mac/combobox.h
+++ b/include/wx/mac/combobox.h
@@ -78,6 +78,10 @@ class WXDLLEXPORT wxComboBox: public wxChoice
   virtual void Remove(long from, long to);
   virtual void SetSelection(long from, long to);
   virtual void SetEditable(bool editable);
+	void		MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
+protected:
+  int m_noStrings;
+  MenuHandle	m_macPopUpMenuHandle ;
 };
 
 #endif
diff --git a/include/wx/mac/control.h b/include/wx/mac/control.h
index c75756a72a..7d8f6d185d 100644
--- a/include/wx/mac/control.h
+++ b/include/wx/mac/control.h
@@ -16,35 +16,77 @@
 #pragma interface "control.h"
 #endif
 
-#include "wx/window.h"
-#include "wx/list.h"
-#include "wx/validate.h"
-
 // General item class
-class WXDLLEXPORT wxControl: public wxWindow
+class WXDLLEXPORT wxControl : public wxControlBase
 {
-  DECLARE_ABSTRACT_CLASS(wxControl)
+    DECLARE_ABSTRACT_CLASS(wxControl)
+
 public:
    wxControl();
-   ~wxControl();
+   virtual ~wxControl();
+
+   // Simulates an event
+   virtual void Command(wxCommandEvent& event) { ProcessCommand(event); }
+
+   // implementation from now on
+   // --------------------------
+
+   // Calls the callback and appropriate event handlers
+   bool ProcessCommand(wxCommandEvent& event);
+
+
+   wxList& GetSubcontrols() { return m_subControls; }
+
+   void OnEraseBackground(wxEraseEvent& event);
+
+#if WXWIN_COMPATIBILITY
+   virtual void SetButtonColour(const wxColour& WXUNUSED(col)) { }
+   wxColour* GetButtonColour() const { return NULL; }
 
-   virtual void Command(wxCommandEvent& WXUNUSED(event)) {};        // Simulates an event
-   virtual void ProcessCommand(wxCommandEvent& event); // Calls the callback and
-                                                                 // appropriate event handlers
-   virtual void SetLabel(const wxString& label);
-   virtual wxString GetLabel() const ;
+   inline virtual void SetLabelFont(const wxFont& font);
+   inline virtual void SetButtonFont(const wxFont& font);
+   inline wxFont& GetLabelFont() const;
+   inline wxFont& GetButtonFont() const;
 
-   // Places item in centre of panel - so can't be used BEFORE panel->Fit()
-   void Centre(int direction = wxHORIZONTAL);
-   inline void Callback(const wxFunction function) { m_callback = function; }; // Adds callback
+   // Adds callback
+   inline void Callback(const wxFunction function);
 
-   inline wxFunction GetCallback() { return m_callback; }
+   wxFunction GetCallback() { return m_callback; }
 
 protected:
    wxFunction       m_callback;     // Callback associated with the window
+#endif // WXWIN_COMPATIBILITY
 
-DECLARE_EVENT_TABLE()
+protected:
+   // For controls like radiobuttons which are really composite
+   wxList m_subControls;
+
+   virtual wxSize DoGetBestSize();
+
+   // create the control of the given class with the given style, returns FALSE
+   // if creation failed
+   bool MSWCreateControl(const wxChar *classname, WXDWORD style);
+
+   // determine the extended styles combination for this window (may slightly
+   // modify styl parameter)
+   WXDWORD GetExStyle(WXDWORD& style) const;
+
+private:
+   DECLARE_EVENT_TABLE()
 };
 
+
+#if WXWIN_COMPATIBILITY
+    inline void wxControl::Callback(const wxFunction f) { m_callback = f; };
+    inline wxFont& wxControl::GetLabelFont() const { return GetFont(); }
+    inline wxFont& wxControl::GetButtonFont() const { return GetFont(); }
+    inline void wxControl::SetLabelFont(const wxFont& font) { SetFont(font); }
+    inline void wxControl::SetButtonFont(const wxFont& font) { SetFont(font); }
+#endif // WXWIN_COMPATIBILITY
+
+wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
+void wxAssociateControlWithMacControl(ControlHandle inControl, wxControl *control) ;
+void wxRemoveMacControlAssociation(wxControl *control) ;
+
 #endif
     // _WX_CONTROL_H_
diff --git a/include/wx/mac/cursor.h b/include/wx/mac/cursor.h
index bc6397069f..2500050091 100644
--- a/include/wx/mac/cursor.h
+++ b/include/wx/mac/cursor.h
@@ -27,9 +27,7 @@ public:
     ~wxCursorRefData();
 
 protected:
-/* TODO: implementation
   WXHCURSOR m_hCursor;
-*/
 };
 
 #define M_CURSORDATA ((wxCursorRefData *)m_refData)
@@ -49,24 +47,22 @@ public:
   wxCursor(const char bits[], int width, int height, int hotSpotX = -1, int hotSpotY = -1,
     const char maskBits[] = NULL);
 
-  /* TODO: make default type suit platform */
-  wxCursor(const wxString& name, long flags = wxBITMAP_TYPE_CUR_RESOURCE,
+  wxCursor(const wxString& name, long flags = wxBITMAP_TYPE_MACCURSOR_RESOURCE,
    int hotSpotX = 0, int hotSpotY = 0);
 
   wxCursor(int cursor_type);
   ~wxCursor();
 
-  // TODO: also verify the internal cursor handle
-  virtual bool Ok() const { return (m_refData != NULL) ; }
+  virtual bool Ok() const { return (m_refData != NULL && M_CURSORDATA->m_hCursor != NULL ) ; }
 
   inline wxCursor& operator = (const wxCursor& cursor) { if (*this == cursor) return (*this); Ref(cursor); return *this; }
   inline bool operator == (const wxCursor& cursor) { return m_refData == cursor.m_refData; }
   inline bool operator != (const wxCursor& cursor) { return m_refData != cursor.m_refData; }
 
-/* TODO: implementation
+	void MacInstall() const ;
+
   void SetHCURSOR(WXHCURSOR cursor);
   inline WXHCURSOR GetHCURSOR() const { return (M_CURSORDATA ? M_CURSORDATA->m_hCursor : 0); }
-*/
 };
 
 extern WXDLLEXPORT void wxSetCursor(const wxCursor& cursor);
diff --git a/include/wx/mac/dc.h b/include/wx/mac/dc.h
index ce3e9998d1..a685c9a576 100644
--- a/include/wx/mac/dc.h
+++ b/include/wx/mac/dc.h
@@ -61,53 +61,53 @@ class WXDLLEXPORT wxDC: public wxObject
     
     virtual bool Ok(void) const { return m_ok; };
 
-    virtual void FloodFill( long x1, long y1, const wxColour& col, int style=wxFLOOD_SURFACE ) = 0;
+    virtual void FloodFill( long x1, long y1, const wxColour& col, int style=wxFLOOD_SURFACE );
     inline void FloodFill(const wxPoint& pt, const wxColour& col, int style=wxFLOOD_SURFACE)
     {
         FloodFill(pt.x, pt.y, col, style);
     }
 
-    virtual bool GetPixel( long x1, long y1, wxColour *col ) const = 0;
+    virtual bool GetPixel( long x1, long y1, wxColour *col ) const ;
     inline bool GetPixel(const wxPoint& pt, wxColour *col) const
     {
         return GetPixel(pt.x, pt.y, col);
     }
 
-    virtual void DrawLine( long x1, long y1, long x2, long y2 ) = 0;
+    virtual void DrawLine( long x1, long y1, long x2, long y2 );
     inline void DrawLine(const wxPoint& pt1, const wxPoint& pt2)
     {
         DrawLine(pt1.x, pt1.y, pt2.x, pt2.y);
     }
 
-    virtual void CrossHair( long x, long y ) = 0;
+    virtual void CrossHair( long x, long y );
     inline void CrossHair(const wxPoint& pt)
     {
         CrossHair(pt.x, pt.y);
     }
 
-    virtual void DrawArc( long x1, long y1, long x2, long y2, long xc, long yc ) = 0;
+    virtual void DrawArc( long x1, long y1, long x2, long y2, long xc, long yc );
     inline void DrawArc(const wxPoint& pt1, const wxPoint& pt2, const wxPoint& centre)
     {
         DrawArc(pt1.x, pt1.y, pt2.x, pt2.y, centre.x, centre.y);
     }
 
-    virtual void DrawEllipticArc( long x, long y, long width, long height, double sa, double ea ) = 0;
+    virtual void DrawEllipticArc( long x, long y, long width, long height, double sa, double ea );
     virtual void DrawEllipticArc (const wxPoint& pt, const wxSize& sz, double sa, double ea)
     {
         DrawEllipticArc(pt.x, pt.y, sz.x, sz.y, sa, ea);
     }
 
-    virtual void DrawPoint( long x, long y ) = 0;
+    virtual void DrawPoint( long x, long y );
     virtual void DrawPoint( wxPoint& point );
     
-    virtual void DrawLines( int n, wxPoint points[], long xoffset = 0, long yoffset = 0 ) = 0;
+    virtual void DrawLines( int n, wxPoint points[], long xoffset = 0, long yoffset = 0 );
     virtual void DrawLines( wxList *points, long xoffset = 0, long yoffset = 0 );
     virtual void DrawPolygon( int n, wxPoint points[], long xoffset = 0, long yoffset = 0, 
-                              int fillStyle=wxODDEVEN_RULE ) = 0;
+                              int fillStyle=wxODDEVEN_RULE );
     virtual void DrawPolygon( wxList *lines, long xoffset = 0, long yoffset = 0, 
                               int fillStyle=wxODDEVEN_RULE );
     
-    virtual void DrawRectangle( long x, long y, long width, long height ) = 0;
+    virtual void DrawRectangle( long x, long y, long width, long height );
     inline void DrawRectangle(const wxPoint& pt, const wxSize& sz)
     {
         DrawRectangle(pt.x, pt.y, sz.x, sz.y);
@@ -116,7 +116,7 @@ class WXDLLEXPORT wxDC: public wxObject
     {
         DrawRectangle(rect.x, rect.y, rect.width, rect.height);
     }
-    virtual void DrawRoundedRectangle( long x, long y, long width, long height, double radius = 20.0 ) = 0;
+    virtual void DrawRoundedRectangle( long x, long y, long width, long height, double radius = 20.0 );
     inline void DrawRoundedRectangle(const wxPoint& pt, const wxSize& sz, double radius = 20.0)
     {
         DrawRoundedRectangle(pt.x, pt.y, sz.x, sz.y, radius);
@@ -126,7 +126,7 @@ class WXDLLEXPORT wxDC: public wxObject
         DrawRoundedRectangle(rect.x, rect.y, rect.width, rect.height, radius);
     }
 
-    virtual void DrawEllipse( long x, long y, long width, long height ) = 0;
+    virtual void DrawEllipse( long x, long y, long width, long height );
     inline void DrawEllipse(const wxPoint& pt, const wxSize& sz)
     {
         DrawEllipse(pt.x, pt.y, sz.x, sz.y);
@@ -137,10 +137,10 @@ class WXDLLEXPORT wxDC: public wxObject
     }
 
     virtual void DrawSpline( long x1, long y1, long x2, long y2, long x3, long y3 );
-    virtual void DrawSpline( wxList *points ) = 0;
+    virtual void DrawSpline( wxList *points );
     virtual void DrawSpline( int n, wxPoint points[] );
     
-    virtual bool CanDrawBitmap(void) const = 0;
+    virtual bool CanDrawBitmap(void) const ;
 
     virtual void DrawIcon( const wxIcon &icon, long x, long y, bool useMask=FALSE );
     inline void DrawIcon(const wxIcon& icon, const wxPoint& pt)
@@ -148,47 +148,44 @@ class WXDLLEXPORT wxDC: public wxObject
         DrawIcon(icon, pt.x, pt.y);
     }
 
-    // TODO DrawBitmap is not always the same as DrawIcon, especially if bitmaps and
-    // icons are implemented differently.
-    void DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask=FALSE )
-	      { DrawIcon( *((wxIcon*)(&bmp)), x, y, useMask ); }
+    void DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask=FALSE ) ;
 
     virtual bool Blit( long xdest, long ydest, long width, long height,
-       wxDC *source, long xsrc, long ysrc, int logical_func = wxCOPY, bool useMask=FALSE ) = 0;
+       wxDC *source, long xsrc, long ysrc, int logical_func = wxCOPY, bool useMask=FALSE );
     inline bool Blit(const wxPoint& destPt, const wxSize& sz,
             wxDC *source, const wxPoint& srcPt, int rop = wxCOPY, bool useMask = FALSE)
     {
         return Blit(destPt.x, destPt.y, sz.x, sz.y, source, srcPt.x, srcPt.y, rop, useMask);
     }
 
-    virtual void DrawText( const wxString &text, long x, long y, bool use16 = FALSE ) = 0;
+    virtual void DrawText( const wxString &text, long x, long y, bool use16 = FALSE );
     inline void DrawText(const wxString& text, const wxPoint& pt, bool use16bit = FALSE)
     {
         DrawText(text, pt.x, pt.y, use16bit);
     }
 
-    virtual bool CanGetTextExtent(void) const = 0;
+    virtual bool CanGetTextExtent(void) const ;
     virtual void GetTextExtent( const wxString &string, long *width, long *height,
                      long *descent = NULL, long *externalLeading = NULL,
-                     wxFont *theFont = NULL, bool use16 = FALSE ) = 0;
-    virtual long GetCharWidth(void) = 0;
-    virtual long GetCharHeight(void) = 0;
+                     wxFont *theFont = NULL, bool use16 = FALSE ) const ;
+    virtual long GetCharWidth(void);
+    virtual long GetCharHeight(void);
     
-    virtual void Clear(void) = 0;
+    virtual void Clear(void);
             
-    virtual void SetFont( const wxFont &font ) = 0;
+    virtual void SetFont( const wxFont &font );
     virtual wxFont& GetFont(void) const { return (wxFont&) m_font; };
     
-    virtual void SetPen( const wxPen &pen ) = 0;
+    virtual void SetPen( const wxPen &pen );
     virtual wxPen& GetPen(void) const { return (wxPen&) m_pen; };
     
-    virtual void SetBrush( const wxBrush &brush ) = 0;
+    virtual void SetBrush( const wxBrush &brush );
     virtual wxBrush& GetBrush(void) const { return (wxBrush&) m_brush; };
 
-    virtual void SetBackground( const wxBrush &brush ) = 0;
+    virtual void SetBackground( const wxBrush &brush );
     virtual wxBrush& GetBackground(void) const { return (wxBrush&) m_backgroundBrush; };
 
-    virtual void SetLogicalFunction( int function ) = 0;
+    virtual void SetLogicalFunction( int function );
     virtual int GetLogicalFunction(void) const { return m_logicalFunction; };
     
     virtual void SetTextForeground( const wxColour &col );
@@ -196,10 +193,10 @@ class WXDLLEXPORT wxDC: public wxObject
     virtual wxColour& GetTextBackground(void) const { return (wxColour&)m_textBackgroundColour; };
     virtual wxColour& GetTextForeground(void) const { return (wxColour&)m_textForegroundColour; };
     
-    virtual void SetBackgroundMode( int mode ) = 0;
+    virtual void SetBackgroundMode( int mode );
     virtual int GetBackgroundMode(void) const { return m_backgroundMode; };
     
-    virtual void SetPalette( const wxPalette& palette ) = 0;
+    virtual void SetPalette( const wxPalette& palette );
     void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
     
     // the first two must be overridden and called
@@ -368,6 +365,30 @@ class WXDLLEXPORT wxDC: public wxObject
     
     long         m_clipX1,m_clipY1,m_clipX2,m_clipY2;
     long         m_minX,m_maxX,m_minY,m_maxY;
+
+//begin wxmac
+	GrafPtr				m_macPort ;
+
+	// in order to preserve the const inheritance of the virtual functions, we have to 
+	// use mutable variables starting from CWPro 5
+
+	void					MacInstallFont() const ;
+	void					MacInstallPen() const ;
+	void					MacInstallBrush() const ;
+	
+	mutable bool	m_macFontInstalled ;
+	mutable bool	m_macPenInstalled ;
+	mutable bool	m_macBrushInstalled ;
+	
+	mutable long	m_macPortId ;
+	GrafPtr				m_macOrigPort ;
+	Rect					m_macClipRect ;
+	Point					m_macLocalOrigin ;
+	
+	void					MacSetupPort() const ;
+	void					MacVerifySetup() const { if ( m_macPortId != m_macCurrentPortId ) MacSetupPort() ; } 
+
+	static long m_macCurrentPortId ;
 };
 
 #endif
diff --git a/include/wx/mac/dcclient.h b/include/wx/mac/dcclient.h
index 29e4e6f7a0..c2a118c6a1 100644
--- a/include/wx/mac/dcclient.h
+++ b/include/wx/mac/dcclient.h
@@ -25,100 +25,44 @@
 class WXDLLEXPORT wxPaintDC;
 class WXDLLEXPORT wxWindow;
 
-// Under Windows, wxClientDC, wxPaintDC and wxWindowDC are implemented differently.
-// On many platforms, however, they will be the same.
-
 class WXDLLEXPORT wxWindowDC: public wxDC
 {
   DECLARE_DYNAMIC_CLASS(wxWindowDC)
 
-  public:
-
-    wxWindowDC(void);
-    wxWindowDC( wxWindow *win );
-
-    ~wxWindowDC(void);
-    
-    virtual void FloodFill( long x1, long y1, const wxColour& col, int style=wxFLOOD_SURFACE );
-    virtual bool GetPixel( long x1, long y1, wxColour *col ) const;
-
-    virtual void DrawLine( long x1, long y1, long x2, long y2 );
-    virtual void CrossHair( long x, long y );
-    virtual void DrawArc( long x1, long y1, long x2, long y2, long xc, long yc );
-    virtual void DrawEllipticArc( long x, long y, long width, long height, double sa, double ea );
-    virtual void DrawPoint( long x, long y );
-    
-    virtual void DrawLines( int n, wxPoint points[], long xoffset = 0, long yoffset = 0 );
-    virtual void DrawLines( wxList *points, long xoffset = 0, long yoffset = 0 );
-    virtual void DrawPolygon( int n, wxPoint points[], long xoffset = 0, long yoffset = 0, 
-                              int fillStyle=wxODDEVEN_RULE );
-    virtual void DrawPolygon( wxList *lines, long xoffset = 0, long yoffset = 0, 
-                              int fillStyle=wxODDEVEN_RULE );
-    
-    virtual void DrawRectangle( long x, long y, long width, long height );
-    virtual void DrawRoundedRectangle( long x, long y, long width, long height, double radius = 20.0 );
-    virtual void DrawEllipse( long x, long y, long width, long height );
-    
-    virtual bool CanDrawBitmap(void) const;
-    virtual void DrawIcon( const wxIcon &icon, long x, long y, bool useMask=FALSE );
-    virtual bool Blit( long xdest, long ydest, long width, long height,
-       wxDC *source, long xsrc, long ysrc, int logical_func = wxCOPY, bool useMask=FALSE );
-
-    virtual void DrawText( const wxString &text, long x, long y, bool use16 = FALSE );
-    virtual bool CanGetTextExtent(void) const;
-    virtual void GetTextExtent( const wxString &string, long *width, long *height,
-                     long *descent = NULL, long *externalLeading = NULL,
-                     wxFont *theFont = NULL, bool use16 = FALSE );
-    virtual long GetCharWidth(void);
-    virtual long GetCharHeight(void);
-    
-    virtual void Clear(void);
-            
-    virtual void SetFont( const wxFont &font );
-    virtual void SetPen( const wxPen &pen );
-    virtual void SetBrush( const wxBrush &brush );
-    virtual void SetBackground( const wxBrush &brush );
-    virtual void SetLogicalFunction( int function );
-    virtual void SetTextForeground( const wxColour &col );
-    virtual void SetTextBackground( const wxColour &col );
-    virtual void SetBackgroundMode( int mode );
-    virtual void SetPalette( const wxPalette& palette );
-    
-    virtual void SetClippingRegion( long x, long y, long width, long height );
-    virtual void SetClippingRegion( const wxRegion& region ) ;
-    virtual void DestroyClippingRegion(void);
-    
-    virtual void DrawSpline( wxList *points );
+ public:
+  wxWindowDC(void);
+
+  // Create a DC corresponding to a canvas
+  wxWindowDC(wxWindow *win);
+
+  ~wxWindowDC(void);
 };
 
-//-----------------------------------------------------------------------------
-// wxPaintDC
-//-----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxPaintDC: public wxWindowDC
+class WXDLLEXPORT wxClientDC: public wxWindowDC
 {
-  DECLARE_DYNAMIC_CLASS(wxPaintDC)
+  DECLARE_DYNAMIC_CLASS(wxClientDC)
 
-  public:
+ public:
+  wxClientDC(void);
 
-    wxPaintDC(void):wxWindowDC() {};
-    wxPaintDC( wxWindow *win ): wxWindowDC(win) {};
+  // Create a DC corresponding to a canvas
+  wxClientDC(wxWindow *win);
 
+  ~wxClientDC(void);
 };
 
-//-----------------------------------------------------------------------------
-// wxClientDC
-//-----------------------------------------------------------------------------
-
-class WXDLLEXPORT wxClientDC: public wxWindowDC
+class WXDLLEXPORT wxPaintDC: public wxWindowDC
 {
-  DECLARE_DYNAMIC_CLASS(wxClientDC)
+  DECLARE_DYNAMIC_CLASS(wxPaintDC)
 
-  public:
+ public:
+  wxPaintDC(void);
 
-    wxClientDC(void):wxWindowDC() {};
-    wxClientDC( wxWindow *win ): wxWindowDC(win) {};
+  // Create a DC corresponding to a canvas
+  wxPaintDC(wxWindow *win);
 
+  ~wxPaintDC(void);
 };
 
 #endif
diff --git a/include/wx/mac/dcmemory.h b/include/wx/mac/dcmemory.h
index c6c5737642..642ae88afd 100644
--- a/include/wx/mac/dcmemory.h
+++ b/include/wx/mac/dcmemory.h
@@ -28,9 +28,8 @@ class WXDLLEXPORT wxMemoryDC: public wxPaintDC
     ~wxMemoryDC(void);
     virtual void SelectObject( const wxBitmap& bitmap );
     void GetSize( int *width, int *height ) const;
-
+		wxBitmap	GetSelectedObject() { return m_selected ; }
   private: 
-    friend wxPaintDC;
     wxBitmap  m_selected;
 };
 
diff --git a/include/wx/mac/dcprint.h b/include/wx/mac/dcprint.h
index 2ea66d15bf..07f876fc85 100644
--- a/include/wx/mac/dcprint.h
+++ b/include/wx/mac/dcprint.h
@@ -17,6 +17,7 @@
 #endif
 
 #include "wx/dc.h"
+#include "wx/cmndata.h"
 
 class WXDLLEXPORT wxPrinterDC: public wxDC
 {
@@ -24,9 +25,16 @@ class WXDLLEXPORT wxPrinterDC: public wxDC
   DECLARE_CLASS(wxPrinterDC)
 
   // Create a printer DC
-  wxPrinterDC(const wxString& driver, const wxString& device, const wxString& output, bool interactive = TRUE, int orientation = wxPORTRAIT);
-
+  wxPrinterDC(const wxPrintData& printdata );
   ~wxPrinterDC();
+
+    virtual bool StartDoc( const wxString& WXUNUSED(message) ) ;
+    virtual void EndDoc(void) ;
+    virtual void StartPage(void) ;
+    virtual void EndPage(void) ;
+ protected :
+ 	TPPrPort 	m_macPrintPort ;
+ 	wxPrintData m_printData ;
 };
 
 #endif
diff --git a/include/wx/mac/dialog.h b/include/wx/mac/dialog.h
index d68cc7c9a0..0b595e9c9d 100644
--- a/include/wx/mac/dialog.h
+++ b/include/wx/mac/dialog.h
@@ -60,23 +60,17 @@ public:
   ~wxDialog();
 
   virtual bool Destroy();
-  void SetClientSize(int width, int height);
-  void GetPosition(int *x, int *y) const;
   bool Show(bool show);
-  void Iconize(bool iconize);
-
-  virtual bool IsIconized() const;
   void Fit();
 
-  void SetTitle(const wxString& title);
-  wxString GetTitle() const ;
+  void Iconize(bool iconize);
 
+  virtual bool IsIconized() const;
   void OnCharHook(wxKeyEvent& event);
   void OnCloseWindow(wxCloseEvent& event);
 
   void SetModal(bool flag);
 
-  virtual void Centre(int direction = wxBOTH);
   virtual bool IsModal() const { return ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL); }
 
   virtual int ShowModal();
@@ -87,9 +81,17 @@ public:
   void OnApply(wxCommandEvent& event);
   void OnCancel(wxCommandEvent& event);
 
+	void OnSize(wxSizeEvent& event) ;
   // Responds to colour changes
   void OnSysColourChanged(wxSysColourChangedEvent& event);
 
+    // splits text up at newlines and places the
+    // lines into a vertical wxBoxSizer
+    wxSizer *CreateTextSizer( const wxString &message );
+    
+    // places buttons into a horizontal wxBoxSizer
+    wxSizer *CreateButtonSizer( long flags );
+
 DECLARE_EVENT_TABLE()
 };
 
diff --git a/include/wx/mac/dnd.h b/include/wx/mac/dnd.h
index 5a7a65335f..e3a149ed85 100644
--- a/include/wx/mac/dnd.h
+++ b/include/wx/mac/dnd.h
@@ -155,7 +155,7 @@ class WXDLLEXPORT wxDropTarget: public wxObject
 
 //  protected:
       
-    friend wxWindow;
+    friend class wxWindow;
     
     // Override these to indicate what kind of data you support: 
   
diff --git a/include/wx/mac/font.h b/include/wx/mac/font.h
index aff8fb3a75..f7596f241b 100644
--- a/include/wx/mac/font.h
+++ b/include/wx/mac/font.h
@@ -1,88 +1,105 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        font.h
 // Purpose:     wxFont class
-// Author:      AUTHOR
+// Author:      Julian Smart
 // Modified by:
-// Created:     ??/??/98
+// Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
-// Licence:   	wxWindows licence
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifndef _WX_FONT_H_
 #define _WX_FONT_H_
 
 #ifdef __GNUG__
-#pragma interface "font.h"
+    #pragma interface "font.h"
 #endif
 
-#include "wx/gdiobj.h"
+// ----------------------------------------------------------------------------
+// public functions
+// ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxFont;
+// convert wxFontEncoding into one of Windows XXX_CHARSET constants (fill exact
+// parameter if it's not NULL with TRUE if encoding is realyl supported under
+// Windows and FALSE if not and we just chose something close to it)
+extern int wxCharsetFromEncoding(wxFontEncoding encoding, bool *exact = NULL);
 
-class WXDLLEXPORT wxFontRefData: public wxGDIRefData
+// ----------------------------------------------------------------------------
+// wxFont
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxFont : public wxFontBase
 {
-    friend class WXDLLEXPORT wxFont;
 public:
-    wxFontRefData();
-    wxFontRefData(const wxFontRefData& data);
-    ~wxFontRefData();
-protected:
-  int           m_pointSize;
-  int           m_family;
-  int           m_style;
-  int           m_weight;
-  bool          m_underlined;
-  wxString      m_faceName;
-/* TODO: implementation
-  WXHFONT       m_hFont;
-*/
-};
+    // ctors and such
+    wxFont() { Init(); }
+    wxFont(const wxFont& font) { Init(); Ref(font); }
+
+    wxFont(int size,
+           int family,
+           int style,
+           int weight,
+           bool underlined = FALSE,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Init();
+
+        (void)Create(size, family, style, weight, underlined, face, encoding);
+    }
+
+    bool Create(int size,
+                int family,
+                int style,
+                int weight,
+                bool underlined = FALSE,
+                const wxString& face = wxEmptyString,
+                wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
+
+    virtual ~wxFont();
+
+    // assignment
+    wxFont& operator=(const wxFont& font);
+
+    // implement base class pure virtuals
+    virtual int GetPointSize() const;
+    virtual int GetFamily() const;
+    virtual int GetStyle() const;
+    virtual int GetWeight() const;
+    virtual bool GetUnderlined() const;
+    virtual wxString GetFaceName() const;
+    virtual wxFontEncoding GetEncoding() const;
+
+    virtual void SetPointSize(int pointSize);
+    virtual void SetFamily(int family);
+    virtual void SetStyle(int style);
+    virtual void SetWeight(int weight);
+    virtual void SetFaceName(const wxString& faceName);
+    virtual void SetUnderlined(bool underlined);
+    virtual void SetEncoding(wxFontEncoding encoding);
+
+    // implementation only from now on
+    // -------------------------------
+
+    int GetFontId() const;
+    virtual bool IsFree() const;
+    virtual bool RealizeResource();
+    virtual WXHANDLE GetResourceHandle();
+    virtual bool FreeResource(bool force = FALSE);
+    /*
+       virtual bool UseResource();
+       virtual bool ReleaseResource();
+     */
 
-#define M_FONTDATA ((wxFontRefData *)m_refData)
+protected:
+    // common part of all ctors
+    void Init();
 
-WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
+    void Unshare();
 
-// Font
-class WXDLLEXPORT wxFont: public wxGDIObject
-{
-  DECLARE_DYNAMIC_CLASS(wxFont)
-public:
-  wxFont();
-  wxFont(int pointSize, int family, int style, int weight, bool underlined = FALSE, const wxString& faceName = wxEmptyString);
-  inline wxFont(const wxFont& font) { Ref(font); }
-
-  ~wxFont();
-
-  bool Create(int pointSize, int family, int style, int weight, bool underlined = FALSE, const wxString& faceName = wxEmptyString);
-
-  virtual bool Ok() const { return (m_refData != NULL) ; }
-
-  inline int GetPointSize() const { return M_FONTDATA->m_pointSize; }
-  inline int GetFamily() const { return M_FONTDATA->m_family; }
-  inline int GetStyle() const { return M_FONTDATA->m_style; }
-  inline int GetWeight() const { return M_FONTDATA->m_weight; }
-  wxString GetFamilyString() const ;
-  wxString GetFaceName() const ;
-  wxString GetStyleString() const ;
-  wxString GetWeightString() const ;
-  inline bool GetUnderlined() const { return M_FONTDATA->m_underlined; }
-
-  void SetPointSize(int pointSize);
-  void SetFamily(int family);
-  void SetStyle(int style);
-  void SetWeight(int weight);
-  void SetFaceName(const wxString& faceName);
-  void SetUnderlined(bool underlined);
-
-  inline wxFont& operator = (const wxFont& font) { if (*this == font) return (*this); Ref(font); return *this; }
-  inline bool operator == (const wxFont& font) { return m_refData == font.m_refData; }
-  inline bool operator != (const wxFont& font) { return m_refData != font.m_refData; }
-
-  // Implementation
-protected:
-  bool RealizeResource();
-  void Unshare();
+private:
+    DECLARE_DYNAMIC_CLASS(wxFont)
 };
 
 #endif
diff --git a/include/wx/mac/frame.h b/include/wx/mac/frame.h
index 64ec0d6cd1..ae5e085877 100644
--- a/include/wx/mac/frame.h
+++ b/include/wx/mac/frame.h
@@ -19,12 +19,14 @@
 #include "wx/window.h"
 #include "wx/toolbar.h"
 #include "wx/accel.h"
+#include "wx/icon.h"
 
 WXDLLEXPORT_DATA(extern const char*) wxFrameNameStr;
 WXDLLEXPORT_DATA(extern const char*) wxToolBarNameStr;
 
 class WXDLLEXPORT wxMenuBar;
 class WXDLLEXPORT wxStatusBar;
+class WXDLLEXPORT wxMacToolTip ;
 
 class WXDLLEXPORT wxFrame: public wxWindow {
 
@@ -54,14 +56,6 @@ public:
            const wxString& name = wxFrameNameStr);
 
   virtual bool Destroy();
-  void SetClientSize(int width, int height);
-  void GetClientSize(int *width, int *height) const;
-
-  void GetSize(int *width, int *height) const ;
-  void GetPosition(int *x, int *y) const ;
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void ClientToScreen(int *x, int *y) const;
-  void ScreenToClient(int *x, int *y) const;
 
   void OnSize(wxSizeEvent& event);
   void OnMenuHighlight(wxMenuEvent& event);
@@ -69,18 +63,10 @@ public:
   void OnIdle(wxIdleEvent& event);
   void OnCloseWindow(wxCloseEvent& event);
 
-  bool Show(bool show);
-
   // Set menu bar
   void SetMenuBar(wxMenuBar *menu_bar);
   virtual wxMenuBar *GetMenuBar() const ;
 
-  // Set title
-  void SetTitle(const wxString& title);
-  wxString GetTitle() const ;
-
-  void Centre(int direction = wxBOTH);
-
   // Call this to simulate a menu command
   virtual void Command(int id);
   virtual void ProcessCommand(int id);
@@ -96,6 +82,8 @@ public:
   virtual wxStatusBar *OnCreateStatusBar(int number, long style, wxWindowID id,
     const wxString& name);
 
+#if wxUSE_TOOLBAR
+
   // Create toolbar
   virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL, wxWindowID id = -1, const wxString& name = wxToolBarNameStr);
   virtual wxToolBar *OnCreateToolBar(long style, wxWindowID id, const wxString& name);
@@ -104,6 +92,8 @@ public:
   virtual inline wxToolBar *GetToolBar() const { return m_frameToolBar; }
   virtual void PositionToolBar();
 
+#endif
+
   // Set status line text
   virtual void SetStatusText(const wxString& text, int number = 0);
 
@@ -136,10 +126,18 @@ public:
 
   // Query app for menu item updates (called from OnIdle)
   void DoMenuUpdates();
-  void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin);
+  void DoMenuUpdates(wxMenu* menu);
 
   // Checks if there is a toolbar, and returns the first free client position
   virtual wxPoint GetClientAreaOrigin() const;
+	virtual	void GetClientSize(int *x, int *y) const ;
+	virtual void DoSetClientSize(int clientwidth, int clientheight) ;
+
+  // tooltip management
+#if wxUSE_TOOLTIPS
+    wxMacToolTip* GetToolTipCtrl() const { return m_hwndToolTip; }
+    void SetToolTipCtrl(wxMacToolTip *tt) { m_hwndToolTip = wxMacToolTip; }
+#endif // tooltips
 
 protected:
   wxMenuBar *           m_frameMenuBar;
@@ -147,7 +145,9 @@ protected:
   wxIcon                m_icon;
   bool                  m_iconized;
   static bool           m_useNativeStatusBar;
+#if wxUSE_TOOLBAR
   wxToolBar *           m_frameToolBar ;
+#endif
 
   DECLARE_EVENT_TABLE()
 };
diff --git a/include/wx/mac/gauge.h b/include/wx/mac/gauge.h
index ce19d9ef1f..b88f5187a7 100644
--- a/include/wx/mac/gauge.h
+++ b/include/wx/mac/gauge.h
@@ -56,8 +56,6 @@ class WXDLLEXPORT wxGauge: public wxControl
   int GetRange() const ;
   int GetValue() const ;
 
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {} ;
 
  protected:
diff --git a/include/wx/mac/icon.h b/include/wx/mac/icon.h
index df475672ba..fed25013ff 100644
--- a/include/wx/mac/icon.h
+++ b/include/wx/mac/icon.h
@@ -27,9 +27,7 @@ public:
     ~wxIconRefData();
 
 public:
-/* TODO: whatever your actual icon handle is
   WXHICON m_hIcon;
-*/
 };
 
 #define M_ICONDATA ((wxIconRefData *)m_refData)
@@ -47,33 +45,31 @@ public:
   inline wxIcon(const wxIcon& icon) { Ref(icon); }
 
   wxIcon(const char bits[], int width, int height);
-  wxIcon(const wxString& name, long flags = wxBITMAP_TYPE_ICO_RESOURCE,
+  wxIcon(const wxString& name, long flags = wxBITMAP_TYPE_ICON_RESOURCE,
     int desiredWidth = -1, int desiredHeight = -1);
   ~wxIcon();
 
-  bool LoadFile(const wxString& name, long flags = wxBITMAP_TYPE_ICO_RESOURCE,
-      int desiredWidth = -1, int desiredHeight = -1);
+  bool LoadFile(const wxString& name, long flags /* = wxBITMAP_TYPE_ICON_RESOURCE */ ,
+      int desiredWidth /* = -1 */ , int desiredHeight = -1);
+  bool LoadFile(const wxString& name ,long flags = wxBITMAP_TYPE_ICON_RESOURCE )
+  	{ return LoadFile( name , flags , -1 , -1 ) ; } 
 
   inline wxIcon& operator = (const wxIcon& icon) { if (*this == icon) return (*this); Ref(icon); return *this; }
   inline bool operator == (const wxIcon& icon) { return m_refData == icon.m_refData; }
   inline bool operator != (const wxIcon& icon) { return m_refData != icon.m_refData; }
 
-/* TODO: implementation
   void SetHICON(WXHICON ico);
   inline WXHICON GetHICON() const { return (M_ICONDATA ? M_ICONDATA->m_hIcon : 0); }
-*/
 
-/* TODO */
   virtual bool Ok() const { return (m_refData != NULL) ; }
 };
 
-/* Example handlers. TODO: write your own handlers for relevant types.
-
-class WXDLLEXPORT wxICOFileHandler: public wxBitmapHandler
+/*
+class WXDLLEXPORT wxICONFileHandler: public wxBitmapHandler
 {
-  DECLARE_DYNAMIC_CLASS(wxICOFileHandler)
+  DECLARE_DYNAMIC_CLASS(wxICONFileHandler)
 public:
-  inline wxICOFileHandler()
+  inline wxICONFileHandler()
   {
 	m_name = "ICO icon file";
 	m_extension = "ico";
@@ -83,16 +79,17 @@ public:
   virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
       int desiredWidth = -1, int desiredHeight = -1);
 };
+*/
 
-class WXDLLEXPORT wxICOResourceHandler: public wxBitmapHandler
+class WXDLLEXPORT wxICONResourceHandler: public wxBitmapHandler
 {
-  DECLARE_DYNAMIC_CLASS(wxICOResourceHandler)
+  DECLARE_DYNAMIC_CLASS(wxICONResourceHandler)
 public:
-  inline wxICOResourceHandler()
+  inline wxICONResourceHandler()
   {
-	m_name = "ICO resource";
-	m_extension = "ico";
-	m_type = wxBITMAP_TYPE_ICO_RESOURCE;
+	m_name = "ICON resource";
+	m_extension = "";
+	m_type = wxBITMAP_TYPE_ICON_RESOURCE;
   };
 
   virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
@@ -100,7 +97,5 @@ public:
 
 };
 
-*/
-
 #endif
     // _WX_ICON_H_
diff --git a/include/wx/mac/listbox.h b/include/wx/mac/listbox.h
index d95db4379b..0ab770ac57 100644
--- a/include/wx/mac/listbox.h
+++ b/include/wx/mac/listbox.h
@@ -17,6 +17,7 @@
 #endif
 
 #include "wx/control.h"
+#include "wx/dynarray.h"
 
 WXDLLEXPORT_DATA(extern const char*) wxListBoxNameStr;
 
@@ -26,6 +27,9 @@ class WXDLLEXPORT wxArrayInt;
 WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
 
 // List box item
+
+WX_DEFINE_ARRAY( char * , wxListDataArray ) ;
+
 class WXDLLEXPORT wxListBox: public wxControl
 {
   DECLARE_DYNAMIC_CLASS(wxListBox)
@@ -73,7 +77,6 @@ class WXDLLEXPORT wxListBox: public wxControl
   virtual int GetSelections(wxArrayInt& aSelections) const;
   virtual bool Selected(int n) const ;
   virtual wxString GetString(int n) const ;
-  virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
 
   // Set the specified item at the first visible item
   // or scroll to max range.
@@ -88,9 +91,33 @@ class WXDLLEXPORT wxListBox: public wxControl
 
   void Command(wxCommandEvent& event);
 
+	void MacSetRedraw( bool doDraw ) ;
  protected:
   int       m_noItems;
   int       m_selected;
+  
+	void			MacDestroy() ;			
+	void			MacDelete( int n ) ;
+	void			MacInsert( int n , const char * text) ;
+	void			MacAppend( const char * text) ;
+	void			MacSet( int n , const char *text ) ;
+	void			MacClear() ;
+	void			MacSetSelection( int n , bool select ) ;
+	int 			MacGetSelection() const ;
+	int				MacGetSelections(wxArrayInt& aSelections) const ;
+	bool			MacIsSelected( int n ) const ;
+	void			MacScrollTo( int n ) ;
+	void			OnSize( const wxSizeEvent &size ) ;
+	void			MacDoClick() ;
+	void			MacDoDoubleClick() ;
+
+ public :
+  ListHandle	m_macList ;
+	wxArrayString m_stringArray ;
+	wxListDataArray m_dataArray ;
+	
+    virtual void	MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
+DECLARE_EVENT_TABLE()
 };
 
 #endif
diff --git a/include/wx/mac/macsock.h b/include/wx/mac/macsock.h
index 5703eb5f00..e69de29bb2 100644
--- a/include/wx/mac/macsock.h
+++ b/include/wx/mac/macsock.h
@@ -1,1058 +0,0 @@
-/*********************************************************************
-Project	:	GUSI				-	Grand Unified Socket Interface
-File		:	GUSI.h			-	Socket calls
-Author	:	Matthias Neeracher
-Language	:	MPW C/C++
-*********************************************************************/
-
-#ifndef _GUSI_
-#define _GUSI_
-
-#ifdef __MWERKS__
-	#ifndef macintosh
-		#define macintosh 1
-	#endif
-#endif
-
-#ifdef macintosh
-#include <errno.h>
-#else
-#ifndef KERNEL
-extern int errno;			/* global error number */
-#endif
-#endif
-
-#define	__P(protos)	protos		/* full-blown ANSI C */
-
-#define	EPERM			1		/* Operation not permitted */
-/* MSL defines ENOMEM, EACCES, ENOENT, ENOSYS. We give in. */
-#ifndef ENOENT
-#define	ENOENT		2		/* No such file or directory */
-#endif
-#define	ESRCH			3		/* No such process */
-#define	EINTR			4		/* Interrupted system call */
-#define	EIO			5		/* Input/output error */
-#define	ENXIO			6		/* Device not configured */
-#define	E2BIG			7		/* Argument list too long */
-#define	ENOEXEC		8		/* Exec format error */
-#define	EBADF			9		/* Bad file descriptor */
-#define	ECHILD		10		/* No child processes */
-#define	EDEADLK		11		/* Resource deadlock avoided */
-					/* 11 was EAGAIN */
-#ifndef ENOMEM	
-#define	ENOMEM		12		/* Cannot allocate memory */
-#define	EACCES		13		/* Permission denied */
-#endif
-#define	EFAULT		14		/* Bad address */
-#ifndef _POSIX_SOURCE
-#define	ENOTBLK		15		/* Block device required */
-#define	EBUSY			16		/* Device busy */
-#endif
-#define	EEXIST		17		/* File exists */
-#define	EXDEV			18		/* Cross-device link */
-#define	ENODEV		19		/* Operation not supported by device */
-#define	ENOTDIR		20		/* Not a directory */
-#define	EISDIR		21		/* Is a directory */
-#define	EINVAL		22		/* Invalid argument */
-#define	ENFILE		23		/* Too many open files in system */
-#define	EMFILE		24		/* Too many open files */
-#define	ENOTTY		25		/* Inappropriate ioctl for device */
-#ifndef _POSIX_SOURCE
-#define	ETXTBSY		26		/* Text file busy */
-#endif
-#define	EFBIG			27		/* File too large */
-#define	ENOSPC		28		/* No space left on device */
-#define	ESPIPE		29		/* Illegal seek */
-#define	EROFS			30		/* Read-only file system */
-#define	EMLINK		31		/* Too many links */
-#define	EPIPE			32		/* Broken pipe */
-
-#ifndef __MWERKS__
-/* math software */
-#define	EDOM			33		/* Numerical argument out of domain */
-#define	ERANGE		34		/* Result too large */
-#endif
-
-/* non-blocking and interrupt i/o */
-#if defined(macintosh) 
-#ifndef EAGAIN
-#define EAGAIN 		11
-#endif
-#else
-#define	EAGAIN		35		/* Resource temporarily unavailable */
-#endif
-#define	EWOULDBLOCK	EAGAIN	/* Operation would block */
-#ifndef _POSIX_SOURCE
-/* Did I tell that MSL also occupies errnos 33-40? We give in. */
-#if ENOMEM==37
-#define	EINPROGRESS	136		/* Operation now in progress */
-#define	EALREADY		137		/* Operation already in progress */
-
-/* ipc/network software -- argument errors */
-#define	ENOTSOCK		138		/* Socket operation on non-socket */
-#define	EDESTADDRREQ	139		/* Destination address required */
-#define	EMSGSIZE		140		/* Message too long */
-#else
-#define	EINPROGRESS	36		/* Operation now in progress */
-#define	EALREADY		37		/* Operation already in progress */
-
-/* ipc/network software -- argument errors */
-#define	ENOTSOCK		38		/* Socket operation on non-socket */
-#define	EDESTADDRREQ	39		/* Destination address required */
-#define	EMSGSIZE		40		/* Message too long */
-#endif
-#define	EPROTOTYPE	41		/* Protocol wrong type for socket */
-#define	ENOPROTOOPT	42		/* Protocol not available */
-#define	EPROTONOSUPPORT	43		/* Protocol not supported */
-#define	ESOCKTNOSUPPORT	44		/* Socket type not supported */
-#define	EOPNOTSUPP		45		/* Operation not supported on socket */
-#define	EPFNOSUPPORT	46		/* Protocol family not supported */
-#define	EAFNOSUPPORT	47		/* Address family not supported by protocol family */
-#define	EADDRINUSE		48		/* Address already in use */
-#define	EADDRNOTAVAIL	49		/* Can't assign requested address */
-
-/* ipc/network software -- operational errors */
-#define	ENETDOWN			50		/* Network is down */
-#define	ENETUNREACH		51		/* Network is unreachable */
-#define	ENETRESET		52		/* Network dropped connection on reset */
-#define	ECONNABORTED	53		/* Software caused connection abort */
-#define	ECONNRESET		54		/* Connection reset by peer */
-#define	ENOBUFS			55		/* No buffer space available */
-#define	EISCONN			56		/* Socket is already connected */
-#define	ENOTCONN			57		/* Socket is not connected */
-#define	ESHUTDOWN		58		/* Can't send after socket shutdown */
-#define	ETOOMANYREFS	59		/* Too many references: can't splice */
-#define	ETIMEDOUT		60		/* Connection timed out */
-#define	ECONNREFUSED	61		/* Connection refused */
-
-#define	ELOOP				62		/* Too many levels of symbolic links */
-#endif /* _POSIX_SOURCE */
-#define	ENAMETOOLONG	63		/* File name too long */
-
-/* should be rearranged */
-#ifndef _POSIX_SOURCE
-#define	EHOSTDOWN		64		/* Host is down */
-#define	EHOSTUNREACH	65		/* No route to host */
-#endif /* _POSIX_SOURCE */
-#define	ENOTEMPTY		66		/* Directory not empty */
-
-/* quotas & mush */
-#ifndef _POSIX_SOURCE
-#define	EPROCLIM			67		/* Too many processes */
-#define	EUSERS			68		/* Too many users */
-#define	EDQUOT			69		/* Disc quota exceeded */
-
-/* Network File System */
-#define	ESTALE			70		/* Stale NFS file handle */
-#define	EREMOTE			71		/* Too many levels of remote in path */
-#define	EBADRPC			72		/* RPC struct is bad */
-#define	ERPCMISMATCH	73		/* RPC version wrong */
-#define	EPROGUNAVAIL	74		/* RPC prog. not avail */
-#define	EPROGMISMATCH	75		/* Program version wrong */
-#define	EPROCUNAVAIL	76		/* Bad procedure for program */
-#endif /* _POSIX_SOURCE */
-
-#define	ENOLCK			77		/* No locks available */
-
-#ifndef ENOSYS
-#define	ENOSYS			78		/* Function not implemented */
-#endif
-
-#define	EFTYPE			79		/* Inappropriate file type or format */
-
-#ifdef KERNEL
-/* pseudo-errors returned inside kernel to modify return to process */
-#define	ERESTART	-1		/* restart syscall */
-#define	EJUSTRETURN	-2		/* don't modify regs, just return */
-#endif
-
-#define	NBBY	8		/* number of bits in a byte */
-
-/*
- * Select uses bit masks of file descriptors in longs.  These macros
- * manipulate such bit fields (the filesystem macros use chars).
- * FD_SETSIZE may be defined by the user, but the default here should
- * be enough for most uses.
- */
-#ifndef	FD_SETSIZE
-#ifdef macintosh
-#define 	FD_SETSIZE	64
-#else
-#define	FD_SETSIZE	256
-#endif
-#endif
-
-typedef long	fd_mask;
-#define NFDBITS	(sizeof(fd_mask) * NBBY)	/* bits per mask */
-
-#ifndef howmany
-#define	howmany(x, y)	(((x)+((y)-1))/(y))
-#endif
-
-typedef	struct fd_set {
-	fd_mask	fds_bits[howmany(FD_SETSIZE, NFDBITS)];
-} fd_set;
-
-#define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
-#define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
-#define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
-#define	FD_ZERO(p)	bzero((char *)(p), sizeof(*(p)))
-
-// #include <sys/types.h>
-typedef	unsigned char	u_char;
-typedef	unsigned short	u_short;
-typedef	unsigned int	u_int;
-typedef	unsigned long	u_long;
-typedef	unsigned short	ushort;		/* Sys V compatibility */
-
-typedef	char *	caddr_t;		/* core address */
-typedef	long	daddr_t;		/* disk address */
-typedef	short	dev_t;			/* device number */
-typedef	u_long	ino_t;			/* inode number */
-typedef	long	off_t;			/* file offset (should be a quad) */
-typedef	u_short	nlink_t;		/* link count */
-typedef	long	swblk_t;		/* swap offset */
-typedef	long	segsz_t;		/* segment size */
-typedef	u_short	uid_t;			/* user id */
-typedef	u_short	gid_t;			/* group id */
-typedef	short	pid_t;			/* process id */
-typedef	u_short	mode_t;			/* permissions */
-typedef u_long	fixpt_t;		/* fixed point number */
-
-
-// Feel free to increase FD_SETSIZE as needed 
-#define GUSI_MAX_FD	FD_SETSIZE
-
-//#include <sys/cdefs.h>
-
-#ifndef macintosh
-#ifdef __MWERKS__
-#define macintosh 1
-#endif
-#endif
-
-#if defined(__cplusplus)
-#define	__BEGIN_DECLS	extern "C" {
-#define	__END_DECLS	}
-#else
-#define	__BEGIN_DECLS
-#define	__END_DECLS
-#endif
-
-//#include <compat.h>
-//#include <sys/ioctl.h>
-#define	IOCPARM_MASK	0x1fff		/* parameter length, at most 13 bits */
-#define	IOCPARM_LEN(x)	(((x) >> 16) & IOCPARM_MASK)
-#define	IOCBASECMD(x)	((x) & ~IOCPARM_MASK)
-#define	IOCGROUP(x)	(((x) >> 8) & 0xff)
-
-#define	IOCPARM_MAX	NBPG		/* max size of ioctl, mult. of NBPG */
-#define	IOC_VOID	0x20000000	/* no parameters */
-#define	IOC_OUT		0x40000000	/* copy out parameters */
-#define	IOC_IN		0x80000000	/* copy in parameters */
-#define	IOC_INOUT	(IOC_IN|IOC_OUT)
-#define	IOC_DIRMASK	0xe0000000	/* mask for IN/OUT/VOID */
-
-#define _IOC(inout,group,num,len) \
-	(inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
-#define	_IO(g,n)	_IOC(IOC_VOID,	(g), (n), 0)
-#define	_IOR(g,n,t)	_IOC(IOC_OUT,	(g), (n), sizeof(t))
-#define	_IOW(g,n,t)	_IOC(IOC_IN,	(g), (n), sizeof(t))
-/* this should be _IORW, but stdio got there first */
-#define	_IOWR(g,n,t)	_IOC(IOC_INOUT,	(g), (n), sizeof(t))
-
-#define	FIOCLEX		_IO('f', 1)		/* set close on exec on fd */
-#define	FIONCLEX	_IO('f', 2)		/* remove close on exec */
-#define	FIONREAD	_IOR('f', 127, int)	/* get # bytes to read */
-#define	FIONBIO		_IOW('f', 126, int)	/* set/clear non-blocking i/o */
-#define	FIOASYNC	_IOW('f', 125, int)	/* set/clear async i/o */
-#define	FIOSETOWN	_IOW('f', 124, int)	/* set owner */
-#define	FIOGETOWN	_IOR('f', 123, int)	/* get owner */
-
-__BEGIN_DECLS
-#ifdef macintosh
-int ioctl(int fildes, unsigned int cmd, unsigned long *arg);
-#else
-int	ioctl __P((int, unsigned long, ...));
-#endif
-__END_DECLS
-
-//#include <sys/fcntl.h>
-//#include <sys/stat.h>
-//#include <dirent.h>
-//#include <Types.h>
-//#include <Events.h>
-//#include <Files.h>
-//#include <AppleTalk.h>
-//#include <CTBUtilities.h>
-//#include <Packages.h>
-//#include <PPCToolBox.h>
-//#include <StandardFile.h>
-//#include <stdio.h>
-//#include <sys/time.h>
-
-
-/*
- * Definitions for byte order, according to byte significance from low
- * address to high.
- */
-#define	LITTLE_ENDIAN	1234	/* LSB first: i386, vax */
-#define	BIG_ENDIAN		4321	/* MSB first: 68000, ibm, net */
-#define	PDP_ENDIAN		3412	/* LSB first in word, MSW first in long */
-
-#define	BYTE_ORDER	BIG_ENDIAN
-
-__BEGIN_DECLS
-unsigned long	htonl (unsigned long);
-unsigned short	htons (unsigned short);
-unsigned long	ntohl (unsigned long);
-unsigned short	ntohs (unsigned short);
-__END_DECLS
-
-/*
- * Macros for network/external number representation conversion.
- */
-#if BYTE_ORDER == BIG_ENDIAN && !defined(lint)
-#define	ntohl(x)	(x)
-#define	ntohs(x)	(x)
-#define	htonl(x)	(x)
-#define	htons(x)	(x)
-
-#define	NTOHL(x)	(x)
-#define	NTOHS(x)	(x)
-#define	HTONL(x)	(x)
-#define	HTONS(x)	(x)
-
-#else
-
-#define	NTOHL(x)	(x) = ntohl((u_long)x)
-#define	NTOHS(x)	(x) = ntohs((u_short)x)
-#define	HTONL(x)	(x) = htonl((u_long)x)
-#define	HTONS(x)	(x) = htons((u_short)x)
-#endif
-
-
-
-/*
- * Constants and structures defined by the internet system,
- * Per RFC 790, September 1981.
- */
-
-/*
- * Protocols
- */
-#define	IPPROTO_IP		0		/* dummy for IP */
-#define	IPPROTO_ICMP	1		/* control message protocol */
-#define	IPPROTO_GGP		3		/* gateway^2 (deprecated) */
-#define	IPPROTO_TCP		6		/* tcp */
-#define	IPPROTO_EGP		8		/* exterior gateway protocol */
-#define	IPPROTO_PUP		12		/* pup */
-#define	IPPROTO_UDP		17		/* user datagram protocol */
-#define	IPPROTO_IDP		22		/* xns idp */
-#define	IPPROTO_TP		29 	/* tp-4 w/ class negotiation */
-#define	IPPROTO_EON		80		/* ISO cnlp */
-
-#define	IPPROTO_RAW		255	/* raw IP packet */
-#define	IPPROTO_MAX		256
-
-
-/*
- * Local port number conventions:
- * Ports < IPPORT_RESERVED are reserved for
- * privileged processes (e.g. root).
- * Ports > IPPORT_USERRESERVED are reserved
- * for servers, not necessarily privileged.
- */
-#define	IPPORT_RESERVED		1024
-#define	IPPORT_USERRESERVED	5000
-
-/*
- * Internet address (a structure for historical reasons)
- */
-struct in_addr {
-	u_long s_addr;
-};
-
-/*
- * Definitions of bits in internet address integers.
- * On subnets, the decomposition of addresses to host and net parts
- * is done according to subnet mask, not the masks here.
- */
-#define	IN_CLASSA(i)		(((long)(i) & 0x80000000) == 0)
-#define	IN_CLASSA_NET		0xff000000
-#define	IN_CLASSA_NSHIFT	24
-#define	IN_CLASSA_HOST		0x00ffffff
-#define	IN_CLASSA_MAX		128
-
-#define	IN_CLASSB(i)		(((long)(i) & 0xc0000000) == 0x80000000)
-#define	IN_CLASSB_NET		0xffff0000
-#define	IN_CLASSB_NSHIFT	16
-#define	IN_CLASSB_HOST		0x0000ffff
-#define	IN_CLASSB_MAX		65536
-
-#define	IN_CLASSC(i)		(((long)(i) & 0xe0000000) == 0xc0000000)
-#define	IN_CLASSC_NET		0xffffff00
-#define	IN_CLASSC_NSHIFT	8
-#define	IN_CLASSC_HOST		0x000000ff
-
-#define	IN_CLASSD(i)		(((long)(i) & 0xf0000000) == 0xe0000000)
-#define	IN_MULTICAST(i)		IN_CLASSD(i)
-
-#define	IN_EXPERIMENTAL(i)	(((long)(i) & 0xe0000000) == 0xe0000000)
-#define	IN_BADCLASS(i)		(((long)(i) & 0xf0000000) == 0xf0000000)
-
-#define	INADDR_ANY		(u_long)0x00000000
-#define	INADDR_BROADCAST	(u_long)0xffffffff	/* must be masked */
-#ifndef KERNEL
-#define	INADDR_NONE		0xffffffff		/* -1 return */
-#endif
-
-#define	IN_LOOPBACKNET		127			/* official! */
-
-/*
- * Socket address, internet style.
- */
-struct sockaddr_in {
-	u_char	sin_len;
-	u_char	sin_family;
-	u_short	sin_port;
-	struct	in_addr sin_addr;
-	char		sin_zero[8];
-};
-
-/*
- * Structure used to describe IP options.
- * Used to store options internally, to pass them to a process,
- * or to restore options retrieved earlier.
- * The ip_dst is used for the first-hop gateway when using a source route
- * (this gets put into the header proper).
- */
-#ifdef __MWERKS__
-#pragma cplusplus off
-#endif
-struct ip_opts {
-	struct	in_addr ip_dst;		/* first hop, 0 w/o src rt */
-	char		ip_opts[40];		/* actually variable in size */
-};
-#ifdef __MWERKS__
-#pragma cplusplus reset
-#endif
-
-/*
- * Options for use with [gs]etsockopt at the IP level.
- * First word of comment is data type; bool is stored in int.
- */
-#define	IP_OPTIONS	1	/* buf/ip_opts; set/get IP per-packet options */
-#define	IP_HDRINCL	2	/* int; header is included with data (raw) */
-#define	IP_TOS		3	/* int; IP type of service and precedence */
-#define	IP_TTL		4	/* int; IP time to live */
-#define	IP_RECVOPTS	5	/* bool; receive all IP options w/datagram */
-#define	IP_RECVRETOPTS	6	/* bool; receive IP options for response */
-#define	IP_RECVDSTADDR	7	/* bool; receive IP dst addr w/datagram */
-#define	IP_RETOPTS	8	/* ip_opts; set/get IP per-packet options */
-
-/*
- * Structure returned by gettimeofday(2) system call,
- * and used in other calls.
- */
-struct timeval {
-	long	tv_sec;		/* seconds */
-	long	tv_usec;		/* and microseconds */
-};
-
-struct timezone {
-	int	tz_minuteswest;	/* minutes west of Greenwich */
-	int	tz_dsttime;			/* type of dst correction */
-};
-#define	DST_NONE		0	/* not on dst */
-#define	DST_USA		1	/* USA style dst */
-#define	DST_AUST		2	/* Australian style dst */
-#define	DST_WET		3	/* Western European dst */
-#define	DST_MET		4	/* Middle European dst */
-#define	DST_EET		5	/* Eastern European dst */
-#define	DST_CAN		6	/* Canada */
-//#include <sys/socket.h>
-
-/*
- * Definitions related to sockets: types, address families, options.
- */
-
-/*
- * Types
- */
-#define	SOCK_STREAM		1		/* stream socket */
-#define	SOCK_DGRAM		2		/* datagram socket */
-#define	SOCK_RAW			3		/* raw-protocol interface */
-#define	SOCK_RDM			4		/* reliably-delivered message */
-#define	SOCK_SEQPACKET	5		/* sequenced packet stream */
-
-/*
- * Option flags per-socket.
- */
-#define	SO_DEBUG			0x0001		/* turn on debugging info recording */
-#define	SO_ACCEPTCONN	0x0002		/* socket has had listen() */
-#define	SO_REUSEADDR	0x0004		/* allow local address reuse */
-#define	SO_KEEPALIVE	0x0008		/* keep connections alive */
-#define	SO_DONTROUTE	0x0010		/* just use interface addresses */
-#define	SO_BROADCAST	0x0020		/* permit sending of broadcast msgs */
-#define	SO_USELOOPBACK	0x0040		/* bypass hardware when possible */
-#define	SO_LINGER		0x0080		/* linger on close if data present */
-#define	SO_OOBINLINE	0x0100		/* leave received OOB data in line */
-
-/*
- * Additional options, not kept in so_options.
- */
-#define SO_SNDBUF		0x1001		/* send buffer size */
-#define SO_RCVBUF		0x1002		/* receive buffer size */
-#define SO_SNDLOWAT	0x1003		/* send low-water mark */
-#define SO_RCVLOWAT	0x1004		/* receive low-water mark */
-#define SO_SNDTIMEO	0x1005		/* send timeout */
-#define SO_RCVTIMEO	0x1006		/* receive timeout */
-#define	SO_ERROR		0x1007		/* get error status and clear */
-#define	SO_TYPE		0x1008		/* get socket type */
-
-/*
- * Structure used for manipulating linger option.
- */
-struct	linger {
-	int	l_onoff;			/* option on/off */
-	int	l_linger;		/* linger time */
-};
-
-/*
- * Level number for (get/set)sockopt() to apply to socket itself.
- */
-#define	SOL_SOCKET	0xffff		/* options for socket level */
-
-/*
- * Address families.
- */
-#ifdef macintosh
-#define	AF_UNSPEC		 0		/* unspecified 									*/
-#define	AF_UNIX			 1		/* local to host (pipes, portals) 			*/
-#define	AF_INET			 2		/* internetwork: UDP, TCP, etc. 				*/
-#define	AF_CTB			 3		/* Apple Comm Toolbox (not yet supported) */
-#define	AF_FILE			 4		/* Normal File I/O (used internally)		*/
-#define	AF_PPC			 5		/* PPC Toolbox										*/
-#define	AF_PAP			 6		/* Printer Access Protocol (client only)	*/
-#define	AF_APPLETALK	16		/* Apple Talk 										*/
-
-#define	AF_MAX		20
-#else
-#define	ATALK_SYMADDR 272		/* Symbolic Address for AppleTalk 			*/
-#define	AF_UNSPEC	0		/* unspecified */
-#define	AF_UNIX		1		/* local to host (pipes, portals) */
-#define	AF_INET		2		/* internetwork: UDP, TCP, etc. */
-#define	AF_IMPLINK	3		/* arpanet imp addresses */
-#define	AF_PUP		4		/* pup protocols: e.g. BSP */
-#define	AF_CHAOS		5		/* mit CHAOS protocols */
-#define	AF_NS			6		/* XEROX NS protocols */
-#define	AF_ISO		7		/* ISO protocols */
-#define	AF_OSI		AF_ISO
-#define	AF_ECMA		8		/* european computer manufacturers */
-#define	AF_DATAKIT	9		/* datakit protocols */
-#define	AF_CCITT		10		/* CCITT protocols, X.25 etc */
-#define	AF_SNA		11		/* IBM SNA */
-#define AF_DECnet		12		/* DECnet */
-#define AF_DLI			13		/* DEC Direct data link interface */
-#define AF_LAT			14		/* LAT */
-#define	AF_HYLINK	15		/* NSC Hyperchannel */
-#define	AF_APPLETALK16		/* Apple Talk */
-#define	AF_ROUTE		17		/* Internal Routing Protocol */
-#define	AF_LINK		18		/* Link layer interface */
-#define	pseudo_AF_XTP	19		/* eXpress Transfer Protocol (no AF) */
-
-#define	AF_MAX		20
-#endif
-
-/*
- * Structure used by kernel to store most
- * addresses.
- */
-#if defined(powerc) || defined (__powerc)
-#pragma options align=mac68k
-#endif
-struct sockaddr {
-	u_char	sa_len;			/* total length */
-	u_char	sa_family;		/* address family */
-	char	sa_data[14];		/* actually longer; address value */
-};
-#if defined(powerc) || defined (__powerc)
-#pragma options align=reset
-#endif
-
-/*
- * Structure used by kernel to pass protocol
- * information in raw sockets.
- */
-struct sockproto {
-	u_short	sp_family;		/* address family */
-	u_short	sp_protocol;		/* protocol */
-};
-
-/*
- * Protocol families, same as address families for now.
- */
-#ifdef macintosh
-#define	PF_UNSPEC		 AF_UNSPEC		/* unspecified 									*/
-#define	PF_UNIX			 AF_UNIX			/* local to host (pipes, portals) 			*/
-#define	PF_INET			 AF_INET			/* internetwork: UDP, TCP, etc. 				*/
-#define	PF_CTB			 AF_CTB			/* Apple Comm Toolbox (not yet supported) */
-#define	PF_FILE			 AF_FILE			/* Normal File I/O (used internally)		*/
-#define	PF_PPC			 AF_PPC			/* PPC Toolbox										*/
-#define	PF_PAP			 AF_PAP			/* Printer Access Protocol (client only)	*/
-#define	PF_APPLETALK	 AF_APPLETALK	/* Apple Talk 										*/
-#else
-#define	PF_UNSPEC	AF_UNSPEC
-#define	PF_UNIX		AF_UNIX
-#define	PF_INET		AF_INET
-#define	PF_IMPLINK	AF_IMPLINK
-#define	PF_PUP		AF_PUP
-#define	PF_CHAOS		AF_CHAOS
-#define	PF_NS			AF_NS
-#define	PF_ISO		AF_ISO
-#define	PF_OSI		AF_ISO
-#define	PF_ECMA		AF_ECMA
-#define	PF_DATAKIT	AF_DATAKIT
-#define	PF_CCITT		AF_CCITT
-#define	PF_SNA		AF_SNA
-#define PF_DECnet		AF_DECnet
-#define PF_DLI			AF_DLI
-#define PF_LAT			AF_LAT
-#define	PF_HYLINK	AF_HYLINK
-#define	PF_APPLETALK	AF_APPLETALK
-#define	PF_ROUTE		AF_ROUTE
-#define	PF_LINK		AF_LINK
-#define	PF_XTP		pseudo_AF_XTP	/* really just proto family, no AF */
-#endif
-
-#define	PF_MAX		AF_MAX
-
-/*
- * Maximum queue length specifiable by listen.
- */
-#define	SOMAXCONN	5
-
-/*
- * Message header for recvmsg and sendmsg calls.
- * Used value-result for recvmsg, value only for sendmsg.
- */
-struct msghdr {
-	caddr_t	msg_name;		/* optional address */
-	u_int		msg_namelen;		/* size of address */
-	struct	iovec *msg_iov;		/* scatter/gather array */
-	u_int		msg_iovlen;		/* # elements in msg_iov */
-	caddr_t	msg_control;		/* ancillary data, see below */
-	u_int		msg_controllen;		/* ancillary data buffer len */
-	int		msg_flags;		/* flags on received message */
-};
-
-#define	MSG_OOB			0x1		/* process out-of-band data */
-#define	MSG_PEEK			0x2		/* peek at incoming message */
-#define	MSG_DONTROUTE	0x4		/* send without using routing tables */
-#define	MSG_EOR			0x8		/* data completes record */
-#define	MSG_TRUNC		0x10		/* data discarded before delivery */
-#define	MSG_CTRUNC		0x20		/* control data lost before delivery */
-#define	MSG_WAITALL		0x40		/* wait for full request or error */
-
-/*
- * Header for ancillary data objects in msg_control buffer.
- * Used for additional information with/about a datagram
- * not expressible by flags.  The format is a sequence
- * of message elements headed by cmsghdr structures.
- */
-struct cmsghdr {
-	u_int	cmsg_len;		/* data byte count, including hdr */
-	int	cmsg_level;		/* originating protocol */
-	int	cmsg_type;		/* protocol-specific type */
-/* followed by	u_char  cmsg_data[]; */
-};
-
-/* given pointer to struct adatahdr, return pointer to data */
-#define	CMSG_DATA(cmsg)		((u_char *)((cmsg) + 1))
-
-/* given pointer to struct adatahdr, return pointer to next adatahdr */
-#define	CMSG_NXTHDR(mhdr, cmsg)	\
-	(((caddr_t)(cmsg) + (cmsg)->cmsg_len + sizeof(struct cmsghdr) > \
-	    (mhdr)->msg_control + (mhdr)->msg_controllen) ? \
-	    (struct cmsghdr *)NULL : \
-	    (struct cmsghdr *)((caddr_t)(cmsg) + ALIGN((cmsg)->cmsg_len)))
-
-#define	CMSG_FIRSTHDR(mhdr)	((struct cmsghdr *)(mhdr)->msg_control)
-
-/* "Socket"-level control message types: */
-#define	SCM_RIGHTS	0x01		/* access rights (array of int) */
-
-/*
- * 4.3 compat sockaddr, move to compat file later
- */
-struct osockaddr {
-	u_short	sa_family;			/* address family */
-	char		sa_data[14];		/* up to 14 bytes of direct address */
-};
-
-/*
- * 4.3-compat message header (move to compat file later).
- */
-struct omsghdr {
-	caddr_t	msg_name;			/* optional address */
-	int		msg_namelen;		/* size of address */
-	struct	iovec *msg_iov;	/* scatter/gather array */
-	int		msg_iovlen;			/* # elements in msg_iov */
-	caddr_t	msg_accrights;		/* access rights sent/received */
-	int		msg_accrightslen;
-};
-
-//#include <string.h>
-//#include <netinet/in.h>
-//#include <netdb.h>
-//#include <sys/un.h>
-//#include <unistd.h>
-//#include <machine/endian.h>
-//
-
-typedef enum spin_msg {
-	SP_MISC,				/* some weird thing, usually just return immediately if you get this */
-	SP_SELECT,			/* in a select call */
-	SP_NAME,				/* getting a host by name */
-	SP_ADDR,				/* getting a host by address */
-	SP_STREAM_READ,	/* Stream read call */
-	SP_STREAM_WRITE,	/* Stream write call */
-	SP_DGRAM_READ,		/* Datagram read call */
-	SP_DGRAM_WRITE,	/* Datagram write call */
-	SP_SLEEP,			/* sleeping, passes ticks left to sleep */
-	SP_AUTO_SPIN		/* Autospin, passes argument to SpinCursor */
-} spin_msg;
-
-typedef int (*GUSISpinFn)(spin_msg msg, long param);
-typedef void (*GUSIEvtHandler)(EventRecord * ev);
-typedef GUSIEvtHandler	GUSIEvtTable[24];
-
-/*
- * Address families, defined in sys/socket.h
- *
- 
-#define	AF_UNSPEC		 0		// unspecified
-#define	AF_UNIX			 1		// local to host (pipes, portals)
-#define	AF_INET			 2		// internetwork: UDP, TCP, etc.
-#define	AF_CTB			 3		// Apple Comm Toolbox (not yet supported)
-#define	AF_FILE			 4		// Normal File I/O (used internally)
-#define	AF_PPC			 5		// PPC Toolbox
-#define	AF_PAP			 6		// Printer Access Protocol (client only)
-#define	AF_APPLETALK	16		// Apple Talk
-
-*/
-
-#define	ATALK_SYMADDR 272		/* Symbolic Address for AppleTalk 			*/
-
-/*
- * Some Implementations of GUSI require you to call GUSISetup for the
- * socket families you'd like to have defined. It's a good idea to call
- * this for *all* implementations.
- *
- * GUSIDefaultSetup() will include all socket families.
- *
- * Never call any of the GUSIwithXXX routines directly.
- */
-
-__BEGIN_DECLS
-void GUSIwithAppleTalkSockets();
-void GUSIwithInternetSockets();
-void GUSIwithPAPSockets();
-void GUSIwithPPCSockets();
-void GUSIwithUnixSockets();
-void GUSIwithSIOUXSockets();
-void GUSIwithMPWSockets();
-
-void GUSISetup(void (*socketfamily)());
-void GUSIDefaultSetup();
-__END_DECLS
-/*
- * Types,  defined in sys/socket.h
- *
-
-#define	SOCK_STREAM		 1		// stream socket 
-#define	SOCK_DGRAM		 2		// datagram socket
-
-*/
-
-/*
- * Defined in sys/un.h
- *
- 
-struct sockaddr_un {
-	short		sun_family;
-	char 		sun_path[108];
-};
-
-*/
-
-#ifndef PRAGMA_ALIGN_SUPPORTED
-#error Apple had some fun with the conditional macros again
-#endif
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=mac68k
-#endif
-
-/*
-struct sockaddr_atlk {
-	short			family;
-	AddrBlock	addr;
-};
-
-struct sockaddr_atlk_sym {
-	short			family;
-	EntityName	name;
-};
-
-struct sockaddr_ppc {
-	short					family;
-	LocationNameRec	location;
-	PPCPortRec			port;
-};
-
-// Definitions for choose() 
-
-#define 	CHOOSE_DEFAULT	1		
-#define	CHOOSE_NEW		2		
-#define	CHOOSE_DIR		4		
-
-typedef struct {
-	short			numTypes;
-	SFTypeList	types;
-} sa_constr_file;
-
-typedef struct {
-	short			numTypes;
-	NLType		types;
-} sa_constr_atlk;
-
-
-// Definitions for sa_constr_ppc 
-
-#define PPC_CON_NEWSTYLE		0x8000	
-#define PPC_CON_MATCH_NAME		0x0001	
-#define PPC_CON_MATCH_TYPE 	0x0002 	
-#define PPC_CON_MATCH_NBP		0x0004	
-
-typedef struct	{
-	short			flags;
-	Str32			nbpType;
-	PPCPortRec	match;
-} sa_constr_ppc;
-
-*/
-
-#if PRAGMA_ALIGN_SUPPORTED
-#pragma options align=reset
-#endif
-
-__BEGIN_DECLS
-/* 
- * IO/Socket stuff, defined elsewhere (unistd.h, sys/socket.h
- *
-*/
-int socket(int domain, int type, short protocol);
-int bind(int s, void *name, int namelen);
-int connect(int s, void *addr, int addrlen);
-int listen(int s, int qlen);
-int accept(int s, void *addr, int *addrlen);
-int close(int s);
-int read(int s, char *buffer, unsigned buflen);
-int readv(int s, struct iovec *iov, int count);
-int recv(int s, void *buffer, int buflen, int flags);
-int recvfrom(int s, void *buffer, int buflen, int flags, void *from, int *fromlen);
-int recvmsg(int s,struct msghdr *msg,int flags);
-int write(int s, const char *buffer, unsigned buflen);
-int writev(int s, struct iovec *iov, int count);
-int send(int s, void *buffer, int buflen, int flags);
-int sendto (int s, void *buffer, int buflen, int flags, void *to, int tolen);
-int sendmsg(int s,struct msghdr *msg,int flags);
-int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
-int getdtablesize(void);
-int getsockname(int s, void *name, int *namelen);
-int getpeername(int s, struct sockaddr *name, int *namelen);
-int shutdown(int s, int how);
-int fcntl(int s, unsigned int cmd, int arg);
-int dup(int s);
-int dup2(int s, int s1);
-//int ioctl(int d, unsigned int request, long *argp);
-int getsockopt(int s, int level, int optname, char *optval, int * optlen);
-int setsockopt(int s, int level, int optname, char *optval, int optlen);
-int isatty(int);
-int remove(const char *filename);
-int rename(const char *oldname, const char *newname);
-int creat(const char*);
-int faccess(char*, unsigned int, long*);
-long lseek(int, long, int);
-int open(const char*, int);
-int unlink(char*);
-int symlink(char* linkto, char* linkname);
-int readlink(char* path, char* buf, int bufsiz);
-int truncate(char *path, long length);
-int ftruncate(int fd, long length);
-int chdir(char * path);
-int mkdir(char * path);
-int rmdir(char * path);
-char * getcwd(char * buf, int size);
-
-
-/* 
- * Defined in stdio.h
- */
- 
-#ifdef __MWERKS__
-void fsetfileinfo (char *filename, unsigned long newcreator, unsigned long newtype);
-#endif
-
-void fgetfileinfo (char *filename, unsigned long * creator, unsigned long * type);
-
-#ifdef __MWERKS__
-FILE *fdopen(int fd, const char *mode);
-int fwalk(int (*func)(FILE * stream));
-#endif
-
-int choose(
-		int 		domain,
-		int 		type,
-		char * 	prompt,
-		void * 	constraint,
-		int 		flags,
-		void * 	name,
-		int * 	namelen);
-
-/* 
- * Hostname routines, defined in netdb.h
- *
-*/ 
-
-/*
- * Structures returned by network data base library.  All addresses are
- * supplied in host order, and returned in network order (suitable for
- * use in system calls).
- */
-struct	hostent {
-	char	*h_name;	/* official name of host */
-	char	**h_aliases;	/* alias list */
-	int	h_addrtype;	/* host address type */
-	int	h_length;	/* length of address */
-	char	**h_addr_list;	/* list of addresses from name server */
-#define	h_addr	h_addr_list[0]	/* address, for backward compatiblity */
-};
-
-/*
- * Assumption here is that a network number
- * fits in 32 bits -- probably a poor one.
- */
-struct	netent {
-	char		*n_name;	/* official name of net */
-	char		**n_aliases;	/* alias list */
-	int		n_addrtype;	/* net address type */
-	unsigned long	n_net;		/* network # */
-};
-
-struct	servent {
-	char	*s_name;	/* official service name */
-	char	**s_aliases;	/* alias list */
-	int	s_port;		/* port # */
-	char	*s_proto;	/* protocol to use */
-};
-
-struct	protoent {
-	char	*p_name;	/* official protocol name */
-	char	**p_aliases;	/* alias list */
-	int	p_proto;	/* protocol # */
-};
-
-/*
- * Error return codes from gethostbyname() and gethostbyaddr()
- * (left in extern int h_errno).
- */
-
-#define	HOST_NOT_FOUND	1 /* Authoritative Answer Host not found */
-#define	TRY_AGAIN	2 /* Non-Authoritive Host not found, or SERVERFAIL */
-#define	NO_RECOVERY	3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
-#define	NO_DATA		4 /* Valid name, no data record of requested type */
-#define	NO_ADDRESS	NO_DATA		/* no address, look for MX record */
-
-int gethostname(char *machname, long buflen);
-
-void		endhostent __P((void));
-void		endnetent __P((void));
-void		endprotoent __P((void));
-void		endservent __P((void));
-struct hostent	*gethostbyaddr __P((const char *, int, int));
-struct hostent	*gethostbyname __P((const char *));
-struct hostent *gethostent __P((void));
-struct netent	*getnetbyaddr __P((long, int)); /* u_long? */
-struct netent	*getnetbyname __P((const char *));
-struct netent	*getnetent __P((void));
-struct protoent	*getprotobyname __P((const char *));
-struct protoent	*getprotobynumber __P((int));
-struct protoent	*getprotoent __P((void));
-struct servent	*getservbyname __P((const char *, const char *));
-struct servent	*getservbyport __P((int, const char *));
-struct servent	*getservent __P((void));
-void		herror __P((const char *));
-void		sethostent __P((int));
-/* void		sethostfile __P((const char *)); */
-void		setnetent __P((int));
-void		setprotoent __P((int));
-void		setservent __P((int));
-
-
-char * inet_ntoa(struct in_addr inaddr);
-struct in_addr inet_addr(const char *address);
-
-/* 
- * GUSI supports a number of hooks. Every one of them has a different prototype, but needs
- * to be passed as a GUSIHook
- */
-
-typedef enum {
-	GUSI_SpinHook,	/* A GUSISpinFn, to be called when a call blocks */
-	GUSI_ExecHook, /* Boolean (*hook)(const GUSIFileRef & ref), decides if file is executable */
-	GUSI_FTypeHook,/* Boolean (*hook)(const FSSpec & spec) sets a default file type */
-	GUSI_SpeedHook /* A long integer, to be added to the cursor spin variable */
-} GUSIHookCode;
-
-typedef void (*GUSIHook)(void);
-void GUSISetHook(GUSIHookCode code, GUSIHook hook);
-GUSIHook GUSIGetHook(GUSIHookCode code);
-
-/* 
- * What to do when a routine blocks
- */
-
-/* Defined for compatibility */
-#define GUSISetSpin(routine)	GUSISetHook(GUSI_SpinHook, (GUSIHook)routine)
-#define GUSIGetSpin()			(GUSISpinFn) GUSIGetHook(GUSI_SpinHook)
-
-int GUSISetEvents(GUSIEvtTable table);
-GUSIEvtHandler * GUSIGetEvents(void);
-
-extern GUSIEvtHandler	GUSISIOWEvents[];
-
-#define SIGPIPE	13
-#define SIGALRM	14
-
-/* 
- * BSD memory routines, defined in compat.h
- *
-*/
-#define index(a, b)						strchr(a, b)
-#define rindex(a, b)						strrchr(a, b)
-#define bzero(from, len) 				memset(from, 0, len)
-#define bcopy(from, to, len)			memcpy(to, from, len)
-#define bcmp(s1, s2, len)				memcmp(s1, s2, len)
-#define bfill(from, len, x)			memset(from, x, len)
-
-
-__END_DECLS
-
-	typedef struct wxSockInternal 
-	{
-		long nothing ;
-	} ;
-
diff --git a/include/wx/mac/mdi.h b/include/wx/mac/mdi.h
index 6f9fc294e2..fc3cf94603 100644
--- a/include/wx/mac/mdi.h
+++ b/include/wx/mac/mdi.h
@@ -125,6 +125,7 @@ public:
 
   // MDI operations
   virtual void Maximize();
+  virtual void Maximize( bool ){ Maximize() ; } // this one is inherited from wxFrame
   virtual void Restore();
   virtual void Activate();
 };
diff --git a/include/wx/mac/menu.h b/include/wx/mac/menu.h
index fa3936557c..3c5634d202 100644
--- a/include/wx/mac/menu.h
+++ b/include/wx/mac/menu.h
@@ -92,6 +92,10 @@ public:
 
   inline wxList& GetItems() const { return (wxList&) m_menuItems; }
 
+  void      				SetInvokingWindow(wxWindow *pWin) { m_pInvokingWindow = pWin; }
+  wxWindow *				GetInvokingWindow()         const { return m_pInvokingWindow; }
+
+  bool MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum) ;
 public:
   wxFunction        m_callback;
 
@@ -101,7 +105,21 @@ public:
   wxList            m_menuItems;
   wxEvtHandler *    m_parent;
   wxEvtHandler *    m_eventHandler;
+  wxWindow*			m_pInvokingWindow;
   void*             m_clientData;
+  
+  MenuHandle		m_macMenuHandle;
+  short				m_macMenuId;
+  bool				m_macMenuEnabled ;
+
+  //	void 					MacSetTitle(const wxString& title);
+  int				MacGetIndexFromId( int id ) ; 
+  int				MacGetIndexFromItem( wxMenuItem *pItem ) ; 
+  void				MacEnableMenu( bool bDoEnable ) ;
+
+  static short		s_macNextMenuId ;
+
+protected:
 };
 
 // ----------------------------------------------------------------------------
@@ -149,14 +167,17 @@ class WXDLLEXPORT wxMenuBar: public wxEvtHandler
   inline int GetMenuCount() const { return m_menuCount; }
   inline wxMenu* GetMenu(int i) const { return m_menus[i]; }
 
+  void MacInstallMenuBar() ;
+  void MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum) ;
+
  public:
   wxEvtHandler *            m_eventHandler;
   int                       m_menuCount;
   wxMenu **                 m_menus;
   wxString *                m_titles;
   wxFrame *                 m_menuBarFrame;
-/* TODO: data that represents the actual menubar when created.
- */
+
+  static wxMenuBar*			s_macInstalledMenuBar ;
 };
 
 #endif // _WX_MENU_H_
diff --git a/include/wx/mac/menuitem.h b/include/wx/mac/menuitem.h
index 9c912967f1..97359a102a 100644
--- a/include/wx/mac/menuitem.h
+++ b/include/wx/mac/menuitem.h
@@ -29,67 +29,48 @@
 #include  "wx/ownerdrw.h"
 #endif
 
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-// id for a separator line in the menu (invalid for normal item)
-#define   ID_SEPARATOR    (-1)
-
 // ----------------------------------------------------------------------------
 // wxMenuItem: an item in the menu, optionally implements owner-drawn behaviour
 // ----------------------------------------------------------------------------
-class WXDLLEXPORT wxMenuItem: public wxObject
+class WXDLLEXPORT wxMenuItem: public wxMenuItemBase
 #if wxUSE_OWNER_DRAWN
                             , public wxOwnerDrawn
 #endif
 {
-DECLARE_DYNAMIC_CLASS(wxMenuItem)
-
 public:
-  // ctor & dtor
-  wxMenuItem(wxMenu *pParentMenu = NULL, int id = ID_SEPARATOR,
-             const wxString& strName = "", const wxString& wxHelp = "",
-             bool bCheckable = FALSE, wxMenu *pSubMenu = NULL);
-  virtual ~wxMenuItem();
-
-  // accessors (some more are inherited from wxOwnerDrawn or are below)
-  bool              IsSeparator() const { return m_idItem == ID_SEPARATOR;  }
-  bool              IsEnabled()   const { return m_bEnabled;  }
-  bool              IsChecked()   const { return m_bChecked;  }
-
-  int               GetId()       const { return m_idItem;    }
-  const wxString&   GetHelp()     const { return m_strHelp;   }
-  wxMenu           *GetSubMenu()  const { return m_pSubMenu;  }
-
-  // operations
-  void SetName(const wxString& strName) { m_strName = strName; }
-  void SetHelp(const wxString& strHelp) { m_strHelp = strHelp; }
-
-  void Enable(bool bDoEnable = TRUE);
-  void Check(bool bDoCheck = TRUE);
-
-  void DeleteSubMenu();
+    // ctor & dtor
+    wxMenuItem(wxMenu *parentMenu = (wxMenu *)NULL,
+               int id = wxID_SEPARATOR,
+               const wxString& name = wxEmptyString,
+               const wxString& help = wxEmptyString,
+               bool isCheckable = FALSE,
+               wxMenu *subMenu = (wxMenu *)NULL);
+    virtual ~wxMenuItem();
+
+    // override base class virtuals
+    virtual void SetText(const wxString& strName);
+    virtual wxString GetLabel() const;
+    virtual void SetCheckable(bool checkable);
+
+    virtual void Enable(bool bDoEnable = TRUE);
+    virtual void Check(bool bDoCheck = TRUE);
+    virtual bool IsChecked() const;
+
+#if wxUSE_ACCEL
+    virtual wxAcceleratorEntry *GetAccel() const;
+#endif // wxUSE_ACCEL
+
+    // unfortunately needed to resolve ambiguity between
+    // wxMenuItemBase::IsCheckable() and wxOwnerDrawn::IsCheckable()
+    bool IsCheckable() const { return wxMenuItemBase::IsCheckable(); }
+
+    // the id for a popup menu is really its menu handle (as required by
+    // ::AppendMenu() API), so this function will return either the id or the
+    // menu handle depending on what we're
+    int GetRealId() const;
 
 private:
-  int         m_idItem;         // numeric id of the item
-  wxString    m_strHelp;        // associated help string
-  wxMenu     *m_pSubMenu,       // may be NULL
-             *m_pParentMenu;    // menu this item is contained in
-  bool        m_bEnabled,       // enabled or greyed?
-              m_bChecked;       // checked? (only if checkable)
-
-#if wxUSE_OWNER_DRAWN
-  // wxOwnerDrawn base class already has these variables - nothing to do
-
-#else   //!owner drawn
-  bool        m_bCheckable;     // can be checked?
-  wxString    m_strName;        // name or label of the item
-
-public:
-  const wxString&   GetName()     const { return m_strName;    }
-  bool              IsCheckable() const { return m_bCheckable; }
-#endif  //owner drawn
+    DECLARE_DYNAMIC_CLASS(wxMenuItem)
 };
 
 #endif  //_MENUITEM_H
diff --git a/include/wx/mac/metafile.h b/include/wx/mac/metafile.h
index e4be296d92..c65ec89071 100644
--- a/include/wx/mac/metafile.h
+++ b/include/wx/mac/metafile.h
@@ -15,73 +15,91 @@
 #ifndef _WX_METAFIILE_H_
 #define _WX_METAFIILE_H_
 
-#ifdef __GNUG__
-#pragma interface "metafile.h"
-#endif
+#if wxUSE_METAFILE
+#include "wx/dc.h"
+#include "wx/gdiobj.h"
 
-#include "wx/setup.h"
+#if wxUSE_DRAG_AND_DROP
+#include "wx/dataobj.h" wx/defs.h
+#endif
 
 /*
- * Metafile and metafile device context classes - work in Windows 3.1 only
+ * Metafile and metafile device context classes
  *
  */
 
-class WXDLLEXPORT wxDC;
-class WXDLLEXPORT wxMetaFile: public wxObject
+#define wxMetaFile wxMetafile
+#define wxMetaFileDC wxMetafileDC
+
+class WXDLLEXPORT wxMetafile;
+
+class WXDLLEXPORT wxMetafileRefData: public wxGDIRefData
+{
+    friend class WXDLLEXPORT wxMetafile;
+public:
+    wxMetafileRefData(void);
+    ~wxMetafileRefData(void);
+
+public:
+    PicHandle m_metafile;
+};
+
+#define M_METAFILEDATA ((wxMetafileRefData *)m_refData)
+
+class WXDLLEXPORT wxMetafile: public wxGDIObject
 {
-  DECLARE_DYNAMIC_CLASS(wxMetaFile)
+  DECLARE_DYNAMIC_CLASS(wxMetafile)
  public:
-  wxMetaFile(const wxString& file = "");
-  ~wxMetaFile();
+  // Copy constructor
+  inline wxMetafile(const wxMetafile& metafile)
+  { Ref(metafile); }
+
+  wxMetafile(const wxString& file = "");
+  ~wxMetafile(void);
 
   // After this is called, the metafile cannot be used for anything
   // since it is now owned by the clipboard.
   virtual bool SetClipboard(int width = 0, int height = 0);
 
   virtual bool Play(wxDC *dc);
-  // TODO
-  inline bool Ok() { return FALSE; };
+  inline bool Ok(void) const { return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != 0)); };
+
+  // Implementation
+  inline PicHandle GetHMETAFILE(void) { return M_METAFILEDATA->m_metafile; }
+  void SetHMETAFILE(PicHandle mf) ;
 
-/* TODO: Implementation
-  inline WXHANDLE GetHMETAFILE() { return m_metaFile; }
-  inline void SetHMETAFILE(WXHANDLE mf) { m_metaFile = mf; }
+  // Operators
+  inline wxMetafile& operator = (const wxMetafile& metafile) { if (*this == metafile) return (*this); Ref(metafile); return *this; }
+  inline bool operator == (const wxMetafile& metafile) { return m_refData == metafile.m_refData; }
+  inline bool operator != (const wxMetafile& metafile) { return m_refData != metafile.m_refData; }
 
 protected:
-  WXHANDLE m_metaFile;
-*/
 };
 
-class WXDLLEXPORT wxMetaFileDC: public wxDC
+class WXDLLEXPORT wxMetafileDC: public wxDC
 {
-  DECLARE_DYNAMIC_CLASS(wxMetaFileDC)
+  DECLARE_DYNAMIC_CLASS(wxMetafileDC)
 
  public:
   // Don't supply origin and extent
   // Supply them to wxMakeMetaFilePlaceable instead.
-  wxMetaFileDC(const wxString& file = "");
+  wxMetafileDC(const wxString& file = "");
 
   // Supply origin and extent (recommended).
   // Then don't need to supply them to wxMakeMetaFilePlaceable.
-  wxMetaFileDC(const wxString& file, int xext, int yext, int xorg, int yorg);
+  wxMetafileDC(const wxString& file, int xext, int yext, int xorg, int yorg);
 
-  ~wxMetaFileDC();
+  ~wxMetafileDC(void);
 
   // Should be called at end of drawing
-  virtual wxMetaFile *Close();
-  virtual void SetMapMode(int mode);
-  virtual void GetTextExtent(const wxString& string, float *x, float *y,
-                     float *descent = NULL, float *externalLeading = NULL,
-                     wxFont *theFont = NULL, bool use16bit = FALSE);
+  virtual wxMetafile *Close(void);
 
   // Implementation
-  inline wxMetaFile *GetMetaFile() { return m_metaFile; }
-  inline void SetMetaFile(wxMetaFile *mf) { m_metaFile = mf; }
-  inline int GetWindowsMappingMode() { return m_windowsMappingMode; }
-  inline void SetWindowsMappingMode(int mm) { m_windowsMappingMode = mm; }
+  inline wxMetafile *GetMetaFile(void) const { return m_metaFile; }
+  inline void SetMetaFile(wxMetafile *mf) { m_metaFile = mf; }
 
 protected:
-  int m_windowsMappingMode;
-  wxMetaFile *m_metaFile;
+  wxMetafile*   m_metaFile;
 };
 
 /*
@@ -92,10 +110,57 @@ protected:
  */
 
 // No origin or extent
-bool WXDLLEXPORT wxMakeMetaFilePlaceable(const wxString& filename, float scale = 1.0);
+#define wxMakeMetaFilePlaceable wxMakeMetafilePlaceable
+bool WXDLLEXPORT wxMakeMetafilePlaceable(const wxString& filename, float scale = 1.0);
 
 // Optional origin and extent
 bool WXDLLEXPORT wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, int y2, float scale = 1.0, bool useOriginAndExtent = TRUE);
 
+// ----------------------------------------------------------------------------
+// wxMetafileDataObject is a specialization of wxDataObject for metafile data
+// ----------------------------------------------------------------------------
+
+// TODO: implement OLE side of things. At present, it's just for clipboard
+// use.
+
+#if wxUSE_DRAG_AND_DROP
+class WXDLLEXPORT wxMetafileDataObject : public wxDataObject
+{
+public:
+  // ctors
+  wxMetafileDataObject() { m_width = 0; m_height = 0; };
+  wxMetafileDataObject(const wxMetafile& metafile, int width = 0, int height = 0):
+    m_metafile(metafile), m_width(width), m_height(height) { }
+
+  void SetMetafile(const wxMetafile& metafile, int w = 0, int h = 0)
+    { m_metafile = metafile; m_width = w; m_height = h; }
+  wxMetafile GetMetafile() const { return m_metafile; }
+  int GetWidth() const { return m_width; }
+  int GetHeight() const { return m_height; }
+
+  virtual wxDataFormat GetFormat() const { return wxDF_METAFILE; }
+
+/* ??
+  // implement base class pure virtuals
+  virtual wxDataFormat GetPreferredFormat() const
+    { return (wxDataFormat) wxDataObject::Text; }
+  virtual bool IsSupportedFormat(wxDataFormat format) const
+    { return format == wxDataObject::Text || format == wxDataObject::Locale; }
+  virtual size_t GetDataSize() const
+    { return m_strText.Len() + 1; } // +1 for trailing '\0'of course
+  virtual void GetDataHere(void *pBuf) const
+    { memcpy(pBuf, m_strText.c_str(), GetDataSize()); }
+*/
+
+private:
+  wxMetafile   m_metafile;
+  int          m_width;
+  int          m_height;
+};
+#endif
+
+#endif // wxUSE_METAFILE
+
+
 #endif
     // _WX_METAFIILE_H_
diff --git a/include/wx/mac/notebook.h b/include/wx/mac/notebook.h
index 83f8c1ce4e..0e43da55d8 100644
--- a/include/wx/mac/notebook.h
+++ b/include/wx/mac/notebook.h
@@ -165,6 +165,7 @@ public:
   virtual bool DoPhase(int nPhase);
 
 protected:
+	virtual void 						MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
   // common part of all ctors
   void Init();
 
diff --git a/include/wx/mac/palette.h b/include/wx/mac/palette.h
index 3482b33934..c359654e79 100644
--- a/include/wx/mac/palette.h
+++ b/include/wx/mac/palette.h
@@ -26,10 +26,9 @@ class WXDLLEXPORT wxPaletteRefData: public wxGDIRefData
 public:
     wxPaletteRefData();
     ~wxPaletteRefData();
-/* TODO: implementation
 protected:
- WXHPALETTE m_hPalette;
-*/
+ 		wxColour* m_palette;
+ 		wxInt32		m_count ;
 };
 
 #define M_PALETTEDATA ((wxPaletteRefData *)m_refData)
diff --git a/include/wx/mac/radiobox.h b/include/wx/mac/radiobox.h
index cb7c5ba405..8a4529edca 100644
--- a/include/wx/mac/radiobox.h
+++ b/include/wx/mac/radiobox.h
@@ -25,63 +25,88 @@ class WXDLLEXPORT wxBitmap ;
 
 class WXDLLEXPORT wxRadioBox: public wxControl
 {
-  DECLARE_DYNAMIC_CLASS(wxRadioBox)
+    DECLARE_DYNAMIC_CLASS(wxRadioBox)
+
 public:
-  wxRadioBox();
-
-  inline wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title,
-             const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-             int n = 0, const wxString choices[] = NULL,
-             int majorDim = 0, long style = wxRA_HORIZONTAL,
-             const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr)
-  {
-    Create(parent, id, title, pos, size, n, choices, majorDim, style, val, name);
-  }
-
-  ~wxRadioBox();
-
-  bool Create(wxWindow *parent, wxWindowID id, const wxString& title,
-             const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
-             int n = 0, const wxString choices[] = NULL,
-             int majorDim = 0, long style = wxRA_HORIZONTAL,
-             const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr);
-
-  int FindString(const wxString& s) const;
-  void SetSelection(int N);
-  int GetSelection() const;
-  wxString GetString(int N) const;
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void GetSize(int *x, int *y) const;
-  void GetPosition(int *x, int *y) const;
-  wxString GetLabel() const;
-  void SetLabel(const wxString& label);
-  void SetLabel(int item, const wxString& label) ;
-  wxString GetLabel(int item) const;
-  bool Show(bool show);
-  void SetFocus();
-  void Enable(bool enable);
-  void Enable(int item, bool enable);
-  void Show(int item, bool show) ;
-  inline void SetLabelFont(const wxFont& WXUNUSED(font)) {};
-  inline void SetButtonFont(const wxFont& font) { SetFont(font); }
-
-  virtual wxString GetStringSelection() const;
-  virtual bool SetStringSelection(const wxString& s);
-  inline virtual int Number() const { return m_noItems; } ;
-  void Command(wxCommandEvent& event);
-  
-  inline int GetNumberOfRowsOrCols() const { return m_noRowsOrCols; }
-  inline void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; }
+    wxRadioBox();
+
+    wxRadioBox(wxWindow *parent, wxWindowID id, const wxString& title,
+            const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+            int n = 0, const wxString choices[] = NULL,
+            int majorDim = 0, long style = wxRA_HORIZONTAL,
+            const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr)
+    {
+        Create(parent, id, title, pos, size, n, choices, majorDim, style, val, name);
+    }
+
+    ~wxRadioBox();
+
+    bool Create(wxWindow *parent, wxWindowID id, const wxString& title,
+            const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+            int n = 0, const wxString choices[] = NULL,
+            int majorDim = 0, long style = wxRA_HORIZONTAL,
+            const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr);
+
+    int FindString(const wxString& s) const;
+    void SetSelection(int N);
+    int GetSelection() const;
+    wxString GetString(int N) const;
+
+    void GetSize(int *x, int *y) const;
+    void GetPosition(int *x, int *y) const;
+
+    void SetLabel(int item, const wxString& label);
+    void SetLabel(int item, wxBitmap *bitmap);
+    wxString GetLabel(int item) const;
+    bool Show(bool show);
+    void SetFocus();
+    bool Enable(bool enable);
+    void Enable(int item, bool enable);
+    void Show(int item, bool show);
+    void SetLabelFont(const wxFont& WXUNUSED(font)) {};
+    void SetButtonFont(const wxFont& font) { SetFont(font); }
+
+    virtual wxString GetStringSelection() const;
+    virtual bool SetStringSelection(const wxString& s);
+    virtual int Number() const { return m_noItems; };
+    void Command(wxCommandEvent& event);
+
+    int GetNumberOfRowsOrCols() const { return m_noRowsOrCols; }
+    void SetNumberOfRowsOrCols(int n) { m_noRowsOrCols = n; }
+
+    // implementation only from now on
+    // -------------------------------
+
+    WXHWND *GetRadioButtons() const { return m_radioButtons; }
+    bool ContainsHWND(WXHWND hWnd) const;
+    void SendNotificationEvent();
+
+    // get the number of buttons per column/row
+    int GetNumVer() const;
+    int GetNumHor() const;
+
+#if WXWIN_COMPATIBILITY
+    wxRadioBox(wxWindow *parent, wxFunction func, const char *title,
+            int x = -1, int y = -1, int width = -1, int height = -1,
+            int n = 0, char **choices = NULL,
+            int majorDim = 0, long style = wxRA_HORIZONTAL, const char *name = wxRadioBoxNameStr);
+#endif // WXWIN_COMPATIBILITY
 
 protected:
-/* TODO: implementation
-  WXHWND *          m_radioButtons;
-*/
-  int               m_majorDim ;
-  int               m_noItems;
-  int               m_noRowsOrCols;
-  int               m_selectedButton;
+    void SubclassRadioButton(WXHWND hWndBtn);
+
+    WXHWND *          m_radioButtons;
+    int               m_majorDim;
+    int *             m_radioWidth;  // for bitmaps
+    int *             m_radioHeight;
+
+    int               m_noItems;
+    int               m_noRowsOrCols;
+    int               m_selectedButton;
 
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
 };
 
 #endif
diff --git a/include/wx/mac/region.h b/include/wx/mac/region.h
index 04d143c2e9..bbe826196d 100644
--- a/include/wx/mac/region.h
+++ b/include/wx/mac/region.h
@@ -43,6 +43,7 @@ public:
     wxRegion(long x, long y, long w, long h);
     wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight);
     wxRegion(const wxRect& rect);
+	wxRegion( WXHRGN hRegion );
 	wxRegion();
 	~wxRegion();
 
@@ -100,6 +101,7 @@ public:
 	bool Combine(long x, long y, long width, long height, wxRegionOp op);
 	bool Combine(const wxRegion& region, wxRegionOp op);
 	bool Combine(const wxRect& rect, wxRegionOp op);
+	const WXHRGN GetWXHRGN() const ;
 };
 
 class WXDLLEXPORT wxRegionIterator : public wxObject {
@@ -125,7 +127,6 @@ public:
 	long GetH() const;
 	long GetHeight() const { return GetH(); }
     wxRect GetRect() const { return wxRect(GetX(), GetY(), GetWidth(), GetHeight()); }
-
 private:
 	long	 m_current;
 	long	 m_numRects;
diff --git a/include/wx/mac/scrolbar.h b/include/wx/mac/scrolbar.h
index 3ec992e78e..10e80637db 100644
--- a/include/wx/mac/scrolbar.h
+++ b/include/wx/mac/scrolbar.h
@@ -55,6 +55,7 @@ public:
     bool refresh = TRUE);
 
   void Command(wxCommandEvent& event);
+		virtual void 						MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
 
 protected:
     int m_pageSize;
diff --git a/include/wx/mac/setup.h b/include/wx/mac/setup.h
index 77f7dfa27b..2498112208 100644
--- a/include/wx/mac/setup.h
+++ b/include/wx/mac/setup.h
@@ -16,6 +16,19 @@
  * General features
  *
  */
+#define wxUSE_BUSYINFO 1
+
+#define WORDS_BIGENDIAN 1
+
+#define wxUSE_LIBPNG        1
+                                  // Use PNG bitmap code
+#define wxUSE_LIBJPEG       1
+                                  // Use JPEG bitmap code
+#define wxUSE_STREAMS						1
+
+#define wxUSE_ZLIB 1
+#define wxUSE_ZIPSTREAM 1
+#define wxUSE_SOCKETS 					1
 
 #define wxUSE_CONSTRAINTS       1
                                 // Use constraints mechanism
@@ -24,7 +37,7 @@
 #define _WX_GOODCOMPILER__
                                 // gcc can have problems, but Windows compilers
                                 // are generally OK.
-#define WXWIN_COMPATIBILITY  1
+#define WXWIN_COMPATIBILITY  0
                                 // Compatibility with 1.66 API.
                                 // Level 0: no backward compatibility, all new features
                                 // Level 1: wxDC, OnSize (etc.) compatibility, but
@@ -36,7 +49,7 @@
                         	// 0 for no PostScript device context
 #define wxUSE_AFM_FOR_POSTSCRIPT 0
                                 // 1 to use font metric files in GetTextExtent
-#define wxUSE_METAFILE    0
+#define wxUSE_METAFILE    1
                                 // 0 for no Metafile and metafile device context
 #define wxUSE_FORM        0
                                 // 0 for no wxForm
@@ -44,9 +57,9 @@
                                 // 0 for no interprocess comms
 #define wxUSE_HELP        0
                                 // 0 for no help facility
-#define wxUSE_RESOURCES   0
+#define wxUSE_RESOURCES   1
                         	// 0 for no wxGetResource/wxWriteResource
-#define wxUSE_CLIPBOARD   0
+#define wxUSE_CLIPBOARD   1
                         	// 0 for no clipboard functions
 #define wxUSE_SPLINES     0
                             	// 0 for no splines
@@ -55,17 +68,17 @@
 // AIAI spline code is slower, but freer of copyright issues.
                             	// 0 for no splines
 
-#define wxUSE_TOOLBAR     0
+#define wxUSE_TOOLBAR     1
                             // Use toolbars
 #define wxUSE_DRAG_AND_DROP 0
                         	// 0 for no drag and drop
 
-#define wxUSE_WX_RESOURCES        0
+#define wxUSE_WX_RESOURCES        1
                                   // Use .wxr resource mechanism (requires PrologIO library)
 
 #define wxUSE_DOC_VIEW_ARCHITECTURE 1
                                   // Set to 0 to disable document/view architecture
-#define wxUSE_PRINTING_ARCHITECTURE  0
+#define wxUSE_PRINTING_ARCHITECTURE  1
                                     // Set to 0 to disable print/preview architecture code
 #define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0
                                     // Set to 0 to disable PostScript print/preview architecture code
@@ -111,6 +124,18 @@
                                   // but you can't mix them. Set to 1 for <iostream.h>,
                                   // 0 for <iostream>
 
+#define wxUSE_ZIPSTREAM       1
+
+#define wxUSE_FS_ZIP 1
+
+#define wxUSE_FS_INET 1
+
+#define wxUSE_STREAMS       1
+                                  // If enabled (1), compiles wxWindows streams classes
+
+#define wxUSE_STD_IOSTREAM  1
+                                  // Use standard C++ streams if 1. If 0, use wxWin
+                                  // streams implementation.
 #define wxUSE_WXCONFIG      0
                                   // if enabled, compiles built-in OS independent wxConfig
                                   // class and it's file (any platform) and registry (Win)
@@ -125,5 +150,43 @@
 				// will be used to write, in a portable way,
 				// float on the disk
 
+// use wxFile class - required by i18n code, wxConfig and others - recommended
+#define wxUSE_FILE                1
+
+// use wxTextFile class: requires wxFile, required by wxConfig
+#define wxUSE_TEXTFILE            1
+
+// i18n support: _() macro, wxLocale class. Requires wxFile
+#define wxUSE_INTL                1
+
+// wxLogXXX functions - highly recommended
+#define wxUSE_LOG                   1
+
+// wxValidator class
+#define wxUSE_VALIDATORS 1
+
+// wxAcceleratorTable/Entry classes and support for them in wxMenu(Bar)
+#define wxUSE_ACCEL 1
+
+// wxSashWindow class
+#define wxUSE_SASH 1
+
+// text entry dialog and wxGetTextFromUser function
+#define wxUSE_TEXTDLG 1
+
+#define wxUSE_STATLINE 1
+
+// wxToolBar class
+#define wxUSE_TOOLBAR 1
+
+// wxStatusBar class
+#define wxUSE_STATUSBAR 1
+
+// progress dialog class for lengthy operations
+#define wxUSE_PROGRESSDLG 1
+
+// wxDirDlg class for getting a directory name from user
+#define wxUSE_DIRDLG 1
+
 #endif
     // _WX_SETUP_H_
diff --git a/include/wx/mac/slider.h b/include/wx/mac/slider.h
index 239e914e5c..e71b62fdb1 100644
--- a/include/wx/mac/slider.h
+++ b/include/wx/mac/slider.h
@@ -51,9 +51,6 @@ public:
 
   virtual int GetValue() const ;
   virtual void SetValue(int);
-  void GetSize(int *x, int *y) const ;
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void GetPosition(int *x, int *y) const ;
   bool Show(bool show);
 
   void SetRange(int minValue, int maxValue);
@@ -78,7 +75,12 @@ public:
   void SetTick(int tickPos) ;
 
   void Command(wxCommandEvent& event);
+	void 					MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
  protected:
+ 	wxStaticText*	m_macMinimumStatic ;
+ 	wxStaticText*	m_macMaximumStatic ;
+ 	wxStaticText*	m_macValueStatic ;
+
   int           m_rangeMin;
   int           m_rangeMax;
   int           m_pageSize;
diff --git a/include/wx/mac/spinbutt.h b/include/wx/mac/spinbutt.h
index afdb978c3f..caa1b77db2 100644
--- a/include/wx/mac/spinbutt.h
+++ b/include/wx/mac/spinbutt.h
@@ -63,10 +63,12 @@ class WXDLLEXPORT wxSpinButton: public wxControl
   ////////////////////////////////////////////////////////////////////////////
 
   void Command(wxCommandEvent& event) { ProcessCommand(event); };
+	virtual void MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
 
 protected:
   int   m_min;
   int   m_max;
+  int		m_value ;
 };
 
 class WXDLLEXPORT wxSpinEvent: public wxScrollEvent
diff --git a/include/wx/mac/statbmp.h b/include/wx/mac/statbmp.h
index f371fddd2d..f2162aeb10 100644
--- a/include/wx/mac/statbmp.h
+++ b/include/wx/mac/statbmp.h
@@ -47,7 +47,7 @@ class WXDLLEXPORT wxStaticBitmap: public wxControl
 
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {};
   virtual void ProcessCommand(wxCommandEvent& WXUNUSED(event)) {};
-
+	virtual void OnPaint( wxPaintEvent &event ) ;
   void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
 
   inline wxBitmap& GetBitmap() const { return (wxBitmap&) m_messageBitmap; }
@@ -57,7 +57,7 @@ class WXDLLEXPORT wxStaticBitmap: public wxControl
 
  protected:
   wxBitmap m_messageBitmap;
-
+	DECLARE_EVENT_TABLE() 
 };
 
 #endif
diff --git a/include/wx/mac/statbox.h b/include/wx/mac/statbox.h
index 1aa4a6f88a..a70d8e11c6 100644
--- a/include/wx/mac/statbox.h
+++ b/include/wx/mac/statbox.h
@@ -47,8 +47,8 @@ class WXDLLEXPORT wxStaticBox: public wxControl
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {};
   virtual void ProcessCommand(wxCommandEvent& WXUNUSED(event)) {};
 
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void SetLabel(const wxString& label);
+
+protected:
 
 DECLARE_EVENT_TABLE()
 };
diff --git a/include/wx/mac/stattext.h b/include/wx/mac/stattext.h
index aa8eaf229e..1117b6fc9a 100644
--- a/include/wx/mac/stattext.h
+++ b/include/wx/mac/stattext.h
@@ -44,9 +44,8 @@ class WXDLLEXPORT wxStaticText: public wxControl
            const wxString& name = wxStaticTextNameStr);
 
   // accessors
-  void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void SetLabel(const wxString&);
-
+  void SetLabel(const wxString& , bool resize );
+  void SetLabel( const wxString &str ) { SetLabel( str , true ) ; }
   // operations
   virtual void Command(wxCommandEvent& WXUNUSED(event)) {};
   virtual void ProcessCommand(wxCommandEvent& WXUNUSED(event)) {};
diff --git a/include/wx/mac/statusbr.h b/include/wx/mac/statusbr.h
index 28567b19e1..a83d84ae33 100644
--- a/include/wx/mac/statusbr.h
+++ b/include/wx/mac/statusbr.h
@@ -19,7 +19,7 @@
 
 #include "wx/generic/statusbr.h"
 
-class WXDLLEXPORT wxStatusBarXX : public wxStatusBar
+class WXDLLEXPORT wxStatusBarMac : public wxStatusBar
 {
   DECLARE_DYNAMIC_CLASS(wxStatusBarXX);
 
@@ -51,3 +51,4 @@ protected:
 };
 
 #endif
+    // _WX_STATBAR_H_
\ No newline at end of file
diff --git a/include/wx/mac/textctrl.h b/include/wx/mac/textctrl.h
index 675e21bb3f..da11bfad29 100644
--- a/include/wx/mac/textctrl.h
+++ b/include/wx/mac/textctrl.h
@@ -119,11 +119,12 @@ public:
   virtual void PositionToXY(long pos, long *x, long *y) const ;
   virtual void ShowPosition(long pos);
   virtual void Clear();
+	virtual bool MacCanFocus() const { return true ; }
   
   // callbacks
   // ---------
   void OnDropFiles(wxDropFilesEvent& event);
-//  void OnChar(wxKeyEvent& event); // Process 'enter' if required
+	void OnChar(wxKeyEvent& event); // Process 'enter' if required
 //  void OnEraseBackground(wxEraseEvent& event);
   
   // Implementation
diff --git a/include/wx/mac/timer.h b/include/wx/mac/timer.h
index e668d30bec..0f656dae8f 100644
--- a/include/wx/mac/timer.h
+++ b/include/wx/mac/timer.h
@@ -45,9 +45,5 @@ private:
     DECLARE_ABSTRACT_CLASS(wxTimer)
 };
 
-/* Note: these are implemented in common/timercmn.cpp, so need to implement them separately.
- * But you may need to modify timercmn.cpp.
- */
-
 #endif
     // _WX_TIMER_H_
diff --git a/include/wx/mac/toolbar.h b/include/wx/mac/toolbar.h
index e42c5827ef..6fe126b788 100644
--- a/include/wx/mac/toolbar.h
+++ b/include/wx/mac/toolbar.h
@@ -16,7 +16,10 @@
 #pragma interface "toolbar.h"
 #endif
 
+#if wxUSE_TOOLBAR
+
 #include "wx/tbarbase.h"
+#include "wx/dynarray.h"
 
 WXDLLEXPORT_DATA(extern const char*) wxToolBarNameStr;
 
@@ -62,16 +65,19 @@ class WXDLLEXPORT wxToolBar: public wxToolBarBase
 
   // Add all the buttons
   virtual bool CreateTools();
-  virtual void Layout() {}
+ 	virtual void LayoutButtons() {}
 
   // The post-tool-addition call. TODO: do here whatever's
   // necessary for completing the toolbar construction.
   bool Realize() { return CreateTools(); };
-
+	virtual void MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ;
 protected:
+	wxArrayPtrVoid	m_macToolHandles ;
 
 DECLARE_EVENT_TABLE()
 };
 
+#endif // wxUSE_TOOLBAR
+
 #endif
     // _WX_TOOLBAR_H_
diff --git a/include/wx/mac/window.h b/include/wx/mac/window.h
index 0d37a8b071..7c4bb6b097 100644
--- a/include/wx/mac/window.h
+++ b/include/wx/mac/window.h
@@ -16,577 +16,331 @@
 #pragma interface "window.h"
 #endif
 
-#include "wx/gdicmn.h"
-#include "wx/icon.h"
-#include "wx/cursor.h"
-#include "wx/pen.h"
-#include "wx/font.h"
-#include "wx/validate.h"
-#include "wx/event.h"
-#include "wx/string.h"
-#include "wx/list.h"
-#include "wx/region.h"
-#include "wx/accel.h"
-
-#define wxKEY_SHIFT     1
-#define wxKEY_CTRL      2
-
-/*
- * Base class for frame, panel, canvas, panel items, dialog box.
- *
- */
-
-/*
- * Event handler: windows have themselves as their event handlers
- * by default, but their event handlers could be set to another
- * object entirely. This separation can reduce the amount of
- * derivation required, and allow alteration of a window's functionality
- * (e.g. by a resource editor that temporarily switches event handlers).
- */
-
-class WXDLLEXPORT wxWindow;
-class WXDLLEXPORT wxEvent;
-class WXDLLEXPORT wxCommandEvent;
-class WXDLLEXPORT wxKeyEvent;
-class WXDLLEXPORT wxControl;
-class WXDLLEXPORT wxCursor;
-class WXDLLEXPORT wxColourMap;
-class WXDLLEXPORT wxFont;
-class WXDLLEXPORT wxMenu;
-class WXDLLEXPORT wxRect;
-class WXDLLEXPORT wxBitmap;
-class WXDLLEXPORT wxSizer;
-class WXDLLEXPORT wxList;
-class WXDLLEXPORT wxLayoutConstraints;
-class WXDLLEXPORT wxMouseEvent;
-class WXDLLEXPORT wxButton;
-class WXDLLEXPORT wxColour;
-class WXDLLEXPORT wxBrush;
-class WXDLLEXPORT wxPen;
-class WXDLLEXPORT wxIcon;
-class WXDLLEXPORT wxDC;
-class WXDLLEXPORT wxValidator;
-
-#if wxUSE_DRAG_AND_DROP
-class WXDLLEXPORT wxDropTarget;
-#endif
-
-#if wxUSE_WX_RESOURCES
-class WXDLLEXPORT wxResourceTable;
-class WXDLLEXPORT wxItemResource;
-#endif
-
-WXDLLEXPORT_DATA(extern const char*) wxPanelNameStr;
+// ---------------------------------------------------------------------------
+// forward declarations
+// ---------------------------------------------------------------------------
 
-WXDLLEXPORT_DATA(extern const wxSize) wxDefaultSize;
-WXDLLEXPORT_DATA(extern const wxPoint) wxDefaultPosition;
+class WXDLLEXPORT wxButton;
 
-//-----------------------------------------------------------------------------
-// wxClientData
-//-----------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+// constants
+// ---------------------------------------------------------------------------
 
-class wxClientData
+// FIXME does anybody use those? they're unused by wxWindows...
+enum
 {
-public:
-    wxClientData() { }
-    virtual ~wxClientData() { }
+    wxKEY_SHIFT = 1,
+    wxKEY_CTRL  = 2
 };
 
-//-----------------------------------------------------------------------------
-// wxStringClientData
-//-----------------------------------------------------------------------------
-
-class wxStringClientData: public wxClientData
+class WXDLLEXPORT wxWindow: public wxWindowBase
 {
-public:
-    wxStringClientData() { }
-    wxStringClientData( wxString &data ) { m_data = data; }
-    void SetData( wxString &data ) { m_data = data; }
-    wxString GetData() const { return m_data; }
-    
-private:
-    wxString  m_data;
-};
-
-class WXDLLEXPORT wxWindow: public wxEvtHandler
-{
-  DECLARE_ABSTRACT_CLASS(wxWindow)
+  DECLARE_DYNAMIC_CLASS(wxWindow);
 
   friend class wxDC;
   friend class wxPaintDC;
 
 public:
-  wxWindow();
-  inline wxWindow(wxWindow *parent, wxWindowID id,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize,
-           long style = 0,
-           const wxString& name = wxPanelNameStr)
-  {
-  	  m_children = new wxList;
-      Create(parent, id, pos, size, style, name);
-  }
-
-  virtual ~wxWindow();
-
-  bool Create(wxWindow *parent, wxWindowID id,
-           const wxPoint& pos = wxDefaultPosition,
-           const wxSize& size = wxDefaultSize,
-           long style = 0,
-           const wxString& name = wxPanelNameStr);
-
-  // Fit the window around the items
-  virtual void Fit();
-
-  // Show or hide the window
-  virtual bool Show(bool show);
-
-  // Is the window shown?
-  virtual bool IsShown() const;
-
-  // Raise the window to the top of the Z order
-  virtual void Raise();
-
-  // Lower the window to the bottom of the Z order
-  virtual void Lower();
-
-  // Is the window enabled?
-  virtual bool IsEnabled() const;
-
-  // For compatibility
-  inline bool Enabled() const { return IsEnabled(); }
-
-  // Dialog support: override these and call
-  // base class members to add functionality
-  // that can't be done using validators.
-
-  // Transfer values to controls. If returns FALSE,
-  // it's an application error (pops up a dialog)
-  virtual bool TransferDataToWindow();
-
-  // Transfer values from controls. If returns FALSE,
-  // transfer failed: don't quit
-  virtual bool TransferDataFromWindow();
-
-  // Validate controls. If returns FALSE,
-  // validation failed: don't quit
-  virtual bool Validate();
-
-  // Return code for dialogs
-  inline void SetReturnCode(int retCode);
-  inline int GetReturnCode();
-
-  // Set the cursor
-  virtual void SetCursor(const wxCursor& cursor);
-  inline virtual wxCursor *GetCursor() const { return (wxCursor *)& m_windowCursor; };
-
-  // Get the window with the focus
-  static wxWindow *FindFocus();
-
-  // Get character size
-  virtual int GetCharHeight() const;
-  virtual int GetCharWidth() const;
-
-  // Get overall window size
-  virtual void GetSize(int *width, int *height) const;
-  wxSize GetSize() const { int w, h; GetSize(& w, & h); return wxSize(w, h); }
-
-  // Get window position, relative to parent (or screen if no parent)
-  virtual void GetPosition(int *x, int *y) const;
-  wxPoint GetPosition() const
-    { int x, y; GetPosition(&x, &y); return wxPoint(x, y); }
-
-  // Get size and position
-  wxRect GetRect() const
-    { int x, y, w, h; GetPosition(& x, & y); GetSize(& w, & h); return wxRect(x, y, w, h); }
-
-  // Get client (application-useable) size
-  virtual void GetClientSize(int *width, int *height) const;
-  wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); }
-
-  // Set overall size and position
-  virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
-  void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO)
-    { SetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); }
-
-    // set size only
-  void SetSize(int width, int height)
-    { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); }
-  void SetSize(const wxSize& size)
-   { SetSize(-1, -1, size.x, size.y, wxSIZE_USE_EXISTING); }
-
-    // set position only
-  virtual void Move(int x, int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); }
-  void Move(const wxPoint& pt) { SetSize(pt.x, pt.y, -1, -1, wxSIZE_USE_EXISTING); }
-
-  // Set client size
-  virtual void SetClientSize(int width, int height);
-  void SetClientSize(const wxSize& sz) { SetClientSize(sz.x, sz.y); }
-
-  // Convert client to screen coordinates
-  virtual void ClientToScreen(int *x, int *y) const;
-  wxPoint ClientToScreen(const wxPoint& pt) const
-    { int x = pt.x; int y = pt.y; ClientToScreen(& x, & y); return wxPoint(x, y); }
-
-  // Convert screen to client coordinates
-  virtual void ScreenToClient(int *x, int *y) const;
-  wxPoint ScreenToClient(const wxPoint& pt) const
-    { int x = pt.x; int y = pt.y; ScreenToClient(& x, & y); return wxPoint(x, y); }
-
-  // Set the focus to this window
-  virtual void SetFocus();
-
-  // Capture/release mouse
-  virtual void CaptureMouse();
-  virtual void ReleaseMouse();
-
-  // Enable or disable the window
-  virtual void Enable(bool enable);
+	typedef struct MacWindowData
+	{
+			SInt16								m_macWindowBackgroundTheme ;
+			WindowRef							m_macWindow ;
+			ControlHandle					m_macRootControl ;
+			wxWindow*							m_macFocus ;
+	} MacWindowData ;
+	
+	
+    wxWindow() { Init(); }
+
+    wxWindow(wxWindow *parent,
+             wxWindowID id,
+             const wxPoint& pos = wxDefaultPosition,
+             const wxSize& size = wxDefaultSize,
+             long style = 0,
+             const wxString& name = wxPanelNameStr)
+    {
+        Init();
+        Create(parent, id, pos, size, style, name);
+    }
+
+    virtual ~wxWindow();
+
+    bool Create(wxWindow *parent,
+                wxWindowID id,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = 0,
+                const wxString& name = wxPanelNameStr);
+
+
+    // implement base class pure virtuals
+    virtual void SetTitle( const wxString& title);
+    virtual wxString GetTitle() const;
+
+    virtual void Raise();
+    virtual void Lower();
+
+    virtual bool Show( bool show = TRUE );
+    virtual bool Enable( bool enable = TRUE );
+
+    virtual void SetFocus();
+
+    virtual bool Reparent( wxWindow *newParent );
+
+    virtual void WarpPointer(int x, int y);
+    virtual void CaptureMouse();
+    virtual void ReleaseMouse();
+
+    virtual void Refresh( bool eraseBackground = TRUE,
+                          const wxRect *rect = (const wxRect *) NULL );
+    virtual void Clear();
+
+    virtual bool SetCursor( const wxCursor &cursor );
+    virtual bool SetFont( const wxFont &font );
+
+    virtual int GetCharHeight() const;
+    virtual int GetCharWidth() const;
+    virtual void GetTextExtent(const wxString& string,
+                               int *x, int *y,
+                               int *descent = (int *) NULL,
+                               int *externalLeading = (int *) NULL,
+                               const wxFont *theFont = (const wxFont *) NULL)
+                               const;
+
+    virtual bool DoPopupMenu( wxMenu *menu, int x, int y );
+
+    virtual void SetScrollbar( int orient, int pos, int thumbVisible,
+                               int range, bool refresh = TRUE );
+    virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE );
+    virtual int GetScrollPos( int orient ) const;
+    virtual int GetScrollThumb( int orient ) const;
+    virtual int GetScrollRange( int orient ) const;
+    virtual void ScrollWindow( int dx, int dy,
+                               const wxRect* rect = (wxRect *) NULL );
 
 #if wxUSE_DRAG_AND_DROP
-  // Associate a drop target with this window (if the window already had a drop
-  // target, it's deleted!) and return the current drop target (may be NULL).
-  void          SetDropTarget(wxDropTarget *pDropTarget);
-  wxDropTarget *GetDropTarget() const { return m_pDropTarget; }
-#endif
+    virtual void SetDropTarget( wxDropTarget *dropTarget );
+#endif // wxUSE_DRAG_AND_DROP
+
+    // Accept files for dragging
+    virtual void DragAcceptFiles(bool accept);
+
+#if WXWIN_COMPATIBILITY
+    // Set/get scroll attributes
+    virtual void SetScrollRange(int orient, int range, bool refresh = TRUE);
+    virtual void SetScrollPage(int orient, int page, bool refresh = TRUE);
+    virtual int OldGetScrollRange(int orient) const;
+    virtual int GetScrollPage(int orient) const;
+
+    // event handlers
+        // Handle a control command
+    virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
+
+        // Override to define new behaviour for default action (e.g. double
+        // clicking on a listbox)
+    virtual void OnDefaultAction(wxControl * WXUNUSED(initiatingItem)) { }
+#endif // WXWIN_COMPATIBILITY
+
+#if wxUSE_CARET && WXWIN_COMPATIBILITY
+    // caret manipulation (old MSW only functions, see wxCaret class for the
+    // new API)
+    void CreateCaret(int w, int h);
+    void CreateCaret(const wxBitmap *bitmap);
+    void DestroyCaret();
+    void ShowCaret(bool show);
+    void SetCaretPos(int x, int y);
+    void GetCaretPos(int *x, int *y) const;
+#endif // wxUSE_CARET
+
+    // Native resource loading (implemented in src/msw/nativdlg.cpp)
+    // FIXME: should they really be all virtual?
+    virtual bool LoadNativeDialog(wxWindow* parent, wxWindowID& id);
+    virtual bool LoadNativeDialog(wxWindow* parent, const wxString& name);
+    wxWindow* GetWindowChild1(wxWindowID id);
+    wxWindow* GetWindowChild(wxWindowID id);
+
+    // implementation from now on
+    // --------------------------
+
+	void MacClientToRootWindow( int *x , int *y ) const ;
+	void MacRootWindowToClient( int *x , int *y ) const ;
+
+
+    // simple accessors
+    // ----------------
+
+    WXHWND GetHWND() const { return m_hWnd; }
+    void SetHWND(WXHWND hWnd) { m_hWnd = hWnd; }
+	virtual WXWidget GetHandle() const { return (WXWidget) GetHWND(); }
+
+    bool GetUseCtl3D() const { return m_useCtl3D; }
+    bool GetTransparentBackground() const { return m_backgroundTransparent; }
+    void SetTransparent(bool t = TRUE) { m_backgroundTransparent = t; }
+
+    // event handlers
+    // --------------
+    void OnEraseBackground(wxEraseEvent& event);
+    void OnIdle(wxIdleEvent& event);
 
-  // Accept files for dragging
-  virtual void DragAcceptFiles(bool accept);
-
-  // Update region access
-  virtual wxRegion GetUpdateRegion() const;
-  virtual bool IsExposed(int x, int y, int w, int h) const;
-  virtual bool IsExposed(const wxPoint& pt) const;
-  virtual bool IsExposed(const wxRect& rect) const;
-
-  // Set/get the window title
-  virtual inline void SetTitle(const wxString& WXUNUSED(title)) {};
-  inline virtual wxString GetTitle() const { return wxString(""); };
-  // Most windows have the concept of a label; for frames, this is the
-  // title; for items, this is the label or button text.
-  inline virtual wxString GetLabel() const { return GetTitle(); }
-
-  // Set/get the window name (used for resource setting in X)
-  inline virtual wxString GetName() const;
-  inline virtual void SetName(const wxString& name);
-
-  // Centre the window
-  virtual void Centre(int direction) ;
-  inline void Center(int direction = wxHORIZONTAL) { Centre(direction); }
-
-  // Popup a menu
-  virtual bool PopupMenu(wxMenu *menu, int x, int y);
-
-  // Send the window a refresh event
-  virtual void Refresh(bool eraseBack = TRUE, const wxRect *rect = NULL);
-
-  // New functions that will replace the above.
-  virtual void SetScrollbar(int orient, int pos, int thumbVisible,
-    int range, bool refresh = TRUE);
-
-  virtual void SetScrollPos(int orient, int pos, bool refresh = TRUE);
-  virtual int GetScrollPos(int orient) const;
-  virtual int GetScrollRange(int orient) const;
-  virtual int GetScrollThumb(int orient) const;
-
-  virtual void ScrollWindow(int dx, int dy, const wxRect *rect = NULL);
-
-  // Caret manipulation
-  virtual void CreateCaret(int w, int h);
-  virtual void CreateCaret(const wxBitmap *bitmap);
-  virtual void DestroyCaret();
-  virtual void ShowCaret(bool show);
-  virtual void SetCaretPos(int x, int y);
-  virtual void GetCaretPos(int *x, int *y) const;
-
-  // Tell window how much it can be sized
-  virtual void SetSizeHints(int minW = -1, int minH = -1, int maxW = -1, int maxH = -1, int incW = -1, int incH = -1);
-
-  // Set/get the window's identifier
-  inline int GetId() const;
-  inline void SetId(int id);
-
-  virtual void SetAcceleratorTable(const wxAcceleratorTable& accel);
-  inline virtual wxAcceleratorTable& GetAcceleratorTable() const { return (wxAcceleratorTable&) m_acceleratorTable; }
-
-  // Make the window modal (all other windows unresponsive)
-  virtual void MakeModal(bool modal);
-
-  // Get the private handle (platform-dependent)
-  inline void *GetHandle() const;
-
-  // Set/get the window's relatives
-  inline wxWindow *GetParent() const;
-  inline void SetParent(wxWindow *p) ;
-  inline wxWindow *GetGrandParent() const;
-  inline wxList& GetChildren() const;
-
-  // Set/get the window's font
-  virtual void SetFont(const wxFont& f);
-  inline virtual wxFont& GetFont() const;
-
-  // Set/get the window's validator
-  void SetValidator(const wxValidator& validator);
-  inline wxValidator *GetValidator() const;
-
-  // Set/get the window's style
-  inline void SetWindowStyleFlag(long flag);
-  inline long GetWindowStyleFlag() const;
-
-  // Handle a control command
-  virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
-
-  // Set/get event handler
-  inline void SetEventHandler(wxEvtHandler *handler);
-  inline wxEvtHandler *GetEventHandler() const;
-
-  // Push/pop event handler (i.e. allow a chain of event handlers
-  // be searched)
-  void PushEventHandler(wxEvtHandler *handler) ;
-  wxEvtHandler *PopEventHandler(bool deleteHandler = FALSE) ;
-  
-  // Close the window by calling OnClose, posting a deletion
-  virtual bool Close(bool force = FALSE);
-
-  // Destroy the window (delayed, if a managed window)
-  virtual bool Destroy() ;
-
-  // Mode for telling default OnSize members to
-  // call Layout(), if not using Sizers, just top-down constraints
-  inline void SetAutoLayout(bool a);
-  inline bool GetAutoLayout() const;
-
-  // Set/get constraints
-  inline wxLayoutConstraints *GetConstraints() const;
-  void SetConstraints(wxLayoutConstraints *c);
-
-  // Set/get window background colour
-  inline virtual void SetBackgroundColour(const wxColour& col);
-  inline virtual wxColour GetBackgroundColour() const;
-
-  // Set/get window foreground colour
-  inline virtual void SetForegroundColour(const wxColour& col);
-  inline virtual wxColour GetForegroundColour() const;
-
-  // Get the default button, if there is one
-  inline virtual wxButton *GetDefaultItem() const;
-  inline virtual void SetDefaultItem(wxButton *but);
-
-  // Override to define new behaviour for default action (e.g. double clicking
-  // on a listbox)
-  virtual void OnDefaultAction(wxControl *initiatingItem);
-
-  // Resource loading
-#if wxUSE_WX_RESOURCES
-  virtual bool LoadFromResource(wxWindow *parent, const wxString& resourceName, const wxResourceTable *table = NULL);
-  virtual wxControl *CreateItem(const wxItemResource* childResource, const wxItemResource* parentResource,
-                                 const wxResourceTable *table = (const wxResourceTable *) NULL);
-#endif
+public:
+    // For implementation purposes - sometimes decorations make the client area
+    // smaller
+    virtual wxPoint GetClientAreaOrigin() const;
 
-  virtual void GetTextExtent(const wxString& string, int *x, int *y,
-                             int *descent = NULL,
-                             int *externalLeading = NULL,
-                             const wxFont *theFont = NULL, bool use16 = FALSE) const;
+    // Makes an adjustment to the window position (for example, a frame that has
+    // a toolbar that it manages itself).
+    virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags);
 
-  // Is the window retained?
-  inline bool IsRetained() const;
+    wxWindow *FindItem(long id) const;
+    wxWindow *FindItemByHWND(WXHWND hWnd, bool controlOnly = FALSE) const;
 
-  // Warp the pointer the given position
-  virtual void WarpPointer(int x_pos, int y_pos) ;
+    // Make a Windows extended style from the given wxWindows window style
+    static WXDWORD MakeExtendedStyle(long style,
+                                     bool eliminateBorders = TRUE);
+    // Determine whether 3D effects are wanted
+    WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D) const;
 
-  // Clear the window
-  virtual void Clear();
+    // MSW only: TRUE if this control is part of the main control
+    virtual bool ContainsHWND(WXHWND WXUNUSED(hWnd)) const { return FALSE; };
 
-  // Find a window by id or name
-  virtual wxWindow *FindWindow(long id);
-  virtual wxWindow *FindWindow(const wxString& name);
+ #if WXWIN_COMPATIBILITY
+    wxObject *GetChild(int number) const;
+    virtual void MSWDeviceToLogical(float *x, float *y) const;
+#endif // WXWIN_COMPATIBILITY
 
-  // Constraint operations
-  bool Layout();
-  void SetSizer(wxSizer *sizer);    // Adds sizer child to this window
-  inline wxSizer *GetSizer() const ;
-  inline wxWindow *GetSizerParent() const ;
-  inline void SetSizerParent(wxWindow *win);
+    // Create an appropriate wxWindow from a HWND
+    virtual wxWindow* CreateWindowFromHWND(wxWindow* parent, WXHWND hWnd);
 
-  // Do Update UI processing for controls
-  void UpdateWindowUI();
+    // Make sure the window style reflects the HWND style (roughly)
+    virtual void AdoptAttributesFromHWND();
 
-  void OnEraseBackground(wxEraseEvent& event);
-  void OnChar(wxKeyEvent& event);
-  void OnPaint(wxPaintEvent& event);
-  void OnIdle(wxIdleEvent& event);
+    // Setup background and foreground colours correctly
+    virtual void SetupColours();
 
-  // Does this window want to accept keyboard focus?
-  virtual bool AcceptsFocus() const;
 
-  virtual void PrepareDC( wxDC &dc ) {};
+#if WXWIN_COMPATIBILITY
+    void SetShowing(bool show) { (void)Show(show); }
+    bool IsUserEnabled() const { return IsEnabled(); }
+#endif // WXWIN_COMPATIBILITY
 
+    // Responds to colour changes: passes event on to children.
+    void OnSysColourChanged(wxSysColourChangedEvent& event);
 
-public:
-  ////////////////////////////////////////////////////////////////////////
-  //// IMPLEMENTATION
-  
-  // For implementation purposes - sometimes decorations make the client area
-  // smaller
-  virtual wxPoint GetClientAreaOrigin() const;
-
-  // Makes an adjustment to the window position (for example, a frame that has
-  // a toolbar that it manages itself).
-  virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags);
-
-  // Executes the default message
-  virtual long Default();
-
-/* TODO: you may need something like this
-  // Determine whether 3D effects are wanted
-  virtual WXDWORD Determine3DEffects(WXDWORD defaultBorderStyle, bool *want3D);
-*/
-
-  virtual void AddChild(wxWindow *child);         // Adds reference to the child object
-  virtual void RemoveChild(wxWindow *child);   // Removes reference to child
-                                       // (but doesn't delete the child object)
-  virtual void DestroyChildren();  // Removes and destroys all children
-
-  inline bool IsBeingDeleted() const { return FALSE; } // TODO: Should probably eliminate this
-
-  // Constraint implementation
-  void UnsetConstraints(wxLayoutConstraints *c);
-  inline wxList *GetConstraintsInvolvedIn() const ;
-  // Back-pointer to other windows we're involved with, so if we delete
-  // this window, we must delete any constraints we're involved with.
-  void AddConstraintReference(wxWindow *otherWin);
-  void RemoveConstraintReference(wxWindow *otherWin);
-  void DeleteRelatedConstraints();
-
-  virtual void ResetConstraints();
-  virtual void SetConstraintSizes(bool recurse = TRUE);
-  virtual bool LayoutPhase1(int *noChanges);
-  virtual bool LayoutPhase2(int *noChanges);
-  virtual bool DoPhase(int);
-  // Transforms from sizer coordinate space to actual
-  // parent coordinate space
-  virtual void TransformSizerToActual(int *x, int *y) const ;
-
-  // Set size with transformation to actual coordinates if nec.
-  virtual void SizerSetSize(int x, int y, int w, int h);
-  virtual void SizerMove(int x, int y);
-
-  // Only set/get the size/position of the constraint (if any)
-  virtual void SetSizeConstraint(int x, int y, int w, int h);
-  virtual void MoveConstraint(int x, int y);
-  virtual void GetSizeConstraint(int *w, int *h) const ;
-  virtual void GetClientSizeConstraint(int *w, int *h) const ;
-  virtual void GetPositionConstraint(int *x, int *y) const ;
-
-  // Dialog units translations. Implemented in wincmn.cpp.
-  wxPoint ConvertPixelsToDialog(const wxPoint& pt) ;
-  wxPoint ConvertDialogToPixels(const wxPoint& pt) ;
-  inline wxSize ConvertPixelsToDialog(const wxSize& sz)
-  { wxPoint pt(ConvertPixelsToDialog(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); }
-  inline wxSize ConvertDialogToPixels(const wxSize& sz)
-  { wxPoint pt(ConvertDialogToPixels(wxPoint(sz.x, sz.y))); return wxSize(pt.x, pt.y); }
-
-  wxObject *GetChild(int number) const ;
-
-  // Generates a new id for controls
-  static int NewControlId();
-
-  // Responds to colour changes: passes event on to children.
-  void OnSysColourChanged(wxSysColourChangedEvent& event);
-
-  // Transfers data to any child controls
-  void OnInitDialog(wxInitDialogEvent& event);
-
-  // Sends an OnInitDialog event, which in turns transfers data to
-  // to the window via validators.
-  virtual void InitDialog();
-
-  ////////////////////////////////////////////////////////////////////////
-  //// PROTECTED DATA
 protected:
-  int                   m_windowId;
-  long                  m_windowStyle; 			// Store the window's style
-  wxEvtHandler *        m_windowEventHandler; 	// Usually is 'this'
-  wxLayoutConstraints * m_constraints;           // Constraints for this window
-  wxList *              m_constraintsInvolvedIn; // List of constraints we're involved in
-  wxSizer *             m_windowSizer;                       // Window's top-level sizer (if any)
-  wxWindow *            m_sizerParent;                      // Window's parent sizer (if any)
-  bool                  m_autoLayout;                            // Whether to call Layout() in OnSize
-  wxWindow *            m_windowParent;                     // Each window always knows its parent
-  wxValidator *         m_windowValidator;
-  int                   m_minSizeX;
-  int                   m_minSizeY;
-  int                   m_maxSizeX;
-  int                   m_maxSizeY;
-
-  // Caret data
-  int                   m_caretWidth;
-  int                   m_caretHeight;
-  bool                  m_caretEnabled;
-  bool                  m_caretShown;
-  wxFont                m_windowFont;                               // Window's font
-  wxCursor              m_windowCursor;                        // Window's cursor
-  wxString              m_windowName;                            // Window name
-
-  wxButton *            m_defaultItem;
-
-  wxColour              m_backgroundColour ;
-  wxColour              m_foregroundColour ;
-  wxAcceleratorTable    m_acceleratorTable;
+    // the window handle
+    WXHWND                m_hWnd;
+
+    // the old window proc (we subclass all windows)
+    WXFARPROC             m_oldWndProc;
+
+    // additional (MSW specific) flags
+    bool                  m_useCtl3D:1; // Using CTL3D for this control
+    bool                  m_backgroundTransparent:1;
+    bool                  m_mouseInWindow:1;
+    bool                  m_doubleClickAllowed:1;
+    bool                  m_winCaptured:1;
+
+    // the size of one page for scrolling
+    int                   m_xThumbSize;
+    int                   m_yThumbSize;
+
+    WXHMENU               m_hMenu; // Menu, if any
+
+    // the return value of WM_GETDLGCODE handler
+    long m_lDlgCode;
+
+    // implement the base class pure virtuals
+    virtual void DoClientToScreen( int *x, int *y ) const;
+    virtual void DoScreenToClient( int *x, int *y ) const;
+    virtual void DoGetPosition( int *x, int *y ) const;
+    virtual void DoGetSize( int *width, int *height ) const;
+    virtual void DoGetClientSize( int *width, int *height ) const;
+    virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
+    virtual void DoSetClientSize(int width, int height);
+
+    // get the size which best suits the window: e.g., for a static text it
+    // will be the width and height of the text
+    virtual wxSize DoGetBestSize();
+
+    // move the window to the specified location and resize it: this is called
+    // from both DoSetSize() and DoSetClientSize() and would usually just call
+    // ::MoveWindow() except for composite controls which will want to arrange
+    // themselves inside the given rectangle
+    virtual void DoMoveWindow(int x, int y, int width, int height);
+
+#if wxUSE_TOOLTIPS
+    virtual void DoSetToolTip( wxToolTip *tip );
+#endif // wxUSE_TOOLTIPS
 
-#if wxUSE_DRAG_AND_DROP
-  wxDropTarget         *m_pDropTarget;    // the current drop target or NULL
-#endif  //USE_DRAG_AND_DROP
-
-public:
-  wxRegion              m_updateRegion;
-  wxList *              m_children;                           // Window's children
-  int                   m_returnCode;
+private:
+    // common part of all ctors
+    void Init();
 
-DECLARE_EVENT_TABLE()
+    DECLARE_NO_COPY_CLASS(wxWindow);
+    DECLARE_EVENT_TABLE()
 };
 
-////////////////////////////////////////////////////////////////////////
-//// INLINES
-
-inline void *wxWindow::GetHandle() const { return (void *)NULL; }
-inline int wxWindow::GetId() const { return m_windowId; }
-inline void wxWindow::SetId(int id) { m_windowId = id; }
-inline wxWindow *wxWindow::GetParent() const { return m_windowParent; }
-inline void wxWindow::SetParent(wxWindow *p) { m_windowParent = p; }
-inline wxWindow *wxWindow::GetGrandParent() const { return (m_windowParent ? m_windowParent->m_windowParent : (wxWindow*) NULL); }
-inline wxList& wxWindow::GetChildren() const { return (wxList&) * m_children; }
-inline wxFont& wxWindow::GetFont() const { return (wxFont&) m_windowFont; }
-inline wxString wxWindow::GetName() const { return m_windowName; }
-inline void wxWindow::SetName(const wxString& name) { m_windowName = name; }
-inline long wxWindow::GetWindowStyleFlag() const { return m_windowStyle; }
-inline void wxWindow::SetWindowStyleFlag(long flag) { m_windowStyle = flag; }
-inline void wxWindow::SetEventHandler(wxEvtHandler *handler) { m_windowEventHandler = handler; }
-inline wxEvtHandler *wxWindow::GetEventHandler() const { return m_windowEventHandler; }
-inline void wxWindow::SetAutoLayout(bool a) { m_autoLayout = a; }
-inline bool wxWindow::GetAutoLayout() const { return m_autoLayout; }
-inline wxLayoutConstraints *wxWindow::GetConstraints() const { return m_constraints; }
-inline void wxWindow::SetBackgroundColour(const wxColour& col) { m_backgroundColour = col; };
-inline wxColour wxWindow::GetBackgroundColour() const { return m_backgroundColour; };
-inline void wxWindow::SetForegroundColour(const wxColour& col) { m_foregroundColour = col; };
-inline wxColour wxWindow::GetForegroundColour() const { return m_foregroundColour; };
-
-inline wxButton *wxWindow::GetDefaultItem() const { return m_defaultItem; }
-inline void wxWindow::SetDefaultItem(wxButton *but) { m_defaultItem = but; }
-inline bool wxWindow::IsRetained() const { return ((m_windowStyle & wxRETAINED) == wxRETAINED); }
-
-inline wxList *wxWindow::GetConstraintsInvolvedIn() const { return m_constraintsInvolvedIn; }
-inline wxSizer *wxWindow::GetSizer() const { return m_windowSizer; }
-inline wxWindow *wxWindow::GetSizerParent() const { return m_sizerParent; }
-inline void wxWindow::SetSizerParent(wxWindow *win) { m_sizerParent = win; }
-inline wxValidator *wxWindow::GetValidator() const { return m_windowValidator; }
-inline void wxWindow::SetReturnCode(int retCode) { m_returnCode = retCode; }
-inline int wxWindow::GetReturnCode() { return m_returnCode; }
-
-// Get the active window.
-wxWindow* WXDLLEXPORT wxGetActiveWindow();
-
-WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows;
+// associate mac windows with wx counterparts
+
+wxWindow* wxFindWinFromMacWindow( WindowRef inWindow ) ;
+void wxAssociateWinWithMacWindow(WindowRef inWindow, wxWindow *win) ;
+void wxRemoveMacWindowAssociation(wxWindow *win) ;
+
+class wxMacFocusHelper
+{
+public :
+	wxMacFocusHelper( wxWindow * theWindow ) ;
+	~wxMacFocusHelper() ;
+	bool Ok() { return m_ok ; }
+
+private :
+	GrafPtr 	m_formerPort ;
+	GrafPtr		m_currentPort ;
+	bool			m_ok ;
+} ;
+
+class wxMacDrawingHelper
+{
+public :
+	wxMacDrawingHelper( wxWindow * theWindow ) ;
+	~wxMacDrawingHelper() ;
+	bool Ok() { return m_ok ; }
+
+private :
+	GrafPtr 	m_formerPort ;
+	GrafPtr		m_currentPort ;
+	PenState 	m_savedPenState ;
+	bool			m_ok ;
+} ;
+
+class wxMacFocusClientHelper
+{
+public :
+	wxMacFocusClientHelper( wxWindow * theWindow ) ;
+	~wxMacFocusClientHelper() ;
+	bool Ok() { return m_ok ; }
+
+private :
+	GrafPtr 	m_formerPort ;
+	GrafPtr		m_currentPort ;
+	bool			m_ok ;
+} ;
+
+class wxMacDrawingClientHelper
+{
+public :
+	wxMacDrawingClientHelper( wxWindow * theWindow ) ;
+	~wxMacDrawingClientHelper() ;
+	bool Ok() { return m_ok ; }
+
+private :
+	GrafPtr 	m_formerPort ;
+	GrafPtr		m_currentPort ;
+	PenState 	m_savedPenState ;
+	bool			m_ok ;
+} ;
 
 #endif
     // _WX_WINDOW_H_
diff --git a/include/wx/msw/gsockmsw.h b/include/wx/msw/gsockmsw.h
index e745060b58..6c3befccb5 100644
--- a/include/wx/msw/gsockmsw.h
+++ b/include/wx/msw/gsockmsw.h
@@ -23,12 +23,12 @@
 
 #include <winsock.h>
 
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* Definition of GSocket */
+typedef
 struct _GSocket
 {
   SOCKET m_fd;
diff --git a/include/wx/wx_cw.h b/include/wx/wx_cw.h
index c8bf670a26..5480949118 100644
--- a/include/wx/wx_cw.h
+++ b/include/wx/wx_cw.h
@@ -12,6 +12,29 @@
 #ifndef _WX_CW__
 #define _WX_CW__
 
+#if __option(profile)
+#ifdef __cplusplus
+	#if __POWERPC__
+		#include <wx_PPC++_prof.mch>
+	#elif __INTEL__
+		#include <wx_x86++_prof.mch>
+	#elif __CFM68K__
+		#include <wx_cfm++_prof.mch>
+	#else
+		#include <wx_68k++_prof.mch>
+	#endif
+#else
+	#if __POWERPC__
+		#include <wx_PPC_prof.mch>
+	#elif __INTEL__
+		#include <wx_x86_prof.mch>
+	#elif __CFM68K__
+		#include <wx_cfm_prof.mch>
+	#else
+		#include <wx_68k_prof.mch>
+	#endif
+#endif
+#else
 #ifdef __cplusplus
 	#if __POWERPC__
 		#include <wx_PPC++.mch>
@@ -33,6 +56,6 @@
 		#include <wx_68k.mch>
 	#endif
 #endif
-
+#endif
 #endif
     // _WX_CW__
diff --git a/include/wx/wx_cw_cm.h b/include/wx/wx_cw_cm.h
index dd2c3fa06c..2fe7cf9678 100644
--- a/include/wx/wx_cw_cm.h
+++ b/include/wx/wx_cw_cm.h
@@ -9,7 +9,16 @@
 #if (__MWERKS__ < 0x0900) || macintosh
     #define __MAC__
     #define __WXMAC__
-    #define	USE_PRECOMPILED_MAC_HEADERS	1  /*Set to 0 if you don't want to use precompiled MacHeaders*/
+    #if TARGET_CARBON
+	    #define	USE_PRECOMPILED_MAC_HEADERS	0  /*Set to 0 if you don't want to use precompiled MacHeaders*/
+			#ifdef __cplusplus
+					#include <MacHeadersPPCX++>
+			#else
+					#include <MacHeadersPPCX>
+			#endif
+		#else
+	    #define	USE_PRECOMPILED_MAC_HEADERS	1  /*Set to 0 if you don't want to use precompiled MacHeaders*/
+		#endif
 // automatically includes MacHeaders
 #elif (__MWERKS__ >= 0x0900) && __INTEL__
     #define __WXMSW__
@@ -27,19 +36,23 @@
 #ifdef __WXMSW__
     #include <ansi_prefix.win32.h>
     #include <ansi_parms.h>
+    #ifdef __MWERKS__
     #if defined( __MSL__ ) && __MSL__ >= 0x5012
 			#define	fileno	_fileno
 			#define	fdopen	_fdopen
 			#define	tell	_tell
     #endif
+    #endif
 #elif defined( __WXMAC__)
     #include <ansi_prefix.mac.h>
 #endif
 
 #define USE_DEFINE
+
 // in order to avoid problems further down in wxWindows
 
 #ifdef __cplusplus
+
 extern "C" 
 {
 #endif
diff --git a/include/wx/wx_cw_d.h b/include/wx/wx_cw_d.h
index f56d8cdc0a..75a2a5ed2e 100644
--- a/include/wx/wx_cw_d.h
+++ b/include/wx/wx_cw_d.h
@@ -12,6 +12,9 @@
 #ifndef _WX_CW__
 #define _WX_CW__
 
+#if __option(profile)
+#error "profiling is not supported in debug versions"
+#else
 #ifdef __cplusplus
 	#if __POWERPC__
 		#include <wx_PPC++_d.mch>
@@ -33,6 +36,7 @@
 		#include <wx_68k_d.mch>
 	#endif
 #endif
+#endif
 
 #endif
     // _WX_CW__
diff --git a/include/wx_cw.pch b/include/wx_cw.pch
index c5efcf3859..8a5a49d142 100644
--- a/include/wx_cw.pch
+++ b/include/wx_cw.pch
@@ -1,16 +1,26 @@
+#if __option (profile)
 #if __POWERPC__
-	#pragma precompile_target "wx_PPC.mch"
-	
+	#pragma precompile_target "wx_PPC_prof.mch"	
+#elif __INTEL__
+	#pragma precompile_target "wx_x86_prof.mch"
+#elif __CFM68K__
+	#pragma precompile_target "wx_cfm_prof.mch"
+#else
+	#pragma precompile_target "wx_68k_prof.mch"
+#endif
+#else
+#if __POWERPC__
+	#pragma precompile_target "wx_PPC.mch"	
 #elif __INTEL__
 	#pragma precompile_target "wx_x86.mch"
-
 #elif __CFM68K__
 	#pragma precompile_target "wx_cfm.mch"
-	
 #else
 	#pragma precompile_target "wx_68k.mch"
 #endif
+#endif
 
 #pragma once on
 #undef WX_PRECOMP
+#define wxUSE_GUI 1
 #include "wx/wx_cw_cm.h"
diff --git a/include/wx_cw.pch++ b/include/wx_cw.pch++
index 8ff1e4604b..a9f6924473 100644
--- a/include/wx_cw.pch++
+++ b/include/wx_cw.pch++
@@ -1,18 +1,27 @@
+#if __option (profile)
+#if __POWERPC__
+	#pragma precompile_target "wx_PPC++_prof.mch"
+#elif __INTEL_
+	#pragma precompile_target "wx_x86Prof++_prof.mch"
+#elif __CFM68K__
+	#pragma precompile_target "wx_cfmProf++_prof.mch"
+#else
+	#pragma precompile_target "wx_68kProf++_prof.mch"
+#endif
+#else
 #if __POWERPC__
 	#pragma precompile_target "wx_PPC++.mch"
-	
 #elif __INTEL__
-
 	#pragma precompile_target "wx_x86++.mch"
-
-
 #elif __CFM68K__
 	#pragma precompile_target "wx_cfm++.mch"
-	
 #else
 	#pragma precompile_target "wx_68k++.mch"
 #endif
+#endif
 
 #pragma once on
 #define WX_PRECOMP
+#define wxUSE_GUI 1
 #include "wx/wx_cw_cm.h"
+#include "wx/wxprec.h"
\ No newline at end of file
diff --git a/include/wx_cw_d.pch b/include/wx_cw_d.pch
index 12b3530b86..a38cd139e5 100644
--- a/include/wx_cw_d.pch
+++ b/include/wx_cw_d.pch
@@ -1,3 +1,6 @@
+#if __option (profile)	
+	#error "profiling is not supported for debug targets"
+#else
 #if __POWERPC__
 	#pragma precompile_target "wx_PPC_d.mch"
 	
@@ -10,8 +13,13 @@
 #else
 	#pragma precompile_target "wx_68k_d.mch"
 #endif
-
+#endif
 #pragma once on
 #undef WX_PRECOMP
-#define __WXDEBUG__
+#define __WXDEBUG__ 1
+#define wxUSE_GUI 1
 #include "wx/wx_cw_cm.h"
+#ifdef __WXMSW__
+    #include <windows.h>
+    #include "wx/msw/winundef.h"
+#endif
diff --git a/include/wx_cw_d.pch++ b/include/wx_cw_d.pch++
index 4659812a8b..cb5643a468 100644
--- a/include/wx_cw_d.pch++
+++ b/include/wx_cw_d.pch++
@@ -1,19 +1,24 @@
+#if __option (profile)	
+	#error "profiling is not supported for debug targets"
+#else
 #if __POWERPC__
 	#pragma precompile_target "wx_PPC++_d.mch"
-	
 #elif __INTEL__
-
 	#pragma precompile_target "wx_x86++_d.mch"
-
-
 #elif __CFM68K__
 	#pragma precompile_target "wx_cfm++_d.mch"
-	
 #else
 	#pragma precompile_target "wx_68k++_d.mch"
 #endif
+#endif
 
 #pragma once on
 #define WX_PRECOMP
-#define __WXDEBUG__
+#define __WXDEBUG__ 1
+#define wxUSE_GUI 1
+
+
 #include "wx/wx_cw_cm.h"
+#ifdef WX_PRECOMP
+#include "wx/wxprec.h"
+#endif
\ No newline at end of file
diff --git a/samples/help/doc/ClassGraph.class b/samples/help/doc/ClassGraph.class
index 3c6afea84468c9da332caf0b750afca416c20ed1..2ebf9199b816fbf93a6807749bd2fe37c3213ed8 100644
GIT binary patch
delta 5
Mcmeyx;Wxn#00&<JF8}}l

literal 1146
zcma)5SyR+N5dOj*$%Yg{P!JLCV+qH4;Kd>qEQjcVl$2OJS;OwIM#CgEnFaJ;S?W@y
zRsH~flx5Ez5K10=NOz~Fd;06Idw&1<@e3(TVBNxF3lA+kvXHlM-^5cBFHF2Lv0!4x
z#Iy;|#H5XG4BN1ANsAF1S=`jtbsH8gXzPmhUCqJ7<sA90>E9b#Ty(IC=MLtu;@|;p
zI~d29gD1G-U>0{BEMnQgOUyecV^jyPX))zs3HJ=xrBK9*3AM?BIyW$qA1!}id#u2s
zDB!9v*Hjdw_<<@K$ZqqUP*R}V3JaL16*iRgMU76+tg$`6##AWh>q>>ffR}Gyx33DN
za5oAC7pmB)al&aJ#i~_;w0KbAk@5+cf&La43S0`p{WAL$))j?pgmqcrOMXB|296+8
z)PlduMNGMbrmtKISR5})7QJ6*f(PWg)y9*=-A0pi889n4mlK3kest47Z;h)HWDpm=
zs8TluEGA{RU-hMd4BJthv>i#l!=>ca4ga&I>!^<-77V0);Zu6@Oep3HeL>rqoC4h*
z={6{_6jtfdo^n`W!6uVF+YU6;tmJXCTyKXHK{I^wx~yk&Ova=JW1zd~>2R8hx$4*s
zHM`Cv+vUw>h7&_<g{(5cYFrjIGwKvd|6Pv%_nf+Ut@KVey6j*A)bZ5yiGAEDwN0%o
zgq1q2g_>tEv6gBMDm$aepCvByD>^AbPjgp5D?rZ+q@f=Y$u6>sm?HU%{yrjy4C!~C
zn`zLld2X82s^=P{);zb1)O6Z&Q>4FQ(EAB{D|HCBfwN>=TVq4%@d>YiA^Of8qW?Pv
oJntI@8t8r7HqJEA^My)i5cFi*h5JZrP#NzK=R3y*a&)2e7rP%R2><{9

diff --git a/samples/help/doc/ClassGraphPanel.class b/samples/help/doc/ClassGraphPanel.class
index 4e3b5162cb2ae3b64c20d7b16d5e2918121d36df..4c0f4f9e1bf864921b12b0634f8785045566ec6c 100644
GIT binary patch
delta 6
Ncmew&-^Vzi4*&{60>J<P

literal 4084
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

diff --git a/samples/help/doc/ClassLayout.class b/samples/help/doc/ClassLayout.class
index 40eb67e0e98927ee4f295707fa8d0b1dc7888374..46457cfdd1ddf861a6bd933502949490199e45cc 100644
GIT binary patch
delta 7
OcmaDO^qXfxH5&jA3IjI)

delta 766
zcmYjO%Wl&^6g`e-CUK}xV;GugJAslygB@NAys$+6fF(#Qki4)&g|hB~3S|=(T_b@i
zu_=mV!KxtJL1M$6FW?{e0~Y1pNrGZ)?#zA6oO93pyYVMHKUS0NXpSh_>{W;(S)tFy
zMxw%lui($aYn+gMN9Q&zpJS`k2aMNJjrG(i-YioUq`Ub!u5sfDncm1xgpEqXhsi|x
zi7N0c)~d#}v}u|(OxohDlLjUzF)*zXTbUL!Y_9o<VCNPmb*AMqx%3k`Ri0M%?BYvA
zfJ4IS)3VtDRQy2u`LM+GVL8DzJ)M!WM{Ac}%I3IoPMz>~jC|R|5d@kPdByx6`=bIc
zVoQvFVj~qsFllK-iLNw~=rT?wa^A+@aX(8GC&N={tti-^VJFgx<en4=UC7Q5xR9Ot
zp4~mWn5{&9|6j=v4f+AaP2E|L^zd>;(zB%WB^po1HN9j?S{FEoHF0!oi6FC8Mv-!M
zLa^>MnhH+~!u{<hvcRucQ<=L!m3)ClLybwN;3r%*&Bd|8mQgOnM%TE<<(;&}ZOS|e
zbnp?%PXhLnHe-<tJ=4<eeAIO!9l96t3WEaLw79CPgT=TgNC-6NfnGo|1)IxpR^#C}
l9PlvbxXOHQhF*=^OyF*f{Te${>1jz#Jz9zRl;msR?LUT<l~n)$

diff --git a/samples/help/doc/NavigatorButton.class b/samples/help/doc/NavigatorButton.class
index 9f447021d04f4e91483db54bf2d21718de3f4f43..0c1e6cdd422f0027197d61492e4357a51a6e200b 100644
GIT binary patch
delta 7
OcmX@hJCSFDAR7P+EdoCP

delta 197
zcmbQpbC!35AX~lECI;Ev4D6BH86>o~F^CE=1Bq=6BHI`QwYD$_9cSRy0@7mJ7=(e8
z@+=5f2FTsW00N8*2@C;1G7ZSqWMBre7#L&`CJHeEP1D-OAis@45n?Dzn<qmiSeq>a
zg8>5*P$vU}49LP`3}Qe^1;pIRAkD<EoPi~rWexKhpkj6g5e9Jv0kExJK$3|e7XZwq
BBai?9

diff --git a/src/common/db.cpp b/src/common/db.cpp
index 073e09d252..91f822b736 100644
--- a/src/common/db.cpp
+++ b/src/common/db.cpp
@@ -96,6 +96,10 @@ DbList WXDLLEXPORT *PtrBegDbList = 0;
 	extern wxList TablesInUse;
 #endif
 
+#ifdef __MWERKS__
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#endif
 // SQL Log defaults to be used by GetDbConnection
 enum sqlLog SQLLOGstate				= sqlLogOFF;
 
diff --git a/src/common/dbtable.cpp b/src/common/dbtable.cpp
index 1bec4d64fb..1ee5fb07ed 100644
--- a/src/common/dbtable.cpp
+++ b/src/common/dbtable.cpp
@@ -76,6 +76,11 @@
 	#include "wx/dbtable.h"
 #endif
 
+#ifdef __MWERKS__
+#define stricmp _stricmp
+#define strnicmp _strnicmp
+#endif
+
 #ifdef __UNIX__
 // The HPUX preprocessor lines below were commented out on 8/20/97
 // because macros.h currently redefines DEBUG and is unneeded.
diff --git a/src/common/socket.cpp b/src/common/socket.cpp
index cb112f0642..0f7a633165 100644
--- a/src/common/socket.cpp
+++ b/src/common/socket.cpp
@@ -45,7 +45,7 @@
 #include "wx/socket.h"
 
 
-#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMOTIF__)
+#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMOTIF__) || defined(__WXMAC__)
     #define PROCESS_EVENTS() wxYield()
 #elif defined(__WXGTK__)
     #include <gtk/gtk.h>
diff --git a/src/jpeg/jconfig.h b/src/jpeg/jconfig.h
index 83d28b7bdb..7367459c4c 100644
--- a/src/jpeg/jconfig.h
+++ b/src/jpeg/jconfig.h
@@ -11,6 +11,16 @@
 /* see jconfig.doc for explanations */
 
 /* use wxWindows' configure */
+#ifdef __MWERKS__
+#if (__MWERKS__ < 0x0900) || macintosh
+    #define __WXMAC__
+		#define USE_MAC_MEMMGR
+// automatically includes MacHeaders
+#elif (__MWERKS__ >= 0x0900) && __INTEL__
+    #define __WXMSW__
+#endif
+#endif
+
 #include "wx/setup.h"
 
 #define HAVE_PROTOTYPES
diff --git a/src/mac/app.cpp b/src/mac/app.cpp
index 3061f99aea..fd5a0009b0 100644
--- a/src/mac/app.cpp
+++ b/src/mac/app.cpp
@@ -37,10 +37,18 @@
 
 // mac
 
+#if __option(profile)
+	#include <profiler.h>
+#endif	
+
 #include "apprsrc.h"
 
+#include <wx/mac/uma.h>
+
 extern char *wxBuffer;
 extern wxList wxPendingDelete;
+extern wxList *wxWinMacWindowList;
+extern wxList *wxWinMacControlList;
 
 wxApp *wxTheApp = NULL;
 
@@ -51,56 +59,279 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
 END_EVENT_TABLE()
 #endif
 
-long wxApp::sm_lastMessageTime = 0;
 
 const short	kMacMinHeap = (29 * 1024) ;
 // platform specific static variables
 
-bool					gMacHasAppearance = false ;
-long					gMacAppearanceVersion = 0 ;
-RgnHandle			gMacCursorRgn = NULL ;
+const short kwxMacMenuBarResource = 1 ;
+const short kwxMacAppleMenuId = 1 ;
+
+RgnHandle			wxApp::s_macCursorRgn = NULL;
+wxWindow*			wxApp::s_captureWindow = NULL ;
+int					wxApp::s_lastMouseDown = 0 ;
+long 					wxApp::sm_lastMessageTime = 0;
+
+#ifdef __WXMAC__
+
+bool	wxApp::s_macDefaultEncodingIsPC = true ;
+bool wxApp::s_macSupportPCMenuShortcuts = true ;
+long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
+wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
+
+OSErr AEHandleODoc( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEODoc( event , reply) ;
+}
+
+OSErr AEHandleOApp( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEOApp( event , reply ) ;
+}
+
+OSErr AEHandlePDoc( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEPDoc( event , reply ) ;
+}
+
+OSErr AEHandleQuit( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEQuit( event , reply) ;
+}
+
+OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) 
+{
+	ProcessSerialNumber PSN ;
+	PSN.highLongOfPSN = 0 ;
+	PSN.lowLongOfPSN = kCurrentProcess ;
+	SetFrontProcess( &PSN ) ;
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) 
+{
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) 
+{
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) 
+{
+	wxWindow* win = GetTopWindow() ;
+	if ( win )
+	{
+		win->Close(TRUE ) ;
+	}
+	else
+	{
+		ExitMainLoop() ;
+	}
+	return noErr ;
+}
+
+char StringMac[] = 	"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+					"\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+					"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xae\xaf"
+					"\xb1\xb4\xb5\xb6\xbb\xbc\xbe\xbf"
+					"\xc0\xc1\xc2\xc4\xc7\xc8\xc9\xcb\xcc\xcd\xce\xcf"
+					"\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xca\xdb" ;
+
+char StringANSI[] = "\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8"
+					"\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC"
+					"\x86\xBA\xA2\xA3\xA7\x95\xB6\xDF\xAE\xA9\x99\xB4\xA8\xC6\xD8"
+					"\xB1\xA5\xB5\xF0\xAA\xBA\xE6\xF8"
+					"\xBF\xA1\xAC\x83\xAB\xBB\x85\xC0\xC3\xD5\x8C\x9C"
+					"\x96\x97\x93\x94\x91\x92\xF7\xFF\xA0\x80" ;
+
+void wxMacConvertFromPC( const char *from , char *to , int len )
+{
+	char *c ;
+	if ( from == to )
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringANSI , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringMac[ c - StringANSI] ;
+			}	
+			++to ;
+			++from ;
+		}
+	}
+	else
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringANSI , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringMac[ c - StringANSI] ;
+			}	
+			else
+			{
+				*to = *from ;
+			}
+			++to ;
+			++from ;
+		}
+	}
+}
+
+void wxMacConvertToPC( const char *from , char *to , int len )
+{
+	char *c ;
+	if ( from == to )
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringMac , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringANSI[ c - StringMac] ;
+			}	
+			++to ;
+			++from ;
+		}
+	}
+	else
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringMac , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringANSI[ c - StringMac] ;
+			}	
+			else
+			{
+				*to = *from ;
+			}
+			++to ;
+			++from ;
+		}
+	}
+}
+
+void wxMacConvertFromPC( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+}
+
+void wxMacConvertFromPCForControls( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+	for ( int i = 0 ; i < strlen ( ptr ) ; i++ )
+	{
+		if ( ptr[i] == '&' && ptr[i]+1 != ' ' )
+		{
+			memmove( &ptr[i] , &ptr[i+1] , strlen( &ptr[i+1] ) + 1) ;
+		}
+	}
+}
+
+void wxMacConvertFromPC( unsigned char *p ) 
+{
+	char *ptr = (char*) p + 1 ;
+	int len = p[0] ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+}
+
+extern char *wxBuffer ;
+
+wxString wxMacMakeMacStringFromPC( const char * p ) 
+{
+	const char *ptr = p ;
+	int len = strlen ( p ) ;
+	char *buf = wxBuffer ;
+	
+	if ( len >= BUFSIZ + 512 )
+	{
+		buf = new char [len+1] ;
+	}
+
+	wxMacConvertFromPC( ptr , buf , len ) ;
+	buf[len] = 0 ;
+	wxString result( buf ) ;
+	if ( buf != wxBuffer )
+		delete buf ;
+	return result ;
+}
+
+
+void wxMacConvertToPC( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertToPC( ptr , ptr , len ) ;
+}
+
+void wxMacConvertToPC( unsigned char *p ) 
+{
+	char *ptr = (char*) p + 1 ;
+	int len = p[0] ;
+	
+	wxMacConvertToPC( ptr , ptr , len ) ;
+}
+
+wxString wxMacMakePCStringFromMac( const char * p ) 
+{
+	const char *ptr = p ;
+	int len = strlen ( p ) ;
+	char *buf = wxBuffer ;
+	
+	if ( len >= BUFSIZ + 512 )
+	{
+		buf = new char [len+1] ;
+	}
+
+	wxMacConvertToPC( ptr , buf , len ) ;
+	buf[len] = 0 ;
+	
+	wxString result( buf ) ;
+	if ( buf != wxBuffer )
+		delete buf ;
+	return result ;
+}
 
+#endif
 
 bool wxApp::Initialize()
 {
   int error = 0 ;
 	
   // Mac-specific
-	long total,contig;
   
-  // init all managers
-
-	::InitGraf(&qd.thePort);
-	::InitFonts();
-	::InitWindows();
-	::InitMenus();
-	::TEInit();
-	::InitDialogs(0L);
-	::InitCursor();
-	CursHandle aCursHandle = ::GetCursor(watchCursor);	// Watch should be in system
-	if (aCursHandle)
-		::SetCursor(*aCursHandle);											
-	::FlushEvents(everyEvent, 0);
-	
-	// setup memory of application 
-	
-	::MaxApplZone();
-	for (long i = 1; i <= 4; i++)
-		::MoreMasters();
-	PurgeSpace(&total, &contig);
-	::SetCursor( &qd.arrow ) ; 
+  UMAInitToolbox( 4 ) ;
+	UMAShowWatchCursor() ;
 
+	AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerProc(AEHandleODoc) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerProc(AEHandleOApp) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerProc(AEHandlePDoc) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerProc(AEHandleQuit) , (long) wxTheApp  , FALSE ) ;
 #if 0
-	InitAEHandlers();
-	InitializeAECore() ;
 	GUSISetup(GUSIwithInternetSockets);
 #endif
 
+	
   // test the minimal configuration necessary
 
 	long theSystem ;
 	long theMachine;
-	long theAppearance ;
 
 	if (Gestalt(gestaltMachineType, &theMachine) != noErr)
 	{
@@ -114,32 +345,25 @@ bool wxApp::Initialize()
 	{
 		error = kMacSTROldSystem  ;
 	}	
-	else if ( theSystem < 0x0700 )
+	else if ( theSystem < 0x0750 )
 	{
 		error = kMacSTROldSystem  ;
 	}
+	#if !TARGET_CARBON
 	else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap)
 	{
 		error = kMacSTRSmallSize;
 	}
+	#endif
+	/*
 	else
 	{
-		if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr )
+		if ( !UMAHasAppearance() )
 		{
-			gMacHasAppearance = true ;
-			RegisterAppearanceClient();
-			if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr )
-			{
-				gMacAppearanceVersion = theAppearance ;
-			}
-			else
-			{
-				gMacAppearanceVersion = 0x0100 ;
-			}
-		}
-		else
 			error = kMacSTRNoPre8Yet ;
+		}
 	}
+	*/
 
 	// if we encountered any problems so far, give the error code and exit immediately
   	
@@ -147,19 +371,23 @@ bool wxApp::Initialize()
   {  	
 		short itemHit;
 		Str255 message;
-	
-		SetCursor(&qd.arrow);
+
 		GetIndString(message, 128, error);
-		ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
-		itemHit = Alert(129, nil);
+		UMAShowArrowCursor() ;
+		ParamText("\pFatal Error", message, (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+		itemHit = Alert(128, nil);
 	  return FALSE ;
   }  
-  
+
+#if __option(profile)
+	ProfilerInit( collectDetailed, bestTimeBase , 20000 , 30 ) ;
+#endif	
+
   // now avoid exceptions thrown for new (bad_alloc)
   
   std::__throws_bad_alloc = FALSE ;
   
-	gMacCursorRgn = ::NewRgn() ;
+	s_macCursorRgn = ::NewRgn() ;
 
 #ifdef __WXMSW__
   wxBuffer = new char[1500];
@@ -191,8 +419,14 @@ bool wxApp::Initialize()
   wxBitmap::InitStandardHandlers();
 
   wxModule::RegisterModules();
-  wxASSERT( wxModule::InitializeModules() == TRUE );
+  if (!wxModule::InitializeModules())
+     return FALSE;
 
+  wxWinMacWindowList = new wxList(wxKEY_INTEGER);
+  wxWinMacControlList = new wxList(wxKEY_INTEGER);
+
+	UMAShowArrowCursor() ;
+  
   return TRUE;
 }
 
@@ -228,8 +462,16 @@ void wxApp::CleanUp()
   delete[] wxBuffer;
   wxBuffer = NULL;
 
+  if (wxWinMacWindowList)
+    delete wxWinMacWindowList ;
+
   wxClassInfo::CleanUpClasses();
 
+#if __option(profile)
+	ProfilerDump( "\papp.prof" ) ;
+	ProfilerTerm() ;
+#endif	
+
   delete wxTheApp;
   wxTheApp = NULL;
   
@@ -253,8 +495,8 @@ void wxApp::CleanUp()
   delete wxLog::SetActiveTarget(NULL);
 
 	::PrClose() ;
-	if (gMacCursorRgn)
-		::DisposeRgn(gMacCursorRgn);
+	if (s_macCursorRgn)
+		::DisposeRgn(s_macCursorRgn);
 	#if 0
 		TerminateAE() ;
 	#endif
@@ -281,11 +523,18 @@ int wxEntry( int argc, char *argv[] )
     return 0;
   };
 
+#ifdef __WXMAC__
+  argc = 1 ; // currently we don't support files as parameters
+#endif
+
   wxTheApp->argc = argc;
   wxTheApp->argv = argv;
 
   // GUI-specific initialization, such as creating an app context.
   wxTheApp->OnInitGui();
+  
+  // we could try to get the open apple events here to adjust argc and argv better
+  
 
   // Here frames insert themselves automatically
   // into wxTopLevelWindows by getting created
@@ -324,22 +573,19 @@ wxApp::wxApp()
   m_appName = "";
   argc = 0;
   argv = NULL;
-#ifdef __WXMSW__
+
   m_printMode = wxPRINT_WINDOWS;
-#else
-  m_printMode = wxPRINT_POSTSCRIPT;
-#endif
+
   m_exitOnFrameDelete = TRUE;
   m_auto3D = TRUE;
 }
 
 bool wxApp::Initialized()
 {
+  if (GetTopWindow())
     return TRUE;
-//  if (GetTopWindow())
-//    return TRUE;
-//  else
-//    return FALSE;
+  else
+    return FALSE;
 }
 
 int wxApp::MainLoop()
@@ -372,16 +618,15 @@ void wxApp::ExitMainLoop()
 // Is a message/event pending?
 bool wxApp::Pending()
 {
-/* TODO.
- */
-  return FALSE;
+	EventRecord event ;
+
+  return EventAvail( everyEvent , &event ) ;
 }
 
 // Dispatch a message.
 void wxApp::Dispatch()
 {
-/* TODO.
- */
+	MacDoOneEvent() ;
 }
 
 void wxApp::OnIdle(wxIdleEvent& event)
@@ -493,32 +738,70 @@ void wxExit()
 // Yield to other processes
 bool wxYield()
 {
-#if 0
-	::YieldToOtherThreads() ;
-	::SystemTime() ;
-#endif
+//	YieldToAnyThread() ;
+	SystemTask() ;
   return TRUE;
 }
 
 // platform specifics 
 
+void wxApp::MacSuspend( bool convertClipboard )
+{
+		s_lastMouseDown = 0 ;
+		if( convertClipboard ) 
+		{
+			MacConvertPrivateToPublicScrap() ;
+		}
+		
+		UMAHideFloatingWindows() ;
+}
+
+void wxApp::MacResume( bool convertClipboard )
+{
+		s_lastMouseDown = 0 ;
+		if( convertClipboard ) 
+		{
+			MacConvertPublicToPrivateScrap() ;
+		}
+		
+		UMAShowFloatingWindows() ;
+}
+
+void wxApp::MacConvertPrivateToPublicScrap()
+{
+	::ZeroScrap();
+	::TEToScrap();
+}
+
+void wxApp::MacConvertPublicToPrivateScrap()
+{
+	::TEFromScrap() ;
+}
+
 void wxApp::MacDoOneEvent() 
 {
   EventRecord event ;
 
-	long sleepTime = 60;
+	long sleepTime = ::GetCaretTime();
 
-	if (WaitNextEvent(everyEvent, &event,sleepTime, gMacCursorRgn))
+	if (WaitNextEvent(everyEvent, &event,sleepTime, s_macCursorRgn))
 	{
     MacHandleOneEvent( &event );
 	}
 	else
 	{
 		// idlers
+		WindowPtr window = UMAFrontWindow() ;
+		if ( window )
+			UMAIdleControls( window ) ;
+			
 		wxTheApp->ProcessIdle() ;
 	}
-	
+	if ( event.what != kHighLevelEvent )
+		SetRectRgn( s_macCursorRgn , event.where.h - 1 , event.where.v - 1,  event.where.h + 1 , event.where.v + 1 ) ;
+
 	// repeaters
+
 #if 0
 	wxMacProcessSocketEvents() ;  
 #endif
@@ -526,29 +809,30 @@ void wxApp::MacDoOneEvent()
 
 void wxApp::MacHandleOneEvent( EventRecord *ev ) 
 {
+	m_macCurrentEvent = ev ;
+	
+	wxApp::sm_lastMessageTime = ev->when ;
+	
 	switch (ev->what)
 	{
-		case nullEvent:
-			MacHandleNullEvent( ev ) ;
-			break ;
-		case kHighLevelEvent:
-			MacHandleHighLevelEvent( ev ) ;
-			break;
 		case mouseDown:
 			MacHandleMouseDownEvent( ev ) ;
-			wxTheApp->ExitMainLoop() ;
+			if ( ev->modifiers & controlKey )
+				s_lastMouseDown = 2;
+			else
+				s_lastMouseDown = 1;
 			break;
 		case mouseUp:
+			if ( s_lastMouseDown == 2 )
+			{
+				ev->modifiers |= controlKey ;
+			}
+			else
+			{
+				ev->modifiers &= ~controlKey ;
+			}			
 			MacHandleMouseUpEvent( ev ) ;
-			break;
-		case keyDown:
-			MacHandleKeyDownEvent( ev ) ;
-			break;
-		case autoKey:
-			MacHandleAutoKeyEvent( ev ) ;
-			break;
-		case keyUp:
-			MacHandleKeyUpEvent( ev ) ;
+			s_lastMouseDown = 0;
 			break;
 		case activateEvt:
 			MacHandleActivateEvent( ev ) ;
@@ -556,850 +840,532 @@ void wxApp::MacHandleOneEvent( EventRecord *ev )
 		case updateEvt:
 			MacHandleUpdateEvent( ev ) ;
 			break;
+		case keyDown:
+		case autoKey:
+			MacHandleKeyDownEvent( ev ) ;
+			break;
+		case keyUp:
+			MacHandleKeyUpEvent( ev ) ;
+			break;
 		case diskEvt:
 			MacHandleDiskEvent( ev ) ;
 			break;
 		case osEvt:
 			MacHandleOSEvent( ev ) ;
 			break;
+		case kHighLevelEvent:
+			MacHandleHighLevelEvent( ev ) ;
+			break;
 		default:
 			break;
 	}
 }
 
-void wxApp::MacHandleNullEvent( EventRecord *ev ) 
-{
-}
-
 void wxApp::MacHandleHighLevelEvent( EventRecord *ev )
 {
+	::AEProcessAppleEvent( ev ) ;
 }
 
+bool s_macIsInModalLoop = false ;
+
 void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
 {
-}
+	WindowRef window;
+	WindowRef frontWindow = UMAFrontNonFloatingWindow() ;
+	WindowAttributes frontWindowAttributes = NULL ;
+	if ( frontWindow )
+		UMAGetWindowAttributes( frontWindow , &frontWindowAttributes ) ;
+	
+	short windowPart = ::FindWindow(ev->where, &window);
+	wxWindow* win = wxFindWinFromMacWindow( window ) ;
+	
+	switch (windowPart)
+	{
+		case inMenuBar :
+			if ( s_macIsInModalLoop ) 
+			{
+				SysBeep ( 30 ) ;
+			}
+			else
+			{
+				UInt32 menuresult = MenuSelect(ev->where) ;
+				MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) );
+				s_lastMouseDown = 0;
+			}
+			break ;
+		case inSysWindow :
+			SystemClick( ev , window ) ;
+			s_lastMouseDown = 0;
+			break ;
+		case inDrag :
+			if ( window != frontWindow && s_macIsInModalLoop && !(ev->modifiers & cmdKey ) )
+			{
+				SysBeep ( 30 ) ;
+			}
+			else
+			{
+				DragWindow(window, ev->where, &qd.screenBits.bounds);
+				if (win)
+				{
+					GrafPtr port ;
+					GetPort( &port ) ;
+					Point pt = { 0, 0 } ;
+					SetPort( window ) ;
+					SetOrigin( 0 , 0 ) ;
+					LocalToGlobal( &pt ) ;
+					SetPort( port ) ;
+						win->SetSize( pt.h , pt.v , -1 , 
+							-1 , wxSIZE_USE_EXISTING);
+				}
+				s_lastMouseDown = 0;
+			}
+			break ;
+		case inGoAway:
+			if (TrackGoAway(window, ev->where))
+			{
+				if ( win )
+					win->Close() ;
+			}
+			s_lastMouseDown = 0;
+			break;
+		case inGrow:
+				int growResult = GrowWindow(window , ev->where, &qd.screenBits.bounds);
+				if (growResult != 0)
+				{
+					int newWidth = LoWord(growResult);
+					int newHeight = HiWord(growResult);
+					int oldWidth, oldHeight;
+					
+					win->GetSize(&oldWidth, &oldHeight);
+					if (newWidth == 0) 
+						newWidth = oldWidth;
+					if (newHeight == 0) 
+						newHeight = oldHeight;
+					
+					if (win)
+						win->SetSize( -1, -1, newWidth, newHeight, wxSIZE_USE_EXISTING);
+				}
+				s_lastMouseDown = 0;
+			break;
+		case inZoomIn:
+		case inZoomOut:
+				if (TrackBox(window, ev->where, windowPart))
+				{
+					// TODO setup size event
+					ZoomWindow( window , windowPart , false ) ;
+					if (win)
+						win->SetSize( -1, -1, window->portRect.right-window->portRect.left , 
+							window->portRect.bottom-window->portRect.top, wxSIZE_USE_EXISTING);
+				}
+			s_lastMouseDown = 0;
+			break;
+		case inCollapseBox :
+				// TODO setup size event
+			s_lastMouseDown = 0;
+			break ;
 
-void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
-{
+		case inContent :
+				if ( window != frontWindow )
+				{
+					if ( s_macIsInModalLoop ) 
+					{
+						SysBeep ( 30 ) ;
+					}
+					else if ( UMAIsWindowFloating( window ) )
+					{
+						if ( win )
+							win->MacMouseDown( ev , windowPart ) ;
+					}
+					else
+					{
+						UMASelectWindow( window ) ;
+					}
+				}
+				else
+				{
+					if ( win )
+						win->MacMouseDown( ev , windowPart ) ;
+				}
+			break ;
+			
+		default:
+			break;
+	}
 }
 
-void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
+void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
 {
+	WindowRef window;
+	
+	short windowPart = ::FindWindow(ev->where, &window);
+	
+	switch (windowPart)
+	{
+		case inMenuBar :
+			break ;
+		case inSysWindow :
+			break ;
+		default:
+			{
+				wxWindow* win = wxFindWinFromMacWindow( window ) ;
+				if ( win )
+					win->MacMouseUp( ev , windowPart ) ;
+			}
+			break;
+	}
 }
 
-void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleAutoKeyEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleActivateEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleUpdateEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleDiskEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleOSEvent( EventRecord *ev )
-{
-}
-
-
-
-/*
-
-void wxApp::doMacMouseDown(void)
-{
-	WindowPtr window;
-	short windowPart = ::FindWindow(m_event.where, &window);
-	if ( windowPart != inMenuBar )
-	{
-		WindowPtr frontWindow = FrontWindow();
-		if (WindowIsModal(frontWindow) && (window != frontWindow))
-			SysBeep(1);
-		else
-		{	
-			switch (windowPart)
+long wxMacTranslateKey(char key, char code)
+{ 
+    switch (key) 
+    {
+    	case 0x01 :
+		 		key = WXK_HOME;
+		  break;
+    	case 0x03 :
+		 		key = WXK_RETURN;
+		  break;
+    	case 0x04 :
+		 		key = WXK_END;
+		  break;
+    	case 0x05 :
+		 		key = WXK_HELP;
+		  break;
+    	case 0x08 :
+		 		key = WXK_BACK;
+		  break;
+    	case 0x09 :
+		 		key = WXK_TAB;
+		  break;
+    	case 0x0b :
+		 		key = WXK_PAGEUP;
+		  break;
+    	case 0x0c :
+		 		key = WXK_PAGEDOWN;
+		  break;
+    	case 0x0d :
+		 		key = WXK_RETURN;
+		  break;
+			case 0x10 :
 			{
-				case inMenuBar:
-					break;
-				case inContent:
-					doMacInContent(window); break;
-				case inDrag:
-					doMacInDrag(window); break;
-				case inGrow:
-					doMacInGrow(window); break;
-				case inGoAway:
-					doMacInGoAway(window); break;
-				case inZoomIn:
-				case inZoomOut:
-					doMacInZoom(window, windowPart); break;
-				default:
-					break;
+				switch( code )
+				{
+					case 0x7a :
+						key = WXK_F1 ;
+						break;
+					case 0x78 :
+						key = WXK_F2 ;
+						break;
+					case 0x63 :
+						key = WXK_F3 ;
+						break;
+					case 0x76 :
+						key = WXK_F4 ;
+						break;
+					case 0x60 :
+						key = WXK_F5 ;
+						break;
+					case 0x61 :
+						key = WXK_F6 ;
+						break;
+					case 0x62:
+						key = WXK_F7 ;
+						break;
+					case 0x64 :
+						key = WXK_F8 ;
+						break;
+					case 0x65 :
+						key = WXK_F9 ;
+						break;
+					case 0x6D :
+						key = WXK_F10 ;
+						break;
+					case 0x67 :
+						key = WXK_F11 ;
+						break;
+					case 0x6F :
+						key = WXK_F12 ;
+						break;
+					case 0x69 :
+						key = WXK_F13 ;
+						break;
+					case 0x6B :
+						key = WXK_F14 ;
+						break;
+					case 0x71 :
+						key = WXK_F15 ;
+						break;
+				}
 			}
+			break ;
+			case 0x1b :
+				key = WXK_DELETE ;
+			break ;
+			case 0x1c :
+				key = WXK_LEFT ;
+			break ;
+			case 0x1d :
+				key = WXK_RIGHT ;
+			break ;
+			case 0x1e :
+				key = WXK_UP ;
+			break ;
+			case 0x1f :
+				key = WXK_DOWN ;
+			break ;
+	 		default:
+			break ;
+ 	} // end switch
 	
-		}
-	}
-	else
-	{
-		doMacInMenuBar(::MenuSelect(m_event.where));
-	}
-}
-
-void wxApp::doMacMouseUp(void)
-{
-	if (m_mouseWindow)
-	{
-#if 0
-		int hitX = m_event.where.h; 				// screen window c.s.
-		int hitY = m_event.where.v; 				// screen window c.s.
-		m_mouseWindow->ScreenToClient(&hitX, &hitY);		// mouseWindow client c.s.
-		m_mouseWindow->ClientToLogical(&hitX, &hitY); 	// mouseWindow logical c.s.
-#endif
-		
-		wxMouseEvent event(wxEVT_LEFT_UP);
-		event.m_shiftDown = m_event.modifiers & shiftKey;
-		event.m_controlDown = m_event.modifiers & controlKey;
-		event.m_altDown = m_event.modifiers & optionKey;
-		event.m_metaDown = m_event.modifiers & cmdKey;
-		event.m_leftDown = FALSE;
-		event.m_middleDown = FALSE;
-		event.m_rightDown = FALSE;
-		event.m_x = m_event.where.h;
-		event.m_y = m_event.where.v;
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(m_mouseWindow);
-
-		m_mouseWindow->ProcessEvent(event);
-	}
-	else
- 	{
- 		//??? Can't we just throw away mouse up events without matching mouse down
-		wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
- 		if (theMacWxFrame)
- 		{
-#if 0
- 			int hitX = cCurrentEvent.where.h; // screen window c.s.
- 			int hitY = cCurrentEvent.where.v; // screen window c.s.
-			theMacWxFrame->ScreenToWindow(&hitX, &hitY);
-#endif
-
-			wxMouseEvent event(wxEVT_LEFT_UP);
-			event.m_shiftDown = m_event.modifiers & shiftKey;
-			event.m_controlDown = m_event.modifiers & controlKey;
-			event.m_altDown = m_event.modifiers & optionKey;
-			event.m_metaDown = m_event.modifiers & cmdKey;
-			event.m_leftDown = FALSE;
-			event.m_middleDown = FALSE;
-			event.m_rightDown = FALSE;
-			event.m_x = m_event.where.h;
-			event.m_y = m_event.where.v;
-			event.m_timeStamp = m_event.when;
-			event.SetEventObject(m_mouseWindow);
-
-			theMacWxFrame->ProcessEvent(event);
- 		}
- 	}
-}
-
-void wxApp::doMacMouseMotion(void)
-{
-	if (m_mouseWindow) {
-		wxMouseEvent event(wxEVT_MOTION);
-		event.m_shiftDown = m_event.modifiers & shiftKey;
-		event.m_controlDown = m_event.modifiers & controlKey;
-		event.m_altDown = m_event.modifiers & optionKey;
-		event.m_metaDown = m_event.modifiers & cmdKey;
-		event.m_leftDown = !(m_event.modifiers & btnState);
-		event.m_middleDown = FALSE;
-		event.m_rightDown = FALSE;
-		event.m_x = m_event.where.h;
-		event.m_y = m_event.where.v;
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(m_mouseWindow);
-
-		m_mouseWindow->ProcessEvent(event);
-	}
-	else
- 	{
-		wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
- 		if (theMacWxFrame)
- 		{
-			wxMouseEvent event(wxEVT_MOTION);
-			event.m_shiftDown = m_event.modifiers & shiftKey;
-			event.m_controlDown = m_event.modifiers & controlKey;
-			event.m_altDown = m_event.modifiers & optionKey;
-			event.m_metaDown = m_event.modifiers & cmdKey;
-			event.m_leftDown = !(m_event.modifiers & btnState);
-			event.m_middleDown = FALSE;
-			event.m_rightDown = FALSE;
-			event.m_x = m_event.where.h;
-			event.m_y = m_event.where.v;
-			event.m_timeStamp = m_event.when;
-			event.SetEventObject(m_mouseWindow);
-
-			m_mouseWindow->ProcessEvent(event);
-		}
-	}
-	
-	//??? Need to work with floating windows... isn't there a toolbox call to find the
-	// top window intersecting a point is screen coordinates??
-#if 0
-	else	// will only work for one floating window at the moment... ?
-	{	
-		WindowPtr frontDocPtr = findFrontNonFloatingWindow();
-		WindowPtr frontFloatingPtr = ::FrontWindow();
-		
-		int hitX = cCurrentEvent.where.h;
-		int hitY = cCurrentEvent.where.v;
-		
-		wxFrame* macWxFrame = findMacWxFrame(frontDocPtr);
-		
-		if ((frontFloatingPtr != frontDocPtr) & (frontFloatingPtr != NULL))
-		{
-			RgnHandle frontFloatStrRgn = getStructureRegion(frontFloatingPtr);
-			Rect 	  frontFloatRect = (**frontFloatStrRgn).rgnBBox;
-	
-			if 	   ((hitX >= frontFloatRect.left) & 
-					(hitX <= frontFloatRect.right) & 
-					(hitY >= frontFloatRect.top) &
-					(hitY <= frontFloatRect.bottom))
-			{
-				macWxFrame = findMacWxFrame(frontFloatingPtr);
-			}
-		}
-	}
-#endif
+	return key;
 }
 
-void wxApp::doMacKeyDown(void)
+void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
 {
-	long menuResult = 0 ;
-	short keycode ;
-	short keychar ;
-	keychar = short(m_event.message & charCodeMask);
-	keycode = short(m_event.message & keyCodeMask) >> 8 ;
-
-	// Handle menu accelerators
-	if ( gSFMacHasAppearance )
-	{
-		menuResult = MenuEvent( &m_event ) ;
-		if ( HiWord( menuResult ) )
-		{
-			doMacInMenuBar( menuResult ) ;
-		}
-		else
-		{
-			ControlHandle control ;
-			
-			GetKeyboardFocus( FrontNonFloatingWindow() , &control ) ;
-			if ( control && keychar != 0x07 )
-				HandleControlKey( control , keycode , keychar , m_event.modifiers ) ;
-			else
-			{
-				wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-				if (theMacWxFrame)
-				{
-					wxKeyEvent event(wxEVT_CHAR);
-					event.m_shiftDown = m_event.modifiers & shiftKey;
-					event.m_controlDown = m_event.modifiers & controlKey;
-					event.m_altDown = m_event.modifiers & optionKey;
-					event.m_metaDown = m_event.modifiers & cmdKey;
-					event.m_keyCode = macTranslateKey(keychar, m_event.modifiers & (shiftKey|optionKey));
-					event.m_x = m_event.where.h;
-					event.m_y = m_event.where.v;
-					event.m_timeStamp = m_event.when;
-					event.SetEventObject(theMacWxFrame);
-			
-					theMacWxFrame->ProcessEvent(event);
-				}
-			}
-		}
-	}
+	UInt32 menuresult = UMAMenuEvent(ev) ;
+	if ( HiWord( menuresult ) )
+		MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ;
 	else
 	{
-		if (GetMenuHandle( kwxMacAppleMenuId ) )
-		{
-//			menuResult = MDEF_MenuKey(m_event.message, m_event.modifiers , GetMenuHandle( kwxMacAppleMenuId ) );
-		}
-		else
-		{
-			if (m_event.modifiers & cmdKey)
-			{
-				menuResult = MenuKey( keychar ) ;
-			}
-		}
-
-		if ( HiWord( menuResult ) )
-		{
-			doMacInMenuBar( menuResult ) ;
-		}
-		else
-		{
-			wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-			if (theMacWxFrame)
-			{
-				wxKeyEvent event(wxEVT_CHAR);
-				event.m_shiftDown = m_event.modifiers & shiftKey;
-				event.m_controlDown = m_event.modifiers & controlKey;
-				event.m_altDown = m_event.modifiers & optionKey;
-				event.m_metaDown = m_event.modifiers & cmdKey;
-				event.m_keyCode = macTranslateKey(keychar, m_event.modifiers & (shiftKey|optionKey));
-				event.m_x = m_event.where.h;
-				event.m_y = m_event.where.v;
-				event.m_timeStamp = m_event.when;
-				event.SetEventObject(theMacWxFrame);
+		short keycode ;
+		short keychar ;
+		keychar = short(ev->message & charCodeMask);
+		keycode = short(ev->message & keyCodeMask) >> 8 ; 
 		
-				theMacWxFrame->ProcessEvent(event);
-			}
+		wxWindow* focus = wxWindow::FindFocus() ;
+		if ( focus )
+		{
+			wxKeyEvent event(wxEVT_CHAR);
+			event.m_shiftDown = ev->modifiers & shiftKey;
+			event.m_controlDown = ev->modifiers & controlKey;
+			event.m_altDown = ev->modifiers & optionKey;
+			event.m_metaDown = ev->modifiers & cmdKey;
+			event.m_keyCode = wxMacTranslateKey(keychar, keycode);
+			event.m_x = ev->where.h;
+			event.m_y = ev->where.v;
+			event.m_timeStamp = ev->when;
+			event.SetEventObject(focus);
+			focus->GetEventHandler()->ProcessEvent( event ) ;
 		}
 	}
 }
 
-void wxApp::doMacAutoKey(void)
-{
-	doMacKeyDown();
-}
-
-void wxApp::doMacKeyUp(void)
-{
-}
-
-void wxApp::doMacActivateEvt(void)
-{
-	HighlightAndActivateWindow( (WindowPtr) m_event.message , m_event.modifiers & activeFlag ) ;
-}
-
-void wxApp::doMacUpdateEvt(void)
-{
-	WindowPtr theMacWindow = (WindowPtr)(m_event.message);
-	::BeginUpdate(theMacWindow);
-	
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(theMacWindow);
-	if (theMacWxFrame)
-	{
-//		if (!::EmptyRgn(theMacWindow->visRgn))	// this doesn't work with windowshade
-//		{
-			if ( theMacWxFrame->MacSetupPort() )
-			{
-				// Erase update region
-				// we must do this, because controls add their former rect to the inval
-				// rgn and the background might not have been correct at that moment
-				::EraseRect(&theMacWindow->portRect); 
-	
-	 			// Can't use UpdateControls since each control has it's own coordinate system
-	 			//		::UpdateControls(theMacWindow, theMacWindow->visRgn);
-	
-				::UpdateControls( theMacWindow , theMacWindow->visRgn ) ;
-	#if 0
-	 			// Draw the grow box
-	 			if (cStyle & wxRESIZE_BORDER)
-	 				MacDrawGrowIcon();
-	#endif
-	
-				wxPaintEvent event;
-				event.m_timeStamp = m_event.when;
-				event.SetEventObject(theMacWxFrame);
-	
-				theMacWxFrame->ProcessEvent(event);
-	//			::SetThemeWindowBackground(  theMacWindow , kThemeActiveDialogBackgroundBrush ,  false ) ;
-				::ClipRect( &theMacWindow->portRect ) ;		
-				::SetOrigin(  0 , 0 );	
-			}
-			else
-			{
-				wxASSERT_MSG( false , "unabled to setup window mac port") ;
-			}
-			
-//		}
-	}
-
-	::EndUpdate(theMacWindow);
-}
-
-void wxApp::doMacDiskEvt(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	if ((m_event.message >> 16) != noErr)
-	{
-		const int kDILeft = 0x0050; // top coord for disk init dialog
-		const int kDITop = 0x0070; // left coord for disk init dialog
-		Point mountPoint;
-		mountPoint.h = kDILeft;
-		mountPoint.v = kDITop;
-		int myError = DIBadMount(mountPoint, m_event.message);
-	}
-}
-
-void wxApp::doMacOsEvt(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	switch ((m_event.message >> 24) & 0x0ff)
-	{
-		case suspendResumeMessage:
-			if (m_event.message & resumeFlag)
-				doMacResumeEvent();
-			else
-				doMacSuspendEvent();
-			break;
-		case mouseMovedMessage:
-			doMacMouseMovedMessage();
-			break;
-	}
-}
-
-void wxApp::doMacHighLevelEvent(void)
+void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
 {
-	::AEProcessAppleEvent(&m_event); // System 7 or higher
+	// nothing to do
 }
 
-void wxApp::doMacResumeEvent(void)
+void wxApp::MacHandleActivateEvent( EventRecord *ev )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
+	WindowRef window = (WindowRef) ev->message ;
+	if ( window )
 	{
-		if (m_event.message & convertClipboardFlag)
-			::TEFromScrap();
-
-		wxActivateEvent event(wxEVT_ACTIVATE, TRUE);
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(theMacWxFrame);
-
-		theMacWxFrame->ProcessEvent(event);
+		bool activate = (ev->modifiers & activeFlag ) ;
+		WindowClass wclass ;
+		UMAGetWindowClass ( window , &wclass ) ;
+		if ( wclass == kFloatingWindowClass )
+		{
+			// if it is a floater we activate/deactivate the front non-floating window instead
+			window = UMAFrontNonFloatingWindow() ;
+		}
+		wxWindow* win = wxFindWinFromMacWindow( window ) ;
+		if ( win )
+			win->MacActivate( ev , activate ) ;
 	}
 }
 
-void wxApp::doMacSuspendEvent(void)
+void wxApp::MacHandleUpdateEvent( EventRecord *ev )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
+	WindowRef window = (WindowRef) ev->message ;
+	wxWindow * win = wxFindWinFromMacWindow( window ) ;
+	if ( win )
 	{
-		::ZeroScrap();
-		::TEToScrap();
-
-		wxActivateEvent event(wxEVT_ACTIVATE, FALSE);
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(theMacWxFrame);
-
-		theMacWxFrame->ProcessEvent(event);
+		win->MacUpdate( ev ) ;
 	}
 }
 
-void wxApp::doMacMouseMovedMessage(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	if (m_cursorRgn)
-		::DisposeRgn(m_cursorRgn);
-	m_cursorRgn = ::NewRgn();
-	::SetRectRgn(m_cursorRgn, -32768, -32768, 32766, 32766);
-}
-
-void wxApp::doMacInMenuBar(long menuResult)
+void wxApp::MacHandleDiskEvent( EventRecord *ev )
 {
-	int macMenuId = HiWord(menuResult);
-	int macMenuItemNum = LoWord(menuResult); // counting from 1
-
-	if (macMenuId == 0) 					// no menu item selected;
-		 return;
-	if (macMenuId == 128) 
-	{
-		if (macMenuItemNum != 1) 
-		{			// if not the "About" entry (or the separator)
-			Str255		daName;
-			::GetMenuItemText(GetMenuHandle(128), macMenuItemNum, daName);
-			(void)::OpenDeskAcc(daName);
-			::HiliteMenu(0);								
-			return;
-		}
-	}
-
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
-	{
-		if ( theMacWxFrame->IsKindOf( CLASSINFO( wxDialog ) ) )
-			(( wxDialog *) theMacWxFrame)->MacMenuSelect(m_event, macMenuId, macMenuItemNum);
-		else if ( theMacWxFrame->IsKindOf( CLASSINFO( wxFrame ) ) )
-			(( wxFrame *) theMacWxFrame)->MacMenuSelect(m_event, macMenuId, macMenuItemNum);
+	if ( HiWord( ev->message ) != noErr )
+  {
+		OSErr err ;
+		Point point ;
+ 		SetPt( &point , 100 , 100 ) ;
+ 		
+  	err = DIBadMount( point , ev->message ) ;
+		wxASSERT( err == noErr ) ;
 	}
-	::HiliteMenu(0);								
 }
 
-void wxApp::doMacInContent(WindowPtr window)
+void wxApp::MacHandleOSEvent( EventRecord *ev )
 {
-	WindowPtr frontWindow = FrontWindow();
-	if (window != frontWindow )
-	{
-//		SFSelectWindow( window ) ;
-	}
-	else
+	switch( ( ev->message & osEvtMessageMask ) >> 24 )
 	{
-		ControlHandle	control ;
-		Point		localwhere = m_event.where ;
-		GrafPtr		port ;
-		SInt16		controlpart ;
-		
-		::GetPort( &port ) ;
-		::SetPort( window ) ;
-		::GlobalToLocal( &localwhere ) ;
-
-		::SetPort( port ) ;
-		
-		if ( !gSFMacHasAppearance )
-		{
-			controlpart = FindControl( localwhere , window , &control ) ;
-		}
-		else
-		{
-			control = FindControlUnderMouse( localwhere , window , &controlpart ) ;
-		}
-		
-		if ( control && IsControlActive( control ) )
-		{
-			wxControl* wxc = (wxControl*) GetControlReference( control ) ;
-					
-			if ( wxWindow::FindFocus() != wxc &&  wxc->AcceptsFocus() )
-			{
-				wxc->SetFocus() ;	
-				if ( wxWindow::FindFocus() != wxc )
-					control = NULL ; // we were not able to change focus
-			}		
-								
-			if ( control )
+		case suspendResumeMessage :
 			{
-				if ( !gSFMacHasAppearance)
+				bool isResuming = ev->message & resumeFlag ;
+				bool convertClipboard = ev->message & convertClipboardFlag ;
+				bool doesActivate = UMAGetProcessModeDoesActivateOnFGSwitch() ;
+				if ( isResuming )
 				{
-					controlpart = TrackControl( control , localwhere , NULL ) ;
+					WindowRef oldFrontWindow = NULL ;
+					WindowRef newFrontWindow = NULL ;
+					
+					// in case we don't take care of activating ourselves, we have to synchronize
+					// our idea of the active window with the process manager's - which it already activated
+					
+					if ( !doesActivate )
+						oldFrontWindow = UMAFrontNonFloatingWindow() ;
+					
+					MacResume( convertClipboard ) ;
+					
+					newFrontWindow = UMAFrontNonFloatingWindow() ;
+					
+					if ( oldFrontWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( oldFrontWindow ) ;
+						if ( win )
+							win->MacActivate( ev , false ) ;
+					}
+					if ( newFrontWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( newFrontWindow ) ;
+						if ( win )
+							win->MacActivate( ev , true ) ;
+					}
 				}
 				else
-				{
-					controlpart = HandleControlClick( control , localwhere , m_event.modifiers , (ControlActionUPP) -1 ) ;
-				}
+				{			
+					MacSuspend( convertClipboard ) ;
 				
-				if ( controlpart )
-				{
-					wxControl*	wx = (wxControl*) GetControlReference( control ) ;
-					if ( wx )
-						wx->MacHandleControlClick( control , controlpart ) ;
+					// in case this suspending did close an active window, another one might 
+					// have surfaced -> lets deactivate that one
+					
+					WindowRef newActiveWindow = UMAGetActiveNonFloatingWindow() ;
+					if ( newActiveWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( newActiveWindow ) ;
+						if ( win )
+							win->MacActivate( ev , false ) ;
+					}
 				}
 			}
-		}
-		else
-		{
-			wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-			if (theMacWxFrame)
-			{
-				doMacContentClick((wxFrame*)theMacWxFrame); // todo : this cast is wrong
-			}
-		}
-	}
-	
-#if 0
-	wxFrame* theMacWxFrame = findMacWxFrame(window);
-	if (theMacWxFrame)
-	{
-		WindowPtr MacWindow = findFrontNonFloatingWindow();
-		if (window != MacWindow)
-		{		
-			wxFrame* frontFrame = findMacWxFrame(MacWindow);
-			if (!frontFrame) wxFatalError("No wxFrame for frontnonfloatingWindow.");
-			if (!frontFrame->IsModal())
+			break ;
+		case mouseMovedMessage :
 			{
-				frontFrame->SetFocus();
-				doMacContentClick(theMacWxFrame);	// jonto - to deal with doc windows behind floaters ?
-				::newSelectWindow(window); 			// WCH : should I be calling some wxMethod?
-				if (!IsFloating(MacWindow))
+				WindowRef window;
+				
+				wxWindow* currentMouseWindow = NULL ;
+				
+				MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , &currentMouseWindow ) ; 
+				
+				if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
 				{
-					KeyMap keyMap;
-					GetKeys(keyMap);
-					if (!(keyMap[1] & 0x8000)) theMacWxFrame->ShowAsActive(true);	// temporary measure...
+					wxMouseEvent event ;
+					
+					bool isDown = !(ev->modifiers & btnState) ; // 1 is for up
+					bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse
+					
+					event.m_leftDown = isDown && !controlDown;
+					event.m_middleDown = FALSE;
+					event.m_rightDown = isDown && controlDown;				
+					event.m_shiftDown = ev->modifiers & shiftKey;
+					event.m_controlDown = ev->modifiers & controlKey;
+					event.m_altDown = ev->modifiers & optionKey;
+					event.m_metaDown = ev->modifiers & cmdKey;				
+					event.m_x = ev->where.h;
+					event.m_y = ev->where.v;					
+					event.m_timeStamp = ev->when;
+					event.SetEventObject(this);
+					
+					if ( wxWindow::s_lastMouseWindow )
+					{
+						wxMouseEvent eventleave(event ) ;
+						eventleave.SetEventType( wxEVT_LEAVE_WINDOW ) ;
+						wxWindow::s_lastMouseWindow->GetEventHandler()->ProcessEvent(eventleave);
+					}
+					if ( currentMouseWindow )
+					{
+						wxMouseEvent evententer(event ) ;
+						evententer.SetEventType( wxEVT_ENTER_WINDOW ) ;
+						currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
+					}
+					wxWindow::s_lastMouseWindow = currentMouseWindow ;
 				}
-			}										// jonto : not sure yet, but let's try this ...
-			else ::SysBeep(3);
-		}
-		else
-		{
-			doMacContentClick(theMacWxFrame);
-		}
-	}
-#endif
-}
-
-void wxApp::doMacContentClick(wxWindow* frame)
-{
-	m_mouseWindow = frame;
-
-	wxMouseEvent event(wxEVT_LEFT_DOWN);
-	event.m_shiftDown = m_event.modifiers & shiftKey;
-	event.m_controlDown = m_event.modifiers & controlKey;
-	event.m_altDown = m_event.modifiers & optionKey;
-	event.m_metaDown = m_event.modifiers & cmdKey;
-	event.m_leftDown = FALSE;
-	event.m_middleDown = FALSE;
-	event.m_rightDown = FALSE;
-	if ( m_event.modifiers & controlKey )
-	{
-		event.m_rightDown = TRUE;
-	}
-	else
-	{
-		event.m_leftDown = TRUE;
+				
+				short windowPart = ::FindWindow(ev->where, &window);
+				
+				switch (windowPart)
+				{
+					case inMenuBar :
+						break ;
+					case inSysWindow :
+						break ;
+					default:
+						{							
+							if ( s_lastMouseDown == 0 )
+								ev->modifiers |= btnState ;
+
+							wxWindow* win = wxFindWinFromMacWindow( window ) ;
+							if ( win )
+								win->MacMouseMoved( ev , windowPart ) ;
+						}
+						break;
+				}
+			}
+			break ;
+			
 	}
-#if 0
-  event.m_leftDown = !(m_event.modifiers & btnState);
-	event.m_middleDown = FALSE;
-	event.m_rightDown = FALSE;
-#endif
-	event.m_x = m_event.where.h;
-	event.m_y = m_event.where.v;
-	event.m_timeStamp = m_event.when;
-	event.SetEventObject(m_mouseWindow);
-
-//	m_mouseWindow->ProcessEvent(event);
-	m_mouseWindow->MacDispatchMouseEvent(event);
-	
-#if 0
-	// RightButton is cmdKey click  on the mac platform for one-button mouse
-	Bool rightButton = cCurrentEvent.modifiers & cmdKey;
-	// altKey is optionKey on the mac platform:
-	Bool isAltKey = cCurrentEvent.modifiers & optionKey;
-
-	WXTYPE mouseEventType = rightButton ? wxEVENT_TYPE_RIGHT_DOWN
-										: wxEVENT_TYPE_LEFT_DOWN;
-	wxMouseEvent theMouseEvent(mouseEventType);
-	theMouseEvent.leftDown = !rightButton;
-	theMouseEvent.middleDown = FALSE;
-	theMouseEvent.rightDown = rightButton;
-	theMouseEvent.shiftDown = cCurrentEvent.modifiers & shiftKey;
-	theMouseEvent.controlDown = cCurrentEvent.modifiers & controlKey;
-	theMouseEvent.altDown = isAltKey;
-	theMouseEvent.metaDown = FALSE;  // mflatt
-	theMouseEvent.timeStamp = cCurrentEvent.when; // mflatt
-
-	int hitX = cCurrentEvent.where.h; // screen window c.s.
-	int hitY = cCurrentEvent.where.v; // screen window c.s.
-
-	frame->ScreenToWindow(&hitX, &hitY);
-//	frameParentArea->ScreenToArea(&hitX, &hitY);			// tx coords ?
-	theMouseEvent.x = hitX; // frame parent area c.s.
-	theMouseEvent.y = hitY; // frame parent area c.s.
-
-	frame->SeekMouseEventArea(theMouseEvent);
-#endif
 }
 
-void wxApp::doMacInDrag(WindowPtr window)
+void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
+	if (macMenuId == 0) 					
+		 return; // no menu item selected
+		 
+	if (macMenuId == kwxMacAppleMenuId && macMenuItemNum > 1) 
 	{
-		// should be desktop, not screen
-		Rect dragBoundsRect = qd.screenBits.bounds;	// can't move to a different screen
-//xxx	::InsetRect(&dragBoundsRect, 4, ::GetMBarHeight() + 4); // This is not really necessary
-		Rect oldPos = (**(((WindowPeek)window)->strucRgn)).rgnBBox;
-		::DragReferencedWindow(window, m_event.where, &dragBoundsRect);	// jonto
-		#if 0
-		theMacWxFrame->m_x += (**(((WindowPeek)window)->strucRgn)).rgnBBox.left - oldPos.left;
-		theMacWxFrame->m_y += (**(((WindowPeek)window)->strucRgn)).rgnBBox.top - oldPos.top;
+		#if ! TARGET_CARBON
+		Str255		deskAccessoryName ;
+		GrafPtr		savedPort ;
+		
+		GetMenuItemText(GetMenuHandle(kwxMacAppleMenuId), macMenuItemNum, deskAccessoryName);
+		GetPort(&savedPort);
+		OpenDeskAcc(deskAccessoryName);
+		SetPort(savedPort);
 		#endif
-		Move( (**(((WindowPeek)window)->strucRgn)).rgnBBox.left , (**(((WindowPeek)window)->strucRgn)).rgnBBox.top ) ;
-#if 0
-		theMacWxFrame->wxMacRecalcNewSize(); // Actually, recalc new position only
-#endif
-	}
-	
-#if 0
-//	if (window != ::FrontWindow())
-	if (window != findFrontNonFloatingWindow())
-	{
-//		wxFrame* frontFrame = findMacWxFrame(::FrontWindow());
-		wxFrame* frontFrame = findMacWxFrame(findFrontNonFloatingWindow());
-		if (!frontFrame) wxFatalError("No wxFrame for frontWindow.");
-		if (frontFrame->IsModal())
-		{
-			::SysBeep(3);
-			return;
-		}
 	}
-
-	wxFrame* theMacWxFrame = findMacWxFrame(window);
-	if (theMacWxFrame)
-	{
-		Rect dragBoundsRect = qd.screenBits.bounds;	// can't move to a different screen
-		::InsetRect(&dragBoundsRect, 4, ::GetMBarHeight() + 4); // This is not really necessary
-		newDragWindow(window, cCurrentEvent.where, &dragBoundsRect);	// jonto
-		theMacWxFrame->wxMacRecalcNewSize(); // Actually, recalc new position only
-		if (!IsFloating(window))
-		{
-			theMacWxFrame->ShowAsActive(true);	// temporary measure...
-		}
-	}
-#endif
-}
-
-void wxApp::doMacInGrow(WindowPtr window)
-{
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
+	else
 	{
-		Rect growSizeRect; // WCH: growSizeRect should be a member of wxFrame class
-		growSizeRect.top = 1; // minimum window height
-		growSizeRect.left = 1; // minimum window width
-		growSizeRect.bottom = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
-		growSizeRect.right = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
-		long windSize = ::GrowWindow(window, m_event.where, &growSizeRect);
-		if (windSize != 0)
-		{
-			int nWidth = LoWord(windSize);
-			int nHeight = HiWord(windSize);
-			int oWidth, oHeight;
-			theMacWxFrame->GetSize(&oWidth, &oHeight);
-			if (nWidth == 0) nWidth = oWidth;
-			if (nHeight == 0) nHeight = oHeight;
-			theMacWxFrame->SetSize( -1, -1, nWidth, nHeight, wxSIZE_USE_EXISTING);
-		}
-	}
+		wxWindow* frontwindow = wxFindWinFromMacWindow( ::FrontWindow() )  ;
+		if ( frontwindow && wxMenuBar::s_macInstalledMenuBar )
+			wxMenuBar::s_macInstalledMenuBar->MacMenuSelect( frontwindow->GetEventHandler() , 0 , macMenuId , macMenuItemNum ) ;
+	}		
+	HiliteMenu(0);								
 }
 
-void wxApp::doMacInGoAway(WindowPtr window)
-{
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
-	{
-		if (TrackGoAway(window, m_event.where))
-		{
-            // TODO: Stefan, I think you need to send a wxCloseEvent to the window
-            // here. The OnCloseWindow handler will take care of delete the frame
-            // if it wishes to (there should be a default wxFrame::OnCloseWindow
-            // that destroys the frame).
-			if (theMacWxFrame->OnClose()) {
-#if WXGARBAGE_COLLECTION_ON
-				theMacWxFrame->Show(FALSE);
-#else
-				delete theMacWxFrame;
-#endif
-			}
-		}
-	}
-}
-
-void wxApp::doMacInZoom(WindowPtr window, short windowPart)
+/*
+long wxApp::MacTranslateKey(char key, int mods)
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
-	{
-		if (TrackBox(window, m_event.where, windowPart))
-		{
-#if 0
-			theMacWxFrame->Maximize(windowPart == inZoomOut);
-#endif
-		}
-	}
 }
 
-long wxApp::macTranslateKey(char key, int mods)
+void wxApp::MacAdjustCursor()
 {
-    static Handle transH = NULL;
-    static unsigned long transState = 0;
-    static Handle ScriptH = NULL;
-    static short region_code = 1;
-
-	if (!ScriptH) { // tom: don't guess the regioncode!!!!
-      struct ItlbRecord * r;
-      ScriptH = GetResource('itlb',0);
-      if (ScriptH) {
-      	HLock(ScriptH);
-      	r = (ItlbRecord*)*ScriptH;
-     	region_code = r->itlbKeys;  	
-      	HUnlock(ScriptH);
-      }	
-    }
- 
-    switch (key) {
-    case 0x7e:
-    case 0x3e:
-      key = WXK_UP;
-      break;
-    case 0x7d:
-    case 0x3d:
-      key = WXK_DOWN;
-      break;
-    case 0x7b:
-    case 0x3b:
-      key = WXK_LEFT;
-      break;
-    case 0x7c:
-    case 0x3c:
-      key = WXK_RIGHT;
-      break;
-    case 0x24:
-    case 0x4c:
-      key = WXK_RETURN;
-      break;
-    case 0x30:
-      key = WXK_TAB;
-      break;
-    case 0x33:
-      key = WXK_BACK;
-      break;
-    case 0x75:
-      key = WXK_DELETE;
-      break;
-    case 0x73:
-	  key = WXK_HOME;
-	  break;
-	case 0x77:
-	  key = WXK_END;
-	  break;   
-	case 0x74:
-	  key = WXK_PAGEUP;
-	  break;     
-	case 0x79:
-	  key = WXK_PAGEDOWN;
-	  break;     
-    default:
-      if (!transH) {
-		transH = GetIndResource('KCHR', 1);
-		HNoPurge(transH);
-      }
-#if 0 //Tom replaces
-      if (transH) {
-		// Only let shift & option modify the key: 
-		HLock(transH);
-		key = KeyTranslate(*transH, (key & 0x7F) | mods, &transState) & charCodeMask;
-		HUnlock(transH);
-#else
-       if (0) { // tom fettig@dfki.uni-sb.de
- 		// why if(0):
- 		// code is not correct, see inside Macintosh: Text 1-87
- 		// and 'itlk'-resource!!
- 		// and it is not necessary, as the translated char is in
- 		// cCurrrentEvent.message!!
-  		// Only let shift & option modify the key: 
-  		HLock(transH);
-		key = KeyTranslate(*transH, (key & 0x7F) | mods, &transState) & charCodeMask;
-		HUnlock(transH);
-#endif
-	  }
- 	} // end switch
-	
-	return key;
 }
 
+*/
+/*
 void
 wxApp::macAdjustCursor()
 {
-  if (m_event.what != kHighLevelEvent)
+  if (ev->what != kHighLevelEvent)
   {
 	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
 	if (theMacWxFrame)
 	{
-  	  if (!theMacWxFrame->MacAdjustCursor(m_event.where))
+  	  if (!theMacWxFrame->MacAdjustCursor(ev->where))
 		::SetCursor(&(qd.arrow));
   	}
   }
 }
-*/
+*/
\ No newline at end of file
diff --git a/src/mac/apprsrc.r b/src/mac/apprsrc.r
index 408a135a9f..343157d8d1 100644
--- a/src/mac/apprsrc.r
+++ b/src/mac/apprsrc.r
@@ -7,611 +7,12 @@ resource 'STR#' ( 128 , "Simple Alert Messages" )
 	"This application needs at least a MacPlus" ,
 	"This application needs more memory" ,
 	"This application is out of memory" ,
-	"This application needs at least System 7" ,
+	"This application needs at least System 7.5" ,
+	"About this wxWindows Application" ,
 	"This application needs Appearance extension (built in with System 8) - this restriction will be relieved in the final release"
 	}
 } ;
 
-data 'alis' (128, "Libs alias") {
-	$"0000 0000 00CE 0002 0001 0A58 5858 5858"           
-	$"5858 5858 5800 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 AB9F 536B 4244 0000 0002"            
-	$"EE7C 044C 6962 7300 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0000 0000 0000 0000"          
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            
-	$"0000 0003 1F71 AE82 7707 006A 0016 026C"         
-	$"01A3 0001 0001 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0009 5858 5858 5858"            
-	$"5858 5800 0001 0004 0002 EE7C 0002 0019"            
-	$"5858 5858 5858 5858 5858 5858 5858 5858"           
-	$"5858 5858 5858 5858 5800 FFFF 0000"                 
-};
-
-data 'CSOR' (0) {
-	$"1441 6476 616E 6365 6420 436F 6E63 6570"            
-	$"7473 2041 47"                                       
-};
-
-resource 'FREF' (128) {
-	'APPL',
-	0,
-	""
-};
-
-resource 'FREF' (129) {
-	'shlb',
-	1,
-	""
-};
-
-resource 'FREF' (130) {
-	'PLPW',
-	2,
-	""
-};
-
-resource 'icl4' (128) {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0666 6666 0000 0000 0000 0006 6666 6660"
-	$"0666 6666 0000 0000 0000 0006 6666 6660"
-	$"0666 6660 0000 0000 0000 0000 6666 6660"
-	$"0666 6660 0000 0006 6000 0000 6666 6660"
-	$"0666 6660 0000 0666 6600 0000 6666 6660"
-	$"0666 6660 0000 6606 6600 0000 6666 6660"
-	$"0666 6660 0000 6606 0000 0000 6666 6660"
-	$"0666 6600 0000 0666 6000 0000 0666 6660"
-	$"0666 6600 0000 0006 6600 0000 0666 6660"
-	$"0666 6600 0000 0006 0060 0000 0666 6660"
-	$"0666 6660 0000 0006 6600 0000 6666 6660"
-	$"0666 6660 0000 0666 6000 0000 6666 6660"
-	$"0666 6666 0000 6606 0000 0006 6666 6660"
-	$"0666 6666 6000 6606 0000 0066 6666 6660"
-	$"0666 6666 6000 0666 6600 0066 6666 6660"
-	$"0666 6666 6600 0006 0600 0666 6666 6660"
-	$"0666 6666 6600 0006 0000 0666 6666 6660"
-	$"0666 6666 6660 0006 0000 6666 6666 6660"
-	$"0666 6666 6666 0006 0006 6666 6666 6660"
-	$"0666 6666 6666 0006 0006 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6660 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-};
-
-resource 'icl4' (129, "Editor icon-generic  ") {
-	$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"F000 0000 0000 0000 0000 0000 000C F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCF FFFF FFFF FFFF FFFF CCCC F000"
-	$"F0CC CCFD DDDD DDDD DDDD DDDD FCCC F000"
-	$"F0CC CCFD DDDD DDDF FDDD DDDD FCCC F000"
-	$"F0CC CFDD DDDD DFFF FFDD DDDD DFCC F000"
-	$"F0FC CFDD DDDD FFCF FFDD DDDD DFCC F000"
-	$"FF0F 0FDD DDDD FFCF DDDD DDDD DFCC F0F0"
-	$"F00F 0FFD DDDD DFFF FDDD DDDD FFCC FFCF"
-	$"000F 0CFD DDDD DDDF FFDD DDDD FCCC F0CF"
-	$"000F 0CCF DDDD DDDF DDDD DDDF CCCC CCCF"
-	$"000F 0CCF FDDD DDDF FFDD DDFC CCCC CCCF"
-	$"000F 0CCC FDDD DFFF FDDD DDFC CCCC CCCF"
-	$"000F 0CCC CFDD FFCF DDDD DFCC CCCC CCCF"
-	$"000F 0CCC CFDD FFCF DDDD DFCC CCCC CCCF"
-	$"000F 0CCC CCFD DFFF FFDD FCCC CCCC CCCF"
-	$"000F 0CCC CCFF DDDF DFDF CCCC CCCC CCCF"
-	$"000F 0CCC CCCF DDDF DDDF CCCC CCCC CCCF"
-	$"000F 0CCC CCCC FDDF DDFC CCCC CCCC FCCF"
-	$"F00F 0CCC CCCC FDDF DDFC CCCC CCCC FFCF"
-	$"FF0F 0CCC CCCC FDDF DDFC CCCC CCCC F0F0"
-	$"F0F0 CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F00C CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCFF FCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FCCC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'icl4' (130, "Editor icon-generic  ") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"000F FFFF FFFF FFFF FFFF FFFF FFFF F000"
-	$"000F 0000 0000 0000 0000 0000 0000 F000"
-	$"000F 0CCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FFFF DDDD DDDD DDDD DDDD DDDD DDDD FFFF"
-	$"F00D 0000 0000 0000 0000 0000 0000 D00F"
-	$"F0CD 0CFD DDDD DDDD DDDD DDDD FCCC DCCF"
-	$"F0CD 0CFD DDDD DDDF FDDD DDDD FCCC DCCF"
-	$"F0CD 0FDD DDDD DFFF FFDD DDDD DFCC DCCF"
-	$"F0CD 0FDD DDDD FFCF FFDD DDDD DFCC DCCF"
-	$"F0CD 0FDD DDDD FFCF DDDD DDDD DFCC DCCF"
-	$"F0CD 0FFD DDDD DFFF FDDD DDDD FFCC DCCF"
-	$"F0CD 0CFD DDDD DDDF FFDD DDDD FCCC DCCF"
-	$"F0CD 0CCF DDDD DDDF DDDD DDDF CCCC DCCF"
-	$"F0CD 0CCF FDDD DDDF FFDD DDFC CCCC DCCF"
-	$"F0CD 0CCC FDDD DFFF FDDD DDFC CCCC DCCF"
-	$"F0CD 0CCC CFDD FFCF DDDD DFCC CCCC DCCF"
-	$"F0CD 0CCC CFDD FFCF DDDD DFCC CCCC DCCF"
-	$"F0CD 0CCC CCFD DFFF FFDD FCCC CCCC DCCF"
-	$"F0CD 0CCC CCFF DDDF DFDF CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCF DDDF DDDF CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD DDDD DDDD DDFF FDDD DDDD DDDD FFFF"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF F0"
-};
-
-resource 'icl8' (128) {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"00AB ABAB ABAB ABAB 0000 0000 0000 0000"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB 0000 0000 0000 0000"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 00AB"
-	$"AB00 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 00AB ABAB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 ABAB 00AB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 ABAB 00AB"
-	$"0000 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 00AB ABAB"
-	$"AB00 0000 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 0000 00AB"
-	$"ABAB 0000 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 0000 00AB"
-	$"0000 AB00 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 00AB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 00AB ABAB"
-	$"AB00 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB 0000 0000 ABAB 00AB"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB AB00 0000 ABAB 00AB"
-	$"0000 0000 0000 ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB AB00 0000 00AB ABAB"
-	$"ABAB 0000 0000 ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB 0000 0000 00AB"
-	$"00AB 0000 00AB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB 0000 0000 00AB"
-	$"0000 0000 00AB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB AB00 0000 00AB"
-	$"0000 0000 ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB 0000 00AB"
-	$"0000 00AB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB 0000 00AB"
-	$"0000 00AB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB"
-};
-
-resource 'icl8' (130, "Editor icon-generic  ") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FF00 0000"
-	$"0000 00FF 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 00F5 FF00 0000"
-	$"0000 00FF F5F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
-	$"FFFF FFFF F9F9 F9F9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF FFFF"
-	$"FF00 F5F9 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 F9F5 00FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFF9 F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF FFF9 F9F9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 FFFF 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2BFF F9F9 F9F9 F9F9 F9FF"
-	$"F9F9 F9F9 F9F9 F9FF 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2BFF FFF9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 FF2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B FFF9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 FF2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2BFF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2BFF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B FFF9 F9FF FFFF"
-	$"FFFF F9F9 FF2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B FFFF F9F9 F9FF"
-	$"F9FF F9FF 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2BFF F9F9 F9FF"
-	$"F9F9 F9FF 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 00F8 F82B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B F8F8 F8F8 F9F7 F8FF"
-	$"FF00 F6F9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF FFFF"
-	$"FF00 F62B 2B2B 2B2B 2B2B 2B2B 2B2B 2B2B"
-	$"2B2B 2B2B 2B2B 2B2B 2B2B 2BF8 FF00 0000"
-	$"FFF5 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8"
-	$"F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 FF00 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FF"
-};
-
-resource 'icl8' (129) {
-	$"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000"
-	$"FF00 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 00F6 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6FF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F62B FFF9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 FF2B F6F7 FF00 0000"
-	$"FF00 F6F6 F62B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFF9 F9F9 F9F9 F9F9 FF2B F6F7 FF00 0000"
-	$"FF00 F7F6 F6FF F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF F6F7 FF00 0000"
-	$"FF00 FFF7 F6FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF F6F7 FF00 0000"
-	$"FFFF 00FF 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9F9 F9F9 F9FF F6F7 FF00 FF00"
-	$"FF00 00FF 00FF FFF9 F9F9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 FFFF F6F7 FFFF F7FF"
-	$"0000 00FF 00F6 FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 F9F9 FFF6 F6F7 FF00 F7FF"
-	$"0000 00FF 00F6 F6FF F9F9 F9F9 F9F9 F9FF"
-	$"F9F9 F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6FF FFF9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 FFF6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 FFF9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 FFF6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6FF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6FF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 FFF9 F9FF FFFF"
-	$"FFFF F9F9 FFF6 F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 FFFF F9F9 F9FF"
-	$"F9FF F9FF F6F6 F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 F6FF F9F9 F9FF"
-	$"F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FFF7 F7FF"
-	$"FF00 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FFFF F7FF"
-	$"FFFF 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FF00 FF00"
-	$"FF00 FF00 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 00F6 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 FFFF"
-	$"FFF6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FFF6 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7"
-	$"F7F7 F7F7 F7F7 F7F7 F7F7 F7F7 FF00 0000"
-	$"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'icm#' (129) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm#' (130) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm4' (129) {
-	$""
-};
-
-resource 'icm4' (128) {
-	$""
-};
-
-resource 'icm4' (130) {
-	$""
-};
-
-resource 'icm8' (129) {
-	$""
-};
-
-resource 'icm8' (128) {
-	$""
-};
-
-resource 'icm8' (130) {
-	$""
-};
-
-resource 'ICN#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"0000 0000 7F00 01FE 7F00 01FE 7E00 00FE"
-		$"7E01 80FE 7E07 C0FE 7E0D C0FE 7E0D 00FE"
-		$"7C07 807E 7C01 C07E 7C01 207E 7E01 C0FE"
-		$"7E07 80FE 7F0D 01FE 7F8D 03FE 7F87 C3FE"
-		$"7FC1 47FE 7FC1 07FE 7FE1 0FFE 7FF1 1FFE"
-		$"7FF1 1FFE 7FF9 3FFE 7FF9 3FFE 7FF9 3FFE"
-		$"7FFD 7FFE 7FFD 7FFE 7FFD 7FFE 7FFD 7FFE"
-		$"7FFE FFFE 7FFF FFFE 7FFF FFFE 7FFF FFFE",
-		/* [2] */
-		$"0000 0000 7F00 01FE 7F00 01FE 7E00 00FE"
-		$"7E01 80FE 7E07 C0FE 7E0D C0FE 7E0D 00FE"
-		$"7C07 807E 7C01 C07E 7C01 207E 7E01 C0FE"
-		$"7E07 80FE 7F0D 01FE 7F8D 03FE 7F87 C3FE"
-		$"7FC1 47FE 7FC1 07FE 7FE1 0FFE 7FF1 1FFE"
-		$"7FF1 1FFE 7FF9 3FFE 7FF9 3FFE 7FF9 3FFE"
-		$"7FFD 7FFE 7FFD 7FFE 7FFD 7FFE 7FFD 7FFE"
-		$"7FFE FFFE 7FFF FFFE 7FFF FFFE 7FFF FFFE"
-	}
-};
-
-resource 'ICN#' (129, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"7FFF FFF0 8000 0008 8000 0008 8000 0008"
-		$"82AA AA88 8200 0088 8200 0088 8201 8088"
-		$"A407 C048 D40D C04A 940D 004D 1607 80C9"
-		$"1201 C081 1101 0101 1181 C201 1087 8201"
-		$"104D 0401 104D 0401 1027 C801 1031 5001"
-		$"1011 1009 9009 200D D009 200A A009 2008"
-		$"8005 4008 8005 4008 8005 4008 8003 8008"
-		$"8000 0008 8000 0008 8000 0008 7FFF FFF0",
-		/* [2] */
-		$"0000 0000 1FFF FFF8 1FFF FFF8 1FFF FFF8"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFF8 FFFF FFF8 FFFF FFF8"
-	}
-};
-
-resource 'ICN#' (130, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"0000 0000 1FFF FFF8 1000 0008 1000 0008"
-		$"FAAA AAAF 9200 00A1 8200 0089 9201 8081"
-		$"8407 C049 940D C041 840D 0049 9607 80C1"
-		$"8201 C089 9101 0101 8181 C209 9087 8201"
-		$"804D 0409 904D 0401 8027 C809 9031 5001"
-		$"8011 1009 9009 2001 8009 2009 9009 2001"
-		$"8005 4009 9005 4001 8005 4009 9557 D55F"
-		$"8000 0008 8000 0008 FFFF FFF8",
-		/* [2] */
-		$"0000 0000 1FFF FFF8 1FFF FFF8 1FFF FFF8"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFF8 FFFF FFF8 FFFF FFF8"
-	}
-};
-
-resource 'ics#' (129, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"3FFC 2004 E007 8001 8001 8001 8001 8001"
-		$"8001 8001 8001 8001 8001 8007 8004 FFFC",
-		/* [2] */
-		$"3FFC 3FFC FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFC FFFC"
-	}
-};
-
-resource 'ics#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'ics#' (130, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"3FFC 2004 E007 8001 8001 8001 8001 8001"
-		$"8001 8001 8001 8001 8001 8007 8004 FFFC",
-		/* [2] */
-		$"3FFC 3FFC FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFC FFFC"
-	}
-};
-
-resource 'ics4' (129, "Editor icon-generic  ") {
-	$"00FF FFFF FFFF FF00 00F0 0000 0000 CF00"
-	$"FFFD DDDD DDDD DFFF F0D0 0000 0000 CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0DC CCCC CCCC CDCF F0DD DDDD DDDD DFFF"
-	$"FCCC CCCC CCCC CF00 FFFF FFFF FFFF FF"
-};
-
-resource 'ics4' (128) {
-	$""
-};
-
-resource 'ics4' (130, "Editor icon-generic  ") {
-	$"00FF FFFF FFFF FF00 00F0 0000 0000 CF00"
-	$"FFFD DDDD DDDD DFFF F0D0 0000 0000 CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0DC CCCC CCCC CDCF F0DD DDDD DDDD DFFF"
-	$"FCCC CCCC CCCC CF00 FFFF FFFF FFFF FF"
-};
-
-resource 'ics8' (129, "Editor icon-generic  ") {
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"0000 FFF5 F5F5 F5F5 F5F5 F5F5 F6FF 0000"
-	$"FFFF FFF9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF5 F9F5 F5F5 F5F5 F5F5 F5F5 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F92B 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF6 F8F8 F8F8 F8F8 F8F8 F8F8 F8FF 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'ics8' (128) {
-	$""
-};
-
-resource 'ics8' (130, "Editor icon-generic  ") {
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"0000 FFF5 F5F5 F5F5 F5F5 F5F5 F6FF 0000"
-	$"FFFF FFF9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF5 F9F5 F5F5 F5F5 F5F5 F5F5 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F92B 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF6 F8F8 F8F8 F8F8 F8F8 F8F8 F8FF 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-data 'iSNP' (129) {
-	$"0000"                                               /* .. */
-};
-
-data 'iSNP' (128) {
-	$"0000"                                               /* .. */
-};
-
-data 'iSNP' (130) {
-	$"0000"                                               /* .. */
-};
-
-resource 'BNDL' (128) {
-	'CSOR',
-	0,
-	{	/* array TypeArray: 2 elements */
-		/* [1] */
-		'ICN#',
-		{	/* array IDArray: 3 elements */
-			/* [1] */
-			0, 128,
-			/* [2] */
-			1, 129,
-			/* [3] */
-			2, 130
-		},
-		/* [2] */
-		'FREF',
-		{	/* array IDArray: 3 elements */
-			/* [1] */
-			0, 128,
-			/* [2] */
-			1, 129,
-			/* [3] */
-			2, 130
-		}
-	}
-};
-
 resource 'MENU' (1, preload)
 {
 	1, textMenuProc, 0b11111111111111111111111111111110 , enabled, apple ,
@@ -624,3 +25,4 @@ resource 'MENU' (1, preload)
 resource 'MBAR' (1,preload)
 {
 	{ 1 } ;
+} ;
\ No newline at end of file
diff --git a/src/mac/bitmap.cpp b/src/mac/bitmap.cpp
index 1e6255f551..3a66121d49 100644
--- a/src/mac/bitmap.cpp
+++ b/src/mac/bitmap.cpp
@@ -20,11 +20,83 @@
 #include "wx/icon.h"
 #include "wx/log.h"
 
+extern "C" 
+{
+	#include "xpm.h"
+} ;
+
 #if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
 IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
 #endif
 
+#include <PictUtils.h>
+
+CTabHandle wxMacCreateColorTable( int numColors )
+{
+	CTabHandle newColors; /* Handle to the new color table */
+	short index; /* Index into the table of colors */
+	/* Allocate memory for the color table */
+	newColors = (CTabHandle)NewHandleClear( sizeof (ColorTable) +
+	sizeof (ColorSpec) * (numColors - 1) );
+	if (newColors != nil)
+	{
+		/* Initialize the fields */
+		(**newColors).ctSeed = GetCTSeed();
+		(**newColors).ctFlags = 0;
+		(**newColors).ctSize = numColors - 1;
+		/* Initialize the table of colors */
+	}
+	return newColors ;
+}
+
+void wxMacDestroyColorTable( CTabHandle colors ) 
+{
+	DisposeHandle( (Handle) colors ) ;
+}
+
+void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green ,  int blue )
+{
+	(**newColors).ctTable[index].value = index;
+	(**newColors).ctTable[index].rgb.red = 0 ;// someRedValue;
+	(**newColors).ctTable[index].rgb.green = 0 ; // someGreenValue;
+	(**newColors).ctTable[index].rgb.blue = 0 ; // someBlueValue;
+}
+
+GWorldPtr wxMacCreateGWorld( int height , int width , int depth )
+{
+	OSErr err = noErr ;
+	GWorldPtr port ;
+	Rect rect = { 0 , 0 , width , height } ;
+	
+	if ( depth < 0 )
+	{
+		// get max pixel depth
+		CGrafPtr port ;
+		GetCWMgrPort( &port ) ; 
+		GDHandle maxDevice ;
+		
+		maxDevice = GetMaxDevice( &port->portRect ) ;
+		if ( maxDevice )
+			depth = (**((**maxDevice).gdPMap)).pixelSize ;
+		else
+			depth = 8 ; 
+	}
+		
+	err = NewGWorld( &port , depth , &rect , NULL , NULL , 0 ) ;
+	if ( err == noErr )
+	{
+		return port ;
+	}
+	return NULL ;
+} 
+
+void wxMacDestroyGWorld( GWorldPtr gw )
+{
+	if ( gw )
+		DisposeGWorld( gw ) ;
+}
+
 wxBitmapRefData::wxBitmapRefData()
 {
     m_ok = FALSE;
@@ -34,17 +106,43 @@ wxBitmapRefData::wxBitmapRefData()
     m_quality = 0;
     m_numColors = 0;
     m_bitmapMask = NULL;
+		m_hBitmap = NULL ;
+		m_hPict = NULL ;
+		m_bitmapType = kMacBitmapTypeUnknownType ;
 }
 
 wxBitmapRefData::~wxBitmapRefData()
 {
-    /*
-     * TODO: delete the bitmap data here.
-     */
-
-    if (m_bitmapMask)
-        delete m_bitmapMask;
+	switch (m_bitmapType)
+	{
+		case kMacBitmapTypePict :
+			{
+				if ( m_hPict )
+				{
+					KillPicture( m_hPict ) ;
+					m_hPict = NULL ;
+				}
+			}
+			break ;
+		case kMacBitmapTypeGrafWorld :
+			{
+				if ( m_hBitmap )
+				{
+					wxMacDestroyGWorld( m_hBitmap ) ;
+					m_hBitmap = NULL ;
+				}
+			}
+			break ;
+		default :
+			// unkown type ?
+			break ;
+	} ;
+	
+  if (m_bitmapMask)
+  {
+    delete m_bitmapMask;
     m_bitmapMask = NULL;
+  }
 }
 
 wxList wxBitmap::sm_handlers;
@@ -71,8 +169,57 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits
     M_BITMAPDATA->m_height = the_height ;
     M_BITMAPDATA->m_depth = no_bits ;
     M_BITMAPDATA->m_numColors = 0;
-
-    /* TODO: create the bitmap from data */
+		if ( no_bits == 1 )
+		{
+	    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+	    M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ;
+			M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
+	
+			CGrafPtr 	origPort ;
+			GDHandle	origDevice ;
+			
+			GetGWorld( &origPort , &origDevice ) ;
+			SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
+	
+			// bits is a word aligned array
+			
+			unsigned char* linestart = (unsigned char*) bits ;
+			int linesize = ( the_width / 16 ) * 2  ;
+			if ( the_width % 16 )
+			{
+				linesize += 2 ;
+			} ;
+			
+			RGBColor colors[2] = { 
+				{ 0xFFFF , 0xFFFF , 0xFFFF } ,
+				{ 0, 0 , 0 } 
+				} ;
+			
+			for( int y = 0 ; y < the_height ; ++y , linestart += linesize )
+			{
+				for( int x = 0 ; x < the_width ; ++x )
+				{
+					int index = x / 8 ;
+					int bit = x % 8 ;
+					int mask = 1 << bit ;
+					if ( linestart[index] & mask )
+					{
+						SetCPixel( x , y , &colors[1] ) ;
+					}
+					else
+					{
+						SetCPixel( x , y , &colors[0] ) ;
+					}
+				}
+				
+			}
+	
+	   	SetGWorld( origPort , origDevice ) ;
+	   }
+	   else
+	   {
+				//multicolor BITMAPs not yet implemented
+	   }
 
     if ( wxTheBitmapList )
         wxTheBitmapList->AddBitmap(this);
@@ -102,13 +249,10 @@ wxBitmap::wxBitmap(const wxString& filename, long type)
         wxTheBitmapList->AddBitmap(this);
 }
 
-/* TODO: maybe allow creation from XPM
-// Create from data
 wxBitmap::wxBitmap(const char **data)
 {
     (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
 }
-*/
 
 bool wxBitmap::Create(int w, int h, int d)
 {
@@ -120,11 +264,19 @@ bool wxBitmap::Create(int w, int h, int d)
     M_BITMAPDATA->m_height = h;
     M_BITMAPDATA->m_depth = d;
 
-    /* TODO: create new bitmap */
-
+    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+    M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( w , h , d ) ;
+		M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
     return M_BITMAPDATA->m_ok;
 }
 
+void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
+{
+    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+    M_BITMAPDATA->m_hBitmap = bmp ;
+		M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
+}
+
 bool wxBitmap::LoadFile(const wxString& filename, long type)
 {
     UnRef();
@@ -386,6 +538,52 @@ bool wxBitmapHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type,
  * Standard handlers
  */
 
+class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler
+{
+    DECLARE_DYNAMIC_CLASS(wxPICTResourceHandler)
+public:
+    inline wxPICTResourceHandler()
+    {
+        m_name = "Macintosh Pict resource";
+        m_extension = "";
+        m_type = wxBITMAP_TYPE_PICT_RESOURCE;
+    };
+
+    virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxPICTResourceHandler, wxBitmapHandler)
+
+bool  wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight)
+{
+	Str255 theName ;
+	
+	strcpy( (char*) theName , name ) ;
+	c2pstr( (char*) theName ) ;
+	
+	PicHandle thePict = (PicHandle ) GetNamedResource( 'PICT' , theName ) ;
+	if ( thePict )
+	{
+		PictInfo theInfo ;
+		
+		GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ;
+		DetachResource( (Handle) thePict ) ;
+		M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypePict ;
+		M_BITMAPHANDLERDATA->m_hPict = thePict ;
+		M_BITMAPHANDLERDATA->m_width =  theInfo.sourceRect.right - theInfo.sourceRect.left ;
+		M_BITMAPHANDLERDATA->m_height = theInfo.sourceRect.bottom - theInfo.sourceRect.top ;
+		
+		M_BITMAPHANDLERDATA->m_depth = theInfo.depth ;
+		M_BITMAPHANDLERDATA->m_ok = true ;
+		M_BITMAPHANDLERDATA->m_numColors = theInfo.uniqueColors ;
+//		M_BITMAPHANDLERDATA->m_bitmapPalette;
+//		M_BITMAPHANDLERDATA->m_quality;
+		return TRUE ;
+	}
+	return FALSE ;
+}
+
 /* TODO: bitmap handlers, a bit like this:
 class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
 {
@@ -404,6 +602,251 @@ public:
 IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
 */
 
+class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxXPMFileHandler)
+public:
+  inline wxXPMFileHandler(void)
+  {
+  m_name = "XPM bitmap file";
+  m_extension = "xpm";
+  m_type = wxBITMAP_TYPE_XPM;
+  };
+
+  virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth = -1, int desiredHeight = -1);
+  virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler)
+
+bool wxXPMFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+#if USE_XPM_IN_MSW
+    XImage *ximage;
+    XpmAttributes xpmAttr;
+    HDC     dc;
+
+    M_BITMAPHANDLERDATA->m_ok = FALSE;
+    dc = CreateCompatibleDC(NULL);
+    if (dc)
+    {
+      xpmAttr.valuemask = XpmReturnPixels;
+      int errorStatus = XpmReadFileToImage(&dc, WXSTRINGCAST name, &ximage, (XImage **) NULL, &xpmAttr);
+      DeleteDC(dc);
+      if (errorStatus == XpmSuccess)
+      {
+        M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ximage->bitmap;
+
+        BITMAP  bm;
+        GetObject((HBITMAP)M_BITMAPHANDLERDATA->m_hBitmap, sizeof(bm), (LPSTR) & bm);
+
+        M_BITMAPHANDLERDATA->m_width = (bm.bmWidth);
+        M_BITMAPHANDLERDATA->m_height = (bm.bmHeight);
+        M_BITMAPHANDLERDATA->m_depth = (bm.bmPlanes * bm.bmBitsPixel);
+        M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
+        XpmFreeAttributes(&xpmAttr);
+        XImageFree(ximage);
+
+        M_BITMAPHANDLERDATA->m_ok = TRUE;
+        return TRUE;
+      }
+      else
+      {
+        M_BITMAPHANDLERDATA->m_ok = FALSE;
+        return FALSE;
+      }
+    }
+#endif
+
+    return FALSE;
+}
+
+bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette)
+{
+#if USE_XPM_IN_MSW
+      HDC     dc = NULL;
+
+      Visual *visual = NULL;
+      XImage  ximage;
+
+      dc = CreateCompatibleDC(NULL);
+      if (dc)
+      {
+        if (SelectObject(dc, (HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap))
+        { /* for following SetPixel */
+          /* fill the XImage struct 'by hand' */
+    ximage.width = M_BITMAPHANDLERDATA->m_width; 
+     ximage.height = M_BITMAPHANDLERDATA->m_height;
+    ximage.depth = M_BITMAPHANDLERDATA->m_depth; 
+     ximage.bitmap = (void *)M_BITMAPHANDLERDATA->m_hBitmap;
+    int errorStatus = XpmWriteFileFromImage(&dc, WXSTRINGCAST name,
+              &ximage, (XImage *) NULL, (XpmAttributes *) NULL);
+
+          if (dc)
+      DeleteDC(dc);
+
+    if (errorStatus == XpmSuccess)
+      return TRUE;    /* no error */
+    else
+      return FALSE;
+        } else return FALSE;
+      } else return FALSE;
+#else
+  return FALSE;
+#endif
+}
+
+
+class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxXPMDataHandler)
+public:
+  inline wxXPMDataHandler(void)
+  {
+  m_name = "XPM bitmap data";
+  m_extension = "xpm";
+  m_type = wxBITMAP_TYPE_XPM_DATA;
+  };
+
+  virtual bool Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth = 1);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
+
+bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
+{
+ 		XImage *		ximage;
+  	int     		ErrorStatus;
+  	XpmAttributes 	xpmAttr;
+
+    xpmAttr.valuemask = XpmReturnInfos; // get infos back
+    ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
+         &ximage, (XImage **) NULL, &xpmAttr);
+
+    if (ErrorStatus == XpmSuccess)
+    {
+			M_BITMAPHANDLERDATA->m_ok = FALSE;
+			M_BITMAPHANDLERDATA->m_numColors = 0;
+			M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ;
+	  
+			M_BITMAPHANDLERDATA->m_width = ximage->width;
+			M_BITMAPHANDLERDATA->m_height = ximage->height;
+			M_BITMAPHANDLERDATA->m_depth = ximage->depth;
+			M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
+    	XpmFreeAttributes(&xpmAttr);
+	    M_BITMAPHANDLERDATA->m_ok = TRUE;
+			ximage->gworldptr = NULL ;
+			XImageFree(ximage); // releases the malloc, but does not detroy
+		                  // the bitmap
+			M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+		
+			return TRUE;
+    } 
+    else
+    {
+      M_BITMAPHANDLERDATA->m_ok = FALSE;
+      return FALSE;
+    }
+  return FALSE;
+}
+
+class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
+{
+    DECLARE_DYNAMIC_CLASS(wxBMPResourceHandler)
+public:
+    inline wxBMPResourceHandler()
+    {
+        m_name = "Windows bitmap resource";
+        m_extension = "";
+        m_type = wxBITMAP_TYPE_BMP_RESOURCE;
+    };
+
+    virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight);
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
+
+bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+    // TODO: load colourmap.
+/*
+    M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ::LoadBitmap(wxGetInstance(), name);
+    if (M_BITMAPHANDLERDATA->m_hBitmap)
+    {
+      M_BITMAPHANDLERDATA->m_ok = TRUE;
+      BITMAP bm;
+      GetObject((HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap, sizeof(BITMAP), (LPSTR) &bm);
+      M_BITMAPHANDLERDATA->m_width = bm.bmWidth;
+      M_BITMAPHANDLERDATA->m_height = bm.bmHeight;
+      M_BITMAPHANDLERDATA->m_depth = bm.bmBitsPixel;
+      return TRUE;
+    }
+*/
+  // it's probably not found
+  wxLogError("Can't load bitmap '%s' from resources! Check .rc file.", name.c_str());
+
+  return FALSE;
+}
+
+class WXDLLEXPORT wxBMPFileHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxBMPFileHandler)
+public:
+  inline wxBMPFileHandler(void)
+  {
+  m_name = "Windows bitmap file";
+  m_extension = "bmp";
+  m_type = wxBITMAP_TYPE_BMP;
+  };
+
+  virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+      int desiredWidth, int desiredHeight);
+  virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
+
+bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+#if USE_IMAGE_LOADING_IN_MSW
+    wxPalette *palette = NULL;
+    bool success = FALSE;
+/*
+    if (type & wxBITMAP_DISCARD_COLOURMAP)
+      success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap);
+    else
+*/
+    success = (wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0);
+    if (!success && palette)
+    {
+      delete palette;
+      palette = NULL;
+    }
+    if (palette)
+      M_BITMAPHANDLERDATA->m_bitmapPalette = *palette;
+    return success;
+#else
+  return FALSE;
+#endif
+}
+
+bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *pal)
+{
+#if USE_IMAGE_LOADING_IN_MSW
+    wxPalette *actualPalette = (wxPalette *)pal;
+    if (!actualPalette && (!M_BITMAPHANDLERDATA->m_bitmapPalette.IsNull()))
+      actualPalette = & (M_BITMAPHANDLERDATA->m_bitmapPalette);
+    return (wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0);
+#else
+  return FALSE;
+#endif
+}
+
+
+
 void wxBitmap::CleanUpHandlers()
 {
     wxNode *node = sm_handlers.First();
@@ -419,12 +862,10 @@ void wxBitmap::CleanUpHandlers()
 
 void wxBitmap::InitStandardHandlers()
 {
-/* TODO: initialize all standard bitmap or derive class handlers here.
-    AddHandler(new wxBMPResourceHandler);
-    AddHandler(new wxBMPFileHandler);
-    AddHandler(new wxXPMFileHandler);
-    AddHandler(new wxXPMDataHandler);
-    AddHandler(new wxICOResourceHandler);
-    AddHandler(new wxICOFileHandler);
-*/
+	AddHandler( new wxPICTResourceHandler ) ;
+	AddHandler( new wxICONResourceHandler ) ;
+	AddHandler(new wxXPMFileHandler);
+  AddHandler(new wxXPMDataHandler);
+	AddHandler(new wxBMPResourceHandler);
+	AddHandler(new wxBMPFileHandler);
 }
diff --git a/src/mac/brush.cpp b/src/mac/brush.cpp
index 4f28e92f53..cb9d76d1ab 100644
--- a/src/mac/brush.cpp
+++ b/src/mac/brush.cpp
@@ -24,7 +24,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
 wxBrushRefData::wxBrushRefData()
 {
     m_style = wxSOLID;
-// TODO: null data
 }
 
 wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
@@ -32,14 +31,10 @@ wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
   m_style = data.m_style;
   m_stipple = data.m_stipple;
   m_colour = data.m_colour;
-/* TODO: null data
-  m_hBrush = 0;
-*/
 }
 
 wxBrushRefData::~wxBrushRefData()
 {
-// TODO: delete data
 }
 
 // Brushes
@@ -134,7 +129,6 @@ void wxBrush::SetStipple(const wxBitmap& Stipple)
 
 bool wxBrush::RealizeResource()
 {
-// TODO: create the brush
-    return FALSE;
+    return TRUE;
 }
 
diff --git a/src/mac/button.cpp b/src/mac/button.cpp
index befd0d7156..cb44786443 100644
--- a/src/mac/button.cpp
+++ b/src/mac/button.cpp
@@ -19,57 +19,53 @@
 IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
 // Button
 
+
 bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_windowStyle = style;
-
-    parent->AddChild((wxButton *)this);
-
-    if (id == -1)
-        m_windowId = NewControlId();
-    else
-        m_windowId = id;
-
-    // TODO: create button
-
-    return FALSE;
-}
-
-void wxButton::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	Rect bounds ;
+	Str255 title ;
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlPushButtonProc , (long) this ) ;
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
 void wxButton::SetDefault()
 {
-    wxWindow *parent = (wxWindow *)GetParent();
-    if (parent)
-        parent->SetDefaultItem(this);
-
-    // TODO: make button the default
-}
-
-wxString wxButton::GetLabel() const
-{
-    // TODO
-    return wxString("");
+  wxWindow *parent = (wxWindow *)GetParent();
+  if (parent)
+      parent->SetDefaultItem(this);
+
+  if ( m_macControl )
+  {
+		UMASetControlData( m_macControl , kControlButtonPart , kControlPushButtonDefaultTag , sizeof( Boolean ) , (char*)((Boolean)1) ) ;
+	}
 }
 
-void wxButton::SetLabel(const wxString& label)
+void wxButton::Command (wxCommandEvent & event)
 {
-    // TODO
+    ProcessCommand (event);
 }
 
-void wxButton::Command (wxCommandEvent & event)
+void wxButton::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
 {
-    ProcessCommand (event);
+    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId );
+    event.SetEventObject(this);
+    ProcessCommand(event);
 }
 
diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp
index 3061f99aea..fd5a0009b0 100644
--- a/src/mac/carbon/app.cpp
+++ b/src/mac/carbon/app.cpp
@@ -37,10 +37,18 @@
 
 // mac
 
+#if __option(profile)
+	#include <profiler.h>
+#endif	
+
 #include "apprsrc.h"
 
+#include <wx/mac/uma.h>
+
 extern char *wxBuffer;
 extern wxList wxPendingDelete;
+extern wxList *wxWinMacWindowList;
+extern wxList *wxWinMacControlList;
 
 wxApp *wxTheApp = NULL;
 
@@ -51,56 +59,279 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
 END_EVENT_TABLE()
 #endif
 
-long wxApp::sm_lastMessageTime = 0;
 
 const short	kMacMinHeap = (29 * 1024) ;
 // platform specific static variables
 
-bool					gMacHasAppearance = false ;
-long					gMacAppearanceVersion = 0 ;
-RgnHandle			gMacCursorRgn = NULL ;
+const short kwxMacMenuBarResource = 1 ;
+const short kwxMacAppleMenuId = 1 ;
+
+RgnHandle			wxApp::s_macCursorRgn = NULL;
+wxWindow*			wxApp::s_captureWindow = NULL ;
+int					wxApp::s_lastMouseDown = 0 ;
+long 					wxApp::sm_lastMessageTime = 0;
+
+#ifdef __WXMAC__
+
+bool	wxApp::s_macDefaultEncodingIsPC = true ;
+bool wxApp::s_macSupportPCMenuShortcuts = true ;
+long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
+wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
+
+OSErr AEHandleODoc( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEODoc( event , reply) ;
+}
+
+OSErr AEHandleOApp( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEOApp( event , reply ) ;
+}
+
+OSErr AEHandlePDoc( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEPDoc( event , reply ) ;
+}
+
+OSErr AEHandleQuit( AppleEvent *event , AppleEvent *reply , long refcon )
+{
+	wxApp* app = (wxApp*) refcon ;
+	return wxTheApp->MacHandleAEQuit( event , reply) ;
+}
+
+OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply) 
+{
+	ProcessSerialNumber PSN ;
+	PSN.highLongOfPSN = 0 ;
+	PSN.lowLongOfPSN = kCurrentProcess ;
+	SetFrontProcess( &PSN ) ;
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply) 
+{
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEOApp(AppleEvent *event , AppleEvent *reply) 
+{
+	return noErr ;
+}
+
+OSErr wxApp::MacHandleAEQuit(AppleEvent *event , AppleEvent *reply) 
+{
+	wxWindow* win = GetTopWindow() ;
+	if ( win )
+	{
+		win->Close(TRUE ) ;
+	}
+	else
+	{
+		ExitMainLoop() ;
+	}
+	return noErr ;
+}
+
+char StringMac[] = 	"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+					"\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
+					"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xae\xaf"
+					"\xb1\xb4\xb5\xb6\xbb\xbc\xbe\xbf"
+					"\xc0\xc1\xc2\xc4\xc7\xc8\xc9\xcb\xcc\xcd\xce\xcf"
+					"\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xca\xdb" ;
+
+char StringANSI[] = "\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8"
+					"\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC"
+					"\x86\xBA\xA2\xA3\xA7\x95\xB6\xDF\xAE\xA9\x99\xB4\xA8\xC6\xD8"
+					"\xB1\xA5\xB5\xF0\xAA\xBA\xE6\xF8"
+					"\xBF\xA1\xAC\x83\xAB\xBB\x85\xC0\xC3\xD5\x8C\x9C"
+					"\x96\x97\x93\x94\x91\x92\xF7\xFF\xA0\x80" ;
+
+void wxMacConvertFromPC( const char *from , char *to , int len )
+{
+	char *c ;
+	if ( from == to )
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringANSI , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringMac[ c - StringANSI] ;
+			}	
+			++to ;
+			++from ;
+		}
+	}
+	else
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringANSI , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringMac[ c - StringANSI] ;
+			}	
+			else
+			{
+				*to = *from ;
+			}
+			++to ;
+			++from ;
+		}
+	}
+}
+
+void wxMacConvertToPC( const char *from , char *to , int len )
+{
+	char *c ;
+	if ( from == to )
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringMac , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringANSI[ c - StringMac] ;
+			}	
+			++to ;
+			++from ;
+		}
+	}
+	else
+	{
+		for( int i = 0 ; i < len ; ++ i )
+		{
+			c = strchr( StringMac , *from ) ;
+			if ( c != NULL )
+			{
+				*to = StringANSI[ c - StringMac] ;
+			}	
+			else
+			{
+				*to = *from ;
+			}
+			++to ;
+			++from ;
+		}
+	}
+}
+
+void wxMacConvertFromPC( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+}
+
+void wxMacConvertFromPCForControls( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+	for ( int i = 0 ; i < strlen ( ptr ) ; i++ )
+	{
+		if ( ptr[i] == '&' && ptr[i]+1 != ' ' )
+		{
+			memmove( &ptr[i] , &ptr[i+1] , strlen( &ptr[i+1] ) + 1) ;
+		}
+	}
+}
+
+void wxMacConvertFromPC( unsigned char *p ) 
+{
+	char *ptr = (char*) p + 1 ;
+	int len = p[0] ;
+	
+	wxMacConvertFromPC( ptr , ptr , len ) ;
+}
+
+extern char *wxBuffer ;
+
+wxString wxMacMakeMacStringFromPC( const char * p ) 
+{
+	const char *ptr = p ;
+	int len = strlen ( p ) ;
+	char *buf = wxBuffer ;
+	
+	if ( len >= BUFSIZ + 512 )
+	{
+		buf = new char [len+1] ;
+	}
+
+	wxMacConvertFromPC( ptr , buf , len ) ;
+	buf[len] = 0 ;
+	wxString result( buf ) ;
+	if ( buf != wxBuffer )
+		delete buf ;
+	return result ;
+}
+
+
+void wxMacConvertToPC( char * p ) 
+{
+	char *ptr = p ;
+	int len = strlen ( p ) ;
+	
+	wxMacConvertToPC( ptr , ptr , len ) ;
+}
+
+void wxMacConvertToPC( unsigned char *p ) 
+{
+	char *ptr = (char*) p + 1 ;
+	int len = p[0] ;
+	
+	wxMacConvertToPC( ptr , ptr , len ) ;
+}
+
+wxString wxMacMakePCStringFromMac( const char * p ) 
+{
+	const char *ptr = p ;
+	int len = strlen ( p ) ;
+	char *buf = wxBuffer ;
+	
+	if ( len >= BUFSIZ + 512 )
+	{
+		buf = new char [len+1] ;
+	}
+
+	wxMacConvertToPC( ptr , buf , len ) ;
+	buf[len] = 0 ;
+	
+	wxString result( buf ) ;
+	if ( buf != wxBuffer )
+		delete buf ;
+	return result ;
+}
 
+#endif
 
 bool wxApp::Initialize()
 {
   int error = 0 ;
 	
   // Mac-specific
-	long total,contig;
   
-  // init all managers
-
-	::InitGraf(&qd.thePort);
-	::InitFonts();
-	::InitWindows();
-	::InitMenus();
-	::TEInit();
-	::InitDialogs(0L);
-	::InitCursor();
-	CursHandle aCursHandle = ::GetCursor(watchCursor);	// Watch should be in system
-	if (aCursHandle)
-		::SetCursor(*aCursHandle);											
-	::FlushEvents(everyEvent, 0);
-	
-	// setup memory of application 
-	
-	::MaxApplZone();
-	for (long i = 1; i <= 4; i++)
-		::MoreMasters();
-	PurgeSpace(&total, &contig);
-	::SetCursor( &qd.arrow ) ; 
+  UMAInitToolbox( 4 ) ;
+	UMAShowWatchCursor() ;
 
+	AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerProc(AEHandleODoc) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerProc(AEHandleOApp) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerProc(AEHandlePDoc) , (long) wxTheApp , FALSE ) ;
+	AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerProc(AEHandleQuit) , (long) wxTheApp  , FALSE ) ;
 #if 0
-	InitAEHandlers();
-	InitializeAECore() ;
 	GUSISetup(GUSIwithInternetSockets);
 #endif
 
+	
   // test the minimal configuration necessary
 
 	long theSystem ;
 	long theMachine;
-	long theAppearance ;
 
 	if (Gestalt(gestaltMachineType, &theMachine) != noErr)
 	{
@@ -114,32 +345,25 @@ bool wxApp::Initialize()
 	{
 		error = kMacSTROldSystem  ;
 	}	
-	else if ( theSystem < 0x0700 )
+	else if ( theSystem < 0x0750 )
 	{
 		error = kMacSTROldSystem  ;
 	}
+	#if !TARGET_CARBON
 	else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap)
 	{
 		error = kMacSTRSmallSize;
 	}
+	#endif
+	/*
 	else
 	{
-		if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr )
+		if ( !UMAHasAppearance() )
 		{
-			gMacHasAppearance = true ;
-			RegisterAppearanceClient();
-			if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr )
-			{
-				gMacAppearanceVersion = theAppearance ;
-			}
-			else
-			{
-				gMacAppearanceVersion = 0x0100 ;
-			}
-		}
-		else
 			error = kMacSTRNoPre8Yet ;
+		}
 	}
+	*/
 
 	// if we encountered any problems so far, give the error code and exit immediately
   	
@@ -147,19 +371,23 @@ bool wxApp::Initialize()
   {  	
 		short itemHit;
 		Str255 message;
-	
-		SetCursor(&qd.arrow);
+
 		GetIndString(message, 128, error);
-		ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p");
-		itemHit = Alert(129, nil);
+		UMAShowArrowCursor() ;
+		ParamText("\pFatal Error", message, (ConstStr255Param)"\p", (ConstStr255Param)"\p");
+		itemHit = Alert(128, nil);
 	  return FALSE ;
   }  
-  
+
+#if __option(profile)
+	ProfilerInit( collectDetailed, bestTimeBase , 20000 , 30 ) ;
+#endif	
+
   // now avoid exceptions thrown for new (bad_alloc)
   
   std::__throws_bad_alloc = FALSE ;
   
-	gMacCursorRgn = ::NewRgn() ;
+	s_macCursorRgn = ::NewRgn() ;
 
 #ifdef __WXMSW__
   wxBuffer = new char[1500];
@@ -191,8 +419,14 @@ bool wxApp::Initialize()
   wxBitmap::InitStandardHandlers();
 
   wxModule::RegisterModules();
-  wxASSERT( wxModule::InitializeModules() == TRUE );
+  if (!wxModule::InitializeModules())
+     return FALSE;
 
+  wxWinMacWindowList = new wxList(wxKEY_INTEGER);
+  wxWinMacControlList = new wxList(wxKEY_INTEGER);
+
+	UMAShowArrowCursor() ;
+  
   return TRUE;
 }
 
@@ -228,8 +462,16 @@ void wxApp::CleanUp()
   delete[] wxBuffer;
   wxBuffer = NULL;
 
+  if (wxWinMacWindowList)
+    delete wxWinMacWindowList ;
+
   wxClassInfo::CleanUpClasses();
 
+#if __option(profile)
+	ProfilerDump( "\papp.prof" ) ;
+	ProfilerTerm() ;
+#endif	
+
   delete wxTheApp;
   wxTheApp = NULL;
   
@@ -253,8 +495,8 @@ void wxApp::CleanUp()
   delete wxLog::SetActiveTarget(NULL);
 
 	::PrClose() ;
-	if (gMacCursorRgn)
-		::DisposeRgn(gMacCursorRgn);
+	if (s_macCursorRgn)
+		::DisposeRgn(s_macCursorRgn);
 	#if 0
 		TerminateAE() ;
 	#endif
@@ -281,11 +523,18 @@ int wxEntry( int argc, char *argv[] )
     return 0;
   };
 
+#ifdef __WXMAC__
+  argc = 1 ; // currently we don't support files as parameters
+#endif
+
   wxTheApp->argc = argc;
   wxTheApp->argv = argv;
 
   // GUI-specific initialization, such as creating an app context.
   wxTheApp->OnInitGui();
+  
+  // we could try to get the open apple events here to adjust argc and argv better
+  
 
   // Here frames insert themselves automatically
   // into wxTopLevelWindows by getting created
@@ -324,22 +573,19 @@ wxApp::wxApp()
   m_appName = "";
   argc = 0;
   argv = NULL;
-#ifdef __WXMSW__
+
   m_printMode = wxPRINT_WINDOWS;
-#else
-  m_printMode = wxPRINT_POSTSCRIPT;
-#endif
+
   m_exitOnFrameDelete = TRUE;
   m_auto3D = TRUE;
 }
 
 bool wxApp::Initialized()
 {
+  if (GetTopWindow())
     return TRUE;
-//  if (GetTopWindow())
-//    return TRUE;
-//  else
-//    return FALSE;
+  else
+    return FALSE;
 }
 
 int wxApp::MainLoop()
@@ -372,16 +618,15 @@ void wxApp::ExitMainLoop()
 // Is a message/event pending?
 bool wxApp::Pending()
 {
-/* TODO.
- */
-  return FALSE;
+	EventRecord event ;
+
+  return EventAvail( everyEvent , &event ) ;
 }
 
 // Dispatch a message.
 void wxApp::Dispatch()
 {
-/* TODO.
- */
+	MacDoOneEvent() ;
 }
 
 void wxApp::OnIdle(wxIdleEvent& event)
@@ -493,32 +738,70 @@ void wxExit()
 // Yield to other processes
 bool wxYield()
 {
-#if 0
-	::YieldToOtherThreads() ;
-	::SystemTime() ;
-#endif
+//	YieldToAnyThread() ;
+	SystemTask() ;
   return TRUE;
 }
 
 // platform specifics 
 
+void wxApp::MacSuspend( bool convertClipboard )
+{
+		s_lastMouseDown = 0 ;
+		if( convertClipboard ) 
+		{
+			MacConvertPrivateToPublicScrap() ;
+		}
+		
+		UMAHideFloatingWindows() ;
+}
+
+void wxApp::MacResume( bool convertClipboard )
+{
+		s_lastMouseDown = 0 ;
+		if( convertClipboard ) 
+		{
+			MacConvertPublicToPrivateScrap() ;
+		}
+		
+		UMAShowFloatingWindows() ;
+}
+
+void wxApp::MacConvertPrivateToPublicScrap()
+{
+	::ZeroScrap();
+	::TEToScrap();
+}
+
+void wxApp::MacConvertPublicToPrivateScrap()
+{
+	::TEFromScrap() ;
+}
+
 void wxApp::MacDoOneEvent() 
 {
   EventRecord event ;
 
-	long sleepTime = 60;
+	long sleepTime = ::GetCaretTime();
 
-	if (WaitNextEvent(everyEvent, &event,sleepTime, gMacCursorRgn))
+	if (WaitNextEvent(everyEvent, &event,sleepTime, s_macCursorRgn))
 	{
     MacHandleOneEvent( &event );
 	}
 	else
 	{
 		// idlers
+		WindowPtr window = UMAFrontWindow() ;
+		if ( window )
+			UMAIdleControls( window ) ;
+			
 		wxTheApp->ProcessIdle() ;
 	}
-	
+	if ( event.what != kHighLevelEvent )
+		SetRectRgn( s_macCursorRgn , event.where.h - 1 , event.where.v - 1,  event.where.h + 1 , event.where.v + 1 ) ;
+
 	// repeaters
+
 #if 0
 	wxMacProcessSocketEvents() ;  
 #endif
@@ -526,29 +809,30 @@ void wxApp::MacDoOneEvent()
 
 void wxApp::MacHandleOneEvent( EventRecord *ev ) 
 {
+	m_macCurrentEvent = ev ;
+	
+	wxApp::sm_lastMessageTime = ev->when ;
+	
 	switch (ev->what)
 	{
-		case nullEvent:
-			MacHandleNullEvent( ev ) ;
-			break ;
-		case kHighLevelEvent:
-			MacHandleHighLevelEvent( ev ) ;
-			break;
 		case mouseDown:
 			MacHandleMouseDownEvent( ev ) ;
-			wxTheApp->ExitMainLoop() ;
+			if ( ev->modifiers & controlKey )
+				s_lastMouseDown = 2;
+			else
+				s_lastMouseDown = 1;
 			break;
 		case mouseUp:
+			if ( s_lastMouseDown == 2 )
+			{
+				ev->modifiers |= controlKey ;
+			}
+			else
+			{
+				ev->modifiers &= ~controlKey ;
+			}			
 			MacHandleMouseUpEvent( ev ) ;
-			break;
-		case keyDown:
-			MacHandleKeyDownEvent( ev ) ;
-			break;
-		case autoKey:
-			MacHandleAutoKeyEvent( ev ) ;
-			break;
-		case keyUp:
-			MacHandleKeyUpEvent( ev ) ;
+			s_lastMouseDown = 0;
 			break;
 		case activateEvt:
 			MacHandleActivateEvent( ev ) ;
@@ -556,850 +840,532 @@ void wxApp::MacHandleOneEvent( EventRecord *ev )
 		case updateEvt:
 			MacHandleUpdateEvent( ev ) ;
 			break;
+		case keyDown:
+		case autoKey:
+			MacHandleKeyDownEvent( ev ) ;
+			break;
+		case keyUp:
+			MacHandleKeyUpEvent( ev ) ;
+			break;
 		case diskEvt:
 			MacHandleDiskEvent( ev ) ;
 			break;
 		case osEvt:
 			MacHandleOSEvent( ev ) ;
 			break;
+		case kHighLevelEvent:
+			MacHandleHighLevelEvent( ev ) ;
+			break;
 		default:
 			break;
 	}
 }
 
-void wxApp::MacHandleNullEvent( EventRecord *ev ) 
-{
-}
-
 void wxApp::MacHandleHighLevelEvent( EventRecord *ev )
 {
+	::AEProcessAppleEvent( ev ) ;
 }
 
+bool s_macIsInModalLoop = false ;
+
 void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
 {
-}
+	WindowRef window;
+	WindowRef frontWindow = UMAFrontNonFloatingWindow() ;
+	WindowAttributes frontWindowAttributes = NULL ;
+	if ( frontWindow )
+		UMAGetWindowAttributes( frontWindow , &frontWindowAttributes ) ;
+	
+	short windowPart = ::FindWindow(ev->where, &window);
+	wxWindow* win = wxFindWinFromMacWindow( window ) ;
+	
+	switch (windowPart)
+	{
+		case inMenuBar :
+			if ( s_macIsInModalLoop ) 
+			{
+				SysBeep ( 30 ) ;
+			}
+			else
+			{
+				UInt32 menuresult = MenuSelect(ev->where) ;
+				MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) );
+				s_lastMouseDown = 0;
+			}
+			break ;
+		case inSysWindow :
+			SystemClick( ev , window ) ;
+			s_lastMouseDown = 0;
+			break ;
+		case inDrag :
+			if ( window != frontWindow && s_macIsInModalLoop && !(ev->modifiers & cmdKey ) )
+			{
+				SysBeep ( 30 ) ;
+			}
+			else
+			{
+				DragWindow(window, ev->where, &qd.screenBits.bounds);
+				if (win)
+				{
+					GrafPtr port ;
+					GetPort( &port ) ;
+					Point pt = { 0, 0 } ;
+					SetPort( window ) ;
+					SetOrigin( 0 , 0 ) ;
+					LocalToGlobal( &pt ) ;
+					SetPort( port ) ;
+						win->SetSize( pt.h , pt.v , -1 , 
+							-1 , wxSIZE_USE_EXISTING);
+				}
+				s_lastMouseDown = 0;
+			}
+			break ;
+		case inGoAway:
+			if (TrackGoAway(window, ev->where))
+			{
+				if ( win )
+					win->Close() ;
+			}
+			s_lastMouseDown = 0;
+			break;
+		case inGrow:
+				int growResult = GrowWindow(window , ev->where, &qd.screenBits.bounds);
+				if (growResult != 0)
+				{
+					int newWidth = LoWord(growResult);
+					int newHeight = HiWord(growResult);
+					int oldWidth, oldHeight;
+					
+					win->GetSize(&oldWidth, &oldHeight);
+					if (newWidth == 0) 
+						newWidth = oldWidth;
+					if (newHeight == 0) 
+						newHeight = oldHeight;
+					
+					if (win)
+						win->SetSize( -1, -1, newWidth, newHeight, wxSIZE_USE_EXISTING);
+				}
+				s_lastMouseDown = 0;
+			break;
+		case inZoomIn:
+		case inZoomOut:
+				if (TrackBox(window, ev->where, windowPart))
+				{
+					// TODO setup size event
+					ZoomWindow( window , windowPart , false ) ;
+					if (win)
+						win->SetSize( -1, -1, window->portRect.right-window->portRect.left , 
+							window->portRect.bottom-window->portRect.top, wxSIZE_USE_EXISTING);
+				}
+			s_lastMouseDown = 0;
+			break;
+		case inCollapseBox :
+				// TODO setup size event
+			s_lastMouseDown = 0;
+			break ;
 
-void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
-{
+		case inContent :
+				if ( window != frontWindow )
+				{
+					if ( s_macIsInModalLoop ) 
+					{
+						SysBeep ( 30 ) ;
+					}
+					else if ( UMAIsWindowFloating( window ) )
+					{
+						if ( win )
+							win->MacMouseDown( ev , windowPart ) ;
+					}
+					else
+					{
+						UMASelectWindow( window ) ;
+					}
+				}
+				else
+				{
+					if ( win )
+						win->MacMouseDown( ev , windowPart ) ;
+				}
+			break ;
+			
+		default:
+			break;
+	}
 }
 
-void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
+void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
 {
+	WindowRef window;
+	
+	short windowPart = ::FindWindow(ev->where, &window);
+	
+	switch (windowPart)
+	{
+		case inMenuBar :
+			break ;
+		case inSysWindow :
+			break ;
+		default:
+			{
+				wxWindow* win = wxFindWinFromMacWindow( window ) ;
+				if ( win )
+					win->MacMouseUp( ev , windowPart ) ;
+			}
+			break;
+	}
 }
 
-void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleAutoKeyEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleActivateEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleUpdateEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleDiskEvent( EventRecord *ev )
-{
-}
-
-void wxApp::MacHandleOSEvent( EventRecord *ev )
-{
-}
-
-
-
-/*
-
-void wxApp::doMacMouseDown(void)
-{
-	WindowPtr window;
-	short windowPart = ::FindWindow(m_event.where, &window);
-	if ( windowPart != inMenuBar )
-	{
-		WindowPtr frontWindow = FrontWindow();
-		if (WindowIsModal(frontWindow) && (window != frontWindow))
-			SysBeep(1);
-		else
-		{	
-			switch (windowPart)
+long wxMacTranslateKey(char key, char code)
+{ 
+    switch (key) 
+    {
+    	case 0x01 :
+		 		key = WXK_HOME;
+		  break;
+    	case 0x03 :
+		 		key = WXK_RETURN;
+		  break;
+    	case 0x04 :
+		 		key = WXK_END;
+		  break;
+    	case 0x05 :
+		 		key = WXK_HELP;
+		  break;
+    	case 0x08 :
+		 		key = WXK_BACK;
+		  break;
+    	case 0x09 :
+		 		key = WXK_TAB;
+		  break;
+    	case 0x0b :
+		 		key = WXK_PAGEUP;
+		  break;
+    	case 0x0c :
+		 		key = WXK_PAGEDOWN;
+		  break;
+    	case 0x0d :
+		 		key = WXK_RETURN;
+		  break;
+			case 0x10 :
 			{
-				case inMenuBar:
-					break;
-				case inContent:
-					doMacInContent(window); break;
-				case inDrag:
-					doMacInDrag(window); break;
-				case inGrow:
-					doMacInGrow(window); break;
-				case inGoAway:
-					doMacInGoAway(window); break;
-				case inZoomIn:
-				case inZoomOut:
-					doMacInZoom(window, windowPart); break;
-				default:
-					break;
+				switch( code )
+				{
+					case 0x7a :
+						key = WXK_F1 ;
+						break;
+					case 0x78 :
+						key = WXK_F2 ;
+						break;
+					case 0x63 :
+						key = WXK_F3 ;
+						break;
+					case 0x76 :
+						key = WXK_F4 ;
+						break;
+					case 0x60 :
+						key = WXK_F5 ;
+						break;
+					case 0x61 :
+						key = WXK_F6 ;
+						break;
+					case 0x62:
+						key = WXK_F7 ;
+						break;
+					case 0x64 :
+						key = WXK_F8 ;
+						break;
+					case 0x65 :
+						key = WXK_F9 ;
+						break;
+					case 0x6D :
+						key = WXK_F10 ;
+						break;
+					case 0x67 :
+						key = WXK_F11 ;
+						break;
+					case 0x6F :
+						key = WXK_F12 ;
+						break;
+					case 0x69 :
+						key = WXK_F13 ;
+						break;
+					case 0x6B :
+						key = WXK_F14 ;
+						break;
+					case 0x71 :
+						key = WXK_F15 ;
+						break;
+				}
 			}
+			break ;
+			case 0x1b :
+				key = WXK_DELETE ;
+			break ;
+			case 0x1c :
+				key = WXK_LEFT ;
+			break ;
+			case 0x1d :
+				key = WXK_RIGHT ;
+			break ;
+			case 0x1e :
+				key = WXK_UP ;
+			break ;
+			case 0x1f :
+				key = WXK_DOWN ;
+			break ;
+	 		default:
+			break ;
+ 	} // end switch
 	
-		}
-	}
-	else
-	{
-		doMacInMenuBar(::MenuSelect(m_event.where));
-	}
-}
-
-void wxApp::doMacMouseUp(void)
-{
-	if (m_mouseWindow)
-	{
-#if 0
-		int hitX = m_event.where.h; 				// screen window c.s.
-		int hitY = m_event.where.v; 				// screen window c.s.
-		m_mouseWindow->ScreenToClient(&hitX, &hitY);		// mouseWindow client c.s.
-		m_mouseWindow->ClientToLogical(&hitX, &hitY); 	// mouseWindow logical c.s.
-#endif
-		
-		wxMouseEvent event(wxEVT_LEFT_UP);
-		event.m_shiftDown = m_event.modifiers & shiftKey;
-		event.m_controlDown = m_event.modifiers & controlKey;
-		event.m_altDown = m_event.modifiers & optionKey;
-		event.m_metaDown = m_event.modifiers & cmdKey;
-		event.m_leftDown = FALSE;
-		event.m_middleDown = FALSE;
-		event.m_rightDown = FALSE;
-		event.m_x = m_event.where.h;
-		event.m_y = m_event.where.v;
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(m_mouseWindow);
-
-		m_mouseWindow->ProcessEvent(event);
-	}
-	else
- 	{
- 		//??? Can't we just throw away mouse up events without matching mouse down
-		wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
- 		if (theMacWxFrame)
- 		{
-#if 0
- 			int hitX = cCurrentEvent.where.h; // screen window c.s.
- 			int hitY = cCurrentEvent.where.v; // screen window c.s.
-			theMacWxFrame->ScreenToWindow(&hitX, &hitY);
-#endif
-
-			wxMouseEvent event(wxEVT_LEFT_UP);
-			event.m_shiftDown = m_event.modifiers & shiftKey;
-			event.m_controlDown = m_event.modifiers & controlKey;
-			event.m_altDown = m_event.modifiers & optionKey;
-			event.m_metaDown = m_event.modifiers & cmdKey;
-			event.m_leftDown = FALSE;
-			event.m_middleDown = FALSE;
-			event.m_rightDown = FALSE;
-			event.m_x = m_event.where.h;
-			event.m_y = m_event.where.v;
-			event.m_timeStamp = m_event.when;
-			event.SetEventObject(m_mouseWindow);
-
-			theMacWxFrame->ProcessEvent(event);
- 		}
- 	}
-}
-
-void wxApp::doMacMouseMotion(void)
-{
-	if (m_mouseWindow) {
-		wxMouseEvent event(wxEVT_MOTION);
-		event.m_shiftDown = m_event.modifiers & shiftKey;
-		event.m_controlDown = m_event.modifiers & controlKey;
-		event.m_altDown = m_event.modifiers & optionKey;
-		event.m_metaDown = m_event.modifiers & cmdKey;
-		event.m_leftDown = !(m_event.modifiers & btnState);
-		event.m_middleDown = FALSE;
-		event.m_rightDown = FALSE;
-		event.m_x = m_event.where.h;
-		event.m_y = m_event.where.v;
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(m_mouseWindow);
-
-		m_mouseWindow->ProcessEvent(event);
-	}
-	else
- 	{
-		wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
- 		if (theMacWxFrame)
- 		{
-			wxMouseEvent event(wxEVT_MOTION);
-			event.m_shiftDown = m_event.modifiers & shiftKey;
-			event.m_controlDown = m_event.modifiers & controlKey;
-			event.m_altDown = m_event.modifiers & optionKey;
-			event.m_metaDown = m_event.modifiers & cmdKey;
-			event.m_leftDown = !(m_event.modifiers & btnState);
-			event.m_middleDown = FALSE;
-			event.m_rightDown = FALSE;
-			event.m_x = m_event.where.h;
-			event.m_y = m_event.where.v;
-			event.m_timeStamp = m_event.when;
-			event.SetEventObject(m_mouseWindow);
-
-			m_mouseWindow->ProcessEvent(event);
-		}
-	}
-	
-	//??? Need to work with floating windows... isn't there a toolbox call to find the
-	// top window intersecting a point is screen coordinates??
-#if 0
-	else	// will only work for one floating window at the moment... ?
-	{	
-		WindowPtr frontDocPtr = findFrontNonFloatingWindow();
-		WindowPtr frontFloatingPtr = ::FrontWindow();
-		
-		int hitX = cCurrentEvent.where.h;
-		int hitY = cCurrentEvent.where.v;
-		
-		wxFrame* macWxFrame = findMacWxFrame(frontDocPtr);
-		
-		if ((frontFloatingPtr != frontDocPtr) & (frontFloatingPtr != NULL))
-		{
-			RgnHandle frontFloatStrRgn = getStructureRegion(frontFloatingPtr);
-			Rect 	  frontFloatRect = (**frontFloatStrRgn).rgnBBox;
-	
-			if 	   ((hitX >= frontFloatRect.left) & 
-					(hitX <= frontFloatRect.right) & 
-					(hitY >= frontFloatRect.top) &
-					(hitY <= frontFloatRect.bottom))
-			{
-				macWxFrame = findMacWxFrame(frontFloatingPtr);
-			}
-		}
-	}
-#endif
+	return key;
 }
 
-void wxApp::doMacKeyDown(void)
+void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
 {
-	long menuResult = 0 ;
-	short keycode ;
-	short keychar ;
-	keychar = short(m_event.message & charCodeMask);
-	keycode = short(m_event.message & keyCodeMask) >> 8 ;
-
-	// Handle menu accelerators
-	if ( gSFMacHasAppearance )
-	{
-		menuResult = MenuEvent( &m_event ) ;
-		if ( HiWord( menuResult ) )
-		{
-			doMacInMenuBar( menuResult ) ;
-		}
-		else
-		{
-			ControlHandle control ;
-			
-			GetKeyboardFocus( FrontNonFloatingWindow() , &control ) ;
-			if ( control && keychar != 0x07 )
-				HandleControlKey( control , keycode , keychar , m_event.modifiers ) ;
-			else
-			{
-				wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-				if (theMacWxFrame)
-				{
-					wxKeyEvent event(wxEVT_CHAR);
-					event.m_shiftDown = m_event.modifiers & shiftKey;
-					event.m_controlDown = m_event.modifiers & controlKey;
-					event.m_altDown = m_event.modifiers & optionKey;
-					event.m_metaDown = m_event.modifiers & cmdKey;
-					event.m_keyCode = macTranslateKey(keychar, m_event.modifiers & (shiftKey|optionKey));
-					event.m_x = m_event.where.h;
-					event.m_y = m_event.where.v;
-					event.m_timeStamp = m_event.when;
-					event.SetEventObject(theMacWxFrame);
-			
-					theMacWxFrame->ProcessEvent(event);
-				}
-			}
-		}
-	}
+	UInt32 menuresult = UMAMenuEvent(ev) ;
+	if ( HiWord( menuresult ) )
+		MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ;
 	else
 	{
-		if (GetMenuHandle( kwxMacAppleMenuId ) )
-		{
-//			menuResult = MDEF_MenuKey(m_event.message, m_event.modifiers , GetMenuHandle( kwxMacAppleMenuId ) );
-		}
-		else
-		{
-			if (m_event.modifiers & cmdKey)
-			{
-				menuResult = MenuKey( keychar ) ;
-			}
-		}
-
-		if ( HiWord( menuResult ) )
-		{
-			doMacInMenuBar( menuResult ) ;
-		}
-		else
-		{
-			wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-			if (theMacWxFrame)
-			{
-				wxKeyEvent event(wxEVT_CHAR);
-				event.m_shiftDown = m_event.modifiers & shiftKey;
-				event.m_controlDown = m_event.modifiers & controlKey;
-				event.m_altDown = m_event.modifiers & optionKey;
-				event.m_metaDown = m_event.modifiers & cmdKey;
-				event.m_keyCode = macTranslateKey(keychar, m_event.modifiers & (shiftKey|optionKey));
-				event.m_x = m_event.where.h;
-				event.m_y = m_event.where.v;
-				event.m_timeStamp = m_event.when;
-				event.SetEventObject(theMacWxFrame);
+		short keycode ;
+		short keychar ;
+		keychar = short(ev->message & charCodeMask);
+		keycode = short(ev->message & keyCodeMask) >> 8 ; 
 		
-				theMacWxFrame->ProcessEvent(event);
-			}
+		wxWindow* focus = wxWindow::FindFocus() ;
+		if ( focus )
+		{
+			wxKeyEvent event(wxEVT_CHAR);
+			event.m_shiftDown = ev->modifiers & shiftKey;
+			event.m_controlDown = ev->modifiers & controlKey;
+			event.m_altDown = ev->modifiers & optionKey;
+			event.m_metaDown = ev->modifiers & cmdKey;
+			event.m_keyCode = wxMacTranslateKey(keychar, keycode);
+			event.m_x = ev->where.h;
+			event.m_y = ev->where.v;
+			event.m_timeStamp = ev->when;
+			event.SetEventObject(focus);
+			focus->GetEventHandler()->ProcessEvent( event ) ;
 		}
 	}
 }
 
-void wxApp::doMacAutoKey(void)
-{
-	doMacKeyDown();
-}
-
-void wxApp::doMacKeyUp(void)
-{
-}
-
-void wxApp::doMacActivateEvt(void)
-{
-	HighlightAndActivateWindow( (WindowPtr) m_event.message , m_event.modifiers & activeFlag ) ;
-}
-
-void wxApp::doMacUpdateEvt(void)
-{
-	WindowPtr theMacWindow = (WindowPtr)(m_event.message);
-	::BeginUpdate(theMacWindow);
-	
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(theMacWindow);
-	if (theMacWxFrame)
-	{
-//		if (!::EmptyRgn(theMacWindow->visRgn))	// this doesn't work with windowshade
-//		{
-			if ( theMacWxFrame->MacSetupPort() )
-			{
-				// Erase update region
-				// we must do this, because controls add their former rect to the inval
-				// rgn and the background might not have been correct at that moment
-				::EraseRect(&theMacWindow->portRect); 
-	
-	 			// Can't use UpdateControls since each control has it's own coordinate system
-	 			//		::UpdateControls(theMacWindow, theMacWindow->visRgn);
-	
-				::UpdateControls( theMacWindow , theMacWindow->visRgn ) ;
-	#if 0
-	 			// Draw the grow box
-	 			if (cStyle & wxRESIZE_BORDER)
-	 				MacDrawGrowIcon();
-	#endif
-	
-				wxPaintEvent event;
-				event.m_timeStamp = m_event.when;
-				event.SetEventObject(theMacWxFrame);
-	
-				theMacWxFrame->ProcessEvent(event);
-	//			::SetThemeWindowBackground(  theMacWindow , kThemeActiveDialogBackgroundBrush ,  false ) ;
-				::ClipRect( &theMacWindow->portRect ) ;		
-				::SetOrigin(  0 , 0 );	
-			}
-			else
-			{
-				wxASSERT_MSG( false , "unabled to setup window mac port") ;
-			}
-			
-//		}
-	}
-
-	::EndUpdate(theMacWindow);
-}
-
-void wxApp::doMacDiskEvt(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	if ((m_event.message >> 16) != noErr)
-	{
-		const int kDILeft = 0x0050; // top coord for disk init dialog
-		const int kDITop = 0x0070; // left coord for disk init dialog
-		Point mountPoint;
-		mountPoint.h = kDILeft;
-		mountPoint.v = kDITop;
-		int myError = DIBadMount(mountPoint, m_event.message);
-	}
-}
-
-void wxApp::doMacOsEvt(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	switch ((m_event.message >> 24) & 0x0ff)
-	{
-		case suspendResumeMessage:
-			if (m_event.message & resumeFlag)
-				doMacResumeEvent();
-			else
-				doMacSuspendEvent();
-			break;
-		case mouseMovedMessage:
-			doMacMouseMovedMessage();
-			break;
-	}
-}
-
-void wxApp::doMacHighLevelEvent(void)
+void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
 {
-	::AEProcessAppleEvent(&m_event); // System 7 or higher
+	// nothing to do
 }
 
-void wxApp::doMacResumeEvent(void)
+void wxApp::MacHandleActivateEvent( EventRecord *ev )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
+	WindowRef window = (WindowRef) ev->message ;
+	if ( window )
 	{
-		if (m_event.message & convertClipboardFlag)
-			::TEFromScrap();
-
-		wxActivateEvent event(wxEVT_ACTIVATE, TRUE);
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(theMacWxFrame);
-
-		theMacWxFrame->ProcessEvent(event);
+		bool activate = (ev->modifiers & activeFlag ) ;
+		WindowClass wclass ;
+		UMAGetWindowClass ( window , &wclass ) ;
+		if ( wclass == kFloatingWindowClass )
+		{
+			// if it is a floater we activate/deactivate the front non-floating window instead
+			window = UMAFrontNonFloatingWindow() ;
+		}
+		wxWindow* win = wxFindWinFromMacWindow( window ) ;
+		if ( win )
+			win->MacActivate( ev , activate ) ;
 	}
 }
 
-void wxApp::doMacSuspendEvent(void)
+void wxApp::MacHandleUpdateEvent( EventRecord *ev )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
+	WindowRef window = (WindowRef) ev->message ;
+	wxWindow * win = wxFindWinFromMacWindow( window ) ;
+	if ( win )
 	{
-		::ZeroScrap();
-		::TEToScrap();
-
-		wxActivateEvent event(wxEVT_ACTIVATE, FALSE);
-		event.m_timeStamp = m_event.when;
-		event.SetEventObject(theMacWxFrame);
-
-		theMacWxFrame->ProcessEvent(event);
+		win->MacUpdate( ev ) ;
 	}
 }
 
-void wxApp::doMacMouseMovedMessage(void)
-{ // based on "Programming for System 7" by Gary Little and Tim Swihart
-	if (m_cursorRgn)
-		::DisposeRgn(m_cursorRgn);
-	m_cursorRgn = ::NewRgn();
-	::SetRectRgn(m_cursorRgn, -32768, -32768, 32766, 32766);
-}
-
-void wxApp::doMacInMenuBar(long menuResult)
+void wxApp::MacHandleDiskEvent( EventRecord *ev )
 {
-	int macMenuId = HiWord(menuResult);
-	int macMenuItemNum = LoWord(menuResult); // counting from 1
-
-	if (macMenuId == 0) 					// no menu item selected;
-		 return;
-	if (macMenuId == 128) 
-	{
-		if (macMenuItemNum != 1) 
-		{			// if not the "About" entry (or the separator)
-			Str255		daName;
-			::GetMenuItemText(GetMenuHandle(128), macMenuItemNum, daName);
-			(void)::OpenDeskAcc(daName);
-			::HiliteMenu(0);								
-			return;
-		}
-	}
-
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
-	if (theMacWxFrame)
-	{
-		if ( theMacWxFrame->IsKindOf( CLASSINFO( wxDialog ) ) )
-			(( wxDialog *) theMacWxFrame)->MacMenuSelect(m_event, macMenuId, macMenuItemNum);
-		else if ( theMacWxFrame->IsKindOf( CLASSINFO( wxFrame ) ) )
-			(( wxFrame *) theMacWxFrame)->MacMenuSelect(m_event, macMenuId, macMenuItemNum);
+	if ( HiWord( ev->message ) != noErr )
+  {
+		OSErr err ;
+		Point point ;
+ 		SetPt( &point , 100 , 100 ) ;
+ 		
+  	err = DIBadMount( point , ev->message ) ;
+		wxASSERT( err == noErr ) ;
 	}
-	::HiliteMenu(0);								
 }
 
-void wxApp::doMacInContent(WindowPtr window)
+void wxApp::MacHandleOSEvent( EventRecord *ev )
 {
-	WindowPtr frontWindow = FrontWindow();
-	if (window != frontWindow )
-	{
-//		SFSelectWindow( window ) ;
-	}
-	else
+	switch( ( ev->message & osEvtMessageMask ) >> 24 )
 	{
-		ControlHandle	control ;
-		Point		localwhere = m_event.where ;
-		GrafPtr		port ;
-		SInt16		controlpart ;
-		
-		::GetPort( &port ) ;
-		::SetPort( window ) ;
-		::GlobalToLocal( &localwhere ) ;
-
-		::SetPort( port ) ;
-		
-		if ( !gSFMacHasAppearance )
-		{
-			controlpart = FindControl( localwhere , window , &control ) ;
-		}
-		else
-		{
-			control = FindControlUnderMouse( localwhere , window , &controlpart ) ;
-		}
-		
-		if ( control && IsControlActive( control ) )
-		{
-			wxControl* wxc = (wxControl*) GetControlReference( control ) ;
-					
-			if ( wxWindow::FindFocus() != wxc &&  wxc->AcceptsFocus() )
-			{
-				wxc->SetFocus() ;	
-				if ( wxWindow::FindFocus() != wxc )
-					control = NULL ; // we were not able to change focus
-			}		
-								
-			if ( control )
+		case suspendResumeMessage :
 			{
-				if ( !gSFMacHasAppearance)
+				bool isResuming = ev->message & resumeFlag ;
+				bool convertClipboard = ev->message & convertClipboardFlag ;
+				bool doesActivate = UMAGetProcessModeDoesActivateOnFGSwitch() ;
+				if ( isResuming )
 				{
-					controlpart = TrackControl( control , localwhere , NULL ) ;
+					WindowRef oldFrontWindow = NULL ;
+					WindowRef newFrontWindow = NULL ;
+					
+					// in case we don't take care of activating ourselves, we have to synchronize
+					// our idea of the active window with the process manager's - which it already activated
+					
+					if ( !doesActivate )
+						oldFrontWindow = UMAFrontNonFloatingWindow() ;
+					
+					MacResume( convertClipboard ) ;
+					
+					newFrontWindow = UMAFrontNonFloatingWindow() ;
+					
+					if ( oldFrontWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( oldFrontWindow ) ;
+						if ( win )
+							win->MacActivate( ev , false ) ;
+					}
+					if ( newFrontWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( newFrontWindow ) ;
+						if ( win )
+							win->MacActivate( ev , true ) ;
+					}
 				}
 				else
-				{
-					controlpart = HandleControlClick( control , localwhere , m_event.modifiers , (ControlActionUPP) -1 ) ;
-				}
+				{			
+					MacSuspend( convertClipboard ) ;
 				
-				if ( controlpart )
-				{
-					wxControl*	wx = (wxControl*) GetControlReference( control ) ;
-					if ( wx )
-						wx->MacHandleControlClick( control , controlpart ) ;
+					// in case this suspending did close an active window, another one might 
+					// have surfaced -> lets deactivate that one
+					
+					WindowRef newActiveWindow = UMAGetActiveNonFloatingWindow() ;
+					if ( newActiveWindow )
+					{
+						wxWindow* win = wxFindWinFromMacWindow( newActiveWindow ) ;
+						if ( win )
+							win->MacActivate( ev , false ) ;
+					}
 				}
 			}
-		}
-		else
-		{
-			wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-			if (theMacWxFrame)
-			{
-				doMacContentClick((wxFrame*)theMacWxFrame); // todo : this cast is wrong
-			}
-		}
-	}
-	
-#if 0
-	wxFrame* theMacWxFrame = findMacWxFrame(window);
-	if (theMacWxFrame)
-	{
-		WindowPtr MacWindow = findFrontNonFloatingWindow();
-		if (window != MacWindow)
-		{		
-			wxFrame* frontFrame = findMacWxFrame(MacWindow);
-			if (!frontFrame) wxFatalError("No wxFrame for frontnonfloatingWindow.");
-			if (!frontFrame->IsModal())
+			break ;
+		case mouseMovedMessage :
 			{
-				frontFrame->SetFocus();
-				doMacContentClick(theMacWxFrame);	// jonto - to deal with doc windows behind floaters ?
-				::newSelectWindow(window); 			// WCH : should I be calling some wxMethod?
-				if (!IsFloating(MacWindow))
+				WindowRef window;
+				
+				wxWindow* currentMouseWindow = NULL ;
+				
+				MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , &currentMouseWindow ) ; 
+				
+				if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
 				{
-					KeyMap keyMap;
-					GetKeys(keyMap);
-					if (!(keyMap[1] & 0x8000)) theMacWxFrame->ShowAsActive(true);	// temporary measure...
+					wxMouseEvent event ;
+					
+					bool isDown = !(ev->modifiers & btnState) ; // 1 is for up
+					bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse
+					
+					event.m_leftDown = isDown && !controlDown;
+					event.m_middleDown = FALSE;
+					event.m_rightDown = isDown && controlDown;				
+					event.m_shiftDown = ev->modifiers & shiftKey;
+					event.m_controlDown = ev->modifiers & controlKey;
+					event.m_altDown = ev->modifiers & optionKey;
+					event.m_metaDown = ev->modifiers & cmdKey;				
+					event.m_x = ev->where.h;
+					event.m_y = ev->where.v;					
+					event.m_timeStamp = ev->when;
+					event.SetEventObject(this);
+					
+					if ( wxWindow::s_lastMouseWindow )
+					{
+						wxMouseEvent eventleave(event ) ;
+						eventleave.SetEventType( wxEVT_LEAVE_WINDOW ) ;
+						wxWindow::s_lastMouseWindow->GetEventHandler()->ProcessEvent(eventleave);
+					}
+					if ( currentMouseWindow )
+					{
+						wxMouseEvent evententer(event ) ;
+						evententer.SetEventType( wxEVT_ENTER_WINDOW ) ;
+						currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
+					}
+					wxWindow::s_lastMouseWindow = currentMouseWindow ;
 				}
-			}										// jonto : not sure yet, but let's try this ...
-			else ::SysBeep(3);
-		}
-		else
-		{
-			doMacContentClick(theMacWxFrame);
-		}
-	}
-#endif
-}
-
-void wxApp::doMacContentClick(wxWindow* frame)
-{
-	m_mouseWindow = frame;
-
-	wxMouseEvent event(wxEVT_LEFT_DOWN);
-	event.m_shiftDown = m_event.modifiers & shiftKey;
-	event.m_controlDown = m_event.modifiers & controlKey;
-	event.m_altDown = m_event.modifiers & optionKey;
-	event.m_metaDown = m_event.modifiers & cmdKey;
-	event.m_leftDown = FALSE;
-	event.m_middleDown = FALSE;
-	event.m_rightDown = FALSE;
-	if ( m_event.modifiers & controlKey )
-	{
-		event.m_rightDown = TRUE;
-	}
-	else
-	{
-		event.m_leftDown = TRUE;
+				
+				short windowPart = ::FindWindow(ev->where, &window);
+				
+				switch (windowPart)
+				{
+					case inMenuBar :
+						break ;
+					case inSysWindow :
+						break ;
+					default:
+						{							
+							if ( s_lastMouseDown == 0 )
+								ev->modifiers |= btnState ;
+
+							wxWindow* win = wxFindWinFromMacWindow( window ) ;
+							if ( win )
+								win->MacMouseMoved( ev , windowPart ) ;
+						}
+						break;
+				}
+			}
+			break ;
+			
 	}
-#if 0
-  event.m_leftDown = !(m_event.modifiers & btnState);
-	event.m_middleDown = FALSE;
-	event.m_rightDown = FALSE;
-#endif
-	event.m_x = m_event.where.h;
-	event.m_y = m_event.where.v;
-	event.m_timeStamp = m_event.when;
-	event.SetEventObject(m_mouseWindow);
-
-//	m_mouseWindow->ProcessEvent(event);
-	m_mouseWindow->MacDispatchMouseEvent(event);
-	
-#if 0
-	// RightButton is cmdKey click  on the mac platform for one-button mouse
-	Bool rightButton = cCurrentEvent.modifiers & cmdKey;
-	// altKey is optionKey on the mac platform:
-	Bool isAltKey = cCurrentEvent.modifiers & optionKey;
-
-	WXTYPE mouseEventType = rightButton ? wxEVENT_TYPE_RIGHT_DOWN
-										: wxEVENT_TYPE_LEFT_DOWN;
-	wxMouseEvent theMouseEvent(mouseEventType);
-	theMouseEvent.leftDown = !rightButton;
-	theMouseEvent.middleDown = FALSE;
-	theMouseEvent.rightDown = rightButton;
-	theMouseEvent.shiftDown = cCurrentEvent.modifiers & shiftKey;
-	theMouseEvent.controlDown = cCurrentEvent.modifiers & controlKey;
-	theMouseEvent.altDown = isAltKey;
-	theMouseEvent.metaDown = FALSE;  // mflatt
-	theMouseEvent.timeStamp = cCurrentEvent.when; // mflatt
-
-	int hitX = cCurrentEvent.where.h; // screen window c.s.
-	int hitY = cCurrentEvent.where.v; // screen window c.s.
-
-	frame->ScreenToWindow(&hitX, &hitY);
-//	frameParentArea->ScreenToArea(&hitX, &hitY);			// tx coords ?
-	theMouseEvent.x = hitX; // frame parent area c.s.
-	theMouseEvent.y = hitY; // frame parent area c.s.
-
-	frame->SeekMouseEventArea(theMouseEvent);
-#endif
 }
 
-void wxApp::doMacInDrag(WindowPtr window)
+void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum )
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
+	if (macMenuId == 0) 					
+		 return; // no menu item selected
+		 
+	if (macMenuId == kwxMacAppleMenuId && macMenuItemNum > 1) 
 	{
-		// should be desktop, not screen
-		Rect dragBoundsRect = qd.screenBits.bounds;	// can't move to a different screen
-//xxx	::InsetRect(&dragBoundsRect, 4, ::GetMBarHeight() + 4); // This is not really necessary
-		Rect oldPos = (**(((WindowPeek)window)->strucRgn)).rgnBBox;
-		::DragReferencedWindow(window, m_event.where, &dragBoundsRect);	// jonto
-		#if 0
-		theMacWxFrame->m_x += (**(((WindowPeek)window)->strucRgn)).rgnBBox.left - oldPos.left;
-		theMacWxFrame->m_y += (**(((WindowPeek)window)->strucRgn)).rgnBBox.top - oldPos.top;
+		#if ! TARGET_CARBON
+		Str255		deskAccessoryName ;
+		GrafPtr		savedPort ;
+		
+		GetMenuItemText(GetMenuHandle(kwxMacAppleMenuId), macMenuItemNum, deskAccessoryName);
+		GetPort(&savedPort);
+		OpenDeskAcc(deskAccessoryName);
+		SetPort(savedPort);
 		#endif
-		Move( (**(((WindowPeek)window)->strucRgn)).rgnBBox.left , (**(((WindowPeek)window)->strucRgn)).rgnBBox.top ) ;
-#if 0
-		theMacWxFrame->wxMacRecalcNewSize(); // Actually, recalc new position only
-#endif
-	}
-	
-#if 0
-//	if (window != ::FrontWindow())
-	if (window != findFrontNonFloatingWindow())
-	{
-//		wxFrame* frontFrame = findMacWxFrame(::FrontWindow());
-		wxFrame* frontFrame = findMacWxFrame(findFrontNonFloatingWindow());
-		if (!frontFrame) wxFatalError("No wxFrame for frontWindow.");
-		if (frontFrame->IsModal())
-		{
-			::SysBeep(3);
-			return;
-		}
 	}
-
-	wxFrame* theMacWxFrame = findMacWxFrame(window);
-	if (theMacWxFrame)
-	{
-		Rect dragBoundsRect = qd.screenBits.bounds;	// can't move to a different screen
-		::InsetRect(&dragBoundsRect, 4, ::GetMBarHeight() + 4); // This is not really necessary
-		newDragWindow(window, cCurrentEvent.where, &dragBoundsRect);	// jonto
-		theMacWxFrame->wxMacRecalcNewSize(); // Actually, recalc new position only
-		if (!IsFloating(window))
-		{
-			theMacWxFrame->ShowAsActive(true);	// temporary measure...
-		}
-	}
-#endif
-}
-
-void wxApp::doMacInGrow(WindowPtr window)
-{
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
+	else
 	{
-		Rect growSizeRect; // WCH: growSizeRect should be a member of wxFrame class
-		growSizeRect.top = 1; // minimum window height
-		growSizeRect.left = 1; // minimum window width
-		growSizeRect.bottom = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
-		growSizeRect.right = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
-		long windSize = ::GrowWindow(window, m_event.where, &growSizeRect);
-		if (windSize != 0)
-		{
-			int nWidth = LoWord(windSize);
-			int nHeight = HiWord(windSize);
-			int oWidth, oHeight;
-			theMacWxFrame->GetSize(&oWidth, &oHeight);
-			if (nWidth == 0) nWidth = oWidth;
-			if (nHeight == 0) nHeight = oHeight;
-			theMacWxFrame->SetSize( -1, -1, nWidth, nHeight, wxSIZE_USE_EXISTING);
-		}
-	}
+		wxWindow* frontwindow = wxFindWinFromMacWindow( ::FrontWindow() )  ;
+		if ( frontwindow && wxMenuBar::s_macInstalledMenuBar )
+			wxMenuBar::s_macInstalledMenuBar->MacMenuSelect( frontwindow->GetEventHandler() , 0 , macMenuId , macMenuItemNum ) ;
+	}		
+	HiliteMenu(0);								
 }
 
-void wxApp::doMacInGoAway(WindowPtr window)
-{
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
-	{
-		if (TrackGoAway(window, m_event.where))
-		{
-            // TODO: Stefan, I think you need to send a wxCloseEvent to the window
-            // here. The OnCloseWindow handler will take care of delete the frame
-            // if it wishes to (there should be a default wxFrame::OnCloseWindow
-            // that destroys the frame).
-			if (theMacWxFrame->OnClose()) {
-#if WXGARBAGE_COLLECTION_ON
-				theMacWxFrame->Show(FALSE);
-#else
-				delete theMacWxFrame;
-#endif
-			}
-		}
-	}
-}
-
-void wxApp::doMacInZoom(WindowPtr window, short windowPart)
+/*
+long wxApp::MacTranslateKey(char key, int mods)
 {
-	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(window);
-	if (theMacWxFrame)
-	{
-		if (TrackBox(window, m_event.where, windowPart))
-		{
-#if 0
-			theMacWxFrame->Maximize(windowPart == inZoomOut);
-#endif
-		}
-	}
 }
 
-long wxApp::macTranslateKey(char key, int mods)
+void wxApp::MacAdjustCursor()
 {
-    static Handle transH = NULL;
-    static unsigned long transState = 0;
-    static Handle ScriptH = NULL;
-    static short region_code = 1;
-
-	if (!ScriptH) { // tom: don't guess the regioncode!!!!
-      struct ItlbRecord * r;
-      ScriptH = GetResource('itlb',0);
-      if (ScriptH) {
-      	HLock(ScriptH);
-      	r = (ItlbRecord*)*ScriptH;
-     	region_code = r->itlbKeys;  	
-      	HUnlock(ScriptH);
-      }	
-    }
- 
-    switch (key) {
-    case 0x7e:
-    case 0x3e:
-      key = WXK_UP;
-      break;
-    case 0x7d:
-    case 0x3d:
-      key = WXK_DOWN;
-      break;
-    case 0x7b:
-    case 0x3b:
-      key = WXK_LEFT;
-      break;
-    case 0x7c:
-    case 0x3c:
-      key = WXK_RIGHT;
-      break;
-    case 0x24:
-    case 0x4c:
-      key = WXK_RETURN;
-      break;
-    case 0x30:
-      key = WXK_TAB;
-      break;
-    case 0x33:
-      key = WXK_BACK;
-      break;
-    case 0x75:
-      key = WXK_DELETE;
-      break;
-    case 0x73:
-	  key = WXK_HOME;
-	  break;
-	case 0x77:
-	  key = WXK_END;
-	  break;   
-	case 0x74:
-	  key = WXK_PAGEUP;
-	  break;     
-	case 0x79:
-	  key = WXK_PAGEDOWN;
-	  break;     
-    default:
-      if (!transH) {
-		transH = GetIndResource('KCHR', 1);
-		HNoPurge(transH);
-      }
-#if 0 //Tom replaces
-      if (transH) {
-		// Only let shift & option modify the key: 
-		HLock(transH);
-		key = KeyTranslate(*transH, (key & 0x7F) | mods, &transState) & charCodeMask;
-		HUnlock(transH);
-#else
-       if (0) { // tom fettig@dfki.uni-sb.de
- 		// why if(0):
- 		// code is not correct, see inside Macintosh: Text 1-87
- 		// and 'itlk'-resource!!
- 		// and it is not necessary, as the translated char is in
- 		// cCurrrentEvent.message!!
-  		// Only let shift & option modify the key: 
-  		HLock(transH);
-		key = KeyTranslate(*transH, (key & 0x7F) | mods, &transState) & charCodeMask;
-		HUnlock(transH);
-#endif
-	  }
- 	} // end switch
-	
-	return key;
 }
 
+*/
+/*
 void
 wxApp::macAdjustCursor()
 {
-  if (m_event.what != kHighLevelEvent)
+  if (ev->what != kHighLevelEvent)
   {
 	wxWindow* theMacWxFrame = wxFrame::MacFindFrameOrDialog(::FrontWindow());
 	if (theMacWxFrame)
 	{
-  	  if (!theMacWxFrame->MacAdjustCursor(m_event.where))
+  	  if (!theMacWxFrame->MacAdjustCursor(ev->where))
 		::SetCursor(&(qd.arrow));
   	}
   }
 }
-*/
+*/
\ No newline at end of file
diff --git a/src/mac/carbon/apprsrc.r b/src/mac/carbon/apprsrc.r
index 408a135a9f..343157d8d1 100644
--- a/src/mac/carbon/apprsrc.r
+++ b/src/mac/carbon/apprsrc.r
@@ -7,611 +7,12 @@ resource 'STR#' ( 128 , "Simple Alert Messages" )
 	"This application needs at least a MacPlus" ,
 	"This application needs more memory" ,
 	"This application is out of memory" ,
-	"This application needs at least System 7" ,
+	"This application needs at least System 7.5" ,
+	"About this wxWindows Application" ,
 	"This application needs Appearance extension (built in with System 8) - this restriction will be relieved in the final release"
 	}
 } ;
 
-data 'alis' (128, "Libs alias") {
-	$"0000 0000 00CE 0002 0001 0A58 5858 5858"           
-	$"5858 5858 5800 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 AB9F 536B 4244 0000 0002"            
-	$"EE7C 044C 6962 7300 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0000 0000 0000 0000"          
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            
-	$"0000 0003 1F71 AE82 7707 006A 0016 026C"         
-	$"01A3 0001 0001 0000 0000 0000 0000 0000"            
-	$"0000 0000 0000 0000 0009 5858 5858 5858"            
-	$"5858 5800 0001 0004 0002 EE7C 0002 0019"            
-	$"5858 5858 5858 5858 5858 5858 5858 5858"           
-	$"5858 5858 5858 5858 5800 FFFF 0000"                 
-};
-
-data 'CSOR' (0) {
-	$"1441 6476 616E 6365 6420 436F 6E63 6570"            
-	$"7473 2041 47"                                       
-};
-
-resource 'FREF' (128) {
-	'APPL',
-	0,
-	""
-};
-
-resource 'FREF' (129) {
-	'shlb',
-	1,
-	""
-};
-
-resource 'FREF' (130) {
-	'PLPW',
-	2,
-	""
-};
-
-resource 'icl4' (128) {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0666 6666 0000 0000 0000 0006 6666 6660"
-	$"0666 6666 0000 0000 0000 0006 6666 6660"
-	$"0666 6660 0000 0000 0000 0000 6666 6660"
-	$"0666 6660 0000 0006 6000 0000 6666 6660"
-	$"0666 6660 0000 0666 6600 0000 6666 6660"
-	$"0666 6660 0000 6606 6600 0000 6666 6660"
-	$"0666 6660 0000 6606 0000 0000 6666 6660"
-	$"0666 6600 0000 0666 6000 0000 0666 6660"
-	$"0666 6600 0000 0006 6600 0000 0666 6660"
-	$"0666 6600 0000 0006 0060 0000 0666 6660"
-	$"0666 6660 0000 0006 6600 0000 6666 6660"
-	$"0666 6660 0000 0666 6000 0000 6666 6660"
-	$"0666 6666 0000 6606 0000 0006 6666 6660"
-	$"0666 6666 6000 6606 0000 0066 6666 6660"
-	$"0666 6666 6000 0666 6600 0066 6666 6660"
-	$"0666 6666 6600 0006 0600 0666 6666 6660"
-	$"0666 6666 6600 0006 0000 0666 6666 6660"
-	$"0666 6666 6660 0006 0000 6666 6666 6660"
-	$"0666 6666 6666 0006 0006 6666 6666 6660"
-	$"0666 6666 6666 0006 0006 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6006 0066 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6606 0666 6666 6666 6660"
-	$"0666 6666 6666 6660 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-	$"0666 6666 6666 6666 6666 6666 6666 6660"
-};
-
-resource 'icl4' (129, "Editor icon-generic  ") {
-	$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"F000 0000 0000 0000 0000 0000 000C F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCF FFFF FFFF FFFF FFFF CCCC F000"
-	$"F0CC CCFD DDDD DDDD DDDD DDDD FCCC F000"
-	$"F0CC CCFD DDDD DDDF FDDD DDDD FCCC F000"
-	$"F0CC CFDD DDDD DFFF FFDD DDDD DFCC F000"
-	$"F0FC CFDD DDDD FFCF FFDD DDDD DFCC F000"
-	$"FF0F 0FDD DDDD FFCF DDDD DDDD DFCC F0F0"
-	$"F00F 0FFD DDDD DFFF FDDD DDDD FFCC FFCF"
-	$"000F 0CFD DDDD DDDF FFDD DDDD FCCC F0CF"
-	$"000F 0CCF DDDD DDDF DDDD DDDF CCCC CCCF"
-	$"000F 0CCF FDDD DDDF FFDD DDFC CCCC CCCF"
-	$"000F 0CCC FDDD DFFF FDDD DDFC CCCC CCCF"
-	$"000F 0CCC CFDD FFCF DDDD DFCC CCCC CCCF"
-	$"000F 0CCC CFDD FFCF DDDD DFCC CCCC CCCF"
-	$"000F 0CCC CCFD DFFF FFDD FCCC CCCC CCCF"
-	$"000F 0CCC CCFF DDDF DFDF CCCC CCCC CCCF"
-	$"000F 0CCC CCCF DDDF DDDF CCCC CCCC CCCF"
-	$"000F 0CCC CCCC FDDF DDFC CCCC CCCC FCCF"
-	$"F00F 0CCC CCCC FDDF DDFC CCCC CCCC FFCF"
-	$"FF0F 0CCC CCCC FDDF DDFC CCCC CCCC F0F0"
-	$"F0F0 CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F00C CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CFDF DFCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCFF FCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FCCC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"0FFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'icl4' (130, "Editor icon-generic  ") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"000F FFFF FFFF FFFF FFFF FFFF FFFF F000"
-	$"000F 0000 0000 0000 0000 0000 0000 F000"
-	$"000F 0CCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FFFF DDDD DDDD DDDD DDDD DDDD DDDD FFFF"
-	$"F00D 0000 0000 0000 0000 0000 0000 D00F"
-	$"F0CD 0CFD DDDD DDDD DDDD DDDD FCCC DCCF"
-	$"F0CD 0CFD DDDD DDDF FDDD DDDD FCCC DCCF"
-	$"F0CD 0FDD DDDD DFFF FFDD DDDD DFCC DCCF"
-	$"F0CD 0FDD DDDD FFCF FFDD DDDD DFCC DCCF"
-	$"F0CD 0FDD DDDD FFCF DDDD DDDD DFCC DCCF"
-	$"F0CD 0FFD DDDD DFFF FDDD DDDD FFCC DCCF"
-	$"F0CD 0CFD DDDD DDDF FFDD DDDD FCCC DCCF"
-	$"F0CD 0CCF DDDD DDDF DDDD DDDF CCCC DCCF"
-	$"F0CD 0CCF FDDD DDDF FFDD DDFC CCCC DCCF"
-	$"F0CD 0CCC FDDD DFFF FDDD DDFC CCCC DCCF"
-	$"F0CD 0CCC CFDD FFCF DDDD DFCC CCCC DCCF"
-	$"F0CD 0CCC CFDD FFCF DDDD DFCC CCCC DCCF"
-	$"F0CD 0CCC CCFD DFFF FFDD FCCC CCCC DCCF"
-	$"F0CD 0CCC CCFF DDDF DFDF CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCF DDDF DDDF CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC FDDF DDFC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD 0CCC CCCC CFDF DFCC CCCC CCCC DCCF"
-	$"F0CD DDDD DDDD DDFF FDDD DDDD DDDD FFFF"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"F0CC CCCC CCCC CCCC CCCC CCCC CCCC F000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF F0"
-};
-
-resource 'icl8' (128) {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"00AB ABAB ABAB ABAB 0000 0000 0000 0000"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB 0000 0000 0000 0000"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 00AB"
-	$"AB00 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 00AB ABAB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 ABAB 00AB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 ABAB 00AB"
-	$"0000 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 00AB ABAB"
-	$"AB00 0000 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 0000 00AB"
-	$"ABAB 0000 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB 0000 0000 0000 0000 00AB"
-	$"0000 AB00 0000 0000 00AB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 0000 00AB"
-	$"ABAB 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB AB00 0000 0000 00AB ABAB"
-	$"AB00 0000 0000 0000 ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB 0000 0000 ABAB 00AB"
-	$"0000 0000 0000 00AB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB AB00 0000 ABAB 00AB"
-	$"0000 0000 0000 ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB AB00 0000 00AB ABAB"
-	$"ABAB 0000 0000 ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB 0000 0000 00AB"
-	$"00AB 0000 00AB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB 0000 0000 00AB"
-	$"0000 0000 00AB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB AB00 0000 00AB"
-	$"0000 0000 ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB 0000 00AB"
-	$"0000 00AB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB 0000 00AB"
-	$"0000 00AB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB AB00 00AB"
-	$"0000 ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB 00AB"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB00"
-	$"00AB ABAB ABAB ABAB ABAB ABAB ABAB ABAB"
-	$"ABAB ABAB ABAB ABAB ABAB ABAB ABAB AB"
-};
-
-resource 'icl8' (130, "Editor icon-generic  ") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 00FF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FF00 0000"
-	$"0000 00FF 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 00F5 FF00 0000"
-	$"0000 00FF F5F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F8 FF00 0000"
-	$"FFFF FFFF F9F9 F9F9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF FFFF"
-	$"FF00 F5F9 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 0000 F9F5 00FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFF9 F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9F9 F9F9 F9FF 2BF8 F92B F8FF"
-	$"FF00 F6F9 00FF FFF9 F9F9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 FFFF 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 F9F9 FF2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2BFF F9F9 F9F9 F9F9 F9FF"
-	$"F9F9 F9F9 F9F9 F9FF 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2BFF FFF9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 FF2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B FFF9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 FF2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2BFF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2BFF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B FFF9 F9FF FFFF"
-	$"FFFF F9F9 FF2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B FFFF F9F9 F9FF"
-	$"F9FF F9FF 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2BFF F9F9 F9FF"
-	$"F9F9 F9FF 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B FFF9 F9FF"
-	$"F9F9 FF2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 002B 2B2B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B 2B2B 2BF8 F92B F8FF"
-	$"FF00 F6F9 00F8 F82B 2B2B 2B2B 2BFF F9FF"
-	$"F9FF 2B2B 2B2B 2B2B F8F8 F8F8 F9F7 F8FF"
-	$"FF00 F6F9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 F9F9 F9F9 FFFF FFFF"
-	$"FF00 F62B 2B2B 2B2B 2B2B 2B2B 2B2B 2B2B"
-	$"2B2B 2B2B 2B2B 2B2B 2B2B 2BF8 FF00 0000"
-	$"FFF5 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 F8F8"
-	$"F8F8 F8F8 F8F8 F8F8 F8F8 F8F8 FF00 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FF"
-};
-
-resource 'icl8' (129) {
-	$"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF 0000 0000"
-	$"FF00 0000 0000 0000 0000 0000 0000 0000"
-	$"0000 0000 0000 0000 0000 00F6 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6FF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F62B FFF9 F9F9 F9F9 F9F9 F9F9"
-	$"F9F9 F9F9 F9F9 F9F9 FF2B F6F7 FF00 0000"
-	$"FF00 F6F6 F62B FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFF9 F9F9 F9F9 F9F9 FF2B F6F7 FF00 0000"
-	$"FF00 F7F6 F6FF F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF F6F7 FF00 0000"
-	$"FF00 FFF7 F6FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"FFFF F9F9 F9F9 F9F9 F9FF F6F7 FF00 0000"
-	$"FFFF 00FF 00FF F9F9 F9F9 F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9F9 F9F9 F9FF F6F7 FF00 FF00"
-	$"FF00 00FF 00FF FFF9 F9F9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 F9F9 FFFF F6F7 FFFF F7FF"
-	$"0000 00FF 00F6 FFF9 F9F9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 F9F9 FFF6 F6F7 FF00 F7FF"
-	$"0000 00FF 00F6 F6FF F9F9 F9F9 F9F9 F9FF"
-	$"F9F9 F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6FF FFF9 F9F9 F9F9 F9FF"
-	$"FFFF F9F9 F9F9 FFF6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 FFF9 F9F9 F9FF FFFF"
-	$"FFF9 F9F9 F9F9 FFF6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6FF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6FF F9F9 FFFF 2BFF"
-	$"F9F9 F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 FFF9 F9FF FFFF"
-	$"FFFF F9F9 FFF6 F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 FFFF F9F9 F9FF"
-	$"F9FF F9FF F6F6 F6F6 F6F6 F6F6 F6F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 F6FF F9F9 F9FF"
-	$"F9F9 F9FF F6F6 F6F6 F6F6 F6F6 F7F6 F7FF"
-	$"0000 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FFF7 F7FF"
-	$"FF00 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FFFF F7FF"
-	$"FFFF 00FF 00F6 F6F6 F6F6 F6F6 FFF9 F9FF"
-	$"F9F9 FFF6 F6F6 F6F6 F6F6 F6F7 FF00 FF00"
-	$"FF00 FF00 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 00F6 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6FF F9FF"
-	$"F9FF F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 FFFF"
-	$"FFF6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FF00 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6 F6F6"
-	$"F6F6 F6F6 F6F6 F6F6 F6F6 F6F7 FF00 0000"
-	$"FFF6 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7 F7F7"
-	$"F7F7 F7F7 F7F7 F7F7 F7F7 F7F7 FF00 0000"
-	$"00FF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'icm#' (129) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm#' (130) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'icm4' (129) {
-	$""
-};
-
-resource 'icm4' (128) {
-	$""
-};
-
-resource 'icm4' (130) {
-	$""
-};
-
-resource 'icm8' (129) {
-	$""
-};
-
-resource 'icm8' (128) {
-	$""
-};
-
-resource 'icm8' (130) {
-	$""
-};
-
-resource 'ICN#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"0000 0000 7F00 01FE 7F00 01FE 7E00 00FE"
-		$"7E01 80FE 7E07 C0FE 7E0D C0FE 7E0D 00FE"
-		$"7C07 807E 7C01 C07E 7C01 207E 7E01 C0FE"
-		$"7E07 80FE 7F0D 01FE 7F8D 03FE 7F87 C3FE"
-		$"7FC1 47FE 7FC1 07FE 7FE1 0FFE 7FF1 1FFE"
-		$"7FF1 1FFE 7FF9 3FFE 7FF9 3FFE 7FF9 3FFE"
-		$"7FFD 7FFE 7FFD 7FFE 7FFD 7FFE 7FFD 7FFE"
-		$"7FFE FFFE 7FFF FFFE 7FFF FFFE 7FFF FFFE",
-		/* [2] */
-		$"0000 0000 7F00 01FE 7F00 01FE 7E00 00FE"
-		$"7E01 80FE 7E07 C0FE 7E0D C0FE 7E0D 00FE"
-		$"7C07 807E 7C01 C07E 7C01 207E 7E01 C0FE"
-		$"7E07 80FE 7F0D 01FE 7F8D 03FE 7F87 C3FE"
-		$"7FC1 47FE 7FC1 07FE 7FE1 0FFE 7FF1 1FFE"
-		$"7FF1 1FFE 7FF9 3FFE 7FF9 3FFE 7FF9 3FFE"
-		$"7FFD 7FFE 7FFD 7FFE 7FFD 7FFE 7FFD 7FFE"
-		$"7FFE FFFE 7FFF FFFE 7FFF FFFE 7FFF FFFE"
-	}
-};
-
-resource 'ICN#' (129, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"7FFF FFF0 8000 0008 8000 0008 8000 0008"
-		$"82AA AA88 8200 0088 8200 0088 8201 8088"
-		$"A407 C048 D40D C04A 940D 004D 1607 80C9"
-		$"1201 C081 1101 0101 1181 C201 1087 8201"
-		$"104D 0401 104D 0401 1027 C801 1031 5001"
-		$"1011 1009 9009 200D D009 200A A009 2008"
-		$"8005 4008 8005 4008 8005 4008 8003 8008"
-		$"8000 0008 8000 0008 8000 0008 7FFF FFF0",
-		/* [2] */
-		$"0000 0000 1FFF FFF8 1FFF FFF8 1FFF FFF8"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFF8 FFFF FFF8 FFFF FFF8"
-	}
-};
-
-resource 'ICN#' (130, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"0000 0000 1FFF FFF8 1000 0008 1000 0008"
-		$"FAAA AAAF 9200 00A1 8200 0089 9201 8081"
-		$"8407 C049 940D C041 840D 0049 9607 80C1"
-		$"8201 C089 9101 0101 8181 C209 9087 8201"
-		$"804D 0409 904D 0401 8027 C809 9031 5001"
-		$"8011 1009 9009 2001 8009 2009 9009 2001"
-		$"8005 4009 9005 4001 8005 4009 9557 D55F"
-		$"8000 0008 8000 0008 FFFF FFF8",
-		/* [2] */
-		$"0000 0000 1FFF FFF8 1FFF FFF8 1FFF FFF8"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFF8 FFFF FFF8 FFFF FFF8"
-	}
-};
-
-resource 'ics#' (129, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"3FFC 2004 E007 8001 8001 8001 8001 8001"
-		$"8001 8001 8001 8001 8001 8007 8004 FFFC",
-		/* [2] */
-		$"3FFC 3FFC FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFC FFFC"
-	}
-};
-
-resource 'ics#' (128) {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"",
-		/* [2] */
-		$""
-	}
-};
-
-resource 'ics#' (130, "Editor icon-generic  ") {
-	{	/* array: 2 elements */
-		/* [1] */
-		$"3FFC 2004 E007 8001 8001 8001 8001 8001"
-		$"8001 8001 8001 8001 8001 8007 8004 FFFC",
-		/* [2] */
-		$"3FFC 3FFC FFFF FFFF FFFF FFFF FFFF FFFF"
-		$"FFFF FFFF FFFF FFFF FFFF FFFF FFFC FFFC"
-	}
-};
-
-resource 'ics4' (129, "Editor icon-generic  ") {
-	$"00FF FFFF FFFF FF00 00F0 0000 0000 CF00"
-	$"FFFD DDDD DDDD DFFF F0D0 0000 0000 CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0DC CCCC CCCC CDCF F0DD DDDD DDDD DFFF"
-	$"FCCC CCCC CCCC CF00 FFFF FFFF FFFF FF"
-};
-
-resource 'ics4' (128) {
-	$""
-};
-
-resource 'ics4' (130, "Editor icon-generic  ") {
-	$"00FF FFFF FFFF FF00 00F0 0000 0000 CF00"
-	$"FFFD DDDD DDDD DFFF F0D0 0000 0000 CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0D0 CCCC CCCC CDCF F0D0 CCCC CCCC CDCF"
-	$"F0DC CCCC CCCC CDCF F0DD DDDD DDDD DFFF"
-	$"FCCC CCCC CCCC CF00 FFFF FFFF FFFF FF"
-};
-
-resource 'ics8' (129, "Editor icon-generic  ") {
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"0000 FFF5 F5F5 F5F5 F5F5 F5F5 F6FF 0000"
-	$"FFFF FFF9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF5 F9F5 F5F5 F5F5 F5F5 F5F5 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F92B 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF6 F8F8 F8F8 F8F8 F8F8 F8F8 F8FF 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-resource 'ics8' (128) {
-	$""
-};
-
-resource 'ics8' (130, "Editor icon-generic  ") {
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFF 0000"
-	$"0000 FFF5 F5F5 F5F5 F5F5 F5F5 F6FF 0000"
-	$"FFFF FFF9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF5 F9F5 F5F5 F5F5 F5F5 F5F5 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F5 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F92B 2B2B 2B2B 2B2B 2B2B 2BF9 F8FF"
-	$"FFF5 F9F9 F9F9 F9F9 F9F9 F9F9 F9FF FFFF"
-	$"FFF6 F8F8 F8F8 F8F8 F8F8 F8F8 F8FF 0000"
-	$"FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
-};
-
-data 'iSNP' (129) {
-	$"0000"                                               /* .. */
-};
-
-data 'iSNP' (128) {
-	$"0000"                                               /* .. */
-};
-
-data 'iSNP' (130) {
-	$"0000"                                               /* .. */
-};
-
-resource 'BNDL' (128) {
-	'CSOR',
-	0,
-	{	/* array TypeArray: 2 elements */
-		/* [1] */
-		'ICN#',
-		{	/* array IDArray: 3 elements */
-			/* [1] */
-			0, 128,
-			/* [2] */
-			1, 129,
-			/* [3] */
-			2, 130
-		},
-		/* [2] */
-		'FREF',
-		{	/* array IDArray: 3 elements */
-			/* [1] */
-			0, 128,
-			/* [2] */
-			1, 129,
-			/* [3] */
-			2, 130
-		}
-	}
-};
-
 resource 'MENU' (1, preload)
 {
 	1, textMenuProc, 0b11111111111111111111111111111110 , enabled, apple ,
@@ -624,3 +25,4 @@ resource 'MENU' (1, preload)
 resource 'MBAR' (1,preload)
 {
 	{ 1 } ;
+} ;
\ No newline at end of file
diff --git a/src/mac/carbon/bitmap.cpp b/src/mac/carbon/bitmap.cpp
index 1e6255f551..3a66121d49 100644
--- a/src/mac/carbon/bitmap.cpp
+++ b/src/mac/carbon/bitmap.cpp
@@ -20,11 +20,83 @@
 #include "wx/icon.h"
 #include "wx/log.h"
 
+extern "C" 
+{
+	#include "xpm.h"
+} ;
+
 #if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
 IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
 #endif
 
+#include <PictUtils.h>
+
+CTabHandle wxMacCreateColorTable( int numColors )
+{
+	CTabHandle newColors; /* Handle to the new color table */
+	short index; /* Index into the table of colors */
+	/* Allocate memory for the color table */
+	newColors = (CTabHandle)NewHandleClear( sizeof (ColorTable) +
+	sizeof (ColorSpec) * (numColors - 1) );
+	if (newColors != nil)
+	{
+		/* Initialize the fields */
+		(**newColors).ctSeed = GetCTSeed();
+		(**newColors).ctFlags = 0;
+		(**newColors).ctSize = numColors - 1;
+		/* Initialize the table of colors */
+	}
+	return newColors ;
+}
+
+void wxMacDestroyColorTable( CTabHandle colors ) 
+{
+	DisposeHandle( (Handle) colors ) ;
+}
+
+void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green ,  int blue )
+{
+	(**newColors).ctTable[index].value = index;
+	(**newColors).ctTable[index].rgb.red = 0 ;// someRedValue;
+	(**newColors).ctTable[index].rgb.green = 0 ; // someGreenValue;
+	(**newColors).ctTable[index].rgb.blue = 0 ; // someBlueValue;
+}
+
+GWorldPtr wxMacCreateGWorld( int height , int width , int depth )
+{
+	OSErr err = noErr ;
+	GWorldPtr port ;
+	Rect rect = { 0 , 0 , width , height } ;
+	
+	if ( depth < 0 )
+	{
+		// get max pixel depth
+		CGrafPtr port ;
+		GetCWMgrPort( &port ) ; 
+		GDHandle maxDevice ;
+		
+		maxDevice = GetMaxDevice( &port->portRect ) ;
+		if ( maxDevice )
+			depth = (**((**maxDevice).gdPMap)).pixelSize ;
+		else
+			depth = 8 ; 
+	}
+		
+	err = NewGWorld( &port , depth , &rect , NULL , NULL , 0 ) ;
+	if ( err == noErr )
+	{
+		return port ;
+	}
+	return NULL ;
+} 
+
+void wxMacDestroyGWorld( GWorldPtr gw )
+{
+	if ( gw )
+		DisposeGWorld( gw ) ;
+}
+
 wxBitmapRefData::wxBitmapRefData()
 {
     m_ok = FALSE;
@@ -34,17 +106,43 @@ wxBitmapRefData::wxBitmapRefData()
     m_quality = 0;
     m_numColors = 0;
     m_bitmapMask = NULL;
+		m_hBitmap = NULL ;
+		m_hPict = NULL ;
+		m_bitmapType = kMacBitmapTypeUnknownType ;
 }
 
 wxBitmapRefData::~wxBitmapRefData()
 {
-    /*
-     * TODO: delete the bitmap data here.
-     */
-
-    if (m_bitmapMask)
-        delete m_bitmapMask;
+	switch (m_bitmapType)
+	{
+		case kMacBitmapTypePict :
+			{
+				if ( m_hPict )
+				{
+					KillPicture( m_hPict ) ;
+					m_hPict = NULL ;
+				}
+			}
+			break ;
+		case kMacBitmapTypeGrafWorld :
+			{
+				if ( m_hBitmap )
+				{
+					wxMacDestroyGWorld( m_hBitmap ) ;
+					m_hBitmap = NULL ;
+				}
+			}
+			break ;
+		default :
+			// unkown type ?
+			break ;
+	} ;
+	
+  if (m_bitmapMask)
+  {
+    delete m_bitmapMask;
     m_bitmapMask = NULL;
+  }
 }
 
 wxList wxBitmap::sm_handlers;
@@ -71,8 +169,57 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits
     M_BITMAPDATA->m_height = the_height ;
     M_BITMAPDATA->m_depth = no_bits ;
     M_BITMAPDATA->m_numColors = 0;
-
-    /* TODO: create the bitmap from data */
+		if ( no_bits == 1 )
+		{
+	    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+	    M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( the_width , the_height , no_bits ) ;
+			M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
+	
+			CGrafPtr 	origPort ;
+			GDHandle	origDevice ;
+			
+			GetGWorld( &origPort , &origDevice ) ;
+			SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
+	
+			// bits is a word aligned array
+			
+			unsigned char* linestart = (unsigned char*) bits ;
+			int linesize = ( the_width / 16 ) * 2  ;
+			if ( the_width % 16 )
+			{
+				linesize += 2 ;
+			} ;
+			
+			RGBColor colors[2] = { 
+				{ 0xFFFF , 0xFFFF , 0xFFFF } ,
+				{ 0, 0 , 0 } 
+				} ;
+			
+			for( int y = 0 ; y < the_height ; ++y , linestart += linesize )
+			{
+				for( int x = 0 ; x < the_width ; ++x )
+				{
+					int index = x / 8 ;
+					int bit = x % 8 ;
+					int mask = 1 << bit ;
+					if ( linestart[index] & mask )
+					{
+						SetCPixel( x , y , &colors[1] ) ;
+					}
+					else
+					{
+						SetCPixel( x , y , &colors[0] ) ;
+					}
+				}
+				
+			}
+	
+	   	SetGWorld( origPort , origDevice ) ;
+	   }
+	   else
+	   {
+				//multicolor BITMAPs not yet implemented
+	   }
 
     if ( wxTheBitmapList )
         wxTheBitmapList->AddBitmap(this);
@@ -102,13 +249,10 @@ wxBitmap::wxBitmap(const wxString& filename, long type)
         wxTheBitmapList->AddBitmap(this);
 }
 
-/* TODO: maybe allow creation from XPM
-// Create from data
 wxBitmap::wxBitmap(const char **data)
 {
     (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0);
 }
-*/
 
 bool wxBitmap::Create(int w, int h, int d)
 {
@@ -120,11 +264,19 @@ bool wxBitmap::Create(int w, int h, int d)
     M_BITMAPDATA->m_height = h;
     M_BITMAPDATA->m_depth = d;
 
-    /* TODO: create new bitmap */
-
+    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+    M_BITMAPDATA->m_hBitmap = wxMacCreateGWorld( w , h , d ) ;
+		M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
     return M_BITMAPDATA->m_ok;
 }
 
+void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
+{
+    M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+    M_BITMAPDATA->m_hBitmap = bmp ;
+		M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
+}
+
 bool wxBitmap::LoadFile(const wxString& filename, long type)
 {
     UnRef();
@@ -386,6 +538,52 @@ bool wxBitmapHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type,
  * Standard handlers
  */
 
+class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler
+{
+    DECLARE_DYNAMIC_CLASS(wxPICTResourceHandler)
+public:
+    inline wxPICTResourceHandler()
+    {
+        m_name = "Macintosh Pict resource";
+        m_extension = "";
+        m_type = wxBITMAP_TYPE_PICT_RESOURCE;
+    };
+
+    virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxPICTResourceHandler, wxBitmapHandler)
+
+bool  wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight)
+{
+	Str255 theName ;
+	
+	strcpy( (char*) theName , name ) ;
+	c2pstr( (char*) theName ) ;
+	
+	PicHandle thePict = (PicHandle ) GetNamedResource( 'PICT' , theName ) ;
+	if ( thePict )
+	{
+		PictInfo theInfo ;
+		
+		GetPictInfo( thePict , &theInfo , 0 , 0 , systemMethod , 0 ) ;
+		DetachResource( (Handle) thePict ) ;
+		M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypePict ;
+		M_BITMAPHANDLERDATA->m_hPict = thePict ;
+		M_BITMAPHANDLERDATA->m_width =  theInfo.sourceRect.right - theInfo.sourceRect.left ;
+		M_BITMAPHANDLERDATA->m_height = theInfo.sourceRect.bottom - theInfo.sourceRect.top ;
+		
+		M_BITMAPHANDLERDATA->m_depth = theInfo.depth ;
+		M_BITMAPHANDLERDATA->m_ok = true ;
+		M_BITMAPHANDLERDATA->m_numColors = theInfo.uniqueColors ;
+//		M_BITMAPHANDLERDATA->m_bitmapPalette;
+//		M_BITMAPHANDLERDATA->m_quality;
+		return TRUE ;
+	}
+	return FALSE ;
+}
+
 /* TODO: bitmap handlers, a bit like this:
 class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
 {
@@ -404,6 +602,251 @@ public:
 IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
 */
 
+class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxXPMFileHandler)
+public:
+  inline wxXPMFileHandler(void)
+  {
+  m_name = "XPM bitmap file";
+  m_extension = "xpm";
+  m_type = wxBITMAP_TYPE_XPM;
+  };
+
+  virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth = -1, int desiredHeight = -1);
+  virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler)
+
+bool wxXPMFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+#if USE_XPM_IN_MSW
+    XImage *ximage;
+    XpmAttributes xpmAttr;
+    HDC     dc;
+
+    M_BITMAPHANDLERDATA->m_ok = FALSE;
+    dc = CreateCompatibleDC(NULL);
+    if (dc)
+    {
+      xpmAttr.valuemask = XpmReturnPixels;
+      int errorStatus = XpmReadFileToImage(&dc, WXSTRINGCAST name, &ximage, (XImage **) NULL, &xpmAttr);
+      DeleteDC(dc);
+      if (errorStatus == XpmSuccess)
+      {
+        M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ximage->bitmap;
+
+        BITMAP  bm;
+        GetObject((HBITMAP)M_BITMAPHANDLERDATA->m_hBitmap, sizeof(bm), (LPSTR) & bm);
+
+        M_BITMAPHANDLERDATA->m_width = (bm.bmWidth);
+        M_BITMAPHANDLERDATA->m_height = (bm.bmHeight);
+        M_BITMAPHANDLERDATA->m_depth = (bm.bmPlanes * bm.bmBitsPixel);
+        M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
+        XpmFreeAttributes(&xpmAttr);
+        XImageFree(ximage);
+
+        M_BITMAPHANDLERDATA->m_ok = TRUE;
+        return TRUE;
+      }
+      else
+      {
+        M_BITMAPHANDLERDATA->m_ok = FALSE;
+        return FALSE;
+      }
+    }
+#endif
+
+    return FALSE;
+}
+
+bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette)
+{
+#if USE_XPM_IN_MSW
+      HDC     dc = NULL;
+
+      Visual *visual = NULL;
+      XImage  ximage;
+
+      dc = CreateCompatibleDC(NULL);
+      if (dc)
+      {
+        if (SelectObject(dc, (HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap))
+        { /* for following SetPixel */
+          /* fill the XImage struct 'by hand' */
+    ximage.width = M_BITMAPHANDLERDATA->m_width; 
+     ximage.height = M_BITMAPHANDLERDATA->m_height;
+    ximage.depth = M_BITMAPHANDLERDATA->m_depth; 
+     ximage.bitmap = (void *)M_BITMAPHANDLERDATA->m_hBitmap;
+    int errorStatus = XpmWriteFileFromImage(&dc, WXSTRINGCAST name,
+              &ximage, (XImage *) NULL, (XpmAttributes *) NULL);
+
+          if (dc)
+      DeleteDC(dc);
+
+    if (errorStatus == XpmSuccess)
+      return TRUE;    /* no error */
+    else
+      return FALSE;
+        } else return FALSE;
+      } else return FALSE;
+#else
+  return FALSE;
+#endif
+}
+
+
+class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxXPMDataHandler)
+public:
+  inline wxXPMDataHandler(void)
+  {
+  m_name = "XPM bitmap data";
+  m_extension = "xpm";
+  m_type = wxBITMAP_TYPE_XPM_DATA;
+  };
+
+  virtual bool Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth = 1);
+};
+IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler)
+
+bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
+{
+ 		XImage *		ximage;
+  	int     		ErrorStatus;
+  	XpmAttributes 	xpmAttr;
+
+    xpmAttr.valuemask = XpmReturnInfos; // get infos back
+    ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
+         &ximage, (XImage **) NULL, &xpmAttr);
+
+    if (ErrorStatus == XpmSuccess)
+    {
+			M_BITMAPHANDLERDATA->m_ok = FALSE;
+			M_BITMAPHANDLERDATA->m_numColors = 0;
+			M_BITMAPHANDLERDATA->m_hBitmap = ximage->gworldptr ;
+	  
+			M_BITMAPHANDLERDATA->m_width = ximage->width;
+			M_BITMAPHANDLERDATA->m_height = ximage->height;
+			M_BITMAPHANDLERDATA->m_depth = ximage->depth;
+			M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels;
+    	XpmFreeAttributes(&xpmAttr);
+	    M_BITMAPHANDLERDATA->m_ok = TRUE;
+			ximage->gworldptr = NULL ;
+			XImageFree(ximage); // releases the malloc, but does not detroy
+		                  // the bitmap
+			M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
+		
+			return TRUE;
+    } 
+    else
+    {
+      M_BITMAPHANDLERDATA->m_ok = FALSE;
+      return FALSE;
+    }
+  return FALSE;
+}
+
+class WXDLLEXPORT wxBMPResourceHandler: public wxBitmapHandler
+{
+    DECLARE_DYNAMIC_CLASS(wxBMPResourceHandler)
+public:
+    inline wxBMPResourceHandler()
+    {
+        m_name = "Windows bitmap resource";
+        m_extension = "";
+        m_type = wxBITMAP_TYPE_BMP_RESOURCE;
+    };
+
+    virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight);
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler)
+
+bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+    // TODO: load colourmap.
+/*
+    M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ::LoadBitmap(wxGetInstance(), name);
+    if (M_BITMAPHANDLERDATA->m_hBitmap)
+    {
+      M_BITMAPHANDLERDATA->m_ok = TRUE;
+      BITMAP bm;
+      GetObject((HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap, sizeof(BITMAP), (LPSTR) &bm);
+      M_BITMAPHANDLERDATA->m_width = bm.bmWidth;
+      M_BITMAPHANDLERDATA->m_height = bm.bmHeight;
+      M_BITMAPHANDLERDATA->m_depth = bm.bmBitsPixel;
+      return TRUE;
+    }
+*/
+  // it's probably not found
+  wxLogError("Can't load bitmap '%s' from resources! Check .rc file.", name.c_str());
+
+  return FALSE;
+}
+
+class WXDLLEXPORT wxBMPFileHandler: public wxBitmapHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxBMPFileHandler)
+public:
+  inline wxBMPFileHandler(void)
+  {
+  m_name = "Windows bitmap file";
+  m_extension = "bmp";
+  m_type = wxBITMAP_TYPE_BMP;
+  };
+
+  virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+      int desiredWidth, int desiredHeight);
+  virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL);
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler)
+
+bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+    int desiredWidth, int desiredHeight)
+{
+#if USE_IMAGE_LOADING_IN_MSW
+    wxPalette *palette = NULL;
+    bool success = FALSE;
+/*
+    if (type & wxBITMAP_DISCARD_COLOURMAP)
+      success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap);
+    else
+*/
+    success = (wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0);
+    if (!success && palette)
+    {
+      delete palette;
+      palette = NULL;
+    }
+    if (palette)
+      M_BITMAPHANDLERDATA->m_bitmapPalette = *palette;
+    return success;
+#else
+  return FALSE;
+#endif
+}
+
+bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *pal)
+{
+#if USE_IMAGE_LOADING_IN_MSW
+    wxPalette *actualPalette = (wxPalette *)pal;
+    if (!actualPalette && (!M_BITMAPHANDLERDATA->m_bitmapPalette.IsNull()))
+      actualPalette = & (M_BITMAPHANDLERDATA->m_bitmapPalette);
+    return (wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0);
+#else
+  return FALSE;
+#endif
+}
+
+
+
 void wxBitmap::CleanUpHandlers()
 {
     wxNode *node = sm_handlers.First();
@@ -419,12 +862,10 @@ void wxBitmap::CleanUpHandlers()
 
 void wxBitmap::InitStandardHandlers()
 {
-/* TODO: initialize all standard bitmap or derive class handlers here.
-    AddHandler(new wxBMPResourceHandler);
-    AddHandler(new wxBMPFileHandler);
-    AddHandler(new wxXPMFileHandler);
-    AddHandler(new wxXPMDataHandler);
-    AddHandler(new wxICOResourceHandler);
-    AddHandler(new wxICOFileHandler);
-*/
+	AddHandler( new wxPICTResourceHandler ) ;
+	AddHandler( new wxICONResourceHandler ) ;
+	AddHandler(new wxXPMFileHandler);
+  AddHandler(new wxXPMDataHandler);
+	AddHandler(new wxBMPResourceHandler);
+	AddHandler(new wxBMPFileHandler);
 }
diff --git a/src/mac/carbon/brush.cpp b/src/mac/carbon/brush.cpp
index 4f28e92f53..cb9d76d1ab 100644
--- a/src/mac/carbon/brush.cpp
+++ b/src/mac/carbon/brush.cpp
@@ -24,7 +24,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
 wxBrushRefData::wxBrushRefData()
 {
     m_style = wxSOLID;
-// TODO: null data
 }
 
 wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
@@ -32,14 +31,10 @@ wxBrushRefData::wxBrushRefData(const wxBrushRefData& data)
   m_style = data.m_style;
   m_stipple = data.m_stipple;
   m_colour = data.m_colour;
-/* TODO: null data
-  m_hBrush = 0;
-*/
 }
 
 wxBrushRefData::~wxBrushRefData()
 {
-// TODO: delete data
 }
 
 // Brushes
@@ -134,7 +129,6 @@ void wxBrush::SetStipple(const wxBitmap& Stipple)
 
 bool wxBrush::RealizeResource()
 {
-// TODO: create the brush
-    return FALSE;
+    return TRUE;
 }
 
diff --git a/src/mac/carbon/button.cpp b/src/mac/carbon/button.cpp
index befd0d7156..cb44786443 100644
--- a/src/mac/carbon/button.cpp
+++ b/src/mac/carbon/button.cpp
@@ -19,57 +19,53 @@
 IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
 // Button
 
+
 bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_windowStyle = style;
-
-    parent->AddChild((wxButton *)this);
-
-    if (id == -1)
-        m_windowId = NewControlId();
-    else
-        m_windowId = id;
-
-    // TODO: create button
-
-    return FALSE;
-}
-
-void wxButton::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	Rect bounds ;
+	Str255 title ;
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlPushButtonProc , (long) this ) ;
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
 void wxButton::SetDefault()
 {
-    wxWindow *parent = (wxWindow *)GetParent();
-    if (parent)
-        parent->SetDefaultItem(this);
-
-    // TODO: make button the default
-}
-
-wxString wxButton::GetLabel() const
-{
-    // TODO
-    return wxString("");
+  wxWindow *parent = (wxWindow *)GetParent();
+  if (parent)
+      parent->SetDefaultItem(this);
+
+  if ( m_macControl )
+  {
+		UMASetControlData( m_macControl , kControlButtonPart , kControlPushButtonDefaultTag , sizeof( Boolean ) , (char*)((Boolean)1) ) ;
+	}
 }
 
-void wxButton::SetLabel(const wxString& label)
+void wxButton::Command (wxCommandEvent & event)
 {
-    // TODO
+    ProcessCommand (event);
 }
 
-void wxButton::Command (wxCommandEvent & event)
+void wxButton::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
 {
-    ProcessCommand (event);
+    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId );
+    event.SetEventObject(this);
+    ProcessCommand(event);
 }
 
diff --git a/src/mac/carbon/checkbox.cpp b/src/mac/carbon/checkbox.cpp
index dd2e2abe7a..ca99c4b778 100644
--- a/src/mac/carbon/checkbox.cpp
+++ b/src/mac/carbon/checkbox.cpp
@@ -20,6 +20,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
 #endif
 
+#include <wx/mac/uma.h>
+
 // Single check box item
 bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxPoint& pos,
@@ -27,41 +29,27 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-        m_windowId = NewControlId();
-    else
-        m_windowId = id;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, validator , name , &bounds , title ) ;
 
-    // TODO: create checkbox
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlCheckBoxProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
 
-    return FALSE;
-}
-
-void wxCheckBox::SetLabel(const wxString& label)
-{
-    // TODO
-}
-
-void wxCheckBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+  return TRUE;
 }
 
 void wxCheckBox::SetValue(bool val)
 {
-    // TODO
+   ::SetControlValue( m_macControl , val ) ;
 }
 
 bool wxCheckBox::GetValue() const
 {
-    // TODO
-    return FALSE;
+    return ::GetControlValue( m_macControl ) ;
 }
 
 void wxCheckBox::Command (wxCommandEvent & event)
@@ -70,6 +58,11 @@ void wxCheckBox::Command (wxCommandEvent & event)
     ProcessCommand (event);
 }
 
+void wxCheckBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	SetValue( !GetValue() ) ;
+}
+
 // Bitmap checkbox
 bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *label,
            const wxPoint& pos,
@@ -100,7 +93,7 @@ void wxBitmapCheckBox::SetLabel(const wxBitmap *bitmap)
 
 void wxBitmapCheckBox::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxBitmapCheckBox::SetValue(bool val)
diff --git a/src/mac/carbon/choice.cpp b/src/mac/carbon/choice.cpp
index a584d5303f..da3c4efc92 100644
--- a/src/mac/carbon/choice.cpp
+++ b/src/mac/carbon/choice.cpp
@@ -15,6 +15,7 @@
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/choice.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
@@ -23,71 +24,103 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
 bool wxChoice::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos,
            const wxSize& size,
-		   int n, const wxString choices[],
-		   long style,
+		   		int n, const wxString choices[],
+		   		long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
     m_noStrings = n;
-    m_windowStyle = style;
 
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-    	m_windowId = (int)NewControlId();
-    else
-	m_windowId = id;
-
-    // TODO: create choice control
-    return FALSE;
+		Rect bounds ;
+		Str255 title ;
+	
+		MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+	
+		m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0, 
+	  	kControlPopupButtonProc , (long) this ) ; 
+	
+		m_macPopUpMenuHandle =  NewMenu( 1 , "\pPopUp Menu" ) ;
+		SetControlData( m_macControl , kControlNoPart , kControlPopupButtonMenuHandleTag , sizeof( MenuHandle ) , (char*) &m_macPopUpMenuHandle) ;
+		for ( int i = 0 ; i < n ; i++ )
+		{
+			appendmenu( m_macPopUpMenuHandle , choices[i] ) ;
+		}
+		SetControlMinimum( m_macControl , 0 ) ;
+		SetControlMaximum( m_macControl , m_noStrings) ;
+		SetControlValue( m_macControl , 1 ) ;
+
+		MacPostControlCreate() ;
+
+  	return TRUE;
 }
 
 void wxChoice::Append(const wxString& item)
 {
-    // TODO
+	appendmenu( m_macPopUpMenuHandle , item ) ;
     m_noStrings ++;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxChoice::Delete(int n)
 {
-    // TODO
+	wxASSERT( n < m_noStrings ) ;
+    ::DeleteMenuItem( m_macPopUpMenuHandle , n + 1) ;
     m_noStrings --;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxChoice::Clear()
 {
-    // TODO
+    for ( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	::DeleteMenuItem( m_macPopUpMenuHandle , 1 ) ;
+	}
     m_noStrings = 0;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 int wxChoice::GetSelection() const
 {
-    // TODO
-    return 0;
+    return GetControlValue( m_macControl ) -1 ;
 }
 
+void wxChoice::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+    wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId );
+	event.SetInt(GetSelection());
+    event.SetEventObject(this);
+    event.SetString(copystring(GetStringSelection()));
+    ProcessCommand(event);
+    delete[] event.GetString();
+}
+
+
 void wxChoice::SetSelection(int n)
 {
-    // TODO
+    SetControlValue( m_macControl , n + 1 ) ;
 }
 
 int wxChoice::FindString(const wxString& s) const
 {
-    // TODO
-    return 0;
+    for( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	if ( GetString( i ) == s )
+    		return i ; 
+    }
+    return -1;
 }
 
 wxString wxChoice::GetString(int n) const
 {
-    // TODO
-    return wxString("");
+	Str255 text ;
+    ::GetMenuItemText( m_macPopUpMenuHandle , n+1 , text ) ;
+    p2cstr( text ) ;
+    return wxString( text );
 }
 
 void wxChoice::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+  wxControl::SetSize( x,y,width,height,sizeFlags ) ;
 }
 
 wxString wxChoice::GetStringSelection () const
diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp
index 3fe9ebfb72..28a4b9ef3f 100644
--- a/src/mac/carbon/clipbrd.cpp
+++ b/src/mac/carbon/clipbrd.cpp
@@ -30,19 +30,17 @@ IMPLEMENT_ABSTRACT_CLASS(wxClipboardClient, wxObject)
 
 bool wxOpenClipboard()
 {
-    // TODO
-    return FALSE;
+    return TRUE;
 }
 
 bool wxCloseClipboard()
 {
-    // TODO
     return FALSE;
 }
 
 bool wxEmptyClipboard()
 {
-    // TODO
+		ZeroScrap() ;
     return FALSE;
 }
 
@@ -169,7 +167,7 @@ wxClipboardClient *wxClipboard::GetClipboardClient()
 }
 
 void wxClipboard::SetClipboardString(char *str, long time)
-{
+{/*
   bool got_selection;
 
   if (clipOwner) {
@@ -195,6 +193,7 @@ void wxClipboard::SetClipboardString(char *str, long time)
     delete[] cbString;
     cbString = NULL;
   }
+  */
 }
 
 char *wxClipboard::GetClipboardString(long time)
diff --git a/src/mac/carbon/colordlg.cpp b/src/mac/carbon/colordlg.cpp
index 2275a9a39d..c6037a9f96 100644
--- a/src/mac/carbon/colordlg.cpp
+++ b/src/mac/carbon/colordlg.cpp
@@ -14,7 +14,7 @@
 #pragma implementation "colordlg.h"
 #endif
 
-#include "wx/stubs/colordlg.h"
+#include "wx/mac/colordlg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxColourDialog, wxDialog)
@@ -45,8 +45,20 @@ bool wxColourDialog::Create(wxWindow *parent, wxColourData *data)
 
 int wxColourDialog::ShowModal()
 {
-    /* TODO: implement dialog
-     */
+	Point where ;
+	RGBColor currentColor = m_colourData.dataColour.GetPixel() , newColor ;
+	
+	where.h = where.v = -1;
+
+	if (GetColor( where, "\pSelect a new palette color.", &currentColor, &newColor ))
+	{
+		m_colourData.dataColour.Set( newColor ) ;
+    	return wxID_OK;
+	}
+	else
+	{
+    	return wxID_CANCEL;
+	}
 
     return wxID_CANCEL;
 }
diff --git a/src/mac/carbon/colour.cpp b/src/mac/carbon/colour.cpp
index 8d0827ef1d..cc549b5f11 100644
--- a/src/mac/carbon/colour.cpp
+++ b/src/mac/carbon/colour.cpp
@@ -22,13 +22,20 @@ IMPLEMENT_DYNAMIC_CLASS(wxColour, wxObject)
 
 // Colour
 
+static void wxComposeRGBColor( RGBColor * col , int red, int blue, int green ) ;
+static void wxComposeRGBColor( RGBColor * col , int red, int blue, int green ) 
+{
+	col->red = (red << 8) + red;
+	col->blue = (blue << 8) + blue;
+	col->green = (green << 8) + green;
+}
+
 wxColour::wxColour ()
 {
-    m_isInit = FALSE;
-    m_red = m_blue = m_green = 0;
-/* TODO
-    m_pixel = 0;
-*/
+  m_isInit = FALSE;
+  m_red = m_blue = m_green = 0;
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::wxColour (unsigned char r, unsigned char g, unsigned char b)
@@ -37,9 +44,8 @@ wxColour::wxColour (unsigned char r, unsigned char g, unsigned char b)
     m_green = g;
     m_blue = b;
     m_isInit = TRUE;
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::wxColour (const wxColour& col)
@@ -48,9 +54,18 @@ wxColour::wxColour (const wxColour& col)
     m_green = col.m_green;
     m_blue = col.m_blue;
     m_isInit = col.m_isInit;
-/* TODO
+
     m_pixel = col.m_pixel;
-*/
+}
+
+wxColour::wxColour (const wxColour* col)
+{
+    m_red = col->m_red;
+    m_green = col->m_green;
+    m_blue = col->m_blue;
+    m_isInit = col->m_isInit;
+
+    m_pixel = col->m_pixel;
 }
 
 wxColour& wxColour::operator =(const wxColour& col)
@@ -59,9 +74,9 @@ wxColour& wxColour::operator =(const wxColour& col)
   m_green = col.m_green;
   m_blue = col.m_blue;
   m_isInit = col.m_isInit;
-/* TODO
+ 
   m_pixel = col.m_pixel;
-*/
+
   return *this;
 }
 
@@ -82,9 +97,8 @@ void wxColour::InitFromName(const wxString& col)
         m_blue = 0;
         m_isInit = FALSE;
     }
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::~wxColour ()
@@ -97,7 +111,6 @@ void wxColour::Set (unsigned char r, unsigned char g, unsigned char b)
     m_green = g;
     m_blue = b;
     m_isInit = TRUE;
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
diff --git a/src/mac/carbon/combobox.cpp b/src/mac/carbon/combobox.cpp
index 0be841bad4..905f3180aa 100644
--- a/src/mac/carbon/combobox.cpp
+++ b/src/mac/carbon/combobox.cpp
@@ -14,11 +14,15 @@
 #endif
 
 #include "wx/combobox.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
 #endif
 
+// right now we don't support editable comboboxes
+
+
 bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
            const wxString& value,
            const wxPoint& pos,
@@ -28,32 +32,39 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
     m_noStrings = n;
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-    	m_windowId = (int)NewControlId();
-    else
-	m_windowId = id;
-
-    // TODO: create combobox control
 
-    return TRUE;
+		Rect bounds ;
+		Str255 title ;
+	
+		MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+	
+		m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0, 
+	  	kControlPopupButtonProc , (long) this ) ; 
+	
+		m_macPopUpMenuHandle =  NewMenu( 1 , "\pPopUp Menu" ) ;
+		SetControlData( m_macControl , kControlNoPart , kControlPopupButtonMenuHandleTag , sizeof( MenuHandle ) , (char*) &m_macPopUpMenuHandle) ;
+		for ( int i = 0 ; i < n ; i++ )
+		{
+			appendmenu( m_macPopUpMenuHandle , choices[i] ) ;
+		}
+		SetControlMinimum( m_macControl , 0 ) ;
+		SetControlMaximum( m_macControl , m_noStrings) ;
+		SetControlValue( m_macControl , 1 ) ;
+
+		MacPostControlCreate() ;
+
+  	return TRUE;
 }
 
 wxString wxComboBox::GetValue() const
 {
-    // TODO
-    return wxString("");
+    return GetStringSelection() ;
 }
 
 void wxComboBox::SetValue(const wxString& value)
 {
-    // TODO
+    SetStringSelection( value ) ;
 }
 
 // Clipboard operations
@@ -116,50 +127,85 @@ void wxComboBox::SetSelection(long from, long to)
 
 void wxComboBox::Append(const wxString& item)
 {
-    // TODO
+	appendmenu( m_macPopUpMenuHandle , item ) ;
+    m_noStrings ++;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxComboBox::Delete(int n)
 {
-    // TODO
+	wxASSERT( n < m_noStrings ) ;
+    ::DeleteMenuItem( m_macPopUpMenuHandle , n + 1) ;
+    m_noStrings --;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxComboBox::Clear()
 {
-    // TODO
+    for ( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	::DeleteMenuItem( m_macPopUpMenuHandle , 1 ) ;
+	}
+    m_noStrings = 0;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 int wxComboBox::GetSelection() const
 {
-    // TODO
-    return -1;
+    return GetControlValue( m_macControl ) -1 ;
 }
 
 void wxComboBox::SetSelection(int n)
 {
-    // TODO
+    SetControlValue( m_macControl , n + 1 ) ;
 }
 
 int wxComboBox::FindString(const wxString& s) const
 {
-    // TODO
+    for( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	if ( GetString( i ) == s )
+    		return i ; 
+    }
     return -1;
 }
 
 wxString wxComboBox::GetString(int n) const
 {
-    // TODO
-    return wxString("");
+	Str255 text ;
+    ::GetMenuItemText( m_macPopUpMenuHandle , n+1 , text ) ;
+    p2cstr( text ) ;
+    return wxString( text );
 }
 
 wxString wxComboBox::GetStringSelection() const
 {
-    // TODO
-    return wxString("");
+    int sel = GetSelection ();
+    if (sel > -1)
+        return wxString(this->GetString (sel));
+    else
+        return wxString("");
 }
 
 bool wxComboBox::SetStringSelection(const wxString& sel)
 {
-    // TODO
-    return FALSE;
+    int s = FindString (sel);
+    if (s > -1)
+        {
+            SetSelection (s);
+            return TRUE;
+        }
+    else
+        return FALSE;
+}
+
+void wxComboBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+    wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId );
+	event.SetInt(GetSelection());
+    event.SetEventObject(this);
+    event.SetString(copystring(GetStringSelection()));
+    ProcessCommand(event);
+    delete[] event.GetString();
 }
+
diff --git a/src/mac/carbon/control.cpp b/src/mac/carbon/control.cpp
index b141a80ff1..d570e2c5a1 100644
--- a/src/mac/carbon/control.cpp
+++ b/src/mac/carbon/control.cpp
@@ -14,20 +14,51 @@
 #endif
 
 #include "wx/control.h"
+#include "wx/notebook.h"
+#include "wx/tabctrl.h"
+#include "wx/spinbutt.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow)
 
 BEGIN_EVENT_TABLE(wxControl, wxWindow)
+	EVT_MOUSE_EVENTS( wxControl::OnMouseEvent ) 
+	EVT_CHAR( wxControl::OnKeyDown ) 
+	EVT_PAINT( wxControl::OnPaint ) 
 END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
 // Item members
+
+ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ;
+
+pascal void wxMacLiveScrollbarActionProc( ControlHandle control , ControlPartCode partCode )
+{
+	if ( partCode != 0)
+	{
+		wxControl*	wx = (wxControl*) GetControlReference( control ) ;
+		if ( wx )
+		{
+			wx->MacHandleControlClick( control , partCode ) ;
+		}
+	}
+}
+
 wxControl::wxControl()
 {
+		m_macControl = NULL ;
+		m_macHorizontalBorder = 0 ; // additional pixels around the real control
+		m_macVerticalBorder = 0 ;
     m_backgroundColour = *wxWHITE;
     m_foregroundColour = *wxBLACK;
     m_callback = 0;
+
+	if ( wxMacLiveScrollbarActionUPP == NULL )
+	{
+		wxMacLiveScrollbarActionUPP = NewControlActionProc( wxMacLiveScrollbarActionProc ) ;
+	}
 }
 
 wxControl::~wxControl()
@@ -40,17 +71,31 @@ wxControl::~wxControl()
         if (parent->GetDefaultItem() == (wxButton*) this)
             parent->SetDefaultItem(NULL);
     }
+    if ( m_macControl )
+    {
+    	UMADisposeControl( m_macControl ) ;
+    	m_macControl = NULL ;
+    }
 }
 
 void wxControl::SetLabel(const wxString& label)
 {
-    // TODO
+	m_label = label ;
+
+	if ( m_macControl )
+	{
+		Str255 maclabel ;
+		
+		strcpy( (char*) maclabel , label ) ;
+		c2pstr( (char*) maclabel ) ;
+	
+		::SetControlTitle( m_macControl , maclabel ) ;
+	}
 }
 
 wxString wxControl::GetLabel() const
 {
-    // TODO
-    return wxString("");
+    return m_label ;
 }
 
 void wxControl::ProcessCommand (wxCommandEvent & event)
@@ -93,3 +138,566 @@ void wxControl::Centre (int direction)
   SetSize (new_x, new_y, width, height);
 }
 
+void wxControl::SetClientSize (int width, int height)
+{
+  SetSize (-1, -1, width, height);
+}
+
+// ------------------------
+wxList *wxWinMacControlList = NULL;
+wxControl *wxFindControlFromMacControl(ControlHandle inControl )
+{
+    wxNode *node = wxWinMacControlList->Find((long)inControl);
+    if (!node)
+        return NULL;
+    return (wxControl *)node->Data();
+}
+
+void wxAssociateControlWithMacControl(ControlHandle inControl, wxControl *control)
+{
+    // adding NULL WindowRef is (first) surely a result of an error and
+    // (secondly) breaks menu command processing
+    wxCHECK_RET( inControl != (ControlHandle) NULL, "attempt to add a NULL WindowRef to window list" );
+
+    if ( !wxWinMacControlList->Find((long)inControl) )
+        wxWinMacControlList->Append((long)inControl, control);
+}
+
+void wxRemoveMacControlAssociation(wxControl *control)
+{
+    wxWinMacControlList->DeleteObject(control);
+}
+
+void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString label , 
+			 const wxPoint& pos,
+			 const wxSize& size, long style,
+			 const wxValidator& validator,
+			 const wxString& name , Rect *outBounds , StringPtr maclabel ) 
+{
+	m_label = label ;
+  SetName(name);
+  if ( &validator )
+  	SetValidator(validator);
+
+  m_windowStyle = style;
+  parent->AddChild((wxButton *)this);
+
+  m_backgroundColour = parent->GetBackgroundColour() ;
+  m_foregroundColour = parent->GetForegroundColour() ;
+
+  if (id == -1)
+      m_windowId = NewControlId();
+  else
+      m_windowId = id;
+
+	m_width = size.x ;
+	m_height = size.y ;
+	int x = pos.x ;
+	int y = pos.y ;
+	AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING);
+	m_x = x ;
+	m_y = y ;
+		
+
+	Point localOrigin ;
+	Rect	clipRect ;
+	
+	parent->MacClientToRootWindow( &x , &y ) ;
+	outBounds->top = y + m_macVerticalBorder ;
+	outBounds->left = x + m_macHorizontalBorder ;
+	outBounds->bottom = outBounds->top + m_height - 2 * m_macVerticalBorder;
+	outBounds->right = outBounds->left + m_width - 2 * m_macHorizontalBorder ;
+
+	strcpy( (char*) maclabel , label ) ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		wxMacConvertFromPCForControls( (char*) maclabel ) ;
+	}
+
+	c2pstr( (char*) maclabel ) ;
+}
+
+void wxControl::MacPostControlCreate()
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	
+	if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+	{
+		// no font
+	}
+	else if ( IsKindOf( CLASSINFO( wxStaticBox ) ) )
+	{
+		ControlFontStyleRec		controlstyle ;
+		controlstyle.flags = kControlUseFontMask ;
+		controlstyle.font = kControlFontSmallBoldSystemFont ;
+		
+		::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+	}
+	else
+	{
+		ControlFontStyleRec		controlstyle ;
+		controlstyle.flags = kControlUseFontMask ;
+		controlstyle.font = kControlFontSmallSystemFont ;
+		
+		::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+	}
+	ControlHandle container = GetParent()->MacGetContainerForEmbedding() ;
+	wxASSERT_MSG( container != NULL , "No valid mac container control" ) ;
+	::UMAEmbedControl( m_macControl , container ) ;
+	MacAdjustControlRect() ;
+	wxAssociateControlWithMacControl( m_macControl , this ) ;
+}
+
+void wxControl::MacAdjustControlRect() 
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	if ( m_width == -1 || m_height == -1 )
+	{
+		Rect 	bestsize = { 0 , 0 , 0 , 0 } ;
+		short	baselineoffset ;
+		
+		UMAGetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ;
+
+		if ( EmptyRect( &bestsize ) )
+		{
+			baselineoffset = 0;
+			bestsize.left = bestsize.top = 0 ;
+			bestsize.right = 16 ;
+			bestsize.bottom = 16 ;
+			if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+			{
+				bestsize.bottom = 16 ;
+			}
+			else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
+			{
+				bestsize.bottom = 24 ; 
+			}
+		}
+
+		if ( m_width == -1 )
+		{
+			if ( IsKindOf( CLASSINFO( wxButton ) ) )
+			{
+				m_width = m_label.Length() * 8 + 12 + 2 * m_macHorizontalBorder;
+			}
+			else if ( IsKindOf( CLASSINFO( wxStaticText ) ) )
+			{
+				m_width = m_label.Length() * 8 ;
+			}
+			else
+				m_width = bestsize.right - bestsize.left + 2 * m_macHorizontalBorder;
+		}
+		if ( m_height == -1 )
+		{
+			m_height = bestsize.bottom - bestsize.top ;
+			if ( m_height < 10 )
+				m_height = 13 ;
+
+			m_height += 2 * m_macVerticalBorder;
+		}
+		
+		wxMacDrawingHelper helper ( wxFindWinFromMacWindow( GetMacRootWindow() ) ) ;
+		if ( helper.Ok() )
+		{
+	    UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+  		}
+	}
+}
+ControlHandle wxControl::MacGetContainerForEmbedding() 
+{
+	if ( m_macControl )
+		return m_macControl ;
+
+	return wxWindow::MacGetContainerForEmbedding() ;
+}
+
+void wxControl::MacSuperChangedPosition() 
+{
+	if ( m_macControl )
+	{
+		int former_mac_x = (**m_macControl).contrlRect.left ;
+		int former_mac_y = (**m_macControl).contrlRect.top ;
+		int mac_x = m_x ;
+		int mac_y = m_y ;
+		GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ;
+		
+		WindowRef rootwindow = GetMacRootWindow() ;
+		wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
+		UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
+		wxMacDrawingHelper focus( wxrootwindow ) ;
+	
+		if ( mac_x != former_mac_x || mac_y != former_mac_y )
+		{
+			{
+				Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
+				InvalRect( &inval ) ;
+			}
+	  	UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ;
+			{
+				Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+				InvalRect( &inval ) ;
+			}
+		}
+		if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
+		{
+		}
+		else
+		{
+			UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ;
+		}
+	}
+
+	wxWindow::MacSuperChangedPosition() ;
+}
+
+void wxControl::MacSuperEnabled( bool enabled ) 
+{
+	if ( m_macControl )
+	{
+		if ( UMAHasAppearance() )
+		{
+			if ( !enabled )
+			{
+				::DeactivateControl( m_macControl ) ; 
+			}
+			else
+			{
+				if ( m_macEnabled )
+					::ActivateControl( m_macControl ) ;
+			}
+		}
+		else
+		{
+			if ( !enabled )
+			{
+				::HiliteControl( m_macControl , 255 ) ;
+			}
+			else
+			{
+				if ( m_macEnabled )
+					::HiliteControl( m_macControl , 0 ) ;
+			}
+		}
+	}
+	wxWindow::MacSuperEnabled( enabled ) ;
+}
+
+void  wxControl::MacSuperShown( bool show ) 
+{
+	if ( m_macControl )
+	{
+		if ( !show )
+		{
+			::UMAHideControl( m_macControl ) ;
+		}
+		else
+		{
+			if ( m_macShown )
+				::UMAShowControl( m_macControl ) ;
+		}
+	}
+		
+	wxWindow::MacSuperShown( show ) ;
+}
+
+void  wxControl::DoSetSize(int x, int y,
+            int width, int height,
+            int sizeFlags )
+{
+	if ( m_macControl == NULL )
+	{
+		wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
+		return ;
+	}
+
+	WindowRef rootwindow = GetMacRootWindow() ;
+	wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
+	UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
+		
+	int former_x = m_x ;
+	int former_y = m_y ;
+	int former_w = m_width ;
+	int former_h = m_height ;
+	
+	int former_mac_x = (**m_macControl).contrlRect.left ;
+	int former_mac_y = (**m_macControl).contrlRect.top ;
+	
+  int currentX, currentY;
+  GetPosition(&currentX, &currentY);
+  int currentW,currentH;
+  GetSize(&currentW, &currentH);
+
+  int actualWidth = width;
+  int actualHeight = height;
+  int actualX = x;
+  int actualY = y;
+  if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualX = currentX;
+  if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualY = currentY;
+  if (width == -1)
+      actualWidth = currentW ;
+  if (height == -1)
+      actualHeight = currentH ;
+
+	if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
+		return ;
+		
+	AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
+	wxMacDrawingHelper focus( wxFindWinFromMacWindow( GetMacRootWindow() ) ) ;
+
+	int mac_x = actualX ;
+	int mac_y = actualY ;
+	GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ;
+	
+	if ( mac_x != former_mac_x || mac_y != former_mac_y )
+	{
+		{
+			Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+  	UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y  + m_macVerticalBorder ) ;
+		{
+			Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+	}
+
+	if ( actualX != former_x || actualY != former_y )
+	{
+		m_x = actualX ;
+		m_y = actualY ;
+
+		MacRepositionScrollBars() ;
+		// To consider -> should the parameters be the effective or the virtual coordinates (AdjustForParent..)
+    wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+	}		
+	if ( actualWidth != former_w || actualHeight != former_h )
+	{
+		{
+			Rect inval = { mac_y , mac_x , mac_y + former_h , mac_x + former_w } ;
+			InvalRect( &inval ) ;
+		}
+		m_width = actualWidth ;
+		m_height = actualHeight ;
+
+   	UMASizeControl( m_macControl ,  m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+		{
+			Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+
+		MacRepositionScrollBars() ;
+    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+	}
+	if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
+	{
+	}
+	else
+	{
+		UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ;
+	}
+}
+
+void  wxControl::DoSetClientSize(int width, int height)
+{
+	DoSetSize( -1 , -1 , width , height ) ;
+}
+
+bool  wxControl::Show(bool show) 
+{
+	if ( m_macControl == NULL )
+		return wxWindow::Show( show ) ;
+	
+	if ( m_macShown == show )
+		return TRUE ;
+
+	if ( show )
+		::UMAShowControl( m_macControl ) ;
+	else
+		::UMAHideControl( m_macControl ) ;
+
+	return wxWindow::Show( show ) ;
+}
+
+void  wxControl::Enable(bool enable) 
+{
+	if ( m_macControl == NULL )
+		return wxWindow::Enable( enable ) ;
+	
+	if ( m_macEnabled == enable )
+		return ;
+
+	if ( UMAHasAppearance() )
+	{
+		if ( enable )
+			::ActivateControl( m_macControl ) ;
+		else
+			::DeactivateControl( m_macControl ) ;
+	}
+	else
+	{
+		if ( enable )
+			::HiliteControl( m_macControl , 0 ) ;
+		else
+			::HiliteControl( m_macControl , 255 ) ;
+	}
+
+	return wxWindow::Enable( enable ) ;
+}
+
+void wxControl::Refresh(bool eraseBack, const wxRect *rect)
+{
+  if ( m_macControl )
+  {
+  	wxWindow::Refresh( eraseBack , rect ) ;
+	}
+  else
+  {
+  	wxWindow::Refresh( eraseBack , rect ) ;
+  }
+}
+
+void wxControl::OnPaint(wxPaintEvent& event)
+{
+	if ( m_macControl )
+	{
+		WindowRef window = GetMacRootWindow() ;
+		if ( window )
+		{
+			wxWindow* win = wxFindWinFromMacWindow( window ) ;
+			if ( win )
+			{
+				wxMacDrawingHelper help( win ) ;
+				SetOrigin( 0 , 0 ) ;
+				
+				bool			hasTabBehind = false ;
+				wxWindow* parent = GetParent() ;
+				while ( parent )
+				{
+					if( parent->m_macWindowData )
+					{
+						UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+						break ;
+					}
+					
+					if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) ||  parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+					{
+						if ( ((wxControl*)parent)->m_macControl )
+							SetUpControlBackground( ((wxControl*)parent)->m_macControl , -1 , true ) ;
+						break ;
+					}
+					
+					parent = parent->GetParent() ;
+				} 
+				
+				UMADrawControl( m_macControl ) ;
+				UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+			}
+		}
+	}
+	else
+	{
+		wxWindow::OnPaint( event ) ;
+	}
+}
+
+void  wxControl::OnKeyDown( wxKeyEvent &event ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+	EventRecord *ev = wxTheApp->MacGetCurrentEvent() ;
+	short keycode ;
+	short keychar ;
+	keychar = short(ev->message & charCodeMask);
+	keycode = short(ev->message & keyCodeMask) >> 8 ;
+
+	UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ;
+}
+
+void  wxControl::OnMouseEvent( wxMouseEvent &event ) 
+{
+	if ( m_macControl == NULL )
+	{
+		event.Skip() ;
+		return ;
+	}
+		
+	if (event.GetEventType() == wxEVT_LEFT_DOWN )
+	{
+			
+		int x = event.m_x ;
+		int y = event.m_y ;
+		
+		MacClientToRootWindow( &x , &y ) ;
+			
+		ControlHandle	control ;
+		Point		localwhere ;
+		GrafPtr		port ;
+		SInt16		controlpart ;
+		WindowRef	window = GetMacRootWindow() ;
+		
+		localwhere.h = x ;
+		localwhere.v = y ;
+	
+		short modifiers = 0;
+		
+		if ( !event.m_leftDown && !event.m_rightDown )
+			modifiers  |= btnState ;
+	
+		if ( event.m_shiftDown )
+			modifiers |= shiftKey ;
+			
+		if ( event.m_controlDown )
+			modifiers |= controlKey ;
+	
+		if ( event.m_altDown )
+			modifiers |= optionKey ;
+	
+		if ( event.m_metaDown )
+			modifiers |= cmdKey ;
+	
+		controlpart = FindControl( localwhere , window , &control ) ;
+		{
+			if ( AcceptsFocus() && FindFocus() != this )
+			{
+				SetFocus() ;
+			}
+			if ( control && UMAIsControlActive( control ) )
+			{
+				{
+					if ( controlpart == kControlIndicatorPart && !UMAHasAppearance() )
+						controlpart = UMAHandleControlClick( control , localwhere , modifiers , (ControlActionUPP) NULL ) ;
+					else
+						controlpart = UMAHandleControlClick( control , localwhere , modifiers , (ControlActionUPP) -1 ) ;
+					wxTheApp->s_lastMouseDown = 0 ;
+					if ( controlpart && ! ( ( UMAHasAppearance() || (controlpart != kControlIndicatorPart) ) 
+						&& (IsKindOf( CLASSINFO( wxScrollBar ) ) ) ) ) // otherwise we will get the event twice
+					{
+						MacHandleControlClick( control , controlpart ) ;
+					}
+				}
+			}
+		}
+	}
+}
+
+bool wxControl::MacCanFocus() const
+{
+		{ if ( m_macControl == NULL ) 
+				return true ; 
+			else
+			return false ; 
+		}
+}
+
+void wxControl::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+}
+
diff --git a/src/mac/carbon/corersrc.r b/src/mac/carbon/corersrc.r
index a37b064b21..528e794811 100644
--- a/src/mac/carbon/corersrc.r
+++ b/src/mac/carbon/corersrc.r
@@ -1,8 +1,50 @@
 #include <Types.r>
 
-resource 'ALRT' (128, purgeable) {
+#if UNIVERSAL_INTERFACES_VERSION > 0x320
+	#include <ControlDefinitions.r>
+#endif
+
+#define kMacOKAlertResourceID 128
+#define kMacYesNoAlertResourceID 129
+#define kMacYesNoCancelAlertResourceID 130
+#define kMacNoYesAlertResourceID 131
+#define kMacNoYesCancelAlertResourceID 132
+
+resource 'ALRT' (kMacOKAlertResourceID, purgeable) {
+	{70, 50, 198, 470},
+	kMacOKAlertResourceID,
+	{	/* array: 4 elements */
+		/* [1] */
+		OK, visible, sound1,
+		/* [2] */
+		OK, visible, sound1,
+		/* [3] */
+		OK, visible, sound1,
+		/* [4] */
+		OK, visible, sound1
+	},
+	noAutoCenter
+};
+
+resource 'ALRT' (kMacYesNoAlertResourceID, purgeable) {
+	{70, 50, 198, 470},
+	kMacYesNoAlertResourceID,
+	{	/* array: 4 elements */
+		/* [1] */
+		OK, visible, sound1,
+		/* [2] */
+		OK, visible, sound1,
+		/* [3] */
+		OK, visible, sound1,
+		/* [4] */
+		OK, visible, sound1
+	},
+	noAutoCenter
+};
+
+resource 'ALRT' (kMacYesNoAlertResourceID + 10, purgeable) {
 	{70, 50, 198, 470},
-	128,
+	kMacYesNoAlertResourceID + 10,
 	{	/* array: 4 elements */
 		/* [1] */
 		OK, visible, sound1,
@@ -16,9 +58,9 @@ resource 'ALRT' (128, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (129, purgeable) {
+resource 'ALRT' (kMacYesNoAlertResourceID + 20, purgeable) {
 	{70, 50, 198, 470},
-	129,
+	kMacYesNoAlertResourceID + 20,
 	{	/* array: 4 elements */
 		/* [1] */
 		OK, visible, sound1,
@@ -32,7 +74,7 @@ resource 'ALRT' (129, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (130, purgeable) {
+resource 'ALRT' (kMacYesNoCancelAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	130,
 	{	/* array: 4 elements */
@@ -48,7 +90,7 @@ resource 'ALRT' (130, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (131, purgeable) {
+resource 'ALRT' (kMacNoYesAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	131,
 	{	/* array: 4 elements */
@@ -64,7 +106,7 @@ resource 'ALRT' (131, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (132, purgeable) {
+resource 'ALRT' (kMacNoYesCancelAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	132,
 	{	/* array: 4 elements */
@@ -80,7 +122,7 @@ resource 'ALRT' (132, purgeable) {
 	noAutoCenter
 };
 
-resource 'DITL' (128, purgeable) {
+resource 'DITL' (kMacOKAlertResourceID, purgeable) {
 	{	/* array DITLarray: 3 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -103,13 +145,71 @@ resource 'DITL' (128, purgeable) {
 	}
 };
 
-resource 'DITL' (129, purgeable) {
+resource 'DITL' (kMacYesNoAlertResourceID, purgeable) {
 	{	/* array DITLarray: 4 elements */
 		/* [1] */
 		{100, 340, 120, 408},
 		Button {
 			enabled,
-			"Yes"
+			"Ja"
+		},
+		/* [2] */
+		{100, 260, 120, 324},
+		Button {
+			enabled,
+			"Nein"
+		},
+		/* [3] */
+		{38, 64, 88, 408},
+		StaticText {
+			disabled,
+			"^1"
+		},
+		/* [4] */
+		{10, 64, 30, 412},
+		StaticText {
+			disabled,
+			"^0"
+		}
+	}
+};
+
+resource 'DITL' (kMacYesNoAlertResourceID + 10, purgeable) {
+	{	/* array DITLarray: 4 elements */
+		/* [1] */
+		{100, 340, 120, 408},
+		Button {
+			enabled,
+			"Oui"
+		},
+		/* [2] */
+		{100, 260, 120, 324},
+		Button {
+			enabled,
+			"Non"
+		},
+		/* [3] */
+		{38, 64, 88, 408},
+		StaticText {
+			disabled,
+			"^1"
+		},
+		/* [4] */
+		{10, 64, 30, 412},
+		StaticText {
+			disabled,
+			"^0"
+		}
+	}
+};
+
+resource 'DITL' (kMacYesNoAlertResourceID + 20, purgeable) {
+	{	/* array DITLarray: 4 elements */
+		/* [1] */
+		{100, 340, 120, 408},
+		Button {
+			enabled,
+			"Si"
 		},
 		/* [2] */
 		{100, 260, 120, 324},
@@ -132,7 +232,7 @@ resource 'DITL' (129, purgeable) {
 	}
 };
 
-resource 'DITL' (130, purgeable) {
+resource 'DITL' (kMacYesNoCancelAlertResourceID, purgeable) {
 	{	/* array DITLarray: 5 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -167,7 +267,7 @@ resource 'DITL' (130, purgeable) {
 	}
 };
 
-resource 'DITL' (131, purgeable) {
+resource 'DITL' (kMacNoYesAlertResourceID, purgeable) {
 	{	/* array DITLarray: 4 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -196,7 +296,7 @@ resource 'DITL' (131, purgeable) {
 	}
 };
 
-resource 'DITL' (132, purgeable) {
+resource 'DITL' (kMacNoYesCancelAlertResourceID, purgeable) {
 	{	/* array DITLarray: 5 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -278,54 +378,17 @@ data 'DLGX' (132) {
 	$"0000 0006 0000 0000 0000 0000 0000"                 /* .............. */
 };
 
-data 'ics#' (200, "¥ New File") {
-	$"0000 3FE0 2C70 3458 2C78 3408 2C08 3408"            /* ..?à,p4X,x4.,.4. */
-	$"2C08 3408 2C08 3408 2C0E 340F 3FFE 0000"            /* ,.4.,.4.,.4.?þ.. */
-	$"0000 3FE0 3FF0 3FF8 3FF8 3FF8 3FF8 3FF8"            /* ..?à?ð?ø?ø?ø?ø?ø */
-	$"3FF8 3FF8 3FF8 3FF8 3FFE 3FFF 3FFE 0000"            /* ?ø?ø?ø?ø?þ?ÿ?þ.. */
-};
-
-data 'ics4' (200, "¥ New File") {
-	$"0000 0000 0000 0000 00FF FFFF FFF0 0000"            /* .........ÿÿÿÿð.. */
-	$"00F1 FFED EFFF 0000 00FF 1FDE DFCF F000"            /* .ñÿíïÿ...ÿ.ÞßÏð. */
-	$"00F1 FFED EFFF F000 00FF 1FDE DEEE F000"            /* .ñÿíïÿð..ÿ.ÞÞîð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED FEE0 00FF 1FDE DEDE FEEE"            /* .ñÿíííþà.ÿ.ÞÞÞþî */
-	$"00FF FFFF FFFF FEE0 0000 0000 0000 0000"            /* .ÿÿÿÿÿþà........ */
-};
-
-data 'ics8' (200, "¥ New File") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
-	$"0000 FFFF FFFF FFFF FFFF FF00 0000 0000"            /* ..ÿÿÿÿÿÿÿÿÿ..... */
-	$"0000 FF05 FFFF FB7F FBFF FFFF 0000 0000"            /* ..ÿ.ÿÿû.ûÿÿÿ.... */
-	$"0000 FFFF 0BFF 7FFB 7FFF F6FF FF00 0000"            /* ..ÿÿ.ÿ.û.ÿöÿÿ... */
-	$"0000 FF05 FFFF FB7F FBFF FFFF FF00 0000"            /* ..ÿ.ÿÿû.ûÿÿÿÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB FBFB FF00 0000"            /* ..ÿÿ.ÿ.û.ûûûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FFFC FC00"            /* ..ÿ.ÿÿû.û.û.ÿüü. */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FFFC FCFC"            /* ..ÿÿ.ÿ.û.û.ûÿüüü */
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFC FC00"            /* ..ÿÿÿÿÿÿÿÿÿÿÿüü. */
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
-};
-
 resource 'ldes' ( 128 )
 {
 	versionZero 
 	{
 		0 , 
-		1 ,
+		0 ,
 		0 , 
 		0 , 
 		hasVertScroll , 
 		noHorizScroll , 
-		0 , 
+		128 , 
 		noGrowSpace , 
 	}
 } ;
@@ -536,3 +599,4 @@ resource 'STR#' (251) {
 	}
 };
 
+// end of get file
\ No newline at end of file
diff --git a/src/mac/carbon/cursor.cpp b/src/mac/carbon/cursor.cpp
index 4333364c93..bcbe30008b 100644
--- a/src/mac/carbon/cursor.cpp
+++ b/src/mac/carbon/cursor.cpp
@@ -20,18 +20,24 @@
 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
 #endif
 
+const short kwxCursorHandId = 9 ;
+const short kwxCursorSizeWEId = 10 ;
+const short kwxCursorSizeNSId = 11 ;
+Cursor*		MacArrowCursorPtr = &qd.arrow ;
+CursHandle	MacArrowCursor = &MacArrowCursorPtr ;
+CursHandle	gMacCurrentCursor = NULL ;
+
 wxCursorRefData::wxCursorRefData()
 {
-    m_width = 32; m_height = 32;
-
-/* TODO
-    m_hCursor = 0 ;
-*/
+    m_width = 32; 
+    m_height = 32;
+    m_hCursor = NULL ;
 }
 
 wxCursorRefData::~wxCursorRefData()
 {
-    // TODO: destroy cursor
+	if ( m_hCursor && ( m_hCursor != MacArrowCursor ) )
+		::DisposeHandle( (Handle) m_hCursor ) ;
 }
 
 // Cursors
@@ -56,122 +62,133 @@ wxCursor::wxCursor(int cursor_type)
 {
   m_refData = new wxCursorRefData;
 
-/* TODO
   switch (cursor_type)
   {
     case wxCURSOR_WAIT:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_WAIT);
+      M_CURSORDATA->m_hCursor = ::GetCursor(watchCursor);
       break;
     case wxCURSOR_IBEAM:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_IBEAM);
+      M_CURSORDATA->m_hCursor = ::GetCursor(iBeamCursor);
       break;
     case wxCURSOR_CROSS:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_CROSS);
+      M_CURSORDATA->m_hCursor = ::GetCursor(crossCursor);
       break;
     case wxCURSOR_SIZENWSE:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENWSE);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZENESW:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENESW);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZEWE:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZEWE);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZENS:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENS);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeNSId);
       break;
     case wxCURSOR_CHAR:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_HAND:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_HAND");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_BULLSEYE:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BULLSEYE");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_PENCIL:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PENCIL");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_MAGNIFIER:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_MAGNIFIER");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_NO_ENTRY:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_NO_ENTRY");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_LEFT_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_RIGHT_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_MIDDLE_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_SIZING:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_SIZING");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_WATCH:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_WATCH");
+      M_CURSORDATA->m_hCursor = ::GetCursor(watchCursor);
       break;
     }
     case wxCURSOR_SPRAYCAN:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_ROLLER");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_PAINT_BRUSH:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PBRUSH");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_POINT_LEFT:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PLEFT");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_POINT_RIGHT:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PRIGHT");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_QUESTION_ARROW:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_QARROW");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_BLANK:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BLANK");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     default:
     case wxCURSOR_ARROW:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
-  }
-*/
+	}
+}
 
+void wxCursor::MacInstall() const 
+{
+	if ( m_refData && M_CURSORDATA->m_hCursor )
+	{
+		::SetCursor( *M_CURSORDATA->m_hCursor ) ;
+		gMacCurrentCursor = M_CURSORDATA->m_hCursor ;
+	}
+	else
+	{
+		::SetCursor( *MacArrowCursor ) ;
+		gMacCurrentCursor = NULL ;
+	}
 }
 
 wxCursor::~wxCursor()
@@ -181,7 +198,7 @@ wxCursor::~wxCursor()
 // Global cursor setting
 void wxSetCursor(const wxCursor& cursor)
 {
-  // TODO (optional on platforms with no global cursor)
+	cursor.MacInstall() ;
 }
 
 
diff --git a/src/mac/carbon/data.cpp b/src/mac/carbon/data.cpp
index 138289a5bf..297686b9d1 100644
--- a/src/mac/carbon/data.cpp
+++ b/src/mac/carbon/data.cpp
@@ -25,7 +25,7 @@
 char *wxBuffer = NULL;
 
 // Windows List
-wxList wxTopLevelWindows;
+wxWindowList wxTopLevelWindows;
 
 // List of windows pending deletion
 wxList wxPendingDelete;
diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp
index 2c1c613595..e021274157 100644
--- a/src/mac/carbon/dc.cpp
+++ b/src/mac/carbon/dc.cpp
@@ -30,6 +30,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #define mm2pt			2.83464566929
 #define pt2mm			0.352777777778
 
+long wxDC::m_macCurrentPortId = 1 ;
+
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
@@ -83,14 +85,136 @@ wxDC::wxDC(void)
   m_backgroundBrush = *wxWHITE_BRUSH;
   
 //  m_palette = wxAPP_COLOURMAP;
+  m_macPort = NULL ;
+  m_ok = FALSE ;
+  
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;
+	
+	m_macPortId = 0 ;
+	m_macLocalOrigin.h = m_macLocalOrigin.v = 0 ;
+	m_macClipRect.left = -32000 ;
+	m_macClipRect.top = -32000 ;
+	m_macClipRect.right = 32000 ;
+	m_macClipRect.bottom = 32000 ;
+	::GetPort( &m_macOrigPort ) ;
 };
 
 wxDC::~wxDC(void)
 {
+	if ( m_macPort )
+	{
+		::SetOrigin( 0 , 0 ) ;
+		::ClipRect( &m_macPort->portRect ) ;
+		::PenNormal() ;
+		::SetPort( m_macOrigPort ) ;
+	}
+	++m_macCurrentPortId ;
 };
 
-void wxDC::DrawIcon( const wxIcon &WXUNUSED(icon), long WXUNUSED(x), long WXUNUSED(y), bool WXUNUSED(useMask) )
+void wxDC::MacSetupPort() const
+{
+	m_macPortId = ++m_macCurrentPortId ;
+	::SetPort(m_macPort);
+	::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
+	::ClipRect(&m_macClipRect);
+
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;	
+}
+
+void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  long xx1 = XLOG2DEV(x); 
+  long yy1 = YLOG2DEV(y);
+	
+	{
+		wxBitmapRefData * bmap = (wxBitmapRefData*) ( bmp.GetRefData()) ;
+	   	
+   	if ( bmap )
+    {
+			if ( bmap->m_bitmapType == kMacBitmapTypePict )
+			{ 
+    		Rect bitmaprect = { 0 , 0 , bmap->m_height , bmap->m_width } ;
+				::OffsetRect( &bitmaprect , xx1 , yy1 ) ;
+				::DrawPicture( bmap->m_hPict , &bitmaprect ) ;
+			}
+			else if ( bmap->m_bitmapType == kMacBitmapTypeGrafWorld )
+			{
+				if ( bmap->m_hBitmap )
+				{
+					GWorldPtr 		bmapworld = bmap->m_hBitmap ;
+					PixMapHandle	bmappixels ;
+					RGBColor		white = { 0xFFFF, 0xFFFF,0xFFFF} ;
+					RGBColor		black = { 0,0,0} ;
+					RGBForeColor( &black ) ;
+					RGBBackColor( &white ) ;
+			//		RGBForeColor( &m_textForegroundColour.GetPixel() ) ;
+			//		RGBBackColor( &m_textBackgroundColour.GetPixel() ) ;
+			
+					bmappixels = GetGWorldPixMap( bmapworld ) ;
+					if ( LockPixels(bmappixels) )
+					{
+						Rect source , dest ;
+						source.top = 0 ;
+						source.left = 0 ;
+						source.right = bmap->m_width ;
+						source.bottom = bmap->m_height ;
+						dest.top = YLOG2DEV(y) ;
+						dest.left = XLOG2DEV(x) ;
+						dest.bottom = YLOG2DEV(y + bmap->m_height )  ;
+						dest.right = XLOG2DEV(x + bmap->m_width ) ;
+						// ::ClipRect(&m_macClipRect);
+						CopyBits( &GrafPtr( bmapworld )->portBits , &GrafPtr( m_macPort )->portBits ,
+							&source, &dest, srcCopy, NULL ) ;
+						/*
+						if ( m_clipping )
+						{
+							long x1 = XLOG2DEV(m_clipX1);
+							long y1 = YLOG2DEV(m_clipY1);
+							long x2 = XLOG2DEV(m_clipX2);
+							long y2 = YLOG2DEV(m_clipY2);
+	
+							Rect clip = { y1 , x1 , y2 , x2 } ;
+							::ClipRect(&clip);
+						}
+						*/
+						UnlockPixels( bmappixels ) ;
+					} 
+					m_macPenInstalled = false ;
+					m_macBrushInstalled = false ;
+					m_macFontInstalled = false ;
+				}
+			}
+    }
+	}
+}
+
+void wxDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
 {
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  long xx1 = XLOG2DEV(x); 
+  long yy1 = YLOG2DEV(y);
+	
+	{
+		wxIconRefData * iconref = (wxIconRefData*) ( icon.GetRefData()) ;
+	   	
+   	if ( iconref && iconref->m_ok && iconref->m_hIcon )
+    {
+    	Rect bitmaprect = { 0 , 0 , iconref->m_height , iconref->m_width } ;
+			OffsetRect( &bitmaprect , xx1 , yy1 ) ;
+    	PlotCIconHandle( &bitmaprect , atNone , ttNone , iconref->m_hIcon ) ;
+    }
+	}
 };
 
 void wxDC::DrawPoint( wxPoint& point ) 
@@ -155,16 +279,41 @@ void wxDC::DrawSpline( int n, wxPoint points[] )
 
 void wxDC::SetClippingRegion( long x, long y, long width, long height )
 {
-  m_clipping = TRUE;
-  m_clipX1 = x;
-  m_clipY1 = y;
-  m_clipX2 = x + width;
-  m_clipY2 = y + height;
+  MacVerifySetup() ;
+	if( m_clipping )
+	{
+		m_clipX1 = wxMax( m_clipX1 , x ) ;
+  		m_clipY1 = wxMax( m_clipY1 ,y );
+  		m_clipX2 = wxMin( m_clipX2, (x + width));
+  		m_clipY2 = wxMin( m_clipY2,(y + height));
+		
+	}
+	else
+	{
+	  m_clipping = TRUE;
+	  m_clipX1 = x;
+	  m_clipY1 = y;
+	  m_clipX2 = x + width;
+	  m_clipY2 = y + height;
+	}
+  
+	long x1 = XLOG2DEV(m_clipX1);
+	long y1 = YLOG2DEV(m_clipY1);
+	long x2 = XLOG2DEV(m_clipX2);
+	long y2 = XLOG2DEV(m_clipY2);
+	
+	Rect clip = { y1 , x1 , y2 , x2 } ;
+	
+  ::ClipRect( &clip ) ;
+
 };
 
 void wxDC::DestroyClippingRegion(void)
 {
+  MacVerifySetup() ;
   m_clipping = FALSE;
+//	Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
+	::ClipRect(&m_macClipRect);
 };
 
 void wxDC::GetClippingBox( long *x, long *y, long *width, long *height ) const
@@ -199,12 +348,14 @@ void wxDC::SetTextForeground( const wxColour &col )
 {
   if (!Ok()) return;
   m_textForegroundColour = col;
+  m_macFontInstalled = false ;
 };
 
 void wxDC::SetTextBackground( const wxColour &col )
 {
   if (!Ok()) return;
   m_textBackgroundColour = col;
+  m_macFontInstalled = false ;
 };
 
 void wxDC::SetMapMode( int mode )
@@ -383,3 +534,1044 @@ void wxDC::ComputeScaleAndOrigin(void)
   }
 };
 
+void  wxDC::SetPalette( const wxPalette& palette )
+{
+}
+
+void  wxDC::SetBackgroundMode( int mode )
+{
+	m_backgroundMode = mode ;
+}
+
+void  wxDC::SetFont( const wxFont &font )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  m_font = font;
+  m_macFontInstalled = false ;
+}
+
+void  wxDC::SetPen( const wxPen &pen )
+{
+  if (!Ok()  ) 
+  	return;
+
+  MacVerifySetup() ;
+
+	if ( m_pen == pen )
+		return ;
+		
+  m_pen = pen;
+/*  
+  if (!m_pen.Ok()) 
+  	return;
+*/  	
+  m_macPenInstalled = false ;
+}
+
+void  wxDC::SetBrush( const wxBrush &brush )
+{
+  if (!Ok() ) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_brush == brush) 
+  	return;
+  
+  m_brush = brush;
+  m_macBrushInstalled = false ;
+}
+
+void  wxDC::SetBackground( const wxBrush &brush )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_backgroundBrush == brush) 
+  	return;
+  
+  m_backgroundBrush = brush;
+  
+  if (!m_backgroundBrush.Ok()) 
+  	return;
+   m_macBrushInstalled = false ;
+}
+
+void  wxDC::SetLogicalFunction( int function )
+{
+ 	if (m_logicalFunction == function) 
+ 		return;
+
+	m_logicalFunction = function ;
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;
+}
+
+void  wxDC::FloodFill( long x1, long y1, const wxColour& col, int style )
+{
+}
+
+bool  wxDC::GetPixel( long x1, long y1, wxColour *col ) const 
+{
+	return true ;
+}
+
+void  wxDC::DrawLine( long x1, long y1, long x2, long y2 )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() != wxTRANSPARENT)
+  {
+		MacInstallPen() ;
+		int offset = (m_pen.GetWidth()	- 1) / 2 ;	
+  	long xx1 = XLOG2DEV(x1); 
+  	long yy1 = YLOG2DEV(y1);
+  	long xx2 = XLOG2DEV(x2); 
+  	long yy2 = YLOG2DEV(y2);
+	
+		::MoveTo(xx1 - offset ,yy1 - offset);
+		::LineTo(xx2 - offset , yy2 - offset );
+  };
+}
+
+void  wxDC::CrossHair( long x, long y )
+{
+}
+
+void  wxDC::DrawArc( long x1, long y1, long x2, long y2, long xc, long yc )
+{
+}
+
+void  wxDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea )
+{
+}
+
+void  wxDC::DrawPoint( long x, long y )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() != wxTRANSPARENT) 
+  {
+		MacInstallPen() ;
+  	long xx1 = XLOG2DEV(x); 
+  	long yy1 = YLOG2DEV(y);
+	
+		::MoveTo(xx1,yy1);
+		::LineTo(xx1+1, yy1+1);
+  };
+}
+
+void  wxDC::DrawLines( int n, wxPoint points[], long xoffset , long yoffset  )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() == wxTRANSPARENT) 
+  	return;
+
+	MacInstallPen() ;
+  
+	int offset = (m_pen.GetWidth()	- 1 ) / 2 ;	
+  long x1, x2 , y1 , y2 ;
+  x1 = XLOG2DEV(points[0].x + xoffset);
+	y1 = YLOG2DEV(points[0].y + yoffset);   
+	::MoveTo(x1 - offset ,y1 - offset );
+  
+  for (int i = 0; i < n-1; i++)
+  {
+    long x2 = XLOG2DEV(points[i+1].x + xoffset);
+    long y2 = YLOG2DEV(points[i+1].y + yoffset);
+		::LineTo(x2 - offset  , y2 - offset );
+  }
+}
+
+void  wxDC::DrawPolygon( int n, wxPoint points[], long xoffset , long yoffset , 
+                              int fillStyle )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  PolyHandle polygon = OpenPoly() ;
+  long x1, x2 , y1 , y2 ;
+  x1 = XLOG2DEV(points[0].x + xoffset);
+	y1 = YLOG2DEV(points[0].y + yoffset);   
+	::MoveTo(x1,y1);
+  
+  for (int i = 0; i < n-1; i++)
+  {
+    long x2 = XLOG2DEV(points[i+1].x + xoffset);
+    long y2 = YLOG2DEV(points[i+1].y + yoffset);
+		::LineTo(x2, y2);
+  }
+
+  ClosePoly() ;
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintPoly( polygon ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FramePoly( polygon ) ;
+	};
+  KillPoly( polygon ) ;
+}
+
+void  wxDC::DrawRectangle( long x, long y, long width, long height )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+	
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0) 
+		return;
+	
+	// CMB: handle -ve width and/or height
+	if (ww < 0) 
+	{ 
+		ww = -ww; 
+		xx = xx - ww; 
+	}
+	
+	if (hh < 0) 
+	{ 
+		hh = -hh; 
+		yy = yy - hh; 
+	}
+	
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+	
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintRect( &rect ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FrameRect( &rect ) ;
+	};
+}
+
+void  wxDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius  )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	
+  if (radius < 0.0) 
+  	radius = - radius * ((width < height) ? width : height);
+	
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+	
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0) 
+		return;
+	
+	// CMB: handle -ve width and/or height
+	if (ww < 0) 
+	{ 
+		ww = -ww; 
+		xx = xx - ww; 
+	}
+	
+	if (hh < 0) 
+	{ 
+		hh = -hh; 
+		yy = yy - hh; 
+	}
+	
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+	
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintRoundRect( &rect , radius * 2 , radius * 2 ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FrameRoundRect( &rect , radius * 2 , radius * 2 ) ;
+	};
+}
+
+void  wxDC::DrawEllipse( long x, long y, long width, long height )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0)
+		return;
+
+	// CMB: handle -ve width and/or height
+	if (ww < 0)
+	{
+		ww = -ww;
+		xx = xx - ww;
+	}
+
+	if (hh < 0)
+	{
+		hh = -hh;
+		yy = yy - hh;
+	}
+
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+
+	if (m_brush.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallBrush() ;
+		::PaintOval( &rect ) ;
+	};
+
+	if (m_pen.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallPen() ;
+		::FrameOval( &rect ) ;
+	};
+}
+
+// ----------------------------------- spline code ----------------------------------------
+
+static void wx_quadratic_spline(double a1, double b1, double a2, double b2,
+                         double a3, double b3, double a4, double b4);
+static void wx_clear_stack(void);
+static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
+        double *y3, double *x4, double *y4);
+static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
+          double x4, double y4);
+static bool wx_spline_add_point(double x, double y);
+static void wx_spline_draw_point_array(wxDC *dc);
+
+static wxList wx_spline_point_list;
+
+#define		half(z1, z2)	((z1+z2)/2.0)
+#define		THRESHOLD	5
+
+/* iterative version */
+
+static void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4,
+                 double b4)
+{
+    register double  xmid, ymid;
+    double           x1, y1, x2, y2, x3, y3, x4, y4;
+
+    wx_clear_stack();
+    wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4);
+
+    while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
+        xmid = (double)half(x2, x3);
+        ymid = (double)half(y2, y3);
+	if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD &&
+	    fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) {
+            wx_spline_add_point( x1, y1 );
+            wx_spline_add_point( xmid, ymid );
+	} else {
+            wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
+                 (double)half(x3, x4), (double)half(y3, y4), x4, y4);
+            wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
+                 (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
+	}
+    }
+}
+
+/* utilities used by spline drawing routines */
+
+typedef struct wx_spline_stack_struct {
+    double           x1, y1, x2, y2, x3, y3, x4, y4;
+} Stack;
+
+#define         SPLINE_STACK_DEPTH             20
+static Stack    wx_spline_stack[SPLINE_STACK_DEPTH];
+static Stack   *wx_stack_top;
+static int      wx_stack_count;
+
+static void wx_clear_stack(void)
+{
+    wx_stack_top = wx_spline_stack;
+    wx_stack_count = 0;
+}
+
+static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
+{
+    wx_stack_top->x1 = x1;
+    wx_stack_top->y1 = y1;
+    wx_stack_top->x2 = x2;
+    wx_stack_top->y2 = y2;
+    wx_stack_top->x3 = x3;
+    wx_stack_top->y3 = y3;
+    wx_stack_top->x4 = x4;
+    wx_stack_top->y4 = y4;
+    wx_stack_top++;
+    wx_stack_count++;
+}
+
+static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2,
+                  double *x3, double *y3, double *x4, double *y4)
+{
+    if (wx_stack_count == 0)
+	return (0);
+    wx_stack_top--;
+    wx_stack_count--;
+    *x1 = wx_stack_top->x1;
+    *y1 = wx_stack_top->y1;
+    *x2 = wx_stack_top->x2;
+    *y2 = wx_stack_top->y2;
+    *x3 = wx_stack_top->x3;
+    *y3 = wx_stack_top->y3;
+    *x4 = wx_stack_top->x4;
+    *y4 = wx_stack_top->y4;
+    return (1);
+}
+
+static bool wx_spline_add_point(double x, double y)
+{
+  wxPoint *point = new wxPoint ;
+  point->x = (int) x;
+  point->y = (int) y;
+  wx_spline_point_list.Append((wxObject*)point);
+  return TRUE;
+}
+
+static void wx_spline_draw_point_array(wxDC *dc)
+{
+  dc->DrawLines(&wx_spline_point_list, 0, 0 );
+  wxNode *node = wx_spline_point_list.First();
+  while (node)
+  {
+    wxPoint *point = (wxPoint *)node->Data();
+    delete point;
+    delete node;
+    node = wx_spline_point_list.First();
+  }
+}
+
+void  wxDC::DrawSpline( wxList *points )
+{
+    wxPoint *p;
+    double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
+    double           x1, y1, x2, y2;
+
+    wxNode *node = points->First();
+    p = (wxPoint *)node->Data();
+
+    x1 = p->x;
+    y1 = p->y;
+
+    node = node->Next();
+    p = (wxPoint *)node->Data();
+
+    x2 = p->x;
+    y2 = p->y;
+    cx1 = (double)((x1 + x2) / 2);
+    cy1 = (double)((y1 + y2) / 2);
+    cx2 = (double)((cx1 + x2) / 2);
+    cy2 = (double)((cy1 + y2) / 2);
+
+    wx_spline_add_point(x1, y1);
+
+    while ((node = node->Next()) != NULL)
+    {
+        p = (wxPoint *)node->Data();
+	x1 = x2;
+	y1 = y2;
+	x2 = p->x;
+	y2 = p->y;
+        cx4 = (double)(x1 + x2) / 2;
+        cy4 = (double)(y1 + y2) / 2;
+        cx3 = (double)(x1 + cx4) / 2;
+        cy3 = (double)(y1 + cy4) / 2;
+
+        wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
+
+	cx1 = cx4;
+	cy1 = cy4;
+        cx2 = (double)(cx1 + x2) / 2;
+        cy2 = (double)(cy1 + y2) / 2;
+    }
+
+    wx_spline_add_point( cx1, cy1 );
+    wx_spline_add_point( x2, y2 );
+
+    wx_spline_draw_point_array( this );
+}
+
+
+    
+bool  wxDC::CanDrawBitmap(void) const 
+{
+	return true ;
+}
+
+
+bool  wxDC::Blit( long xdest, long ydest, long width, long height,
+       wxDC *source, long xsrc, long ysrc, int logical_func , bool useMask )
+{
+  if (!Ok()) return FALSE;
+  MacVerifySetup() ;
+
+	CGrafPtr			sourcePort = (CGrafPtr) source->m_macPort ;
+	PixMapHandle	bmappixels =  GetGWorldPixMap( sourcePort ) ; 
+	RGBColor		white = { 0xFFFF, 0xFFFF,0xFFFF} ;
+	RGBColor		black = { 0,0,0} ;
+//		RGBForeColor( &black ) ;
+//		RGBBackColor( &white ) ;
+		RGBForeColor( &m_textForegroundColour.GetPixel() ) ;
+		RGBBackColor( &m_textBackgroundColour.GetPixel() ) ;
+
+	if ( LockPixels(bmappixels) )
+	{
+		Rect srcrect , dstrect ;
+		srcrect.top = source->YLOG2DEV(ysrc) ;
+		srcrect.left = source->XLOG2DEV(xsrc) ;
+		srcrect.right = source->XLOG2DEV(xsrc + width ) ;
+		srcrect.bottom = source->YLOG2DEV(ysrc + height) ;
+		dstrect.top = YLOG2DEV(ydest) ;
+		dstrect.left = XLOG2DEV(xdest) ;
+		dstrect.bottom = YLOG2DEV(ydest + height )  ;
+		dstrect.right = XLOG2DEV(xdest + width ) ;
+//		::ClipRect(&m_macClipRect);
+		CopyBits( &GrafPtr( sourcePort )->portBits , &GrafPtr( m_macPort )->portBits ,
+			&srcrect, &dstrect, srcCopy, NULL ) ;
+/*
+						if ( m_clipping )
+						{
+							long x1 = XLOG2DEV(m_clipX1);
+							long y1 = YLOG2DEV(m_clipY1);
+							long x2 = XLOG2DEV(m_clipX2);
+							long y2 = YLOG2DEV(m_clipY2);
+	
+							Rect clip = { y1 , x1 , y2 , x2 } ;
+							::ClipRect(&clip);
+						}
+*/
+		UnlockPixels( bmappixels ) ;
+	} 
+	
+	m_macPenInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macFontInstalled = false ;
+  	
+  return TRUE;
+}
+
+void  wxDC::DrawText( const wxString &string, long x, long y, bool use16)
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+  
+//	if (m_pen.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallFont() ;
+		/*
+		Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
+			
+		  ::ClipRect( &clip ) ;
+		*/
+		
+		FontInfo fi ;
+		::GetFontInfo( &fi ) ;
+		
+		yy += fi.ascent ;
+		::MoveTo( xx , yy );
+		if (  m_backgroundMode == wxTRANSPARENT )
+		{
+			::TextMode( srcOr) ;
+		}
+		else
+		{
+			::TextMode( srcCopy ) ;
+		}
+
+		const char *text = NULL ;
+		int length = 0 ;
+		wxString macText ;
+
+		if ( wxApp::s_macDefaultEncodingIsPC )
+		{
+			macText = wxMacMakeMacStringFromPC( string ) ;
+			text = macText ;
+			length = macText.Length() ;
+		}
+		else
+		{
+			text = string ;
+			length = string.Length() ;
+		}
+		
+		int laststop = 0 ;
+		int i = 0 ;
+		int line = 0 ;
+		
+		while( i < length )
+		{
+			if( text[i] == 13 || text[i] == 10)
+			{
+				::DrawText( text , laststop , i - laststop ) ;
+				line++ ;
+				::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
+				laststop = i+1 ;
+			}
+			i++ ;
+		}
+				
+		::DrawText( text , laststop , i - laststop ) ;
+		::TextMode( srcOr ) ;
+	}
+}
+
+bool  wxDC::CanGetTextExtent(void) const 
+{
+	if ( !Ok() )
+		return false  ;
+		
+	return true ;
+}
+
+void  wxDC::GetTextExtent( const wxString &string, long *width, long *height,
+                     long *descent, long *externalLeading ,
+                     wxFont *theFont , bool use16  ) const
+{
+  if (!Ok()) 
+  	return;
+ 
+   MacVerifySetup() ;
+
+ 	wxFont formerFont = m_font ; 
+ 	
+	if ( theFont )
+	{
+		wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
+	
+		if ( font )
+		{
+	  	long yy1 = YLOG2DEV(0);
+	 		long yy2 = YLOG2DEV(font->m_macFontSize);
+	
+			::TextFont( font->m_macFontNum ) ;
+			::TextSize( abs( yy2-yy1) ) ;
+			::TextFace( font->m_macFontStyle ) ;
+		}
+	}
+	else
+	{
+		MacInstallFont() ;
+	}
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	*height = fi.descent + fi.ascent ;
+	*descent = fi.descent ;
+	*externalLeading = fi.leading ;
+	
+	const char *text = NULL ;
+	int length = 0 ;
+	wxString macText ;
+	if ( wxApp::s_macDefaultEncodingIsPC )
+	{
+		macText = wxMacMakeMacStringFromPC( string ) ;
+		text = macText ;
+		length = macText.Length() ;
+	}
+	else
+	{
+		text = string ;
+		length = string.Length() ;
+	}
+	
+	int laststop = 0 ;
+	int i = 0 ;
+	int curwidth = 0 ;
+	*width = 0 ;
+	
+	while( i < length )
+	{
+		if( text[i] == 13 || text[i] == 10)
+		{
+			*height += fi.descent + fi.ascent + fi.leading;
+			curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+			if ( curwidth > *width )
+				*width = curwidth ;
+			laststop = i+1 ;
+		}
+		i++ ;
+	}
+			
+	curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+	if ( curwidth > *width )
+		*width = curwidth ;
+
+	if ( theFont )
+	{
+		m_macFontInstalled = false ;
+	}
+}
+
+long   wxDC::GetCharWidth(void)
+{
+  if (!Ok()) 
+  	return 1;
+ 
+   MacVerifySetup() ;
+
+	MacInstallFont() ;
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	return (fi.descent + fi.ascent) / 2 ;
+}
+
+long   wxDC::GetCharHeight(void)
+{
+  if (!Ok()) 
+  	return 1;
+ 
+   MacVerifySetup() ;
+
+	MacInstallFont() ;
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	return fi.descent + fi.ascent ;
+}
+
+void  wxDC::Clear(void)
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	Rect rect = { -32767 , -32767 , 32767 , 32767 } ;
+	
+	if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::EraseRect( &rect ) ;
+	};
+}
+
+void wxDC::MacInstallFont() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macFontInstalled )
+		return ;
+		
+	wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
+
+	if ( font )
+	{
+		::TextFont( font->m_macFontNum ) ;
+		::TextSize( m_scaleY * font->m_macFontSize ) ;
+		::TextFace( font->m_macFontStyle ) ;
+	
+		m_macFontInstalled = true ;
+		m_macBrushInstalled = false ;
+		m_macPenInstalled = false ;
+	
+		::RGBForeColor(&m_textForegroundColour.GetPixel() );
+		::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+	}
+	else
+	{
+		short fontnum ;
+		
+		GetFNum( "\pGeneva" , &fontnum ) ;
+		::TextFont( fontnum ) ;
+		::TextSize( m_scaleY * 10 ) ;
+		::TextFace( 0 ) ;
+	
+		// todo reset after spacing changes - or store the current spacing somewhere
+	
+		m_macFontInstalled = true ;
+		m_macBrushInstalled = false ;
+		m_macPenInstalled = false ;
+		::RGBForeColor( &(m_textForegroundColour.GetPixel()) );
+		::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+	}
+
+
+	short mode = patCopy ;
+
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+}
+
+static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern)
+{
+	int thePatListID = sysPatListID;
+	int theIndex;
+	switch(hatchStyle)
+	{
+		case wxBDIAGONAL_HATCH:
+			theIndex = 34; // WCH: this is not good
+			break;
+		case wxFDIAGONAL_HATCH:
+			theIndex = 26;
+			break;
+		case wxCROSS_HATCH:
+			theIndex = 5;
+			break;
+		case wxHORIZONTAL_HATCH:
+			theIndex = 25;
+			break;
+		case wxVERTICAL_HATCH:
+			theIndex = 6;
+			break;
+		case wxCROSSDIAG_HATCH:
+			theIndex = 4; // WCH: this is not good
+			break;
+		default:
+			theIndex = 1; // solid pattern
+			break;
+	}
+	GetIndPattern( pattern, thePatListID, theIndex);	
+}
+
+void wxDC::MacInstallPen() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macPenInstalled )
+		return ;
+
+	::RGBForeColor(&m_pen.GetColour().GetPixel() );
+	::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+	
+	::PenNormal() ;
+	int penWidth = m_pen.GetWidth();
+	::PenSize(penWidth, penWidth);
+
+	int penStyle = m_pen.GetStyle();
+	
+	if (penStyle == wxSOLID)
+		::PenPat(&qd.black);
+	else if (IS_HATCH(penStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(penStyle, &pat);
+		::PenPat(&pat);
+	}
+	else
+	{
+		::PenPat(&qd.black);
+	}
+
+	short mode = patCopy ;
+	
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+	m_macPenInstalled = true ;
+	m_macBrushInstalled = false ;
+	m_macFontInstalled = false ;
+}
+
+void wxDC::MacInstallBrush() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macBrushInstalled )
+		return ;
+
+	// foreground
+
+	::RGBForeColor(&m_brush.GetColour().GetPixel() );
+	::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+
+	int brushStyle = m_brush.GetStyle();
+	if (brushStyle == wxSOLID)
+		::PenPat(&qd.black);
+	else if (IS_HATCH(brushStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(brushStyle, &pat);
+		::PenPat(&pat);
+	}
+	else
+	{
+		::PenPat(&qd.black);
+	}
+
+	
+	// background
+	
+	brushStyle = m_backgroundBrush.GetStyle();
+	if (brushStyle == wxSOLID)
+		::BackPat(&qd.white);
+	else if (IS_HATCH(brushStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(brushStyle, &pat);
+		::BackPat(&pat);
+	}
+	else
+	{
+		::BackPat(&qd.white);
+	}
+	
+	short mode = patCopy ;
+
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+	m_macBrushInstalled = true ;
+	m_macPenInstalled = false ;
+	m_macFontInstalled = false ;
+}
+
+
diff --git a/src/mac/carbon/dcclient.cpp b/src/mac/carbon/dcclient.cpp
index 925d9609ee..08aeff0504 100644
--- a/src/mac/carbon/dcclient.cpp
+++ b/src/mac/carbon/dcclient.cpp
@@ -38,598 +38,78 @@ IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
  * wxWindowDC
  */
 
+#include <wx/mac/uma.h>
+
 wxWindowDC::wxWindowDC(void)
 {
-};
+}
 
-wxWindowDC::wxWindowDC( wxWindow *window )
-{
-};
+wxWindowDC::wxWindowDC(wxWindow *the_canvas)
+{
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	// this time it is really the full window
+	
+	the_canvas->MacGetPortParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+}
 
 wxWindowDC::~wxWindowDC(void)
 {
-};
-
-void wxWindowDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1), 
-  const wxColour& WXUNUSED(col), int WXUNUSED(style) )
-{
-};
-
-bool wxWindowDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
-{
-  return FALSE;
-};
-
-void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 )
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::CrossHair( long x, long y )
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, long xc, long yc )
-{
-  if (!Ok()) return;
-  
-  long xx1 = XLOG2DEV(x1); 
-  long yy1 = YLOG2DEV(y1);
-  long xx2 = XLOG2DEV(x2); 
-  long yy2 = YLOG2DEV(y2);
-  long xxc = XLOG2DEV((long)xc); 
-  long yyc = YLOG2DEV((long)yc);
-  double dx = xx1 - xxc; 
-  double dy = yy1 - yyc;
-  double radius = sqrt(dx*dx+dy*dy);
-  long   r      = (long)radius;
-  double radius1, radius2;
-
-  if (xx1 == xx2 && yy1 == yy2) 
-  {
-    radius1 = 0.0;
-    radius2 = 360.0;
-  } 
-  else 
-  if (radius == 0.0) 
-  {
-    radius1 = radius2 = 0.0;
-  } 
-  else 
-  {
-    radius1 = (xx1 - xxc == 0) ?
-	    (yy1 - yyc < 0) ? 90.0 : -90.0 :
-	    -atan2(double(yy1-yyc), double(xx1-xxc)) * RAD2DEG;
-    radius2 = (xx2 - xxc == 0) ?
-	    (yy2 - yyc < 0) ? 90.0 : -90.0 :
-	    -atan2(double(yy2-yyc), double(xx2-xxc)) * RAD2DEG;
-  };
-  long alpha1 = long(radius1 * 64.0);
-  long alpha2 = long((radius2 - radius1) * 64.0);
-  while (alpha2 <= 0) alpha2 += 360*64;
-  while (alpha1 > 360*64) alpha1 -= 360*64;
-
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-    
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-  
-};
-
-void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea )
-{
-  if (!Ok()) return;
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-  
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-  
-  long start = long(sa * 64.0);
-  long end = long(ea * 64.0);
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawPoint( long x, long y )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() == wxTRANSPARENT) return;
-  
-  for (int i = 0; i < n-1; i++)
-  {
-    long x1 = XLOG2DEV(points[i].x + xoffset);
-    long x2 = XLOG2DEV(points[i+1].x + xoffset);
-    long y1 = YLOG2DEV(points[i].y + yoffset);     // oh, what a waste
-    long y2 = YLOG2DEV(points[i+1].y + yoffset);
-  };
-};
-
-void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() == wxTRANSPARENT) return;
-  
-  wxNode *node = points->First();
-  while (node->Next())
-  {
-    wxPoint *point = (wxPoint*)node->Data();
-    wxPoint *npoint = (wxPoint*)node->Next()->Data();
-    long x1 = XLOG2DEV(point->x + xoffset);
-    long x2 = XLOG2DEV(npoint->x + xoffset);
-    long y1 = YLOG2DEV(point->y + yoffset);    // and again...
-    long y2 = YLOG2DEV(npoint->y + yoffset);
-    node = node->Next();
-  };
-};
-
-void wxWindowDC::DrawPolygon( int WXUNUSED(n), wxPoint WXUNUSED(points)[], 
-  long WXUNUSED(xoffset), long WXUNUSED(yoffset), int WXUNUSED(fillStyle) )
-{
-  if (!Ok()) return;
-};
-
-void wxWindowDC::DrawPolygon( wxList *WXUNUSED(lines), long WXUNUSED(xoffset), 
-                             long WXUNUSED(yoffset), int WXUNUSED(fillStyle) )
-{
-  if (!Ok()) return;
-};
-
-void wxWindowDC::DrawRectangle( long x, long y, long width, long height )
-{
-  if (!Ok()) return;
-
-  long xx = XLOG2DEV(x);
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width);
-  long hh = m_signY * YLOG2DEVREL(height);
-    
-  // CMB: draw nothing if transformed w or h is 0
-  if (ww == 0 || hh == 0) return;
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-    
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius )
-{
-  if (!Ok()) return;
-  
-  if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-  long rr = XLOG2DEVREL((long)radius);
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-
-  // CMB: if radius is zero use DrawRectangle() instead to avoid
-  // X drawing errors with small radii
-  if (rr == 0)
-  {
-    DrawRectangle( x, y, width, height );
-    return;
-  }
-
-  // CMB: draw nothing if transformed w or h is 0
-  if (ww == 0 || hh == 0) return;
-
-  // CMB: adjust size if outline is drawn otherwise the result is
-  // 1 pixel too wide and high
-  if (m_pen.GetStyle() != wxTRANSPARENT)
-  {
-    ww--;
-    hh--;
-  }
-
-  // CMB: ensure dd is not larger than rectangle otherwise we
-  // get an hour glass shape
-  long dd = 2 * rr;
-  if (dd > ww) dd = ww;
-  if (dd > hh) dd = hh;
-  rr = dd / 2;
-
-  if (m_brush.GetStyle() != wxTRANSPARENT)
-  {
-  };
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT)
-  {
-  };
-};
-
-void wxWindowDC::DrawEllipse( long x, long y, long width, long height )
-{
-  if (!Ok()) return;
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-  
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-bool wxWindowDC::CanDrawBitmap(void) const
-{
-  return TRUE;
-};
-
-void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
-{
-  if (!Ok()) return;
-  
-  if (!icon.Ok()) return;
-  
-  int xx = XLOG2DEV(x);
-  int yy = YLOG2DEV(y);
-  
-};
-
-bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
-       wxDC *source, long xsrc, long ysrc, int WXUNUSED(logical_func), bool WXUNUSED(useMask) )
-{
-  if (!Ok()) return FALSE;
-  
-  // CMB 20/5/98: add blitting of bitmaps
-  if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
-  {
-    wxMemoryDC* srcDC = (wxMemoryDC*)source;
-    /*
-     GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
-    if (bmap)
-    {
-      gdk_draw_bitmap (
-          m_window,
-          m_textGC,
-          bmap,
-          source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
-          XLOG2DEV(xdest), YLOG2DEV(ydest),
-          source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
-          );
-      return TRUE;
-    }
-    */
-  }
-
-  return TRUE;
-};
-
-void wxWindowDC::DrawText( const wxString &text, long x, long y, bool
-WXUNUSED(use16) )
-{
-  if (!Ok()) return;
-
-};
-
-
-
-bool wxWindowDC::CanGetTextExtent(void) const
-{
-  return TRUE;
-};
-
-void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *height,
-                     long *WXUNUSED(descent), long *WXUNUSED(externalLeading),
-                     wxFont *WXUNUSED(theFont), bool WXUNUSED(use16) )
-{
-  if (!Ok()) return;
-  
-};
-
-long wxWindowDC::GetCharWidth(void)
-{
-  if (!Ok()) return 0;
-  return 0;
-};
-
-long wxWindowDC::GetCharHeight(void)
-{
-  if (!Ok()) return 0;
-  return 0;
-};
-
-void wxWindowDC::Clear(void)
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::SetFont( const wxFont &font )
-{
-  if (!Ok()) return;
-  
-  m_font = font;
-};
-
-void wxWindowDC::SetPen( const wxPen &pen )
-{
-  if (!Ok()) return;
-
-  if (m_pen == pen) return;
-  
-  m_pen = pen;
-  
-  if (!m_pen.Ok()) return;
-};
-
-void wxWindowDC::SetBrush( const wxBrush &brush )
-{
-  if (!Ok()) return;
-  
-  if (m_brush == brush) return;
-  
-  m_brush = brush;
-  
-  if (!m_brush.Ok()) return;
-  
-};
-
-void wxWindowDC::SetBackground( const wxBrush &brush )
-{
-  if (!Ok()) return;
-  
-  if (m_backgroundBrush == brush) return;
-  
-  m_backgroundBrush = brush;
-  
-  if (!m_backgroundBrush.Ok()) return;
-  
-};
-
-void wxWindowDC::SetLogicalFunction( int function )
-{
-  if (m_logicalFunction == function) return;
-};
-
-void wxWindowDC::SetTextForeground( const wxColour &col )
-{
-  if (!Ok()) return;
-  
-  if (m_textForegroundColour == col) return;
-  
-  m_textForegroundColour = col;
-  if (!m_textForegroundColour.Ok()) return;
-};
-
-void wxWindowDC::SetTextBackground( const wxColour &col )
-{
-  if (!Ok()) return;
-  
-  if (m_textBackgroundColour == col) return;
-  
-  m_textBackgroundColour = col;
-  if (!m_textBackgroundColour.Ok()) return;
-};
-
-void wxWindowDC::SetBackgroundMode( int mode )
-{
-  m_backgroundMode = mode;
-
-  if (m_brush.GetStyle() != wxSOLID && m_brush.GetStyle() != wxTRANSPARENT)
-  {
-  }
-};
-
-void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) )
-{
-};
-
-void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
-{
-  wxDC::SetClippingRegion( x, y, width, height );
+}
 
-  // TODO
-  
-};
+/*
+ * wxClientDC
+ */
 
-void wxWindowDC::SetClippingRegion( const wxRegion& region )
+wxClientDC::wxClientDC(void)
 {
-  wxRect box = region.GetBox();
-
-  wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
-
-  // TODO
 }
 
-void wxWindowDC::DestroyClippingRegion(void)
+wxClientDC::wxClientDC(wxWindow *window)
 {
-  wxDC::DestroyClippingRegion();
-  
-};
-
-// ----------------------------------- spline code ----------------------------------------
-
-void wx_quadratic_spline(double a1, double b1, double a2, double b2,
-                         double a3, double b3, double a4, double b4);
-void wx_clear_stack(void);
-int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
-        double *y3, double *x4, double *y4);
-void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
-          double x4, double y4);
-static bool wx_spline_add_point(double x, double y);
-static void wx_spline_draw_point_array(wxDC *dc);
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	window->MacGetPortClientParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+  SetBackground(wxBrush(window->GetBackgroundColour(), wxSOLID));
 
-wxList wx_spline_point_list;
-
-#define		half(z1, z2)	((z1+z2)/2.0)
-#define		THRESHOLD	5
-
-/* iterative version */
-
-void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4,
-                 double b4)
-{
-    register double  xmid, ymid;
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-
-    wx_clear_stack();
-    wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4);
-
-    while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
-        xmid = (double)half(x2, x3);
-        ymid = (double)half(y2, y3);
-	if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD &&
-	    fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) {
-            wx_spline_add_point( x1, y1 );
-            wx_spline_add_point( xmid, ymid );
-	} else {
-            wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
-                 (double)half(x3, x4), (double)half(y3, y4), x4, y4);
-            wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
-                 (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
-	}
-    }
 }
 
-/* utilities used by spline drawing routines */
-
-typedef struct wx_spline_stack_struct {
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-} Stack;
-
-#define         SPLINE_STACK_DEPTH             20
-static Stack    wx_spline_stack[SPLINE_STACK_DEPTH];
-static Stack   *wx_stack_top;
-static int      wx_stack_count;
-
-void wx_clear_stack(void)
+wxClientDC::~wxClientDC(void)
 {
-    wx_stack_top = wx_spline_stack;
-    wx_stack_count = 0;
 }
 
-void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
-{
-    wx_stack_top->x1 = x1;
-    wx_stack_top->y1 = y1;
-    wx_stack_top->x2 = x2;
-    wx_stack_top->y2 = y2;
-    wx_stack_top->x3 = x3;
-    wx_stack_top->y3 = y3;
-    wx_stack_top->x4 = x4;
-    wx_stack_top->y4 = y4;
-    wx_stack_top++;
-    wx_stack_count++;
-}
+/*
+ * wxPaintDC
+ */
 
-int wx_spline_pop(double *x1, double *y1, double *x2, double *y2,
-                  double *x3, double *y3, double *x4, double *y4)
+wxPaintDC::wxPaintDC(void)
 {
-    if (wx_stack_count == 0)
-	return (0);
-    wx_stack_top--;
-    wx_stack_count--;
-    *x1 = wx_stack_top->x1;
-    *y1 = wx_stack_top->y1;
-    *x2 = wx_stack_top->x2;
-    *y2 = wx_stack_top->y2;
-    *x3 = wx_stack_top->x3;
-    *y3 = wx_stack_top->y3;
-    *x4 = wx_stack_top->x4;
-    *y4 = wx_stack_top->y4;
-    return (1);
 }
 
-static bool wx_spline_add_point(double x, double y)
+wxPaintDC::wxPaintDC(wxWindow *window)
 {
-  wxPoint *point = new wxPoint ;
-  point->x = (int) x;
-  point->y = (int) y;
-  wx_spline_point_list.Append((wxObject*)point);
-  return TRUE;
-}
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	window->MacGetPortClientParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
 
-static void wx_spline_draw_point_array(wxDC *dc)
-{
-  dc->DrawLines(&wx_spline_point_list, 0, 0 );
-  wxNode *node = wx_spline_point_list.First();
-  while (node)
-  {
-    wxPoint *point = (wxPoint *)node->Data();
-    delete point;
-    delete node;
-    node = wx_spline_point_list.First();
-  }
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+	long x , y ,w , h ;
+	window->GetUpdateRegion().GetBox( x , y , w , h ) ;
+	SetClippingRegion( x , y , w , h ) ;
+  	SetBackground(wxBrush(window->GetBackgroundColour(), wxSOLID));
 }
 
-void wxWindowDC::DrawSpline( wxList *points )
+wxPaintDC::~wxPaintDC()
 {
-    wxPoint *p;
-    double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
-    double           x1, y1, x2, y2;
-
-    wxNode *node = points->First();
-    p = (wxPoint *)node->Data();
-
-    x1 = p->x;
-    y1 = p->y;
-
-    node = node->Next();
-    p = (wxPoint *)node->Data();
-
-    x2 = p->x;
-    y2 = p->y;
-    cx1 = (double)((x1 + x2) / 2);
-    cy1 = (double)((y1 + y2) / 2);
-    cx2 = (double)((cx1 + x2) / 2);
-    cy2 = (double)((cy1 + y2) / 2);
-
-    wx_spline_add_point(x1, y1);
-
-    while ((node = node->Next()) != NULL)
-    {
-        p = (wxPoint *)node->Data();
-	x1 = x2;
-	y1 = y2;
-	x2 = p->x;
-	y2 = p->y;
-        cx4 = (double)(x1 + x2) / 2;
-        cy4 = (double)(y1 + y2) / 2;
-        cx3 = (double)(x1 + cx4) / 2;
-        cy3 = (double)(y1 + cy4) / 2;
-
-        wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
-
-	cx1 = cx4;
-	cy1 = cy4;
-        cx2 = (double)(cx1 + x2) / 2;
-        cy2 = (double)(cy1 + y2) / 2;
-    }
-
-    wx_spline_add_point( cx1, cy1 );
-    wx_spline_add_point( x2, y2 );
-
-    wx_spline_draw_point_array( this );
-};
+}
diff --git a/src/mac/carbon/dcmemory.cpp b/src/mac/carbon/dcmemory.cpp
index 7cbd330821..28a652368a 100644
--- a/src/mac/carbon/dcmemory.cpp
+++ b/src/mac/carbon/dcmemory.cpp
@@ -40,6 +40,18 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
   m_selected = bitmap;
   if (m_selected.Ok())
   {
+		wxBitmapRefData * bmap = (wxBitmapRefData*) (m_selected.GetRefData()) ;
+		if ( bmap->m_hBitmap )
+		{
+			m_macPort = (GrafPtr) bmap->m_hBitmap ;
+			MacSetupPort() ;
+ 			m_ok = TRUE ;
+			// SetBackground(wxBrush(*wxWHITE, wxSOLID));
+ 		}
+ 		else
+ 		{
+	    m_ok = FALSE;
+ 		}
   }
   else
   {
diff --git a/src/mac/carbon/dcscreen.cpp b/src/mac/carbon/dcscreen.cpp
index e03bbac0c8..1ea12f3d29 100644
--- a/src/mac/carbon/dcscreen.cpp
+++ b/src/mac/carbon/dcscreen.cpp
@@ -22,7 +22,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxWindowDC)
 // Create a DC representing the whole screen
 wxScreenDC::wxScreenDC()
 {
-    // TODO
+	m_macPort = LMGetWMgrPort() ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
 }
 
 wxScreenDC::~wxScreenDC()
diff --git a/src/mac/carbon/dialog.cpp b/src/mac/carbon/dialog.cpp
index bf3cae5e35..7e82133eb2 100644
--- a/src/mac/carbon/dialog.cpp
+++ b/src/mac/carbon/dialog.cpp
@@ -19,6 +19,8 @@
 #include "wx/app.h"
 #include "wx/settings.h"
 
+#include <wx/mac/uma.h>
+
 // Lists to keep track of windows, so we can disable/enable them
 // for modal dialogs
 wxList wxModalDialogs;
@@ -29,6 +31,7 @@ extern wxList wxPendingDelete;
 IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
 
 BEGIN_EVENT_TABLE(wxDialog, wxPanel)
+	EVT_SIZE(wxDialog::OnSize)
   EVT_BUTTON(wxID_OK, wxDialog::OnOK)
   EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
   EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
@@ -66,9 +69,47 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
   else
 	m_windowId = id;
 
-  // TODO: create dialog
+	Rect theBoundsRect;
+
+  m_x = (int)pos.x;
+  m_y = (int)pos.y;
+  if ( m_y < 50 )
+  	m_y = 50 ;
+  if ( m_x < 20 )
+  	m_x = 20 ;
+  	
+  m_width = size.x;
+	if (m_width == -1) 
+		m_width = 20;
+  m_height = size.y;
+	if (m_height == -1) 
+		m_height = 20;
+
+	::SetRect(&theBoundsRect, m_x, m_y, m_x + m_width, m_y + m_height);
+	m_macWindowData = new MacWindowData() ;
+
+	WindowClass wclass = kMovableModalWindowClass ;
+	WindowAttributes attr = kWindowNoAttributes ;
+	
+	if ( ( m_windowStyle & wxMINIMIZE_BOX ) || ( m_windowStyle & wxMAXIMIZE_BOX ) )
+	{
+		attr |= kWindowFullZoomAttribute ;
+		attr |= kWindowResizableAttribute ;
+	}
 
-  return FALSE;
+	UMACreateNewWindow( wclass , attr , &theBoundsRect , &m_macWindowData->m_macWindow ) ;
+	wxAssociateWinWithMacWindow( m_macWindowData->m_macWindow , this ) ;
+	wxString label ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+	m_macWindowData->m_macWindowBackgroundTheme = kThemeBrushDialogBackgroundActive ;
+	UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ;
+	m_macWindowData->m_macFocus = NULL ;
+	m_macShown = false ;
+  return TRUE;
 }
 
 void wxDialog::SetModal(bool flag)
@@ -86,7 +127,6 @@ void wxDialog::SetModal(bool flag)
 
 wxDialog::~wxDialog()
 {
-    // TODO
     wxTopLevelWindows.DeleteObject(this);
 
     if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
@@ -99,7 +139,7 @@ wxDialog::~wxDialog()
 
       if (wxTheApp->GetExitOnFrameDelete())
       {
-         // TODO: exit
+       	wxTheApp->ExitMainLoop() ;
       }
     }
 }
@@ -132,67 +172,65 @@ bool wxDialog::IsIconized() const
     return FALSE;
 }
 
-void wxDialog::SetClientSize(int width, int height)
-{
-    // TODO
-}
-
-void wxDialog::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
+extern bool s_macIsInModalLoop ;
 
 bool wxDialog::Show(bool show)
 {
-    // TODO
-    return FALSE;
-}
+	if ( m_macShown == show )
+		return TRUE ;
 
-void wxDialog::SetTitle(const wxString& title)
-{
-    // TODO
-}
+	m_macShown = show ;
 
-wxString wxDialog::GetTitle() const
-{
-    // TODO
-    return wxString("");
-}
+  bool modal =  ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL) ;
 
-void wxDialog::Centre(int direction)
-{
-  int x_offset,y_offset ;
-  int display_width, display_height;
-  int  width, height, x, y;
-  wxWindow *parent = GetParent();
-  if ((direction & wxCENTER_FRAME) && parent)
-  {
-      parent->GetPosition(&x_offset,&y_offset) ;
-      parent->GetSize(&display_width,&display_height) ;
-  }
-  else
-  {
-    wxDisplaySize(&display_width, &display_height);
-    x_offset = 0 ;
-    y_offset = 0 ;
-  }
+	if ( modal )
+	{
+		s_macIsInModalLoop = true ;
+	  if (show)
+	  {
+      // if we don't do it, some window might be deleted while we have pointers
+      // to them in our disabledWindows list and the program will crash when it
+      // will try to reenable them after the modal dialog end
+      wxTheApp->DeletePendingObjects();
 
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
+    	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+    	UMASelectWindow( m_macWindowData->m_macWindow ) ;
 
-  if (direction & wxHORIZONTAL)
-    x = (int)((display_width - width)/2);
-  if (direction & wxVERTICAL)
-    y = (int)((display_height - height)/2);
+      if (!wxModalDialogs.Member(this))
+        wxModalDialogs.Append(this);
 
-  SetSize(x+x_offset, y+y_offset, width, height);
+      while (wxModalDialogs.Member(this) )
+      {
+      	wxTheApp->MacDoOneEvent() ;
+      }
+	  }
+	  else
+	  {
+      wxModalDialogs.DeleteObject(this);
+    	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	  s_macIsInModalLoop = false ;
+	}
+	else // !modal
+	{
+	  if (show)
+	  {
+    	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+    	UMASelectWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	  else
+	  {
+    	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	}
+	return TRUE ;
 }
 
+
 // Replacement for Show(TRUE) for modal dialogs - returns return code
 int wxDialog::ShowModal()
 {
-    m_windowStyle |= wxDIALOG_MODAL;
-    // TODO: modal showing
+  m_windowStyle |= wxDIALOG_MODAL;
 	Show(TRUE);
 	return GetReturnCode();
 }
@@ -275,6 +313,16 @@ bool wxDialog::Destroy()
   return TRUE;
 }
 
+void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+  // if we're using constraints - do use them
+  #if wxUSE_CONSTRAINTS
+    if ( GetAutoLayout() ) {
+      Layout();
+    }
+  #endif
+}
+
 void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
 {
   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
@@ -283,4 +331,128 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
 
 void wxDialog::Fit()
 {
+  wxWindow::Fit();
 }
+
+wxSizer *wxDialog::CreateTextSizer( const wxString &message )
+{
+    wxBoxSizer *box = new wxBoxSizer( wxVERTICAL );
+    
+    // get line height for empty lines
+    int y = 0;
+    wxFont new_font( GetFont() );
+    if (!new_font.Ok()) new_font = *wxSWISS_FONT;
+    GetTextExtent( "H", (int*)NULL, &y, (int*)NULL, (int*)NULL, &new_font );
+    
+    wxString line;
+    for (size_t pos = 0; pos < message.Len(); pos++)
+    {
+        if (message[pos] == _T('\n'))
+        {
+            if (!line.IsEmpty())
+            {
+                wxStaticText *s1 = new wxStaticText( this, -1, line );
+		box->Add( s1 );
+                line = _T("");
+            }
+	    else
+	    {
+	        box->Add( 5, y );
+	    }
+        }
+        else
+        {
+            line += message[pos];
+        }
+    }
+    
+    // remaining text behind last '\n'
+    if (!line.IsEmpty())
+    {
+        wxStaticText *s2 = new wxStaticText( this, -1, line );
+	box->Add( s2 );
+    }
+    
+    return box;
+}
+    
+wxSizer *wxDialog::CreateButtonSizer( long flags )
+{
+    wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL );
+
+#if defined(__WXMSW__) || defined(__WXMAC__)
+    int margin = 6;
+#else
+    int margin = 10;
+#endif
+
+    wxButton *ok = (wxButton *) NULL;
+    wxButton *cancel = (wxButton *) NULL;
+    wxButton *yes = (wxButton *) NULL;
+    wxButton *no = (wxButton *) NULL;
+
+    // always show an OK button, unless only YES_NO is given
+    if ((flags & wxYES_NO) == 0) flags = flags | wxOK;
+    
+    if (flags & wxYES_NO) 
+    {
+        yes = new wxButton( this, wxID_YES, _("Yes") );
+        box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
+        no = new wxButton( this, wxID_NO, _("No") );
+        box->Add( no, 0, wxLEFT|wxRIGHT, margin );
+    } else 
+    if (flags & wxYES) 
+    {
+        yes = new wxButton( this, wxID_YES, _("Yes") );
+        box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
+    } else 
+    if (flags & wxNO) 
+    {
+        no = new wxButton( this, wxID_NO, _("No") );
+        box->Add( no, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if (flags & wxOK) 
+    {
+        ok = new wxButton( this, wxID_OK, _("OK") );
+        box->Add( ok, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if (flags & wxFORWARD) 
+        box->Add( new wxButton( this, wxID_FORWARD, _("Forward")  ), 0, wxLEFT|wxRIGHT, margin ); 
+
+    if (flags & wxBACKWARD) 
+        box->Add( new wxButton( this, wxID_BACKWARD, _("Backward")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxSETUP) 
+        box->Add( new wxButton( this, wxID_SETUP, _("Setup")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxMORE) 
+        box->Add( new wxButton( this, wxID_MORE, _("More...")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxHELP)
+        box->Add( new wxButton( this, wxID_HELP, _("Help")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxCANCEL) 
+    {
+        cancel = new wxButton( this, wxID_CANCEL, _("Cancel") );
+        box->Add( cancel, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if ((flags & wxNO_DEFAULT) == 0)
+    {
+        if (ok)
+        {
+            ok->SetDefault();
+            ok->SetFocus();
+        }
+        else if (yes)
+        {
+            yes->SetDefault();
+            yes->SetFocus();
+        }
+    }
+    
+    return box;
+}
+
diff --git a/src/mac/carbon/dirdlg.cpp b/src/mac/carbon/dirdlg.cpp
index 095621b978..edfc211caa 100644
--- a/src/mac/carbon/dirdlg.cpp
+++ b/src/mac/carbon/dirdlg.cpp
@@ -24,6 +24,407 @@
 IMPLEMENT_CLASS(wxDirDialog, wxDialog)
 #endif
 
+enum {
+	kSelectItem = 10, 			// select button item number
+	kSFGetFolderDlgID = 250,	// dialog resource number
+	kStrListID = 250,			// our strings
+	kSelectStrNum = 1,			// word 'Select: ' for button
+	kDesktopStrNum = 2,			// word 'Desktop' for button
+	kSelectNoQuoteStrNum = 3,	// word 'Select: ' for button
+	
+	kUseQuotes = true,			// parameter for SetButtonName
+	kDontUseQuotes = false
+};
+
+// the data we need to pass to our standard file hook routine
+// includes a pointer to the dialog, a pointer to the standard
+// file reply record (so we can inspect the current selection)
+// and a copy of the "previous" file spec of the reply record
+// so we can see if the selection has changed
+
+struct UserDataRec {
+	StandardFileReply	*sfrPtr;
+	FSSpec				oldSelectionFSSpec;
+	DialogPtr			theDlgPtr;
+};
+typedef struct UserDataRec
+	UserDataRec, *UserDataRecPtr;
+
+static void GetLabelString(StringPtr theStr, short stringNum)
+{
+	GetIndString(theStr, kStrListID, stringNum);
+}
+
+static void CopyPStr(StringPtr src, StringPtr dest)
+{
+	BlockMoveData(src, dest, 1 + src[0]);
+}
+
+static char GetSelectKey(void)
+{
+	// this is the key used to trigger the select button
+	
+	// NOT INTERNATIONAL SAVVY; should at least grab it from resources
+	
+	return 's';
+}
+
+
+// SetButtonName sets the name of the Select button in the dialog
+//
+// To do this, we need to call the Script Manager to truncate the
+// label in the middle to fit the button and to merge the button
+// name with the word Select (possibly followed by quotes).  Using
+// the Script Manager avoids all sorts of problems internationally.
+//
+// buttonName is the name to appear following the word Select
+// quoteFlag should be true if the name is to appear in quotes
+
+static void SetButtonName(DialogPtr theDlgPtr, short buttonID, StringPtr buttonName,
+					Boolean quoteFlag)
+{
+	short 	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	short	textWidth;
+	Handle	labelHandle;
+	Handle	nameHandle;
+	Str15	keyStr;
+	Str255	labelStr;
+	OSErr	err;
+	
+	nameHandle = nil;
+	labelHandle = nil;
+	
+	// get the details of the button from the dialog
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	
+	// get the string for the select button label, "Select ^0" or "Select Ò^0Ó"
+	
+	GetLabelString(labelStr, (quoteFlag == kUseQuotes) ? kSelectStrNum : kSelectNoQuoteStrNum);
+	
+	// make string handles containing the select button label and the
+	// file name to be stuffed into the button
+	
+	err = PtrToHand(&labelStr[1], &labelHandle, labelStr[0]);
+	if (err != noErr) goto Bail;
+	
+	// cut out the middle of the file name to fit the button
+	//
+	// we'll temporarily use labelStr here to hold the modified button name
+	// since we don't own the buttonName string storage space
+	
+	textWidth = (buttonRect.right - buttonRect.left) - StringWidth(labelStr);
+
+	CopyPStr(buttonName, labelStr);
+	(void) TruncString(textWidth, labelStr, smTruncMiddle);
+	
+	err = PtrToHand(&labelStr[1], &nameHandle, labelStr[0]);
+	if (err != noErr) goto Bail;
+	
+	// replace the ^0 in the Select string with the file name
+	
+	CopyPStr("\p^0", keyStr);
+	
+	(void) ReplaceText(labelHandle, nameHandle, keyStr);
+	
+	labelStr[0] = (unsigned char) GetHandleSize(labelHandle);
+	BlockMoveData(*labelHandle, &labelStr[1], labelStr[0]);
+	
+	// now set the control title, and re-validate the area
+	// above the control to avoid a needless redraw
+	
+	SetControlTitle((ControlHandle) buttonHandle, labelStr);
+	
+	ValidRect(&buttonRect);
+
+Bail:
+	if (nameHandle)		DisposeHandle(nameHandle);
+	if (labelHandle)	DisposeHandle(labelHandle);
+	
+}
+
+// FlashButton briefly highlights the dialog button 
+// as feedback for key equivalents
+
+static void FlashButton(DialogPtr theDlgPtr, short buttonID)
+{
+	short	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	unsigned long	finalTicks;
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	HiliteControl((ControlHandle) buttonHandle, kControlButtonPart);
+	Delay(10, &finalTicks);
+	HiliteControl((ControlHandle) buttonHandle, 0);
+}
+
+static Boolean SameFSSpec(FSSpecPtr spec1, FSSpecPtr spec2)
+{
+	return (spec1->vRefNum == spec2->vRefNum
+			&& spec1->parID == spec2->parID
+			&& EqualString(spec1->name, spec2->name, false, false));
+}
+// MyModalDialogFilter maps a key to the Select button, and handles
+// flashing of the button when the key is hit
+
+static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRecord *eventRec,
+											short *item, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// make certain the proper dialog is showing, 'cause standard file
+	// can nest dialogs but calls the same filter for each
+	
+	if (((WindowPeek) theDlgPtr)->refCon == sfMainDialogRefCon)
+	{
+		// check if the select button was hit
+		
+		if ((eventRec->what == keyDown)
+			&& (eventRec->modifiers & cmdKey) 
+			&& ((eventRec->message & charCodeMask) == GetSelectKey()))
+		{
+			*item = kSelectItem;
+			FlashButton(theDlgPtr, kSelectItem);
+			return true;
+		}
+	}
+		
+	return false;
+}
+
+
+// MyDlgHook is a hook routine that maps the select button to Open
+// and sets the Select button name
+
+static pascal short SFGetFolderDialogHook(short item, DialogPtr theDlgPtr, Ptr dataPtr)
+{
+	UserDataRecPtr	theUserDataRecPtr;
+	long			desktopDirID;
+	short			desktopVRefNum;
+	FSSpec			tempSpec;
+	Str63			desktopName;
+	OSErr			err;
+	
+	// be sure Std File is really showing us the intended dialog,
+	// not a nested modal dialog
+	
+	if (((WindowPeek) theDlgPtr)->refCon != sfMainDialogRefCon)
+	{
+		return item;
+	}
+	
+	theUserDataRecPtr = (UserDataRecPtr) dataPtr;
+	
+	// map the Select button to Open
+	
+	if (item == kSelectItem)
+	{
+		item = sfItemOpenButton;
+	}
+	
+	// find the desktop folder
+	
+	err = FindFolder(theUserDataRecPtr->sfrPtr->sfFile.vRefNum,
+					kDesktopFolderType, kDontCreateFolder,
+					&desktopVRefNum, &desktopDirID);
+	
+	if (err != noErr)
+	{
+		// for errors, get value that won't match any real vRefNum/dirID
+		desktopVRefNum = 0;
+		desktopDirID = 0;
+	}
+	
+	// change the Select button label if the selection has changed or
+	// if this is the first call to the hook
+	
+	if (item == sfHookFirstCall
+		|| item == sfHookChangeSelection
+		|| item == sfHookRebuildList
+		|| ! SameFSSpec(&theUserDataRecPtr->sfrPtr->sfFile,
+					&theUserDataRecPtr->oldSelectionFSSpec))
+	{
+		// be sure there is a file name selected
+		
+		if (theUserDataRecPtr->sfrPtr->sfFile.name[0] != '\0')
+		{
+			SetButtonName(theDlgPtr, kSelectItem, 
+							theUserDataRecPtr->sfrPtr->sfFile.name, 
+							kUseQuotes);	// true -> use quotes
+		}
+		else
+		{
+			// is the desktop selected?
+			
+			if (theUserDataRecPtr->sfrPtr->sfFile.vRefNum == desktopVRefNum
+				&& theUserDataRecPtr->sfrPtr->sfFile.parID == desktopDirID)
+			{
+				// set button to "Select Desktop"
+				
+				GetLabelString(desktopName, kDesktopStrNum);
+				SetButtonName(theDlgPtr, kSelectItem, 
+								desktopName, kDontUseQuotes);	// false -> no quotes
+			}
+			else
+			{
+				// get parent directory's name for the Select button
+				//
+				// passing an empty name string to FSMakeFSSpec gets the
+				// name of the folder specified by the parID parameter
+				
+				(void) FSMakeFSSpec(theUserDataRecPtr->sfrPtr->sfFile.vRefNum,
+					theUserDataRecPtr->sfrPtr->sfFile.parID, "\p",
+					&tempSpec);
+				SetButtonName(theDlgPtr, kSelectItem, 
+							tempSpec.name, kUseQuotes); // true -> use quotes
+			}
+		}
+	}
+	
+	// save the current selection as the old selection for comparison next time
+	//
+	// it's not valid on the first call, though, or if we don't have a 
+	// name available from standard file
+	
+	if (item != sfHookFirstCall || theUserDataRecPtr->sfrPtr->sfFile.name[0] != '\0')
+	{
+		theUserDataRecPtr->oldSelectionFSSpec = theUserDataRecPtr->sfrPtr->sfFile;
+	}
+	else
+	{
+		// on first call, empty string won't set the button correctly, 
+		// so invalidate oldSelection
+		
+		theUserDataRecPtr->oldSelectionFSSpec.vRefNum = 999;
+		theUserDataRecPtr->oldSelectionFSSpec.parID = 0;
+	}
+	
+	return item;
+}
+
+void StandardGetFolder( ConstStr255Param message , ConstStr255Param path , FileFilterYDUPP fileFilter, StandardFileReply *theSFR)
+{
+	Point 				thePt;
+	SFTypeList			mySFTypeList;
+	UserDataRec			myData;
+	FSSpec				tempSpec;
+	Boolean				folderFlag;
+	Boolean				wasAliasedFlag;
+	DlgHookYDUPP		dlgHookUPP;
+	ModalFilterYDUPP	myModalFilterUPP;
+	OSErr				err;
+	
+	
+	// presumably we're running System 7 or later so CustomGetFile is
+	// available
+	
+	// set initial contents of Select button to a space
+	
+	CopyPStr("\p ", theSFR->sfFile.name);
+	
+	// point the user data parameter at the reply record so we can get to it later
+	
+	myData.sfrPtr = theSFR;
+	
+	// display the dialog
+	
+	dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
+	myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
+	
+	thePt.h = thePt.v = -1;	// center dialog
+	
+	ParamText( message , NULL , NULL , NULL ) ;
+	
+	CustomGetFile(	fileFilter, 
+					-1,					// show all types
+					mySFTypeList,
+					theSFR,
+					kSFGetFolderDlgID,
+					thePt,				// top left point
+					dlgHookUPP,
+					myModalFilterUPP,
+					nil,				// activate list
+					nil,				// activate proc
+					&myData);
+					
+	DisposeRoutineDescriptor(dlgHookUPP);
+	DisposeRoutineDescriptor(myModalFilterUPP);
+	
+	// if cancel wasn't pressed and no fatal error occurred...
+	
+	if (theSFR->sfGood)
+	{
+		// if no name is in the reply record file spec,
+		// use the file spec of the parent folder
+		
+		if (theSFR->sfFile.name[0] == '\0')
+		{
+			err = FSMakeFSSpec(theSFR->sfFile.vRefNum, theSFR->sfFile.parID,
+								"\p", &tempSpec);
+			if (err == noErr)
+			{
+				theSFR->sfFile = tempSpec;
+			}
+			else
+			{
+				// no name to return, forget it
+				
+				theSFR->sfGood = false;
+			}
+		}
+		
+		// if there is now a name in the file spec, check if it's
+		// for a folder or a volume
+		
+		if (theSFR->sfFile.name[0] != '\0')
+		{
+			// the parID of the root of a disk is always fsRtParID == 1
+			
+			if (theSFR->sfFile.parID == fsRtParID)
+			{
+				theSFR->sfIsVolume = true;
+				theSFR->sfIsFolder = false;	// it would be reasonable for this to be true, too
+			}
+			
+			// we have a valid FSSpec, now let's make sure it's not for an alias file
+			
+			err = ResolveAliasFile(&theSFR->sfFile, true, &folderFlag, &wasAliasedFlag);
+			if (err != noErr)
+			{
+				theSFR->sfGood = false;
+			}
+			
+			// did the alias resolve to a folder?
+			
+			if (folderFlag  && ! theSFR->sfIsVolume)
+			{
+				theSFR->sfIsFolder = true;
+			}
+		}
+	}
+}
+
+static pascal Boolean OnlyVisibleFoldersCustomFileFilter(CInfoPBPtr myCInfoPBPtr, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// return true if this item is invisible or a file
+
+	Boolean visibleFlag;
+	Boolean folderFlag;
+	
+	visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);
+	folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);
+	
+	// because the semantics of the filter proc are "true means don't show
+	// it" we need to invert the result that we return
+	
+	return !(visibleFlag && folderFlag);
+}
+
 wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
         const wxString& defaultPath,
         long style, const wxPoint& pos)
@@ -36,7 +437,35 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
 
 int wxDirDialog::ShowModal()
 {
-    // TODO
+	{
+		Str255				prompt ;
+		Str255				path ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)path, m_path ) ;
+		c2pstr((char *)path ) ;
+
+		FileFilterYDUPP 	invisiblesExcludedCustomFilterUPP;
+		StandardFileReply	reply ;
+		invisiblesExcludedCustomFilterUPP = 
+			NewFileFilterYDProc(OnlyVisibleFoldersCustomFileFilter);
+
+		StandardGetFolder( prompt , path , invisiblesExcludedCustomFilterUPP, &reply);
+	
+		DisposeRoutineDescriptor(invisiblesExcludedCustomFilterUPP);
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
 	return wxID_CANCEL;
 }
 
diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp
index b6f5b1912d..66de687b80 100644
--- a/src/mac/carbon/filedlg.cpp
+++ b/src/mac/carbon/filedlg.cpp
@@ -23,7 +23,352 @@
 IMPLEMENT_CLASS(wxFileDialog, wxDialog)
 #endif
 
-WXDLLEXPORT wxString wxFileSelector(const char *title,
+// begin wxmac
+
+#include "morefile.h"
+#include "moreextr.h"
+#include "fullpath.h"
+#include "fspcompa.h"
+#include "PLStringFuncs.h"
+
+char * gfilters[] =
+{
+	"*.TXT" ,
+	
+	NULL 
+} ;
+
+OSType gfiltersmac[] =
+{
+	'TEXT' ,
+	
+	'****'
+} ;
+
+static void wxMacSetupStandardFile(short newVRefNum, long newDirID) 
+{ 
+	enum 
+	{ SFSaveDisk = 0x214, CurDirStore = 0x398 };
+	*(short *) SFSaveDisk = -1 * newVRefNum; 
+	*(long *) CurDirStore = newDirID; 
+}
+
+static void wxMacSetupStandardFileFromPath( const char* s )
+{
+	Str255	volume ;
+	Str255	path ;
+	short	vRefNum ;
+	long dirRef ;
+	short	i,j ;
+	Boolean isDirectory ;
+	
+	for (i=0 ; (s[i]!=0) && (s[i]!=':') ;i++)
+		{
+		volume[i]=s[i] ;
+		}
+	volume[i]=':' ;
+	volume[i+1]=0 ;
+	
+	// then copy the rest of the filename
+	
+	for (j=0;(s[i]!=0);i++,j++)
+		{
+		path[j]=s[i] ;		
+		}
+	path[j]=0 ;
+	
+	c2pstr((Ptr) volume) ;
+	c2pstr((Ptr) path) ;
+	
+	SetVol(volume, 0) ;
+	GetVol( NULL, &vRefNum ) ;
+		
+	GetDirectoryID( vRefNum , fsRtDirID , path , &dirRef , &isDirectory ) ;
+	wxMacSetupStandardFile(vRefNum, dirRef) 	;
+}
+
+enum {
+	kSelectItem = 10, 			// select button item number
+	kSFGetFileDlgID = 251,	// dialog resource number
+	kStrListID = 251,			// our strings
+	kSelectStrNum = 1,			// word 'Select: ' for button
+	kDesktopStrNum = 2,			// word 'Desktop' for button
+	kSelectNoQuoteStrNum = 3,	// word 'Select: ' for button
+	
+	kUseQuotes = true,			// parameter for SetButtonName
+	kDontUseQuotes = false
+};
+
+// the data we need to pass to our standard file hook routine
+// includes a pointer to the dialog, a pointer to the standard
+// file reply record (so we can inspect the current selection)
+// and a copy of the "previous" file spec of the reply record
+// so we can see if the selection has changed
+
+const int kwxMacFileTypes = 10 ;
+
+struct OpenUserDataRec {
+	StandardFileReply	*sfrPtr;
+	FSSpec				oldSelectionFSSpec;
+	char				filter[kwxMacFileTypes][10] ;
+	OSType				filtermactypes[kwxMacFileTypes] ;
+	int					numfilters ;
+	DialogPtr			theDlgPtr;
+};
+typedef struct OpenUserDataRec
+	OpenUserDataRec, *OpenUserDataRecPtr;
+
+static void GetLabelString(StringPtr theStr, short stringNum)
+{
+	GetIndString(theStr, kStrListID, stringNum);
+}
+
+static void CopyPStr(StringPtr src, StringPtr dest)
+{
+	BlockMoveData(src, dest, 1 + src[0]);
+}
+
+static char GetSelectKey(void)
+{
+	// this is the key used to trigger the select button
+	
+	// NOT INTERNATIONAL SAVVY; should at least grab it from resources
+	
+	return 's';
+}
+
+// FlashButton briefly highlights the dialog button 
+// as feedback for key equivalents
+
+static void FlashButton(DialogPtr theDlgPtr, short buttonID)
+{
+	short	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	unsigned long	finalTicks;
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	HiliteControl((ControlHandle) buttonHandle, kControlButtonPart);
+	Delay(10, &finalTicks);
+	HiliteControl((ControlHandle) buttonHandle, 0);
+}
+
+static Boolean SameFSSpec(FSSpecPtr spec1, FSSpecPtr spec2)
+{
+	return (spec1->vRefNum == spec2->vRefNum
+			&& spec1->parID == spec2->parID
+			&& EqualString(spec1->name, spec2->name, false, false));
+}
+// MyModalDialogFilter maps a key to the Select button, and handles
+// flashing of the button when the key is hit
+
+static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRecord *eventRec,
+											short *item, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// make certain the proper dialog is showing, 'cause standard file
+	// can nest dialogs but calls the same filter for each
+	
+	if (((WindowPeek) theDlgPtr)->refCon == sfMainDialogRefCon)
+	{
+		// check if the select button was hit
+		/*
+		if ((eventRec->what == keyDown)
+			&& (eventRec->modifiers & cmdKey) 
+			&& ((eventRec->message & charCodeMask) == GetSelectKey()))
+		{
+			*item = kSelectItem;
+			FlashButton(theDlgPtr, kSelectItem);
+			return true;
+		}
+		*/
+	}
+		
+	return false;
+}
+
+void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR)
+{
+	Point 				thePt;
+	OpenUserDataRec			myData;
+	FSSpec				tempSpec;
+	Boolean				folderFlag;
+	Boolean				wasAliasedFlag;
+	DlgHookYDUPP		dlgHookUPP;
+	ModalFilterYDUPP	myModalFilterUPP;
+	OSErr				err;
+	SFTypeList			types ;
+	
+	
+	// presumably we're running System 7 or later so CustomGetFile is
+	// available
+	
+	// set initial contents of Select button to a space
+	
+	CopyPStr("\p ", theSFR->sfFile.name);
+	
+	// point the user data parameter at the reply record so we can get to it later
+	
+	myData.sfrPtr = theSFR;
+	if ( filter && filter[0] )
+	{
+		myData.numfilters = 1 ;
+		for ( int i = 0 ; i < myData.numfilters ; i++ )
+		{
+			int j ;
+			
+			strcpy( myData.filter[i] , filter ) ;
+			for( j = 0 ; myData.filter[i][j] ; j++ )
+			{
+				myData.filter[i][j] = toupper( myData.filter[i][j] ) ;
+			}
+			for ( j = 0 ; gfilters[j] ; j++ )
+			{
+				if ( strcmp( myData.filter[i] , gfilters[j] ) == 0 )
+				{
+					myData.filtermactypes[i] = gfiltersmac[j] ;
+					break ;
+				}
+			}
+			if( gfilters[j] == NULL )
+			{
+				myData.filtermactypes[i] = '****' ;
+			}
+		}
+	}
+	else
+	{
+		myData.numfilters = 0 ;
+	}
+	// display the dialog
+	
+	dlgHookUPP = NULL ;
+//	dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
+	myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
+	
+	thePt.h = thePt.v = -1;	// center dialog
+	
+	ParamText( message , NULL , NULL , NULL ) ;
+	
+	CustomGetFile(	fileFilter, 
+					-1,					// show all types
+					NULL,
+					theSFR,
+					kSFGetFileDlgID,
+					thePt,				// top left point
+					dlgHookUPP,
+					myModalFilterUPP,
+					nil,				// activate list
+					nil,				// activate proc
+					&myData);
+					
+	DisposeRoutineDescriptor(dlgHookUPP);
+	DisposeRoutineDescriptor(myModalFilterUPP);
+	
+	// if cancel wasn't pressed and no fatal error occurred...
+	
+	if (theSFR->sfGood)
+	{
+		// if no name is in the reply record file spec,
+		// use the file spec of the parent folder
+		
+		if (theSFR->sfFile.name[0] == '\0')
+		{
+			err = FSMakeFSSpec(theSFR->sfFile.vRefNum, theSFR->sfFile.parID,
+								"\p", &tempSpec);
+			if (err == noErr)
+			{
+				theSFR->sfFile = tempSpec;
+			}
+			else
+			{
+				// no name to return, forget it
+				
+				theSFR->sfGood = false;
+			}
+		}
+		
+		// if there is now a name in the file spec, check if it's
+		// for a folder or a volume
+		
+		if (theSFR->sfFile.name[0] != '\0')
+		{
+			// the parID of the root of a disk is always fsRtParID == 1
+			
+			if (theSFR->sfFile.parID == fsRtParID)
+			{
+				theSFR->sfIsVolume = true;
+				theSFR->sfIsFolder = false;	// it would be reasonable for this to be true, too
+			}
+			
+			// we have a valid FSSpec, now let's make sure it's not for an alias file
+			
+			err = ResolveAliasFile(&theSFR->sfFile, true, &folderFlag, &wasAliasedFlag);
+			if (err != noErr)
+			{
+				theSFR->sfGood = false;
+			}
+			
+			// did the alias resolve to a folder?
+			
+			if (folderFlag  && ! theSFR->sfIsVolume)
+			{
+				theSFR->sfIsFolder = true;
+			}
+		}
+	}
+}
+
+static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, Ptr dataPtr)
+{	
+	Str255 			filename ;
+	OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
+	// return true if this item is invisible or a file
+
+	Boolean visibleFlag;
+	Boolean folderFlag;
+	
+	visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);
+	folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);
+	
+	// because the semantics of the filter proc are "true means don't show
+	// it" we need to invert the result that we return
+	
+	if ( !visibleFlag )
+		return true ;
+		
+	if ( !folderFlag )
+	{
+		if ( data->numfilters > 0 )
+		{
+			PLstrcpy( filename ,myCInfoPBPtr->hFileInfo.ioNamePtr ) ;
+			if ( filename[0] >= 4 )
+			{
+				for( int j = 1 ; j <= filename[0] ; j++ )
+				{
+					filename[j] = toupper( filename[j] ) ;
+				}
+				for ( int i = 0 ; i < data->numfilters ; ++i )
+				{
+					if ( myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType == data->filtermactypes[i] )
+						return false ;
+
+					if ( strncmp( (char*) filename + 1 + filename[0] - 4 , 
+							& data->filter[i][ strlen(data->filter[i]) - 4 ] , 4 ) == 0 )
+							return false ;
+				}
+			}
+			return true ;				
+		}
+	}	
+		
+	return false ;
+}
+
+// end wxmac
+
+wxString wxFileSelector(const char *title,
                      const char *defaultDir, const char *defaultFileName,
                      const char *defaultExtension, const char *filter, int flags,
                      wxWindow *parent, int x, int y)
@@ -100,7 +445,61 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
 
 int wxFileDialog::ShowModal()
 {
-    // TODO
+	if ( m_dialogStyle & wxSAVE )
+	{
+		StandardFileReply	reply ;
+		Str255				prompt ;
+		Str255				filename ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)filename, m_fileName) ;
+		c2pstr((char *)filename ) ;
+		
+		StandardPutFile( prompt , filename , &reply ) ;
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
+	else
+	{
+		OSType types = '????' ;
+		Str255				prompt ;
+		Str255				path ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)path, m_path ) ;
+		c2pstr((char *)path ) ;
+
+		FileFilterYDUPP 	crossPlatformFileFilterUPP;
+		StandardFileReply	reply ;
+		crossPlatformFileFilterUPP = 
+			NewFileFilterYDProc(CrossPlatformFileFilter);
+
+		ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply);
+	
+		DisposeRoutineDescriptor(crossPlatformFileFilterUPP);
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
     return wxID_CANCEL;
 }
 
diff --git a/src/mac/carbon/font.cpp b/src/mac/carbon/font.cpp
index 493a6a25ba..2409e1a38b 100644
--- a/src/mac/carbon/font.cpp
+++ b/src/mac/carbon/font.cpp
@@ -31,9 +31,10 @@ wxFontRefData::wxFontRefData()
   	m_weight = 0;
   	m_underlined = 0;
   	m_faceName = "";
-/* TODO
-  	m_hFont = 0;
-*/
+
+  	m_macFontSize = m_pointSize ; 
+  	m_macFontNum = systemFont ;
+  	m_macFontStyle = normal ;
 }
 
 wxFontRefData::wxFontRefData(const wxFontRefData& data)
@@ -45,9 +46,10 @@ wxFontRefData::wxFontRefData(const wxFontRefData& data)
   	m_weight = data.m_weight;
   	m_underlined = data.m_underlined;
   	m_faceName = data.m_faceName;
-/* TODO
-  	m_hFont = 0;
-*/
+
+  	m_macFontSize = m_pointSize ; 
+  	m_macFontNum = systemFont ;
+  	m_macFontStyle = normal ;
 }
 
 wxFontRefData::~wxFontRefData()
@@ -55,6 +57,56 @@ wxFontRefData::~wxFontRefData()
     // TODO: delete font data
 }
 
+void wxFontRefData::MacFindFont()
+{
+	if( m_faceName == "" )
+	{
+		switch( m_family )
+		{
+			case wxDEFAULT :
+				m_macFontNum = ::GetAppFont() ;
+				break ;
+			case wxDECORATIVE :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxROMAN :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxSCRIPT :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxSWISS :
+				::GetFNum( "\pHelvetica" , &m_macFontNum) ;
+				break ;
+			case wxMODERN :
+				::GetFNum( "\pMonaco" , &m_macFontNum) ;
+				break ;
+		}
+	}
+	else
+	{
+		if ( m_faceName == "systemfont" )
+			m_macFontNum = ::GetSysFont() ;
+		else if ( m_faceName == "applicationfont" )
+			m_macFontNum = ::GetAppFont() ;
+		else
+		{
+			strcpy(wxBuffer, m_faceName);
+			C2PStr(wxBuffer);
+			::GetFNum( (unsigned char*) wxBuffer, &m_macFontNum);
+		}
+	}
+
+	m_macFontStyle = 0;
+	if (m_weight == wxBOLD)
+		 m_macFontStyle |= bold;
+	if (m_style == wxITALIC || m_style == wxSLANT) 
+		m_macFontStyle |= italic;
+	if (m_underlined) 
+		m_macFontStyle |= underline;
+	m_macFontSize = m_pointSize ;
+}
+
 wxFont::wxFont()
 {
     if ( wxTheFontList )
@@ -94,8 +146,8 @@ wxFont::~wxFont()
 
 bool wxFont::RealizeResource()
 {
-    // TODO: create the font (if there is a native font object)
-    return FALSE;
+	M_FONTDATA->MacFindFont() ;
+    return TRUE;
 }
 
 void wxFont::Unshare()
diff --git a/src/mac/carbon/fontdlg.cpp b/src/mac/carbon/fontdlg.cpp
index 60e8e9b987..d775c24c16 100644
--- a/src/mac/carbon/fontdlg.cpp
+++ b/src/mac/carbon/fontdlg.cpp
@@ -14,7 +14,7 @@
 #pragma implementation "fontdlg.h"
 #endif
 
-#include "wx/stubs/fontdlg.h"
+#include "wx/mac/fontdlg.h"
 #include "wx/cmndata.h"
 
 #if !USE_SHARED_LIBRARY
diff --git a/src/mac/carbon/frame.cpp b/src/mac/carbon/frame.cpp
index 55f1e3b72c..5a95ac9097 100644
--- a/src/mac/carbon/frame.cpp
+++ b/src/mac/carbon/frame.cpp
@@ -23,6 +23,8 @@
 #include "wx/settings.h"
 #include "wx/app.h"
 
+#include <wx/mac/uma.h>
+
 extern wxList wxModelessWindows;
 extern wxList wxPendingDelete;
 
@@ -47,7 +49,11 @@ bool wxFrame::m_useNativeStatusBar = FALSE;
 
 wxFrame::wxFrame()
 {
+#if wxUSE_TOOLBAR
   m_frameToolBar = NULL ;
+#endif
+	m_macShown = false ;
+	// in order to be able to give size events on show
   m_frameMenuBar = NULL;
   m_frameStatusBar = NULL;
 
@@ -69,7 +75,10 @@ bool wxFrame::Create(wxWindow *parent,
   SetName(name);
   m_windowStyle = style;
   m_frameMenuBar = NULL;
+
+#if wxUSE_TOOLBAR
   m_frameToolBar = NULL ;
+#endif
   m_frameStatusBar = NULL;
 
   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE));
@@ -83,9 +92,63 @@ bool wxFrame::Create(wxWindow *parent,
 
   wxModelessWindows.Append(this);
 
-  // TODO: create frame.
-
-  return FALSE;
+  // create frame.
+
+	Rect theBoundsRect;
+
+  m_x = (int)pos.x;
+  m_y = (int)pos.y;
+  if ( m_y < 50 )
+  	m_y = 50 ;
+  if ( m_x < 20 )
+  	m_x = 20 ;
+  	
+  m_width = size.x;
+	if (m_width == -1) 
+		m_width = 20;
+  m_height = size.y;
+	if (m_height == -1) 
+		m_height = 20;
+
+	m_macWindowData = new MacWindowData() ;
+
+	::SetRect(&theBoundsRect, m_x, m_y, m_x + m_width, m_y + m_height);
+
+	WindowClass wclass = kDocumentWindowClass ;
+	WindowAttributes attr = kWindowNoAttributes ;
+	
+	if ( ( m_windowStyle & wxMINIMIZE_BOX ) || ( m_windowStyle & wxMAXIMIZE_BOX ) )
+	{
+		attr |= kWindowFullZoomAttribute ;
+		attr |= kWindowResizableAttribute ;
+	}
+	if ( m_windowStyle & wxSTAY_ON_TOP )
+	{
+		wclass = kFloatingWindowClass ;
+		
+//			if ( m_windowStyle & wxCAPTION )
+//				attr |= kHasPaletteTitlebarMask ;
+	}
+	else
+	{
+	}
+	if ( m_windowStyle & wxSYSTEM_MENU )
+	{
+		attr |= kWindowCloseBoxAttribute ;
+	}
+	UMACreateNewWindow( wclass , attr , &theBoundsRect , &m_macWindowData->m_macWindow ) ;
+	wxAssociateWinWithMacWindow( m_macWindowData->m_macWindow , this ) ;
+	wxString label ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+	UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ;
+	m_macWindowData->m_macWindowBackgroundTheme = kThemeBrushDocumentWindowBackground ;
+	m_macWindowData->m_macFocus = NULL ;
+	m_macShown = false ;
+  return TRUE;
 }
 
 wxFrame::~wxFrame()
@@ -105,46 +168,13 @@ wxFrame::~wxFrame()
 
     if (wxTheApp->GetExitOnFrameDelete())
     {
-       // TODO signal to the app that we're going to close
+       wxTheApp->ExitMainLoop() ;
     }
   }
 
   wxModelessWindows.DeleteObject(this);
 }
 
-// Get size *available for subwindows* i.e. excluding menu bar, toolbar etc.
-void wxFrame::GetClientSize(int *x, int *y) const
-{
-    // TODO
-}
-
-// Set the client size (i.e. leave the calculation of borders etc.
-// to wxWindows)
-void wxFrame::SetClientSize(int width, int height)
-{
-    // TODO
-}
-
-void wxFrame::GetSize(int *width, int *height) const
-{
-    // TODO
-}
-
-void wxFrame::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
-
-void wxFrame::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
-
-bool wxFrame::Show(bool show)
-{
-    // TODO
-    return FALSE;
-}
 
 void wxFrame::Iconize(bool iconize)
 {
@@ -170,17 +200,6 @@ bool wxFrame::IsMaximized(void) const
     return FALSE;
 }
 
-void wxFrame::SetTitle(const wxString& title)
-{
-    // TODO
-}
-
-wxString wxFrame::GetTitle() const
-{
-    // TODO
-    return wxString("");
-}
-
 void wxFrame::SetIcon(const wxIcon& icon)
 {
   m_icon = icon;
@@ -192,10 +211,12 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
 {
     wxStatusBar *statusBar = NULL;
 
-    statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 20),
+    statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 17),
         style, name);
 
     // Set the height according to the font and the border size
+    // we shouldn't do this on the mac, because we have to fit the grow box
+    /*
     wxClientDC dc(statusBar);
     dc.SetFont(statusBar->GetFont());
 
@@ -206,6 +227,8 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
 
     statusBar->SetSize(-1, -1, 100, height);
 
+		*/
+
     statusBar->SetFieldsCount(number);
     return statusBar;
 }
@@ -245,6 +268,8 @@ void wxFrame::SetStatusWidths(int n, const int widths_field[])
 
 void wxFrame::PositionStatusBar()
 {
+  if (m_frameStatusBar )
+  {
     int w, h;
     GetClientSize(&w, &h);
     int sw, sh;
@@ -253,6 +278,7 @@ void wxFrame::PositionStatusBar()
     // Since we wish the status bar to be directly under the client area,
     // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS.
     m_frameStatusBar->SetSize(0, h, w, sh);
+   }
 }
 
 void wxFrame::SetMenuBar(wxMenuBar *menuBar)
@@ -264,8 +290,8 @@ void wxFrame::SetMenuBar(wxMenuBar *menuBar)
     }
   
     m_frameMenuBar = menuBar;
-
-    // TODO
+		// TODO : we move this into the app code
+    m_frameMenuBar->MacInstallMenuBar() ;
 }
 
 void wxFrame::Fit()
@@ -333,8 +359,12 @@ void wxFrame::OnSize(wxSizeEvent& event)
     wxWindow *win = (wxWindow *)node->Data();
     if ( !win->IsKindOf(CLASSINFO(wxFrame))  &&
          !win->IsKindOf(CLASSINFO(wxDialog)) && 
-         (win != GetStatusBar()) &&
-         (win != GetToolBar()) )
+         (win != GetStatusBar()) 
+#if wxUSE_TOOLBAR
+         &&
+         (win != GetToolBar()) 
+#endif
+         )
     {
       if ( child )
         return;     // it's our second subwindow - nothing to do
@@ -410,21 +440,6 @@ wxMenuBar *wxFrame::GetMenuBar() const
   return m_frameMenuBar;
 }
 
-void wxFrame::Centre(int direction)
-{
-  int display_width, display_height, width, height, x, y;
-  wxDisplaySize(&display_width, &display_height);
-
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
-
-  if (direction & wxHORIZONTAL)
-    x = (int)((display_width - width)/2);
-  if (direction & wxVERTICAL)
-    y = (int)((display_height - height)/2);
-
-  SetSize(x, y, width, height);
-}
 
 // Call this to simulate a menu command
 void wxFrame::Command(int id)
@@ -434,7 +449,7 @@ void wxFrame::Command(int id)
 
 void wxFrame::ProcessCommand(int id)
 {
-  wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, id);
+  wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id);
   commandEvent.SetInt( id );
   commandEvent.SetEventObject( this );
 
@@ -450,18 +465,14 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  // Process events starting with the window with the focus, if any.
-  wxWindow* focusWin = wxFindFocusDescendant(this);
-
-  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
-
-  evtHandler->ProcessEvent(commandEvent);
+  GetEventHandler()->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
     wxPoint pt(0, 0);
+#if wxUSE_TOOLBAR
     if (GetToolBar())
     {
         int w, h;
@@ -476,33 +487,46 @@ wxPoint wxFrame::GetClientAreaOrigin() const
             pt.y += h;
         }
     }
+#endif
     return pt;
 }
 
-void wxFrame::ScreenToClient(int *x, int *y) const
+void wxFrame::GetClientSize(int *x, int *y) const
 {
-    wxWindow::ScreenToClient(x, y);
-
-    // We may be faking the client origin.
-    // So a window that's really at (0, 30) may appear
-    // (to wxWin apps) to be at (0, 0).
-    wxPoint pt(GetClientAreaOrigin());
-    *x -= pt.x;
-    *y -= pt.y;
+	wxWindow::GetClientSize( x , y ) ;
+
+  if ( GetStatusBar() )
+  {
+    int statusX, statusY;
+    GetStatusBar()->GetClientSize(&statusX, &statusY);
+    *y -= statusY;
+  }
+
+  wxPoint pt(GetClientAreaOrigin());
+  *y -= pt.y;
+  *x -= pt.x;
 }
 
-void wxFrame::ClientToScreen(int *x, int *y) const
+void wxFrame::DoSetClientSize(int clientwidth, int clientheight)
 {
-    // We may be faking the client origin.
-    // So a window that's really at (0, 30) may appear
-    // (to wxWin apps) to be at (0, 0).
-    wxPoint pt1(GetClientAreaOrigin());
-    *x += pt1.x;
-    *y += pt1.y;
-
-    wxWindow::ClientToScreen(x, y);
+	int currentclientwidth , currentclientheight ;
+	int currentwidth , currentheight ;
+	
+	GetClientSize( &currentclientwidth , &currentclientheight ) ;
+	GetSize( &currentwidth , &currentheight ) ;
+	
+	// find the current client size
+
+  // Find the difference between the entire window (title bar and all)
+  // and the client area; add this to the new client size to move the
+  // window
+
+	DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth ,
+		currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
 }
 
+
+#if wxUSE_TOOLBAR
 wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
 {
     wxCHECK_MSG( m_frameToolBar == NULL, FALSE,
@@ -534,7 +558,10 @@ void wxFrame::PositionToolBar()
     // the toolbar/status bar were added.
     // So DEFINITELY replace the line below with something appropriate.
 
-    GetClientSize(& cw, &ch);
+   //  GetClientSize(& cw, &ch);
+
+		cw = m_width ;
+		ch = m_height ;
 
     if ( GetStatusBar() )
     {
@@ -562,4 +589,4 @@ void wxFrame::PositionToolBar()
         }
     }
 }
-
+#endif
diff --git a/src/mac/carbon/gauge.cpp b/src/mac/carbon/gauge.cpp
index a85fbc498f..7dc3b5e813 100644
--- a/src/mac/carbon/gauge.cpp
+++ b/src/mac/carbon/gauge.cpp
@@ -19,67 +19,65 @@
 IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
+
 bool wxGauge::Create(wxWindow *parent, wxWindowID id,
            int range,
            const wxPoint& pos,
-           const wxSize& size,
+           const wxSize& s,
            long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_rangeMax = range;
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-
-    // TODO
-    return FALSE;
-}
-
-void wxGauge::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	wxSize size = s ;
+	Rect bounds ;
+	Str255 title ;
+	m_rangeMax = range ;
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
+	
+	if ( size.x == wxDefaultSize.x && size.y == wxDefaultSize.y)
+	{
+		size = wxSize( 200 , 16 ) ;
+	}
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , range, 
+	  	kControlProgressBarProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
 void wxGauge::SetShadowWidth(int w)
 {
-    // TODO optional
 }
 
 void wxGauge::SetBezelFace(int w)
 {
-    // TODO optional
 }
 
 void wxGauge::SetRange(int r)
 {
     m_rangeMax = r;
-    // TODO
+    ::SetControlMaximum( m_macControl , m_rangeMax ) ;
 }
 
 void wxGauge::SetValue(int pos)
 {
     m_gaugePos = pos;
-    // TODO
+   ::SetControlValue( m_macControl , m_gaugePos ) ;
 }
 
 int wxGauge::GetShadowWidth() const
 {
-    // TODO optional
     return 0;
 }
 
 int wxGauge::GetBezelFace() const
 {
-    // TODO optional
     return 0;
 }
 
diff --git a/src/mac/carbon/icon.cpp b/src/mac/carbon/icon.cpp
index 6deee7dbdc..537165343e 100644
--- a/src/mac/carbon/icon.cpp
+++ b/src/mac/carbon/icon.cpp
@@ -26,12 +26,30 @@ IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap)
 
 wxIconRefData::wxIconRefData()
 {
-    // TODO: init icon handle
+    m_ok = FALSE;
+    m_width = 0;
+    m_height = 0;
+    m_depth = 0;
+    m_quality = 0;
+    m_numColors = 0;
+    m_bitmapMask = NULL;
+		m_hBitmap = NULL ;
+		m_hIcon = NULL ;
 }
 
 wxIconRefData::~wxIconRefData()
 {
-    // TODO: destroy icon handle
+	if ( m_hIcon )
+	{
+		DisposeCIcon( m_hIcon ) ;
+		m_hIcon = NULL ;
+	}
+		
+  if (m_bitmapMask)
+  {
+    delete m_bitmapMask;
+    m_bitmapMask = NULL;
+  }
 }
 
 wxIcon::wxIcon()
@@ -68,3 +86,32 @@ bool wxIcon::LoadFile(const wxString& filename, long type,
 	return FALSE;
 }
 
+IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler)
+
+bool  wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight)
+{
+	Str255 theName ;
+	short theId ;
+	OSType theType ;
+	strcpy( (char*) theName , name ) ;
+	c2pstr( (char*) theName ) ;
+	
+	Handle resHandle = GetNamedResource( 'cicn' , theName ) ;
+	GetResInfo( resHandle , &theId , &theType , theName ) ;
+	ReleaseResource( resHandle ) ;
+	
+	CIconHandle theIcon = (CIconHandle ) GetCIcon( theId ) ;
+	if ( theIcon )
+	{
+		M_ICONHANDLERDATA->m_hIcon = theIcon ;
+		M_ICONHANDLERDATA->m_width =  32 ;
+		M_ICONHANDLERDATA->m_height = 32 ;
+		
+		M_ICONHANDLERDATA->m_depth = 8 ;
+		M_ICONHANDLERDATA->m_ok = true ;
+		M_ICONHANDLERDATA->m_numColors = 256 ;
+		return TRUE ;
+	}
+	return FALSE ;
+}
\ No newline at end of file
diff --git a/src/mac/carbon/listbox.cpp b/src/mac/carbon/listbox.cpp
index 1dad21e12c..e17f1b8213 100644
--- a/src/mac/carbon/listbox.cpp
+++ b/src/mac/carbon/listbox.cpp
@@ -18,10 +18,22 @@
 #include "wx/dynarray.h"
 #include "wx/log.h"
 
+#include "wx/utils.h"
+#include "extldef.h"
+
 #if !USE_SHARED_LIBRARY
   IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+
+BEGIN_EVENT_TABLE(wxListBox, wxControl)
+	EVT_SIZE( wxListBox::OnSize ) 
+END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
+extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
+const short kwxMacListWithVerticalScrollbar = 128 ;
+
 // ============================================================================
 // list box control implementation
 // ============================================================================
@@ -41,111 +53,197 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                        const wxValidator& validator,
                        const wxString& name)
 {
-  m_noItems = n;
+  m_noItems = 0 ; // this will be increased by our append command
   m_selected = 0;
 
-  SetName(name);
-  SetValidator(validator);
-
-  if (parent) parent->AddChild(this);
-
-  wxSystemSettings settings;
-  SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
-
-  m_windowId = ( id == -1 ) ? (int)NewControlId() : id;
-
-  // TODO create listbox
-
-  return FALSE;
+	Rect bounds ;
+	Str255 title ;
+	m_macHorizontalBorder = 5 ; // additional pixels around the real control
+	m_macVerticalBorder = 5 ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , kwxMacListWithVerticalScrollbar , 0 , 0, 
+	  	kControlListBoxProc , (long) this ) ;
+	
+	long	result ;
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &m_macList  , &result ) ;
+
+	NewExtLDEFInfo( m_macList , MacDrawStringCell , (long) this ) ;
+	(**m_macList).selFlags = lOnlyOne ;
+	if ( style  & wxLB_MULTIPLE )
+	{
+		(**m_macList).selFlags += lNoExtend ;
+	}
+	else if ( style & wxLB_EXTENDED )
+	{
+		(**m_macList).selFlags += lExtendDrag ;
+	}
+	Point pt = (**m_macList).cellSize ;
+	pt.v = 14 ;
+	LCellSize( pt , m_macList ) ;
+
+	LAddColumn( 1 , 0 , m_macList ) ;
+
+	MacPostControlCreate() ;
+
+	ControlFontStyleRec		controlstyle ;
+	controlstyle.flags = kControlUseFontMask + kControlUseSizeMask ;
+	//controlstyle.font = kControlFontSmallSystemFont ;
+	controlstyle.font = kFontIDMonaco ;
+	controlstyle.size = 9 ;
+	::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+
+	for ( int i = 0 ; i < n ; i++ )
+	{
+		Append( choices[i] ) ;
+	}
+
+	LSetDrawingMode( true , m_macList ) ;
+
+  return TRUE;
 }
 
 wxListBox::~wxListBox()
 {
+//	DisposeExtLDEFInfo( m_macList ) ;
 }
 
 void wxListBox::SetFirstItem(int N)
 {
-    // TODO
+	MacScrollTo( N ) ;
 }
 
 void wxListBox::SetFirstItem(const wxString& s)
 {
-    // TODO
+	MacScrollTo( FindString( s ) ) ;
 }
 
 void wxListBox::Delete(int N)
 {
-  m_noItems --;
-    // TODO
+	m_dataArray.Remove( N ) ;
+	m_stringArray.Remove( N ) ;
+  	m_noItems --;
+	
+	MacDelete( N ) ;
 }
 
 void wxListBox::Append(const wxString& item)
 {
-  m_noItems ++;
-
-  // TODO
+	Append( item , NULL ) ;
 }
 
 void wxListBox::Append(const wxString& item, char *Client_data)
 {
-  m_noItems ++;
-
-  // TODO
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		m_stringArray.Add( wxMacMakeMacStringFromPC( item ) ) ;
+	}
+	else
+		m_stringArray.Add( item ) ;
+	m_dataArray.Add( Client_data ) ;
+  	m_noItems ++;
+  	
+	MacAppend( item ) ;
 }
 
 void wxListBox::Set(int n, const wxString *choices, char** clientData)
 {
-  m_noItems = n;
-
-  // TODO
+  Clear() ;  
+  for( int i = 0 ; i < n ; ++i )
+  {
+  	if ( clientData )
+  		Append( choices[i] , clientData[0] ) ;
+  	else
+  		Append( choices[i] ) ;
+  }
 }
 
-int wxListBox::FindString(const wxString& s) const
+int wxListBox::FindString(const wxString& st) const
 {
-    // TODO
-    return -1;
+	wxString s ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		s = wxMacMakeMacStringFromPC( st ) ;
+	}
+	else
+		s = st ;
+		
+	if ( s.Right(1) == "*" )
+	{
+		wxString search = s.Left( s.Length() - 1 ) ;
+		int len = search.Length() ;
+    for ( int i = 0 ; i < m_noItems ; ++ i )
+    {
+    	if ( equalstring( m_stringArray[i].Left( len ) , search , false , false ) )
+    		return i ;
+    }
+	}
+	else
+	{
+    for ( int i = 0 ; i < m_noItems ; ++ i )
+    {
+    	if ( equalstring( m_stringArray[i] , s , false , false ) )
+    		return i ;
+    }
+   }
+   return -1;
 }
 
 void wxListBox::Clear()
 {
   m_noItems = 0;
-  // TODO
+  m_stringArray.Empty() ;
+  m_dataArray.Empty() ;
+  MacClear() ;
 }
 
 void wxListBox::SetSelection(int N, bool select)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::SetSelection" );
+	MacSetSelection( N , select ) ;
 }
 
 bool wxListBox::Selected(int N) const
 {
-    // TODO
-    return FALSE;
+    wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE,
+                 "invalid index in wxListBox::Selected" );
+
+	return MacIsSelected( N ) ;
 }
 
 void wxListBox::Deselect(int N)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::Deselect" );
+
+    SetSelection( N , false ) ;
 }
 
 char *wxListBox::GetClientData(int N) const
 {
-    // TODO
-    return (char *)NULL;
+    wxCHECK_MSG( N >= 0 && N < m_noItems, NULL,
+                 "invalid index in wxListBox::GetClientData" );
+
+    return m_dataArray[N];
 }
 
 void wxListBox::SetClientData(int N, char *Client_data)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::SetClientData" );
+
+    m_dataArray[N] = Client_data ;
 }
 
 // Return number of selections and an array of selected integers
 int wxListBox::GetSelections(wxArrayInt& aSelections) const
 {
-    aSelections.Empty();
+	return MacGetSelections( aSelections ) ;
 
 /* TODO
-    if ((m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED))
+    if ((m_windowStyle & wxLB_MULTIMacE) || (m_windowStyle & wxLB_EXTENDED))
     {
         int no_sel = ??
         for ( int n = 0; n < no_sel; n++ )
@@ -160,38 +258,41 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const
         return 1;
     }
 */
-    return 0;
 }
 
 // Get single selection, for single choice list items
 int wxListBox::GetSelection() const
 {
-    // TODO
-    return -1;
+	return MacGetSelection() ;
 }
 
 // Find string for position
 wxString wxListBox::GetString(int N) const
 {
-    // TODO
-    return wxString("");
-}
-
-void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		return 		wxMacMakePCStringFromMac( m_stringArray[N] ) ;
+	}
+	else
+		return m_stringArray[N]  ;
 }
 
 void wxListBox::InsertItems(int nItems, const wxString items[], int pos)
 {
-    m_noItems += nItems;
+	for ( int i = 0 ; i < nItems ; i++ )
+	{
+		m_stringArray.Insert( items[i] , pos + i ) ;
+		m_dataArray.Insert( NULL , pos + i ) ;
+		MacInsert( pos + i , items[i] ) ;
+	}
 
-    // TODO
+    m_noItems += nItems;
 }
 
 void wxListBox::SetString(int N, const wxString& s)
 {
-    // TODO
+	m_stringArray[N] = s ;
+	MacSet( N , s ) ;
 }
 
 int wxListBox::Number () const
@@ -204,7 +305,9 @@ wxString wxListBox::GetStringSelection () const
 {
   int sel = GetSelection ();
   if (sel > -1)
-    return this->GetString (sel);
+  {
+			return GetString (sel);
+  }
   else
     return wxString("");
 }
@@ -233,3 +336,182 @@ void wxListBox::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
+// ============================================================================
+// list box control implementation
+// ============================================================================
+
+void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon)
+{
+	wxListBox*			list;
+	// typecast our refCon
+	list = (wxListBox*)refCon;
+		
+	MoveTo(cellRect->left + 4 , cellRect->top + 10 );
+	const wxString text = list->m_stringArray[lCell.v] ;
+	::TextFont( kFontIDMonaco ) ;
+	::TextSize( 9  );
+	::TextFace( 0 ) ;
+	DrawText(text, 0 , text.Length());
+		
+}
+
+void wxListBox::MacDelete( int N )
+{
+	ListHandle list ;
+	long	result ;
+	Cell cell = { 0 , 0 } ;
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &list  , &result ) ;
+	LDelRow( 1 , N , list ) ;
+}
+
+void wxListBox::MacInsert( int n , const char * text) 
+{
+	Cell	cell ;
+
+	cell.h = 0 ;
+	cell.v = n ;
+
+	LAddRow( 1 , cell.v , m_macList ) ;
+}
+
+void wxListBox::MacAppend( const char * text) 
+{
+	Cell cell = { 0 , 0 } ;
+	cell.v = (**m_macList).dataBounds.bottom ;
+	LAddRow( 1 , cell.v , m_macList ) ;
+}
+
+void wxListBox::MacClear() 
+{
+	LDelRow( (**m_macList).dataBounds.bottom , 0 , m_macList ) ;
+}
+
+void wxListBox::MacSetSelection( int n , bool select )
+{
+	Cell cell = { 0 , 0 } ;
+	if ( LGetSelect( TRUE , &cell , m_macList ) )
+	{
+		LSetSelect( false , cell , m_macList ) ;
+	}
+	
+	cell.v = n ;
+	LSetSelect( select , cell , m_macList ) ;
+	LAutoScroll( m_macList ) ;
+}
+
+bool wxListBox::MacIsSelected( int n ) const
+{
+	Cell cell = { 0 , 0 } ;
+	cell.v = n ;
+	return LGetSelect( false , &cell , m_macList ) ;
+}
+
+void wxListBox::MacDestroy()
+{
+//	DisposeExtLDEFInfo( m_macList ) ;
+}
+
+int wxListBox::MacGetSelection() const
+{
+	Cell cell = { 0 , 0 } ;
+	if ( LGetSelect( true , &cell , m_macList ) )
+		return cell.v ;
+	else
+		return -1 ;
+}
+
+int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const
+{
+	int no_sel = 0 ;
+	
+    aSelections.Empty();
+
+	Cell cell = { 0 , 0 } ;
+	cell.v = 0 ;
+	
+	while ( LGetSelect( true , &cell , m_macList ) )
+	{
+		aSelections.Add( cell.v ) ;
+		no_sel++ ;
+		cell.v++ ;
+	}
+	return no_sel ;
+}
+
+void wxListBox::MacSet( int n , const char * text )
+{
+	// our implementation does not store anything in the list
+	// so we just have to redraw
+	Cell cell = { 0 , 0 } ;
+	cell.v = n ;
+	LDraw( cell , m_macList ) ;
+}
+
+void wxListBox::MacScrollTo( int n )
+{
+	// TODO implement scrolling
+}
+
+void wxListBox::OnSize( const wxSizeEvent &event)
+{
+	Point pt = (**m_macList).cellSize ;
+	pt.h =  m_width - 15 /* scrollbar */ - m_macHorizontalBorder * 2 ;
+	LCellSize( pt , m_macList ) ;
+}
+
+void wxListBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	Boolean wasDoubleClick = false ;
+	long	result ;
+
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick  , &result ) ;
+	if ( !wasDoubleClick )
+	{
+		MacDoClick() ;
+	}
+	else
+	{
+		MacDoDoubleClick() ;
+	}
+}
+
+void wxListBox::MacSetRedraw( bool doDraw ) 
+{
+	LSetDrawingMode( doDraw , m_macList ) ;
+	
+}
+
+void wxListBox::MacDoClick()
+{
+	wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
+	wxArrayInt aSelections;
+	int count = GetSelections(aSelections);
+	if ( count > 0 )
+	{
+		  event.m_commandInt = aSelections[0] ;
+		  event.m_clientData = GetClientData(event.m_commandInt);
+		  wxString str(GetString(event.m_commandInt));
+		  if (str != "")
+		    event.m_commandString = copystring((char *)(const char *)str);
+	}
+	else
+	{
+		return ;
+		/*
+		  event.m_commandInt = -1 ;
+		  event.m_commandString = copystring("") ;
+		 */
+	}
+	
+	event.SetEventObject( this );
+	ProcessCommand(event);
+	if (event.m_commandString)
+	  delete[] event.m_commandString ;
+}
+
+void wxListBox::MacDoDoubleClick()
+{
+    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
+    event.SetEventObject( this );
+	GetEventHandler()->ProcessEvent(event) ; 
+}
diff --git a/src/mac/carbon/makefile.unx b/src/mac/carbon/makefile.unx
index d5d55d86d4..5bd62163fd 100644
--- a/src/mac/carbon/makefile.unx
+++ b/src/mac/carbon/makefile.unx
@@ -62,7 +62,6 @@ LIB_CPP_SRC=\
  ../common/variant.cpp \
  ../common/wxexpr.cpp \
  ../common/socket.cpp \
- ../common/sckint.cpp \
  ../common/sckaddr.cpp \
  ../common/sckipc.cpp \
  ../common/protocol.cpp \
diff --git a/src/mac/carbon/menu.cpp b/src/mac/carbon/menu.cpp
index 1fc7c4a229..b22001b870 100644
--- a/src/mac/carbon/menu.cpp
+++ b/src/mac/carbon/menu.cpp
@@ -27,6 +27,8 @@
 #include "wx/log.h"
 #include "wx/utils.h"
 
+#include "wx/mac/uma.h"
+
 // other standard headers
 // ----------------------
 #include <string.h>
@@ -36,13 +38,146 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler)
 #endif
 
+// the (popup) menu title has this special id
+static const int idMenuTitle = -2;
+static int formerHelpMenuItems = 0 ;
+
+const short kwxMacMenuBarResource = 1 ;
+const short kwxMacAppleMenuId = 1 ;
+
 // ============================================================================
 // implementation
 // ============================================================================
 
+//
+// Helper Functions to get Mac Menus the way they should be ;-)
+//
+
+void wxMacCtoPString(const char* theCString, Str255 thePString);
+
+// remove inappropriate characters, if useShortcuts is false, the ampersand will not auto-generate a mac menu-shortcut
+
+static void wxMacBuildMenuString(StringPtr outMacItemText, char *outMacShortcutChar , short *outMacModifiers , const char *inItemName , bool useShortcuts )
+{
+	char *p = (char *) &outMacItemText[1] ;
+	short macModifiers = 0 ;
+	char macShortCut = 0 ;
+	
+	if ( useShortcuts && !wxApp::s_macSupportPCMenuShortcuts )
+		useShortcuts = false ;
+	
+	// we have problems with a leading hypen - it will be taken as a separator
+	
+	while ( *inItemName == '-' )
+		inItemName++ ;
+		
+	while( *inItemName )
+	{
+		switch ( *inItemName )
+		{
+			// special characters for macintosh menus -> use some replacement
+			case ';' :
+				*p++ = ',' ;
+				break ;
+			case '^' :
+				*p++ = ' ' ;
+				break ;
+			case '!' :
+				*p++ = ' ' ;
+				break ;
+			case '<' :
+				*p++ = ' ' ;
+				break ;
+			case '/' :
+				*p++ = '|' ;
+				break ;
+			case '(' :
+				*p++ = '[' ;
+				break ;
+			case ')' :	
+				*p++ = ']' ;
+				break ;
+			// shortcuts
+			case '&' :
+				{
+					++inItemName ;
+					if ( *inItemName )
+					{
+						*p++ = *inItemName ;
+						if ( useShortcuts )
+							macShortCut = *inItemName ;
+					}
+					else
+						--inItemName ;
+				}
+				break ;
+			// win-like accelerators
+			case '\t' :
+				{
+					++inItemName ;
+					while( *inItemName )
+					{
+						if (strncmp("Ctrl+", inItemName, 5) == 0) 
+						{
+							inItemName = inItemName + 5;
+							macShortCut = *inItemName;
+						}
+						else if (strncmp("Alt+", inItemName, 4) == 0) 
+						{
+							inItemName = inItemName + 4;
+							macModifiers |= kMenuOptionModifier ;
+							macShortCut = *inItemName ;
+						}
+						else if (strncmp("Shift+", inItemName, 6) == 0) 
+						{
+							inItemName = inItemName + 6;
+							macModifiers |= kMenuShiftModifier ;
+							macShortCut = *inItemName ;
+						}
+						else if (strncmp("F", inItemName, 1) == 0) 
+						{
+							inItemName += strlen( inItemName ) ;
+							// no function keys at the moment
+							// macModifiers |= kMenuShiftModifier ;
+							// macShortCut = *inItemName ;
+						}
+						else
+						{
+							break ;
+						}
+					}
+
+					if ( *inItemName == 0 )
+						--inItemName ;
+						
+				}
+				break ;
+			default :
+				*p++ = *inItemName ;
+		}
+		++inItemName ;
+	}
+
+	outMacItemText[0] = (p - (char *)outMacItemText) - 1;
+	if ( outMacShortcutChar )
+		*outMacShortcutChar = macShortCut ;
+	if ( outMacModifiers )
+		*outMacModifiers = macModifiers ;
+	if ( macShortCut )
+	{
+			int pos = outMacItemText[0] ;
+			outMacItemText[++pos] = '/';
+			outMacItemText[++pos] = toupper( macShortCut );
+			outMacItemText[0] = pos ;
+	}
+}
+
 // Menus
 
 // Construct a menu with optional title (then use append)
+
+short wxMenu::s_macNextMenuId = 2 ;
+
 wxMenu::wxMenu(const wxString& title, const wxFunction func)
 {
     m_title = title;
@@ -50,23 +185,27 @@ wxMenu::wxMenu(const wxString& title, const wxFunction func)
     m_eventHandler = this;
     m_noItems = 0;
     m_menuBar = NULL;
+    m_pInvokingWindow = NULL ;
     m_clientData = (void*) NULL;
     if (m_title != "")
     {
-        Append(-2, m_title) ;
+        Append(idMenuTitle, m_title) ;
         AppendSeparator() ;
     }
 
     Callback(func);
 
-    // TODO create menu
+	Str255 	label;
+	wxMacBuildMenuString( label, NULL , NULL , title , false );
+	m_macMenuId = s_macNextMenuId++; 
+    wxCHECK_RET( s_macNextMenuId < 236 , "menu ids > 235 cannot be used for submenus on mac" );
+	m_macMenuHandle = ::NewMenu(m_macMenuId, label);
+	m_macMenuEnabled = true ;
 }
 
 // The wxWindow destructor will take care of deleting the submenus.
 wxMenu::~wxMenu()
 {
-    // TODO destroy menu and children
-
     wxNode *node = m_menuItems.First();
     while (node)
     {
@@ -83,28 +222,78 @@ wxMenu::~wxMenu()
         delete node;
         node = next;
     }
+	if (m_macMenuHandle)
+		::DisposeMenu(m_macMenuHandle);
 }
 
 void wxMenu::Break()
 {
-    // TODO
+	// not available on the mac platform
 }
 
 // function appends a new item or submenu to the menu
 void wxMenu::Append(wxMenuItem *pItem)
 {
-    // TODO
-
     wxCHECK_RET( pItem != NULL, "can't append NULL item to the menu" );
 
     m_menuItems.Append(pItem);
 
+	if ( pItem->IsSeparator() )
+	{
+		MacAppendMenu(m_macMenuHandle, "\p-");
+	}
+	else 
+	{
+		wxMenu *pSubMenu = pItem->GetSubMenu() ;
+		if ( pSubMenu != NULL )
+		{
+ 			Str255 label;
+   			wxCHECK_RET( pSubMenu->m_macMenuHandle != NULL , "invalid submenu added");
+		    pSubMenu->m_parent = this ;
+			wxMacBuildMenuString( label , NULL , NULL , pItem->GetName() ,false);
+		
+			// hardcoded adding of the submenu combination for mac
+		
+			int theEnd = label[0] + 1; 
+			if (theEnd > 251) 
+				theEnd = 251; // mac allows only 255 characters
+			label[theEnd++] = '/';
+			label[theEnd++] = hMenuCmd; 
+			label[theEnd++] = '!';
+			label[theEnd++] = pSubMenu->m_macMenuId; 
+			label[theEnd] = 0x00;
+			label[0] = theEnd;
+
+			if (wxMenuBar::s_macInstalledMenuBar == m_menuBar) 
+			{
+				::InsertMenu( pSubMenu->m_macMenuHandle , -1 ) ;
+			}
+			
+			::AppendMenu(m_macMenuHandle, label);
+		}
+		else
+		{
+			Str255 label ;
+			wxMacBuildMenuString( label , NULL , NULL , pItem->GetName(), pItem->GetId() == wxApp::s_macAboutMenuItemId);
+			if ( label[0] == 0 )
+			{
+				// we cannot add empty menus on mac
+				label[0] = 1 ;
+				label[1] = ' ' ;
+			}
+			::AppendMenu(m_macMenuHandle, label );
+  			if ( pItem->GetId() == idMenuTitle ) 
+  			{
+					UMADisableMenuItem( m_macMenuHandle , CountMItems( m_macMenuHandle ) ) ;
+  			}
+		}
+	}
+
     m_noItems++;
 }
 
 void wxMenu::AppendSeparator()
 {
-    // TODO
     Append(new wxMenuItem(this, ID_SEPARATOR));
 }
 
@@ -136,12 +325,31 @@ void wxMenu::Delete(int id)
     }
 
     if (!node)
-	return;
+		return;
+
+    int index = pos + 1 ;
+
+    if (index < 1)
+		return;
+
+	wxMenu *pSubMenu = item->GetSubMenu();
+	if ( pSubMenu != NULL ) 
+	{
+		::DeleteMenuItem( m_macMenuHandle , index);
+		pSubMenu->m_parent = NULL;
+		// TODO: Why isn't subMenu deleted here???
+		// Will put this in for now. Assuming this is supposed
+		// to delete the menu, not just remove it.
+		item->DeleteSubMenu();
+	}
+	else 
+	{
+		::DeleteMenuItem( m_macMenuHandle , index);
+	}
 
     m_menuItems.DeleteNode(node);
+   	// TODO shouldn't we do this ? Ž_m_noItems--; 
     delete item;
-
-    // TODO
 }
 
 void wxMenu::Enable(int Id, bool Flag)
@@ -178,8 +386,16 @@ bool wxMenu::Checked(int Id) const
 
 void wxMenu::SetTitle(const wxString& label)
 {
+	Str255 title ;
     m_title = label ;
-    // TODO
+	wxMacBuildMenuString( title, NULL , NULL , label , false );
+	UMASetMenuTitle( m_macMenuHandle , title ) ;
+	if (wxMenuBar::s_macInstalledMenuBar == m_menuBar) // are we currently installed ?
+	{
+		::SetMenuBar( GetMenuBar() ) ;
+		::InvalMenuBar() ;
+	}
+	// TODO:for submenus -> their parent item text must be corrected
 }
 
 const wxString wxMenu::GetTitle() const
@@ -189,25 +405,33 @@ const wxString wxMenu::GetTitle() const
 
 void wxMenu::SetLabel(int id, const wxString& label)
 {
+    Str255 maclabel ;
+   int index ;
     wxMenuItem *item = FindItemForId(id) ;
     if (item==NULL)
         return;
 
+    index = MacGetIndexFromItem( item ) ;
+    if (index < 1)
+		return;
+
     if (item->GetSubMenu()==NULL)
     {
-        // TODO
+		wxMacBuildMenuString( maclabel , NULL , NULL , label , false );
+		::SetMenuItemText( m_macMenuHandle , index , maclabel ) ;
     }
     else
     {
-        // TODO
+		wxMacBuildMenuString( maclabel , NULL , NULL , label , false );
+		::SetMenuItemText( m_macMenuHandle , index , maclabel ) ;
     }
     item->SetName(label);
 }
 
 wxString wxMenu::GetLabel(int Id) const
 {
-    // TODO
-    return wxString("") ;
+    wxMenuItem *pItem = FindItemForId(Id) ;
+    return pItem->GetName() ;
 }
 
 // Finds the item id matching the given string, -1 if not found.
@@ -295,21 +519,204 @@ void wxMenu::ProcessCommand(wxCommandEvent & event)
     {
             processed = GetEventHandler()->ProcessEvent(event);
     }
-/* TODO
-    // Try the window the menu was popped up from (and up
-    // through the hierarchy)
-    if ( !processed && GetInvokingWindow())
-        processed = GetInvokingWindow()->ProcessEvent(event);
-*/
+
+  // Try the window the menu was popped up from (and up
+  // through the hierarchy)
+  if ( !processed && GetInvokingWindow())
+    processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
 }
 
 bool wxWindow::PopupMenu(wxMenu *menu, int x, int y)
 {
-    // TODO
-    return FALSE;
+	menu->SetInvokingWindow(this);
+	ClientToScreen( &x , &y ) ;
+
+	::InsertMenu( menu->m_macMenuHandle , -1 ) ;
+  long menuResult = ::PopUpMenuSelect(menu->m_macMenuHandle ,y,x, 0) ;
+  menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ;
+	::DeleteMenu( menu->m_macMenuId ) ;
+  menu->SetInvokingWindow(NULL);
+
+  return TRUE;
+}
+
+// helper functions returning the mac menu position for a certain item, note that this is 
+// mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
+
+int wxMenu::MacGetIndexFromId( int id ) 
+{
+    wxNode *node;
+    wxMenuItem *item;
+    int pos;
+	
+    for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+    {
+	 	item = (wxMenuItem *)node->Data();
+	 	if (item->GetId() == id)
+			break;
+    }
+
+    if (!node)
+		return 0;
+		
+	return pos + 1 ;
+}
+
+int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) 
+{
+    wxNode *node;
+    int pos;
+
+    for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+    {
+	 	if ((wxMenuItem *)node->Data() == pItem)
+			break;
+    }
+
+    if (!node)
+		return 0;
+		
+	return pos + 1 ;
+}
+
+void wxMenu::MacEnableMenu( bool bDoEnable ) 
+{
+	m_macMenuEnabled = bDoEnable ;
+	if ( bDoEnable )
+		UMAEnableMenuItem( m_macMenuHandle , 0 ) ;
+	else
+		UMADisableMenuItem( m_macMenuHandle , 0 ) ;
+		
+	::DrawMenuBar() ;
+}
+
+bool wxMenu::MacMenuSelect( wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum )
+{
+  int pos;
+  wxNode *node;
+
+	if ( m_macMenuId == macMenuId )
+	{
+		node = m_menuItems.Nth(macMenuItemNum-1);
+		if (node) 
+		{
+			wxMenuItem *pItem = (wxMenuItem*)node->Data();
+	
+			wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId());
+			event.m_timeStamp = when;
+			event.SetEventObject(handler);
+      event.SetInt( pItem->GetId() );
+
+			{
+				bool processed = false ;
+
+		    // Try a callback
+		    if (m_callback)
+		    {
+		            (void) (*(m_callback)) (*this, event);
+		            processed = TRUE;
+		    }
+		
+		    // Try the menu's event handler
+		    if ( !processed && handler)
+		    {
+		            processed = handler->ProcessEvent(event);
+		    }
+		
+		  	// Try the window the menu was popped up from (and up
+		  	// through the hierarchy)
+		  	if ( !processed && GetInvokingWindow())
+		    	processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
+		  }
+			return true ;
+		}
+	}
+	else if ( macMenuId == kHMHelpMenuID )
+	{
+		int menuItem = formerHelpMenuItems ;
+	  for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+	  {	
+	  	wxMenuItem * pItem = (wxMenuItem *)  node->Data() ;
+	  	
+	  	wxMenu *pSubMenu = pItem->GetSubMenu() ;
+			if ( pSubMenu != NULL )
+			{
+			}
+			else
+			{
+				if ( pItem->GetId() != wxApp::s_macAboutMenuItemId )
+					++menuItem ;
+					
+				if ( menuItem == macMenuItemNum )
+				{
+					wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId());
+					event.m_timeStamp = when;
+					event.SetEventObject(handler);
+       		event.SetInt( pItem->GetId() );
+					
+					{
+						bool processed = false ;
+				    // Try a callback
+				    if (m_callback)
+				    {
+				            (void) (*(m_callback)) (*this, event);
+				            processed = TRUE;
+				    }
+				
+				    // Try the menu's event handler
+				    if ( !processed && handler)
+				    {
+				            processed = handler->ProcessEvent(event);
+				    }
+				
+				  	// Try the window the menu was popped up from (and up
+				  	// through the hierarchy)
+				  	if ( !processed && GetInvokingWindow())
+				    	processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
+				  }
+				  
+					return true ;
+				}
+			}
+	  }
+	}
+
+  for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+  {	
+  	wxMenuItem * pItem = (wxMenuItem *)  node->Data() ;
+  	
+  	wxMenu *pSubMenu = pItem->GetSubMenu() ;
+		if ( pSubMenu != NULL )
+		{
+			if ( pSubMenu->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+				return true ;
+		}
+  }
+
+	return false ;
 }
 
 // Menu Bar
+
+/* 
+
+Mac Implementation note :
+
+The Mac has only one global menubar, so we attempt to install the currently
+active menubar from a frame, we currently don't take into account mdi-frames
+which would ask for menu-merging
+
+Secondly there is no mac api for changing a menubar that is not the current 
+menubar, so we have to wait for preparing the actual menubar until the
+wxMenubar is to be used
+
+We can in subsequent versions use MacInstallMenuBar to provide some sort of 
+auto-merge for MDI in case this will be necessary
+
+*/
+
+wxMenuBar* wxMenuBar::s_macInstalledMenuBar = NULL ;
+
 wxMenuBar::wxMenuBar()
 {
     m_eventHandler = this;
@@ -317,8 +724,6 @@ wxMenuBar::wxMenuBar()
     m_menus = NULL;
     m_titles = NULL;
     m_menuBarFrame = NULL;
-
-    // TODO
 }
 
 wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
@@ -329,14 +734,18 @@ wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
     m_titles = new wxString[n];
     int i;
     for ( i = 0; i < n; i++ )
-	m_titles[i] = titles[i];
+			m_titles[i] = titles[i];
     m_menuBarFrame = NULL;
-
-    // TODO
 }
 
 wxMenuBar::~wxMenuBar()
 {
+	if (s_macInstalledMenuBar == this)
+	{
+		::ClearMenuBar();
+		s_macInstalledMenuBar = NULL;
+	}
+
     int i;
     for (i = 0; i < m_menuCount; i++)
     {
@@ -345,9 +754,95 @@ wxMenuBar::~wxMenuBar()
     delete[] m_menus;
     delete[] m_titles;
 
-    // TODO
 }
 
+void wxMenuBar::MacInstallMenuBar() 
+{
+  	Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ;
+  	wxString message ;
+  	wxCHECK_RET( menubar != NULL, "can't read MBAR resource" );
+  	::SetMenuBar( menubar ) ;
+  	::DisposeHandle( menubar ) ;
+
+		MenuHandle menu = ::GetMenuHandle( kwxMacAppleMenuId ) ;
+		::AppendResMenu(menu, 'DRVR');
+ 
+   	for (int i = 0; i < m_menuCount; i++)
+  	{
+			Str255 	label;
+    	wxNode *node;
+    	wxMenuItem *item;
+    	int pos ;
+			wxMenu* menu = m_menus[i] , *subMenu = NULL ;
+		
+			
+			if( m_titles[i] == "?" || m_titles[i] == wxApp::s_macHelpMenuTitleName )
+			{
+				MenuHandle mh = NULL ;
+				if ( HMGetHelpMenuHandle( &mh ) != noErr )
+				{
+					continue ;
+				}
+				if ( formerHelpMenuItems == 0 )
+				{
+					if( mh )
+						formerHelpMenuItems = CountMenuItems( mh ) ;
+				}
+					
+		  	for (pos = 0 , node = menu->m_menuItems.First(); node; node = node->Next(), pos++) 
+	  		{
+		 			item = (wxMenuItem *)node->Data();
+		 			subMenu = item->GetSubMenu() ;
+					if (subMenu)	 		
+					{
+						// we don't support hierarchical menus in the help menu yet
+					}
+					else		
+					{
+						Str255 label ;
+						wxMacBuildMenuString( label , NULL , NULL , item->GetName(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu
+						if ( label[0] == 0 )
+						{
+							// we cannot add empty menus on mac
+							label[0] = 1 ;
+							label[1] = ' ' ;
+						}
+						if ( item->GetId() == wxApp::s_macAboutMenuItemId )
+						{ 
+								::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label );
+		//					::EnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 );
+								::EnableItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 );
+ 						}
+						else
+						{
+							if ( mh )
+								::AppendMenu(mh, label );
+						}
+					}
+				}
+			}
+			else
+			{
+				wxMacBuildMenuString( label, NULL , NULL , m_titles[i] , false );
+				UMASetMenuTitle( menu->m_macMenuHandle , label ) ;
+		  	for (pos = 0, node = menu->m_menuItems.First(); node; node = node->Next(), pos++) 
+	  		{
+		 			item = (wxMenuItem *)node->Data();
+		 			subMenu = item->GetSubMenu() ;
+					if (subMenu)	 		
+					{
+						::InsertMenu( subMenu->m_macMenuHandle , -1 ) ;
+					}
+				}
+				::InsertMenu(m_menus[i]->m_macMenuHandle, 0);
+			}
+		}
+		::DrawMenuBar() ;
+
+	s_macInstalledMenuBar = this;
+}
+
+
 // Must only be used AFTER menu has been attached to frame,
 // otherwise use individual menus to enable/disable items
 void wxMenuBar::Enable(int id, bool flag)
@@ -357,12 +852,12 @@ void wxMenuBar::Enable(int id, bool flag)
     if (!item)
         return;
 
-    // TODO
+	item->Enable( flag ) ;
 }
 
 void wxMenuBar::EnableTop(int pos, bool flag)
 {
-    // TODO
+	m_menus[pos]->MacEnableMenu( flag ) ;
 }
 
 // Must only be used AFTER menu has been attached to frame,
@@ -377,7 +872,7 @@ void wxMenuBar::Check(int id, bool flag)
     if (!item->IsCheckable())
         return ;
 
-    // TODO
+	item->Check( flag ) ;
 }
 
 bool wxMenuBar::Checked(int id) const
@@ -387,8 +882,10 @@ bool wxMenuBar::Checked(int id) const
     if (!item)
         return FALSE;
 
-    // TODO
-    return FALSE;
+    if (!item->IsCheckable())
+        return FALSE ;
+
+    return item->IsChecked() ;
 }
 
 bool wxMenuBar::Enabled(int id) const
@@ -398,8 +895,23 @@ bool wxMenuBar::Enabled(int id) const
     if (!item)
         return FALSE;
 
-    // TODO
-    return FALSE ;
+	if ( !item->IsEnabled() )
+		return FALSE ;
+	
+	if ( itemMenu->m_macMenuEnabled == false )
+		return FALSE ;
+		
+	while( itemMenu->m_parent )
+	{
+		itemMenu = (wxMenu*) itemMenu->m_parent ;
+		if ( itemMenu->IsKindOf( CLASSINFO( wxMenu ) ) )
+		{
+			if ( itemMenu->m_macMenuEnabled == false )
+				return FALSE ;
+		}
+	}
+	
+    return TRUE ;
 }
 
 
@@ -411,7 +923,7 @@ void wxMenuBar::SetLabel(int id, const wxString& label)
     if (!item)
         return;
 
-    // TODO
+    itemMenu->SetLabel( id , label ) ;
 }
 
 wxString wxMenuBar::GetLabel(int id) const
@@ -422,31 +934,51 @@ wxString wxMenuBar::GetLabel(int id) const
     if (!item)
         return wxString("");
 
-    // TODO
-    return wxString("") ;
+    return itemMenu->GetLabel( id ) ;
 }
 
 void wxMenuBar::SetLabelTop(int pos, const wxString& label)
 {
-    // TODO
+    m_menus[pos]->SetTitle( label ) ;
 }
 
 wxString wxMenuBar::GetLabelTop(int pos) const
 {
-    // TODO
-    return wxString("");
+   return m_menus[pos]->GetTitle() ;
 }
 
 bool wxMenuBar::OnDelete(wxMenu *a_menu, int pos)
 {
-    // TODO
-    return FALSE;
+	if (s_macInstalledMenuBar == this)
+	{
+		::DeleteMenu( a_menu->m_macMenuId /* m_menus[pos]->m_macMenuId */ ) ;
+		::InvalMenuBar() ;
+		return TRUE ;
+	}
+	else
+	{
+		return TRUE ;
+	}
 }
 
 bool wxMenuBar::OnAppend(wxMenu *a_menu, const char *title)
 {
-    // TODO
-    return FALSE;
+	if (!a_menu->m_macMenuHandle)
+	 	return FALSE;
+
+	if (s_macInstalledMenuBar == this)
+	{
+		Str255 	label;
+		wxMacBuildMenuString( label, NULL , NULL , title , false );
+		UMASetMenuTitle( a_menu->m_macMenuHandle , label ) ;
+		::InsertMenu( a_menu->m_macMenuHandle , 0 ) ;
+		::InvalMenuBar() ;
+		return TRUE ;
+	}
+	else
+	{
+		return TRUE ;
+	}
 }
 
 void wxMenuBar::Append (wxMenu * menu, const wxString& title)
@@ -477,7 +1009,8 @@ void wxMenuBar::Append (wxMenu * menu, const wxString& title)
     m_menus[m_menuCount - 1] = (wxMenu *)menu;
     m_titles[m_menuCount - 1] = title;
 
-    // TODO
+  ((wxMenu *)menu)->m_menuBar = (wxMenuBar *) this;
+  ((wxMenu *)menu)->SetParent(this);
 }
 
 void wxMenuBar::Delete(wxMenu * menu, int i)
@@ -568,4 +1101,43 @@ wxString wxMenuBar::GetHelpString (int Id) const
     return wxString("");
 }
 
+void wxMenuBar::MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum)
+{
+	// first scan fast for direct commands, i.e. menus which have these commands directly in their own list
+
+	if ( macMenuId == kwxMacAppleMenuId && macMenuItemNum == 1 )
+	{
+			wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macAboutMenuItemId );
+			event.m_timeStamp = when;
+			event.SetEventObject(handler);
+     	event.SetInt( wxApp::s_macAboutMenuItemId );
+			handler->ProcessEvent(event);
+	}
+	else
+	{		
+	  for (int i = 0; i < m_menuCount; i++)
+	  {
+	  	if ( m_menus[i]->m_macMenuId == macMenuId || 
+	  		( macMenuId == kHMHelpMenuID && ( m_titles[i] == "?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) )
+	  		)
+	  	{
+	  		if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+	  			return ;
+	  		else
+	  		{
+	  			//TODO flag this as an error since it must contain the item
+	  			return ;
+	  		}
+	  	}
+		}
+	
+	  for (int i = 0; i < m_menuCount; i++)
+	  {
+	  	if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+	  	{
+	  		break ;
+	  	}
+		}
+	}
+}
 
diff --git a/src/mac/carbon/menuitem.cpp b/src/mac/carbon/menuitem.cpp
index 38d31737e7..9195fdc50a 100644
--- a/src/mac/carbon/menuitem.cpp
+++ b/src/mac/carbon/menuitem.cpp
@@ -16,6 +16,7 @@
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
+#include <wx/mac/uma.h>
 // ============================================================================
 // implementation
 // ============================================================================
@@ -49,6 +50,11 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
   m_pSubMenu    = pSubMenu;
   m_idItem      = id;
   m_bEnabled    = TRUE;
+
+  if ( m_strName ==  "E&xit"  ||m_strName == "Exit" )
+  {
+  	m_strName = "Quit\tCtrl+Q" ;
+  }
 }
 
 wxMenuItem::~wxMenuItem() 
@@ -73,12 +79,35 @@ void wxMenuItem::DeleteSubMenu()
 void wxMenuItem::Enable(bool bDoEnable)
 {
   if ( m_bEnabled != bDoEnable ) {
-    if ( m_pSubMenu == NULL ) {     // normal menu item
-        // TODO
+    if ( m_pSubMenu == NULL ) 
+    {     
+    	// normal menu item
+	    if ( m_pParentMenu->m_macMenuHandle )
+	    {
+	   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+	   	 	if ( index >= 1 )
+	   	 	{
+	   	 		if ( bDoEnable )
+	   	 			UMAEnableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 		else
+	   	 			UMADisableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 	}
+	    }
     }
-    else                            // submenu
+    else                            
     {
-        // TODO
+  		// submenu
+	    if ( m_pParentMenu->m_macMenuHandle )
+	    {
+	   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+	   	 	if ( index >= 1 )
+	   	 	{
+	   	 		if ( bDoEnable )
+	   	 			UMAEnableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 		else
+	   	 			UMADisableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 	}
+	    }
     }
 
     m_bEnabled = bDoEnable;
@@ -89,7 +118,19 @@ void wxMenuItem::Check(bool bDoCheck)
 {
   wxCHECK_RET( IsCheckable(), "only checkable items may be checked" );
 
-  if ( m_bChecked != bDoCheck ) {
-    // TODO
+  if ( m_bChecked != bDoCheck ) 
+  {
     m_bChecked = bDoCheck;
+   	if ( m_pParentMenu->m_macMenuHandle )
+    {
+   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+   	 	if ( index >= 1 )
+   	 	{
+   	 		if ( bDoCheck )
+					::SetItemMark( m_pParentMenu->m_macMenuHandle , index , 0x12 ) ; // checkmark
+				else
+ 					::SetItemMark( m_pParentMenu->m_macMenuHandle , index , 0 ) ; // no mark
+  	 	}
+  	}
   }
+}
\ No newline at end of file
diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp
index ddbfb8402f..97e31948bf 100644
--- a/src/mac/carbon/metafile.cpp
+++ b/src/mac/carbon/metafile.cpp
@@ -13,46 +13,118 @@
 #pragma implementation "metafile.h"
 #endif
 
-#include "wx/object.h"
-#include "wx/string.h"
-#include "wx/dc.h"
-#include "wx/stubs/metafile.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/setup.h"
+#endif
+
+#if wxUSE_METAFILE
+
+#ifndef WX_PRECOMP
+#include "wx/utils.h"
+#include "wx/app.h"
+#endif
+
+#include "wx/metafile.h"
 #include "wx/clipbrd.h"
 
+#include <stdio.h>
+#include <string.h>
+
 extern bool wxClipboardIsOpen;
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxMetaFile, wxObject)
-IMPLEMENT_ABSTRACT_CLASS(wxMetaFileDC, wxDC)
+IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
 #endif
 
+/*
+ * Metafiles
+ * Currently, the only purpose for making a metafile is to put
+ * it on the clipboard.
+ */
+
+wxMetafileRefData::wxMetafileRefData(void)
+{
+    m_metafile = 0;
+}
+
+wxMetafileRefData::~wxMetafileRefData(void)
+{
+    if (m_metafile)
+    {
+				KillPicture( m_metafile ) ;
+        m_metafile = 0;
+    }
+}
+
 wxMetaFile::wxMetaFile(const wxString& file)
 {
-    // TODO
+    m_refData = new wxMetafileRefData;
+
+
+    M_METAFILEDATA->m_metafile = 0;
+    wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
+/*
+    if (!file.IsNull() && (file.Cmp("") == 0))
+        M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile(file);
+*/
 }
 
 wxMetaFile::~wxMetaFile()
 {
-    // TODO
 }
 
 bool wxMetaFile::SetClipboard(int width, int height)
 {
+    if (!m_refData)
+        return FALSE;
+/*
     bool alreadyOpen=wxClipboardOpen();
     if (!alreadyOpen)
     {
         wxOpenClipboard();
         if (!wxEmptyClipboard()) return FALSE;
     }
-    bool success = wxSetClipboardData(wxDF_METAFILE,this, width,height);
+    bool success = wxSetClipboardData(wxDF_METAFILE, this, width,height);
     if (!alreadyOpen) wxCloseClipboard();
     return (bool) success;
+    */
+    return TRUE ;
 }
 
 bool wxMetaFile::Play(wxDC *dc)
 {
-    // TODO
+  if (!m_refData)
     return FALSE;
+
+	if (!dc->Ok() )
+		return FALSE;
+		
+	dc->MacVerifySetup() ;
+	
+	{
+		PicHandle pict = GetHMETAFILE() ;
+		DrawPicture( pict , &(**pict).picFrame ) ;
+	}
+/*
+    if (!m_refData)
+        return FALSE;
+
+    dc->BeginDrawing();
+
+    if (dc->GetHDC() && M_METAFILEDATA->m_metafile)
+        PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile);
+
+    dc->EndDrawing();
+*/
+    return TRUE;
 }
 
 /*
@@ -64,176 +136,55 @@ bool wxMetaFile::Play(wxDC *dc)
 // *DO* give origin/extent arguments to wxMakeMetaFilePlaceable.
 wxMetaFileDC::wxMetaFileDC(const wxString& file)
 {
-    // TODO
+  m_metaFile = NULL;
+  m_minX = 10000;
+  m_minY = 10000;
+  m_maxX = -10000;
+  m_maxY = -10000;
+
+  wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
+
+	m_metaFile = new wxMetaFile("") ;
+	Rect r={0,0,100,100} ;
+	
+	m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ;
+	::GetPort( &m_macPort ) ;	
+  m_ok = TRUE ;
+
+  SetMapMode(wxMM_TEXT); 
 }
 
 // New constructor that takes origin and extent. If you use this, don't
 // give origin/extent arguments to wxMakeMetaFilePlaceable.
+
 wxMetaFileDC::wxMetaFileDC(const wxString& file, int xext, int yext, int xorg, int yorg)
 {
-    // TODO
-}
+  m_minX = 10000;
+  m_minY = 10000;
+  m_maxX = -10000;
+  m_maxY = -10000;
 
-wxMetaFileDC::~wxMetaFileDC()
-{
-}
+  wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
 
-void wxMetaFileDC::GetTextExtent(const wxString& string, float *x, float *y,
-                                 float *descent, float *externalLeading, wxFont *theFont, bool use16bit)
-{
-    // TODO
-}
+	m_metaFile = new wxMetaFile("") ;
+	Rect r={yorg,xorg,yorg+yext,xorg+xext} ;
+	
+	m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ;
+	::GetPort( &m_macPort ) ;	
+  m_ok = TRUE ;
 
-wxMetaFile *wxMetaFileDC::Close()
-{
-    // TODO
-    return NULL;
+  SetMapMode(wxMM_TEXT); 
 }
 
-void wxMetaFileDC::SetMapMode(int mode)
+wxMetaFileDC::~wxMetaFileDC()
 {
-    // TODO
 }
 
-#if 0
-
-#ifdef __WIN32__
-struct RECT32
-{
-  short left;
-  short top;
-  short right;
-  short bottom;
-};
-
-struct mfPLACEABLEHEADER {
-	DWORD	key;
-	short	hmf;
-	RECT32	bbox;
-	WORD	inch;
-	DWORD	reserved;
-	WORD	checksum;
-};
-#else
-struct mfPLACEABLEHEADER {
-	DWORD	key;
-	HANDLE	hmf;
-	RECT	bbox;
-	WORD	inch;
-	DWORD	reserved;
-	WORD	checksum;
-};
-#endif
-
-/*
- * Pass filename of existing non-placeable metafile, and bounding box.
- * Adds a placeable metafile header, sets the mapping mode to anisotropic,
- * and sets the window origin and extent to mimic the wxMM_TEXT mapping mode.
- *
- */
- 
-bool wxMakeMetaFilePlaceable(const wxString& filename, float scale)
+wxMetaFile *wxMetaFileDC::Close()
 {
-  return wxMakeMetaFilePlaceable(filename, 0, 0, 0, 0, scale, FALSE);
+	ClosePicture() ;
+	return m_metaFile;
 }
 
-bool wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, int y2, float scale, bool useOriginAndExtent)
-{
-  // I'm not sure if this is the correct way of suggesting a scale
-  // to the client application, but it's the only way I can find.
-  int unitsPerInch = (int)(576/scale);
-  
-  mfPLACEABLEHEADER header;
-  header.key = 0x9AC6CDD7L;
-  header.hmf = 0;
-  header.bbox.left = (int)(x1);
-  header.bbox.top = (int)(y1);
-  header.bbox.right = (int)(x2);
-  header.bbox.bottom = (int)(y2);
-  header.inch = unitsPerInch;
-  header.reserved = 0;
-
-  // Calculate checksum  
-  WORD *p;
-  mfPLACEABLEHEADER *pMFHead = &header;
-  for (p =(WORD *)pMFHead,pMFHead -> checksum = 0;
-	p < (WORD *)&pMFHead ->checksum; ++p)
-       pMFHead ->checksum ^= *p;
-
-  FILE *fd = fopen((char *)(const char *)filename, "rb");
-  if (!fd) return FALSE;
-  
-  char tempFileBuf[256];
-  wxGetTempFileName("mf", tempFileBuf);
-  FILE *fHandle = fopen(tempFileBuf, "wb");
-  if (!fHandle)
-    return FALSE;
-  fwrite((void *)&header, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER), fHandle);
-
-  // Calculate origin and extent
-  int originX = x1;
-  int originY = y1;
-  int extentX = x2 - x1;
-  int extentY = (y2 - y1);
-
-  // Read metafile header and write
-  METAHEADER metaHeader;
-  fread((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fd);
-  
-  if (useOriginAndExtent)
-    metaHeader.mtSize += 15;
-  else
-    metaHeader.mtSize += 5;
-    
-  fwrite((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fHandle);
-
-  // Write SetMapMode, SetWindowOrigin and SetWindowExt records
-  char modeBuffer[8];
-  char originBuffer[10];
-  char extentBuffer[10];
-  METARECORD *modeRecord = (METARECORD *)&modeBuffer;
-
-  METARECORD *originRecord = (METARECORD *)&originBuffer;
-  METARECORD *extentRecord = (METARECORD *)&extentBuffer;
-
-  modeRecord->rdSize = 4;
-  modeRecord->rdFunction = META_SETMAPMODE;
-  modeRecord->rdParm[0] = wxMM_ANISOTROPIC;
-
-  originRecord->rdSize = 5;
-  originRecord->rdFunction = META_SETWINDOWORG;
-  originRecord->rdParm[0] = originY;
-  originRecord->rdParm[1] = originX;
-
-  extentRecord->rdSize = 5;
-  extentRecord->rdFunction = META_SETWINDOWEXT;
-  extentRecord->rdParm[0] = extentY;
-  extentRecord->rdParm[1] = extentX;
-
-  fwrite((void *)modeBuffer, sizeof(char), 8, fHandle);
-  
-  if (useOriginAndExtent)
-  {
-    fwrite((void *)originBuffer, sizeof(char), 10, fHandle);
-    fwrite((void *)extentBuffer, sizeof(char), 10, fHandle);
-  }
-
-  int ch = -2;
-  while (ch != EOF)
-  {
-    ch = getc(fd);
-    if (ch != EOF)
-    {
-      putc(ch, fHandle);
-    }
-  }
-  fclose(fHandle);
-  fclose(fd);
-  wxRemoveFile(filename);
-  wxCopyFile(tempFileBuf, filename);
-  wxRemoveFile(tempFileBuf);
-  return TRUE;
-}
 
 #endif
-
diff --git a/src/mac/carbon/msgdlg.cpp b/src/mac/carbon/msgdlg.cpp
index 775ac8f064..5aa8554038 100644
--- a/src/mac/carbon/msgdlg.cpp
+++ b/src/mac/carbon/msgdlg.cpp
@@ -14,11 +14,47 @@
 #endif
 
 #include "wx/msgdlg.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
 #endif
 
+#define kMacOKAlertResourceID 128
+#define kMacYesNoAlertResourceID 129
+#define kMacYesNoCancelAlertResourceID 130
+#define kMacNoYesAlertResourceID 131
+#define kMacNoYesCancelAlertResourceID 132
+
+short language = 0 ;
+
+void wxMacConvertNewlines( const char *source , char * destination )
+{
+	const char *s = source ;
+	char *d = destination ;
+	
+	while( *s  )
+	{
+		switch( *s )
+		{
+			case 0x0a :
+				*d++ = 0x0d ;
+				++s ;
+				break ;
+			case 0x0d :
+				*d++ = 0x0d ;
+				++s ;
+				if ( *s == 0x0a )
+					++s ;
+				break ;
+			default :
+				*d++ = *s++ ;
+				break ;
+		}
+	}
+	*d = 0 ;
+}
+
 wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
         long style, const wxPoint& pos)
 {
@@ -30,7 +66,226 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, cons
 
 int wxMessageDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+	int resultbutton = wxID_CANCEL ;
+
+	short result ;
+	Str255 pascalTitle ;
+	Str255 pascalText ;
+	
+	strcpy( (char*) pascalTitle , m_caption ) ;
+	c2pstr( (char*) pascalTitle ) ;
+	strcpy( (char*) pascalText , m_message ) ;
+	wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ;
+	c2pstr( (char*) pascalText ) ;
+
+	if ( !UMAHasAppearance() )
+	{
+		int resourceID ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	      resourceID = kMacYesNoCancelAlertResourceID;
+	    else
+	      resourceID = kMacYesNoAlertResourceID + language * 10 ;
+	  }
+	  else if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	      resourceID = kMacOKAlertResourceID; // wrong
+	    else
+	      resourceID = kMacOKAlertResourceID;
+	  }
+		else
+		{
+			return resultbutton ;
+		}
+	/*
+	  if (hWnd)
+	    msStyle |= MB_APPLMODAL;
+	  else
+	    msStyle |= MB_TASKMODAL;
+	*/
+
+		ParamText( pascalTitle , pascalText , NULL , NULL ) ;
+
+	  if (m_dialogStyle & wxICON_EXCLAMATION)
+				result = Alert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_HAND)
+			result = StopAlert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_INFORMATION)
+				result = NoteAlert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_QUESTION)
+				result = CautionAlert( resourceID , NULL ) ;
+		else
+				result = Alert( resourceID , NULL ) ;
+
+		resultbutton = result ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_NO ;
+						break ;
+					case 3 :
+						resultbutton = wxID_CANCEL ;
+						break ;
+				}
+	    }
+	    else
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_NO ;
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+		}
+	}
+	else
+	{
+		AlertStdAlertParamRec	param;
+
+		param.movable 		= true;
+		param.filterProc 	= NULL ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				param.defaultText 	= "\pYes" ;
+				param.cancelText 	= (StringPtr) kAlertDefaultCancelText;
+				param.otherText 	= "\pNo";
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= kAlertStdAlertCancelButton;
+	    }
+	    else
+	    {
+				param.defaultText 	= "\pYes" ;
+				param.cancelText 	= NULL;
+				param.otherText 	= "\pNo";
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	  }
+	  else if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+	    	// thats a cancel missing
+				param.defaultText 	= (StringPtr) kAlertDefaultOKText ;
+				param.cancelText 	= NULL;
+				param.otherText 	= NULL;
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	    else
+	    {
+				param.defaultText 	= (StringPtr) kAlertDefaultOKText ;
+				param.cancelText 	= NULL;
+				param.otherText 	= NULL;
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	  }
+		else
+		{
+			return resultbutton ;
+		}
+
+		param.position 		= 0;
+
+	  if (m_dialogStyle & wxICON_EXCLAMATION)
+				StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_HAND)
+				StandardAlert( kAlertStopAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_INFORMATION)
+			StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_QUESTION)
+				StandardAlert( kAlertCautionAlert, pascalTitle, pascalText, &param, &result );
+		else
+				StandardAlert( kAlertPlainAlert, pascalTitle, pascalText, &param, &result );
+
+		if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)				
+	    {
+	    	//TODO add Cancelbutton
+	    	switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_OK ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+			else
+			{
+	    	switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_OK ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+		}
+	  else if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_CANCEL ;
+						break ;
+					case 3 :
+						resultbutton = wxID_NO ;
+						break ;
+				}
+	    }
+	    else
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						resultbutton = wxID_NO ;
+						break ;
+				}
+			}
+		} 
+	}
+	return resultbutton ;
 }
 
diff --git a/src/mac/carbon/notebook.cpp b/src/mac/carbon/notebook.cpp
index 312dd0f3d3..a4f93917eb 100644
--- a/src/mac/carbon/notebook.cpp
+++ b/src/mac/carbon/notebook.cpp
@@ -24,7 +24,7 @@
 #include  <wx/log.h>
 #include  <wx/imaglist.h>
 #include  <wx/notebook.h>
-
+#include <wx/mac/uma.h>
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -32,6 +32,11 @@
 // check that the page index is valid
 #define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
 
+const short kwxMacTabLeftMargin = 16 ;
+const short kwxMacTabTopMargin = 30 ;
+const short kwxMacTabRightMargin = 16 ;
+const short kwxMacTabBottomMargin = 16 ;
+
 // ----------------------------------------------------------------------------
 // event table
 // ----------------------------------------------------------------------------
@@ -91,21 +96,16 @@ bool wxNotebook::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
-    // base init
-    SetName(name);
-    SetParent(parent);
-
-    m_windowId = id == -1 ? NewControlId() : id;
-
-    // style
-    m_windowStyle = style;
-
-    if ( parent != NULL )
-        parent->AddChild(this);
-
-    // TODO
-
-    return FALSE;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlTabSmallProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+	return TRUE ;
 }
 
 // dtor
@@ -123,8 +123,7 @@ int wxNotebook::GetPageCount() const
 
 int wxNotebook::GetRowCount() const
 {
-    // TODO
-    return 0;
+    return 1;
 }
 
 int wxNotebook::SetSelection(int nPage)
@@ -132,9 +131,11 @@ int wxNotebook::SetSelection(int nPage)
     wxASSERT( IS_VALID_PAGE(nPage) );
 
     ChangePage(m_nSelection, nPage);
-
-    // TODO
-    return 0;
+		SetControlValue( m_macControl , m_nSelection + 1 ) ;
+//	Boolean enabled = true ;
+	
+//	SetControlData( m_macControl, m_nSelection + 1, kControlTabEnabledFlagTag, sizeof( Boolean ), (Ptr)&enabled );
+    return m_nSelection;
 }
 
 void wxNotebook::AdvanceSelection(bool bForward)
@@ -246,7 +247,19 @@ bool wxNotebook::InsertPage(int nPage,
     wxASSERT( pPage != NULL );
     wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE );
 
-    // TODO: insert native widget page
+		ControlTabInfoRec tie ;
+		Boolean enabled = true ;
+		if ( nPage + 1 > GetControlMaximum( m_macControl ) )
+		{
+			SetControlMaximum( m_macControl , nPage + 1 ) ;
+		}
+		
+		tie.version = 0 ;
+		tie.iconSuiteID = 0 ;
+		strcpy( (char*) tie.name , strText ) ;
+		c2pstr( (char*) tie.name ) ;	
+		SetControlData( m_macControl, nPage + 1, kControlTabInfoTag , sizeof( ControlTabInfoRec) , (char*) &tie ) ;
+		SetControlData( m_macControl, m_nSelection + 1, kControlTabEnabledFlagTag, sizeof( Boolean ), (Ptr)&enabled );
 
     // save the pointer to the page
     m_aPages.Insert(pPage, nPage);
@@ -258,6 +271,9 @@ bool wxNotebook::InsertPage(int nPage,
     else if ( m_nSelection == -1 )
         m_nSelection = 0;
 
+  	// don't show pages by default (we'll need to adjust their size first)
+	 	pPage->Show( FALSE ) ;
+
     return TRUE;
 }
 
@@ -290,7 +306,9 @@ void wxNotebook::OnSize(wxSizeEvent& event)
     unsigned int nCount = m_aPages.Count();
     for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) {
         wxNotebookPage *pPage = m_aPages[nPage];
-        pPage->SetSize(0, 0, w, h);
+        pPage->SetSize(kwxMacTabLeftMargin, kwxMacTabTopMargin, w - kwxMacTabLeftMargin - kwxMacTabRightMargin,
+        	h - kwxMacTabTopMargin - kwxMacTabBottomMargin );
+//        pPage->SetSize(0, 0, w, h);
         if ( pPage->GetAutoLayout() )
             pPage->Layout();
     }
@@ -362,7 +380,16 @@ void wxNotebook::Command(wxCommandEvent& event)
 // hide the currently active panel and show the new one
 void wxNotebook::ChangePage(int nOldSel, int nSel)
 {
-    wxASSERT( nOldSel != nSel ); // impossible
+  // it's not an error (the message may be generated by the tab control itself)
+  // and it may happen - just do nothing
+  if ( nSel == nOldSel )
+  {
+    wxNotebookPage *pPage = m_aPages[nSel];
+   	pPage->Show(FALSE);
+   	pPage->Show(TRUE);
+ 	pPage->SetFocus();
+    return;
+  }
 
     if ( nOldSel != -1 ) {
         m_aPages[nOldSel]->Show(FALSE);
@@ -375,3 +402,11 @@ void wxNotebook::ChangePage(int nOldSel, int nSel)
     m_nSelection = nSel;
 }
 
+void wxNotebook::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+  wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControlValue(m_macControl) - 1, m_nSelection);
+  event.SetEventObject(this);
+
+  ProcessEvent(event);
+}
+
diff --git a/src/mac/carbon/palette.cpp b/src/mac/carbon/palette.cpp
index f8db96f8d0..85a9fd16d8 100644
--- a/src/mac/carbon/palette.cpp
+++ b/src/mac/carbon/palette.cpp
@@ -26,12 +26,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
 
 wxPaletteRefData::wxPaletteRefData()
 {
-    // TODO
+	m_palette = NULL ;
+	m_count = 0 ;
 }
 
 wxPaletteRefData::~wxPaletteRefData()
 {
-    // TODO
+	delete[] m_palette ;
 }
 
 wxPalette::wxPalette()
@@ -53,7 +54,13 @@ bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *gre
 
   m_refData = new wxPaletteRefData;
 
-  // TODO
+  M_PALETTEDATA->m_count = n ;
+  M_PALETTEDATA->m_palette = new wxColour[n] ;
+  
+  for ( int i = 0 ; i < n ; ++i)
+  {
+  	M_PALETTEDATA->m_palette[i].Set( red[i] , green[i] , blue[i] ) ;
+	}
 
   return FALSE;
 }
@@ -61,10 +68,26 @@ bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *gre
 int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const
 {
     if ( !m_refData )
-  	return FALSE;
-
-    // TODO
-    return FALSE;
+  	return -1;
+
+    long bestdiff = 3 * 256 ;
+    long bestpos = 0 ;
+    long currentdiff ;
+    
+    for ( int i = 0  ; i < M_PALETTEDATA->m_count ; ++i )
+    {
+    	const wxColour& col = &M_PALETTEDATA->m_palette[i] ;
+    	currentdiff = abs ( col.Red() - red ) + abs( col.Green() - green ) + abs ( col.Blue() - blue )  ;
+    	if ( currentdiff < bestdiff )
+    	{
+    		bestdiff = currentdiff ;
+    		bestpos = i ;
+    		if ( bestdiff == 0 )
+    			break ; 
+    	}
+    }
+    
+    return bestpos;
 }
 
 bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsigned char *blue) const
@@ -72,11 +95,15 @@ bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsi
     if ( !m_refData )
 	    return FALSE;
 
-    if (index < 0 || index > 255)
+    if (index < 0 || index >= M_PALETTEDATA->m_count)
         return FALSE;
 
-    // TODO
-    return FALSE;
+    const wxColour& col = &M_PALETTEDATA->m_palette[index] ;
+    *red = col.Red() ;
+    *green = col.Green() ;
+    *blue = col.Blue() ;
+    
+    return TRUE;
 }
 
 
diff --git a/src/mac/carbon/print.cpp b/src/mac/carbon/print.cpp
index 61fd6e7e99..1064058925 100644
--- a/src/mac/carbon/print.cpp
+++ b/src/mac/carbon/print.cpp
@@ -13,8 +13,8 @@
 #pragma implementation "print.h"
 #endif
 
-#include "wx/stubs/print.h"
-#include "wx/stubs/printdlg.h"
+#include "wx/mac/print.h"
+#include "wx/mac/printdlg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPrinter, wxPrinterBase)
diff --git a/src/mac/carbon/printdlg.cpp b/src/mac/carbon/printdlg.cpp
index eae3b95568..18c7a8427e 100644
--- a/src/mac/carbon/printdlg.cpp
+++ b/src/mac/carbon/printdlg.cpp
@@ -14,11 +14,10 @@
 #endif
 
 #include "wx/object.h"
-#include "wx/stubs/printdlg.h"
+#include "wx/mac/printdlg.h"
 #include "wx/dcprint.h"
 
 // Use generic page setup dialog: use your own native one if one exists.
-#include "wx/generic/prntdlgg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPrintDialog, wxDialog)
@@ -29,7 +28,6 @@ wxPrintDialog::wxPrintDialog():
  wxDialog()
 {
     m_dialogParent = NULL;
-    m_printerDC = NULL;
 }
 
 wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data):
@@ -41,7 +39,6 @@ wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data):
 bool wxPrintDialog::Create(wxWindow *p, wxPrintData* data)
 {
     m_dialogParent = p;
-    m_printerDC = NULL;
 
     if ( data )
         m_printData = *data;
@@ -51,26 +48,39 @@ bool wxPrintDialog::Create(wxWindow *p, wxPrintData* data)
 
 wxPrintDialog::~wxPrintDialog()
 {
-    if (m_printerDC)
-        delete m_printerDC;
 }
 
 int wxPrintDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+	int result = wxID_CANCEL ;
+	OSErr err ;
+	wxString message ;
+	::PrOpen() ;
+	err = PrError() ;
+	
+	if ( !err )
+	{
+		m_printData.ConvertToNative() ;
+		if  ( m_printData.macPrintInfo && ::PrJobDialog( m_printData.macPrintInfo ) )
+		{
+			m_printData.ConvertFromNative() ;
+			result = wxID_OK ;
+		}
+
+	}
+	else
+	{
+		message.Printf( "Print Error %d", err ) ;
+		wxMessageDialog dialog( NULL , message  , "", wxICON_HAND | wxOK) ;
+	}
+	::PrClose() ;
+
+	return result ;
 }
 
 wxDC *wxPrintDialog::GetPrintDC()
 {
-  if (m_printerDC)
-  {
-    wxDC* dc = m_printerDC;
-    m_printerDC = NULL;
-    return dc;
-  }
-  else
-    return NULL;
+    return new wxPrinterDC( m_printData ) ;
 }
 
 /*
@@ -105,11 +115,29 @@ wxPageSetupDialog::~wxPageSetupDialog()
 
 int wxPageSetupDialog::ShowModal()
 {
-    // Uses generic page setup dialog
-    wxGenericPageSetupDialog *genericPageSetupDialog = new wxGenericPageSetupDialog(GetParent(), & m_pageSetupData);
-    int ret = genericPageSetupDialog->ShowModal();
-    m_pageSetupData = genericPageSetupDialog->GetPageSetupData();
-    genericPageSetupDialog->Close(TRUE);
-    return ret;
+	int result = wxID_CANCEL ;
+	OSErr err ;
+	wxString message ;
+	::PrOpen() ;
+	err = PrError() ;
+	
+	if ( !err )
+	{
+		m_pageSetupData.ConvertToNative() ;
+		if  ( m_pageSetupData.m_macPageSetupInfo && ::PrStlDialog( m_pageSetupData.m_macPageSetupInfo ) )
+		{
+			m_pageSetupData.ConvertFromNative() ;
+			result = wxID_OK ;
+		}
+
+	}
+	else
+	{
+		message.Printf( "Print Error %d", err ) ;
+		wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+	}
+	::PrClose() ;
+
+	return result ;
 }
 
diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp
index da582d0e52..3393009f47 100644
--- a/src/mac/carbon/radiobox.cpp
+++ b/src/mac/carbon/radiobox.cpp
@@ -108,7 +108,7 @@ wxString wxRadioBox::GetString(int n) const
 
 void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxRadioBox::GetSize(int *width, int *height) const
@@ -140,12 +140,13 @@ void wxRadioBox::SetFocus()
 bool wxRadioBox::Show(bool show)
 {
     // TODO
-    return FALSE;
+	return wxWindow::Show( show ) ;
 }
 
 // Enable a specific button
 void wxRadioBox::Enable(int item, bool enable)
 {
+    wxControl::Enable(enable);
     // TODO
 }
 
diff --git a/src/mac/carbon/region.cpp b/src/mac/carbon/region.cpp
index c71d4c605a..c5c6332e06 100644
--- a/src/mac/carbon/region.cpp
+++ b/src/mac/carbon/region.cpp
@@ -28,19 +28,24 @@ class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
 public:
 	wxRegionRefData()
 	{
+		m_macRgn = NewRgn() ;
 	}
 
 	wxRegionRefData(const wxRegionRefData& data)
 	{
-        // TODO
+		m_macRgn = NewRgn() ;
+        CopyRgn( data.m_macRgn , m_macRgn ) ;
 	}
 
 	~wxRegionRefData()
 	{
-        // TODO
+        DisposeRgn( m_macRgn ) ;
 	}
+	RgnHandle	m_macRgn ;
 };
 
+#define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
+#define OTHER_M_REGION(a) (((wxRegionRefData*)(a.m_refData))->m_macRgn)
 
 //-----------------------------------------------------------------------------
 // wxRegion
@@ -52,25 +57,30 @@ public:
 wxRegion::wxRegion()
 {
     m_refData = new wxRegionRefData;
-    // TODO create empty region
+}
+
+wxRegion::wxRegion(WXHRGN hRegion )
+{
+    m_refData = new wxRegionRefData;
+    CopyRgn( hRegion , M_REGION ) ;
 }
 
 wxRegion::wxRegion(long x, long y, long w, long h)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , x , y , x+w , y+h ) ;
 }
 
 wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
 }
 
 wxRegion::wxRegion(const wxRect& rect)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
 }
 
 /*!
@@ -95,41 +105,42 @@ void wxRegion::Clear()
 bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 {
 	// Don't change shared data
-	if (!m_refData) {
+	if (!m_refData) 
+	{
 		m_refData = new wxRegionRefData();
-	} else if (m_refData->GetRefCount() > 1) {
+	} 
+	else if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
-    // If ref count is 1, that means it's 'ours' anyway so no action.
-
-    // TODO create rect region
-
-    int mode = 0; // TODO platform-specific code
+    RgnHandle rgn = NewRgn() ;
+		SetRectRgn( rgn , x , y, x+width,y + height ) ;
+		
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( rgn ,M_REGION ) ;
             break ;
     }
 
-    // TODO do combine region
+		DisposeRgn( rgn ) ;
 
-    return FALSE;
+    return TRUE;
 }
 
 //! Union /e region with this.
@@ -141,36 +152,35 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
 	// Don't change shared data
 	if (!m_refData) {
 		m_refData = new wxRegionRefData();
-	} else	if (m_refData->GetRefCount() > 1) {
+	} 
+	else	if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
 
-    int mode = 0; // TODO platform-specific code
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
             break ;
     }
 
-    // TODO combine region
-
-	return FALSE;
+	return TRUE;
 }
 
 bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
@@ -185,9 +195,16 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 // Outer bounds of region
 void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
 {
-	if (m_refData) {
-        // TODO get box
-	} else {
+	if (m_refData) 
+	{
+		Rect box = (**M_REGION).rgnBBox ;
+        x = box.left ;
+        y = box.top ;
+        w = box.right - box.left ;
+        h = box.bottom - box.top ;
+	} 
+	else 
+	{
 		x = y = w = h = 0;
 	}
 }
@@ -202,8 +219,12 @@ wxRect wxRegion::GetBox() const
 // Is region empty?
 bool wxRegion::Empty() const
 {
-    // TODO
-    return FALSE;
+    return EmptyRgn( M_REGION ) ;
+}
+
+const WXHRGN wxRegion::GetWXHRGN() const
+{
+	return M_REGION ;
 }
 
 //-----------------------------------------------------------------------------
@@ -228,11 +249,11 @@ wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Point p = { pt.y , pt.x } ;
+    if (PtInRgn( p , M_REGION ) )
         return wxInRegion;
-    else
-        return wxOutRegion;
+        
+    return wxOutRegion;
 }
 
 // Does the region contain the rectangle (x, y, w, h)?
@@ -241,8 +262,8 @@ wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Rect rect = { y , x , y + h , x + w } ;
+    if (RectInRgn( &rect , M_REGION ) )
         return wxInRegion;
     else
         return wxOutRegion;
@@ -308,8 +329,14 @@ void wxRegionIterator::Reset(const wxRegion& region)
 		m_numRects = 0;
 	else
     {
-        // TODO create m_rects and fill with rectangles for this region
-        m_numRects = 0;
+    	// we cannot dissolve it into rects on mac
+        m_rects = new wxRect[1];
+        Rect rect = (**OTHER_M_REGION( region )).rgnBBox ;
+        m_rects[0].x = rect.left;
+        m_rects[0].y = rect.top;
+        m_rects[0].width = rect.right - rect.left;
+        m_rects[0].height = rect.bottom - rect.top;
+        m_numRects = 1;
     }
 }
 
diff --git a/src/mac/carbon/scrolbar.cpp b/src/mac/carbon/scrolbar.cpp
index a92154acfb..a432b3e9b1 100644
--- a/src/mac/carbon/scrolbar.cpp
+++ b/src/mac/carbon/scrolbar.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/scrolbar.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
@@ -23,6 +24,8 @@ END_EVENT_TABLE()
 
 #endif
 
+extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
+
 // Scrollbar
 bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos,
@@ -30,21 +33,24 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    if (!parent)
-        return FALSE;
-    parent->AddChild(this);
-    SetName(name);
-	SetValidator(validator);
+  if (!parent)
+      return FALSE;
     
-    m_windowStyle = style;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 100, 
+		kControlScrollBarLiveProc , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
+	MacPostControlCreate() ;
 
-    // TODO create scrollbar
-    return TRUE;
+  return TRUE;
 }
 
 wxScrollBar::~wxScrollBar()
@@ -53,13 +59,12 @@ wxScrollBar::~wxScrollBar()
 
 void wxScrollBar::SetThumbPosition(int viewStart)
 {
-    // TODO
+    ::SetControlValue( m_macControl , viewStart ) ;
 }
 
 int wxScrollBar::GetThumbPosition() const
 {
-    // TODO
-    return 0;
+    return ::GetControlValue( m_macControl ) ;
 }
 
 void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
@@ -69,7 +74,19 @@ void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageS
     m_pageSize = thumbSize;
     m_objectSize = range;
 
-    // TODO
+  	int range1 = wxMax((m_objectSize - m_pageSize), 0) ;
+
+    SetControlMaximum( m_macControl , range1 ) ;
+    SetControlMinimum(  m_macControl , 0 ) ;
+    SetControlValue(  m_macControl , position ) ;
+
+    if ( UMAGetAppearanceVersion() >= 0x0110  )
+    {
+#if UMA_USE_8_6    	
+			SetControlViewSize( m_macControl , m_pageSize ) ;
+#endif
+    }
+    Refresh() ;
 }
 
 
@@ -79,3 +96,62 @@ void wxScrollBar::Command(wxCommandEvent& event)
     ProcessCommand(event);
 }
 
+void wxScrollBar::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+  int position = GetControlValue( m_macControl) ;
+  int minPos = GetControlMinimum( m_macControl) ;
+  int maxPos = GetControlMaximum( m_macControl) ;
+
+  wxEventType scrollEvent = wxEVT_NULL;
+  int nScrollInc;
+
+	switch( controlpart )
+	{
+		case kControlUpButtonPart :
+        nScrollInc = -1;
+        scrollEvent = wxEVT_SCROLL_LINEUP;
+			break ;
+		case kControlDownButtonPart :
+        nScrollInc = 1;
+        scrollEvent = wxEVT_SCROLL_LINEDOWN;
+			break ;
+		case kControlPageUpPart :
+        nScrollInc = -m_pageSize;
+        scrollEvent = wxEVT_SCROLL_PAGEUP;
+			break ;
+		case kControlPageDownPart :
+        nScrollInc = m_pageSize;
+        scrollEvent = wxEVT_SCROLL_PAGEDOWN;
+			break ;
+		case kControlIndicatorPart :
+        nScrollInc = 0 ;
+        scrollEvent = wxEVT_SCROLL_THUMBTRACK;
+			break ;
+	}
+
+  int new_pos = position + nScrollInc;
+
+  if (new_pos < 0)
+      new_pos = 0;
+  if (new_pos > maxPos)
+      new_pos = maxPos;
+	if ( nScrollInc )
+  	SetThumbPosition(new_pos);
+  	
+  wxScrollEvent event(scrollEvent, m_windowId);
+	if ( m_windowStyle & wxHORIZONTAL )
+	{
+		event.SetOrientation( wxHORIZONTAL ) ;
+	}
+	else
+	{
+		event.SetOrientation( wxVERTICAL ) ;
+	}
+  event.SetPosition(new_pos);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
+}
+
diff --git a/src/mac/carbon/settings.cpp b/src/mac/carbon/settings.cpp
index 2beda5c2a6..b13b5733cc 100644
--- a/src/mac/carbon/settings.cpp
+++ b/src/mac/carbon/settings.cpp
@@ -17,39 +17,92 @@
 
 wxColour wxSystemSettings::GetSystemColour(int index)
 {
-    // TODO
-	return wxColour();
+	switch( index )
+	{
+		case wxSYS_COLOUR_SCROLLBAR :
+		case wxSYS_COLOUR_BACKGROUND:
+		case wxSYS_COLOUR_ACTIVECAPTION:
+		case wxSYS_COLOUR_INACTIVECAPTION:
+		case wxSYS_COLOUR_MENU:
+		case wxSYS_COLOUR_WINDOW:
+		case wxSYS_COLOUR_WINDOWFRAME:
+		case wxSYS_COLOUR_ACTIVEBORDER:
+		case wxSYS_COLOUR_INACTIVEBORDER:
+		case wxSYS_COLOUR_BTNFACE:
+			return wxColor( 0xDD , 0xDD , 0xDD ) ;
+			break ;
+
+		case wxSYS_COLOUR_BTNSHADOW:
+			return wxColor( 0x44 , 0x44 , 0x44 ) ;
+			break ;
+
+		case wxSYS_COLOUR_BTNTEXT:
+		case wxSYS_COLOUR_MENUTEXT:
+		case wxSYS_COLOUR_WINDOWTEXT:
+		case wxSYS_COLOUR_CAPTIONTEXT:
+		case wxSYS_COLOUR_INFOTEXT:
+		case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
+     		return *wxBLACK;
+			break ;
+		case wxSYS_COLOUR_HIGHLIGHT:
+			{
+				RGBColor hilite ;
+				LMGetHiliteRGB(&hilite) ;
+				return wxColor( hilite.red >> 8 , hilite.green >> 8  , hilite.blue >> 8  ) ;
+			}
+			break ;
+		case wxSYS_COLOUR_BTNHIGHLIGHT:
+		case wxSYS_COLOUR_GRAYTEXT:
+			return wxColor( 0xCC , 0xCC , 0xCC ) ;
+			break ;
+	
+		case wxSYS_COLOUR_3DDKSHADOW:
+			return wxColor( 0x44 , 0x44 , 0x44 ) ;
+			break ;
+		case wxSYS_COLOUR_3DLIGHT:
+			return wxColor( 0xCC , 0xCC , 0xCC ) ;
+			break ;
+		case wxSYS_COLOUR_HIGHLIGHTTEXT :
+			{
+				RGBColor hilite ;
+				LMGetHiliteRGB(&hilite) ;
+				if ( ( hilite.red + hilite.green + hilite.blue ) == 0 )
+						return *wxWHITE ;
+				else
+						return *wxBLACK ;
+			}
+			break ;
+		case wxSYS_COLOUR_INFOBK :
+		case wxSYS_COLOUR_APPWORKSPACE:	
+			return *wxWHITE ;
+			break ;
+	}
+	return *wxWHITE;
 }
 
 wxFont wxSystemSettings::GetSystemFont(int index)
 {
-    // TODO
     switch (index)
     {
-        case wxSYS_DEVICE_DEFAULT_FONT:
-        {
-            break;
-        }
-        case wxSYS_DEFAULT_PALETTE:
-        {
-            break;
-        }
-        case wxSYS_SYSTEM_FIXED_FONT:
-        {
-            break;
-        }
-        case wxSYS_SYSTEM_FONT:
-        {
-            break;
-        }
-        default:
-        case wxSYS_DEFAULT_GUI_FONT:
-        {
-            break;
-        }
+        case wxSYS_ANSI_VAR_FONT :
+        case wxSYS_SYSTEM_FONT :
+        case wxSYS_DEVICE_DEFAULT_FONT :
+        case wxSYS_DEFAULT_GUI_FONT :
+	        {
+	        	return *wxSMALL_FONT ;
+					} ;
+        	break ;
+        case wxSYS_OEM_FIXED_FONT :
+        case wxSYS_ANSI_FIXED_FONT :
+        case wxSYS_SYSTEM_FIXED_FONT :
+        default :
+	        {
+	        	return *wxNORMAL_FONT ;
+	 				} ;
+	       	break ;
+				
     }
-
-    return wxFont();
+    return *wxNORMAL_FONT;
 }
 
 // Get a system metric, e.g. scrollbar size
@@ -58,11 +111,10 @@ int wxSystemSettings::GetSystemMetric(int index)
 	switch ( index)
 	{
         case wxSYS_MOUSE_BUTTONS:
-            // TODO
-			return 0;
+					return 2; // we emulate a two button mouse (ctrl + click = right button )
         case wxSYS_BORDER_X:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_BORDER_Y:
             // TODO
 			return 0;
@@ -91,14 +143,11 @@ int wxSystemSettings::GetSystemMetric(int index)
             // TODO
 			return 0;
         case wxSYS_HSCROLL_ARROW_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_HSCROLL_ARROW_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_HTHUMB_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_ICON_X:
             // TODO
 			return 0;
@@ -136,40 +185,33 @@ int wxSystemSettings::GetSystemMetric(int index)
             // TODO
 			return 0;
         case wxSYS_HSCROLL_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_ARROW_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_ARROW_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VTHUMB_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_CAPTION_Y:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_MENU_Y:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_NETWORK_PRESENT:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_PENWINDOWS_PRESENT:
-            // TODO
-			return 0;
+					return 0;
         case wxSYS_SHOW_SOUNDS:
             // TODO
 			return 0;
         case wxSYS_SWAP_BUTTONS:
-            // TODO
-			return 0;
-		default:
-			return 0;
+				return 0;
+			default:
+				return 0;
 	}
 	return 0;
 }
diff --git a/src/mac/carbon/slider.cpp b/src/mac/carbon/slider.cpp
index c9952342a9..936ccddb47 100644
--- a/src/mac/carbon/slider.cpp
+++ b/src/mac/carbon/slider.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/slider.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
@@ -34,6 +35,8 @@ wxSlider::wxSlider()
   m_tickFreq = 0;
 }
 
+extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
+
 bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            int value, int minValue, int maxValue,
            const wxPoint& pos,
@@ -41,28 +44,92 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-
-    if (parent) parent->AddChild(this);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
 
-    m_lineSize = 1;
-    m_windowStyle = style;
-    m_tickFreq = 0;
+	m_macMinimumStatic = NULL ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-    m_rangeMax = maxValue;
-    m_rangeMin = minValue;
-
-    m_pageSize = (int)((maxValue-minValue)/10);
+  m_lineSize = 1;
+  m_tickFreq = 0;
 
-    // TODO create slider
+  m_rangeMax = maxValue;
+  m_rangeMin = minValue;
+
+  m_pageSize = (int)((maxValue-minValue)/10);
+	if ( m_width == -1 )
+	{
+		m_width = 20 ;
+		if ( style & wxSL_LABELS && style & wxSL_VERTICAL )
+			m_width += 24 ;
+		bounds.right = bounds.left + m_width ;
+	}
+	if ( m_height == -1 )
+	{
+		m_height = 20 ;
+		if ( style & wxSL_LABELS && style & wxSL_HORIZONTAL )
+			m_height += 24 ;
+		bounds.bottom = bounds.top + m_height ;
+	}
+	
+	if ( style & wxSL_LABELS && style & wxSL_HORIZONTAL )
+	{
+		bounds.top += 12 ; 
+		bounds.right -= 24 ;
+	}
+			
+	if ( style & wxSL_LABELS && style & wxSL_VERTICAL )
+	{
+		bounds.left += 24 ;
+		bounds.top += 12 ;
+	}
+			
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true ,  value , minValue , maxValue, 
+  			kControlSliderProc +  kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
+
+	MacPostControlCreate() ;
+
+	if ( style & wxSL_LABELS )
+	{
+		if ( style & wxSL_HORIZONTAL )
+		{
+			wxSize size( 24 , 12 ) ;
+			wxPoint leftpos( 0 , 0 ) ;
+			wxPoint	rightpos( m_width - 2 * 12 , 0 ) ;
+			wxPoint valuepos( m_width - 12 , 20 ) ;
+			wxString valuestring ;
+			
+			valuestring.Printf( "%d" , minValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos , size ) ;
+			valuestring.Printf( "%d" , maxValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos , size ) ;
+			valuestring.Printf( "%d" , value ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos , size ) ;
+		}
+		else
+		{
+			wxSize size( 24 , 12 ) ;
+			wxPoint toppos( 0 , 12 ) ;
+			wxPoint	bottompos( 0 , m_height - 12 ) ;
+			wxPoint valuepos( 20 , 0 ) ;
+			wxString valuestring ;
+			
+			valuestring.Printf( "%d" , minValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos , size ) ;
+			valuestring.Printf( "%d" , maxValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos , size ) ;
+			valuestring.Printf( "%d" , value ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos , size ) ;
+		}
+	}
+
+  return TRUE;
 
-    return FALSE;
 }
 
 wxSlider::~wxSlider()
@@ -71,28 +138,16 @@ wxSlider::~wxSlider()
 
 int wxSlider::GetValue() const
 {
-    // TODO
-    return 0;
+ 	return GetControlValue( m_macControl) ;
 }
 
 void wxSlider::SetValue(int value)
 {
-    // TODO
-}
-
-void wxSlider::GetSize(int *width, int *height) const
-{
-    // TODO
-}
-
-void wxSlider::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
-
-void wxSlider::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	wxString valuestring ;
+	valuestring.Printf( "%d" , value ) ;	
+	if ( m_macMinimumStatic )			
+		m_macMinimumStatic->SetLabel( valuestring ) ;
+ 	SetControlValue( m_macControl , value ) ;
 }
 
 void wxSlider::SetRange(int minValue, int maxValue)
@@ -182,9 +237,32 @@ void wxSlider::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
-bool wxSlider::Show(bool show)
+bool wxSlider::Show( bool show ) 
 {
-    // TODO
-    return TRUE;
+	return wxWindow::Show( show ) ;
 }
 
+void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	SInt16 value = ::GetControlValue( m_macControl ) ;
+	
+	SetValue( value ) ;		
+	
+	wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+	event.SetPosition(GetControlValue( m_macControl) );
+	event.SetEventObject( this );
+
+#if WXWIN_COMPATIBILITY
+
+    wxEventType oldEvent = event.GetEventType();
+    event.SetEventType( wxEVT_COMMAND_SLIDER_UPDATED );
+    if ( !GetEventHandler()->ProcessEvent(event) )
+    {
+        event.SetEventType( oldEvent );
+        if (!GetParent()->GetEventHandler()->ProcessEvent(event))
+            event.Skip();
+    }
+#else
+	GetEventHandler()->ProcessEvent(event);
+#endif
+}
diff --git a/src/mac/carbon/spinbutt.cpp b/src/mac/carbon/spinbutt.cpp
index cbea725592..8f3e1533b8 100644
--- a/src/mac/carbon/spinbutt.cpp
+++ b/src/mac/carbon/spinbutt.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/spinbutt.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
@@ -28,19 +29,25 @@ wxSpinButton::wxSpinButton()
 bool wxSpinButton::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    SetName(name);
-
-    m_windowStyle = style;
-
-    SetParent(parent);
-
     m_min = 0;
     m_max = 100;
 
-    m_windowId = (id == -1) ? NewControlId() : id;
+  if (!parent)
+      return FALSE;
+    
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style,*( (wxValidator*) NULL ) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 100, 
+		kControlLittleArrowsProc , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	MacPostControlCreate() ;
 
-    // TODO create spin button
-    return FALSE;
+  return TRUE;
 }
 
 wxSpinButton::~wxSpinButton()
@@ -52,20 +59,23 @@ wxSpinButton::~wxSpinButton()
 
 int wxSpinButton::GetValue() const
 {
-	// TODO
-    return 0;
+    return m_value;
 }
 
 void wxSpinButton::SetValue(int val)
 {
-	// TODO
+	m_value = val ;
+  wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+
+  event.SetPosition(m_value);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
 }
 
 void wxSpinButton::SetRange(int minVal, int maxVal)
 {
 	m_min = minVal;
 	m_max = maxVal;
-	// TODO
 }
 
 // Spin event
@@ -76,3 +86,49 @@ wxSpinEvent::wxSpinEvent(wxEventType commandType, int id):
 {
 }
 
+void wxSpinButton::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+  wxEventType scrollEvent = wxEVT_NULL;
+  int nScrollInc;
+
+	switch( controlpart )
+	{
+		case kControlUpButtonPart :
+        nScrollInc = 1;
+        scrollEvent = wxEVT_SCROLL_LINEUP;
+			break ;
+		case kControlDownButtonPart :
+        nScrollInc = -1;
+        scrollEvent = wxEVT_SCROLL_LINEDOWN;
+			break ;
+	}
+
+  m_value = m_value + nScrollInc;
+
+  if (m_value < m_min)
+  {
+  	if ( m_windowStyle & wxSP_WRAP )
+      m_value = m_max;
+  	else
+      m_value = m_min;
+  }
+  
+  if (m_value > m_max)
+  {
+  	if ( m_windowStyle & wxSP_WRAP )
+      m_value = m_min;
+    else
+      m_value = m_max;
+  }
+  	
+  wxScrollEvent event(scrollEvent, m_windowId);
+
+  event.SetPosition(m_value);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
+}
+
+
diff --git a/src/mac/carbon/statbmp.cpp b/src/mac/carbon/statbmp.cpp
index a67c558465..721c254234 100644
--- a/src/mac/carbon/statbmp.cpp
+++ b/src/mac/carbon/statbmp.cpp
@@ -23,6 +23,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
  * wxStaticBitmap
  */
 
+BEGIN_EVENT_TABLE(wxStaticBitmap, wxControl)
+    EVT_PAINT(wxStaticBitmap::OnPaint)
+END_EVENT_TABLE()
+
 bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
            const wxBitmap& bitmap,
            const wxPoint& pos,
@@ -41,19 +45,27 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
 
     m_windowStyle = style;
 
-    // TODO: create static bitmap control
-    return FALSE;
+    bool ret = wxControl::Create( parent, id, pos, size, style , name );
+
+    return ret;
 }
 
 void wxStaticBitmap::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap)
 {
     m_messageBitmap = bitmap;
 
-    // TODO: redraw bitmap
+    Refresh() ;
+}
+void wxStaticBitmap::OnPaint( wxPaintEvent &event ) 
+{
+    wxPaintDC dc(this);
+    PrepareDC(dc);
+		dc.SetPalette( *m_messageBitmap.GetPalette() ) ;
+		dc.DrawBitmap( m_messageBitmap , 0 , 0 ) ;
 }
 
diff --git a/src/mac/carbon/statbox.cpp b/src/mac/carbon/statbox.cpp
index b239dc738c..abae14d07e 100644
--- a/src/mac/carbon/statbox.cpp
+++ b/src/mac/carbon/statbox.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/statbox.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl)
@@ -35,28 +36,15 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-    SetName(name);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    if (parent) parent->AddChild(this);
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlGroupBoxTextTitleProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-    m_windowStyle = style;
-
-    // TODO: create static box
-    return FALSE;
-}
-
-void wxStaticBox::SetLabel(const wxString& label)
-{
-    // TODO
+  return TRUE;
 }
-
-void wxStaticBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
-
diff --git a/src/mac/carbon/stattext.cpp b/src/mac/carbon/stattext.cpp
index 3b19c7184d..14c69f1d96 100644
--- a/src/mac/carbon/stattext.cpp
+++ b/src/mac/carbon/stattext.cpp
@@ -22,6 +22,8 @@
 IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
+
 bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
            const wxString& label,
            const wxPoint& pos,
@@ -29,32 +31,31 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-  SetName(name);
-  if (parent) parent->AddChild(this);
-
-  SetBackgroundColour(parent->GetBackgroundColour()) ;
-  SetForegroundColour(parent->GetForegroundColour()) ;
-
-  if ( id == -1 )
-  	m_windowId = (int)NewControlId();
-  else
-	m_windowId = id;
-
-  m_windowStyle = style;
-
-  SetFont(parent->GetFont());
-
-  // TODO
-  return FALSE;
-}
-
-void wxStaticText::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlStaticTextProc , (long) this ) ;
+	::UMASetControlData( m_macControl, kControlLabelPart, kControlStaticTextTextTag , (long) title[0] , (char*) &title[1] ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
-void wxStaticText::SetLabel(const wxString& label)
+void wxStaticText::SetLabel(const wxString& st , bool resize )
 {
-    // TODO
+	m_label = st ;
+	wxString label ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( st ) ;
+	else
+		label = st ;
+		
+	::UMASetControlData( m_macControl, kControlLabelPart, kControlStaticTextTextTag , (long) label.Length() , (char*)(const char*) label ) ;
+	Refresh() ;
 }
 
diff --git a/src/mac/carbon/statusbr.cpp b/src/mac/carbon/statusbr.cpp
index dff1ddec34..15ab99d5ac 100644
--- a/src/mac/carbon/statusbr.cpp
+++ b/src/mac/carbon/statusbr.cpp
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#include "wx/stubs/statusbr.h"
+#include "wx/mac/statusbr.h"
 
 #if     !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxStatusBarXX, wxStatusBar);
diff --git a/src/mac/carbon/tabctrl.cpp b/src/mac/carbon/tabctrl.cpp
index b3b45a72d1..ea057aae52 100644
--- a/src/mac/carbon/tabctrl.cpp
+++ b/src/mac/carbon/tabctrl.cpp
@@ -15,6 +15,7 @@
 
 #include "wx/control.h"
 #include "wx/tabctrl.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTabCtrl, wxControl)
@@ -31,20 +32,18 @@ wxTabCtrl::wxTabCtrl()
 bool wxTabCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    m_imageList = NULL;
-
-    SetName(name);
-
-    m_windowStyle = style;
+	Rect bounds ;
+	Str255 title ;
 
-    SetParent(parent);
+  m_imageList = NULL;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    m_windowId = (id < 0 ? NewControlId() : id);
-
-    if (parent) parent->AddChild(this);
-
-    // TODO: create tab control
-    return FALSE;
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlTabSmallProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+	return TRUE ;
 }
 
 wxTabCtrl::~wxTabCtrl()
diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp
index a2b5e7d38e..d553477f93 100644
--- a/src/mac/carbon/textctrl.cpp
+++ b/src/mac/carbon/textctrl.cpp
@@ -36,11 +36,14 @@
 #endif
 #endif
 
+#include "wx/mac/uma.h"
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
 	EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+	EVT_CHAR(wxTextCtrl::OnChar)
 END_EVENT_TABLE()
 #endif
 
@@ -54,67 +57,114 @@ wxTextCtrl::wxTextCtrl()
 }
 
 bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
-		   const wxString& value,
+		   const wxString& st,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    m_fileName = "";
-    SetName(name);
-    SetValidator(validator);
-    if (parent) parent->AddChild(this);
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
 
-    m_windowStyle = style;
+	wxSize mySize = size ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
+	Rect bounds ;
+	Str255 title ;
+	
+	if ( mySize.y == -1 )
+	{
+		if ( UMAHasAppearance() )
+			mySize.y = 16 ;
+		else
+			mySize.y = 24 ;
+	}
+	MacPreControlCreate( parent , id ,  "" , pos , mySize ,style, validator , name , &bounds , title ) ;
 
-    return TRUE;
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlEditTextProc , (long) this ) ;
+	MacPostControlCreate() ;
+
+	wxString value ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		value = wxMacMakeMacStringFromPC( st ) ;
+	else
+		value = st ;
+	UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+
+  return TRUE;
 }
 
 wxString wxTextCtrl::GetValue() const
 {
-    // TODO
-    return wxString("");
+	Size actualsize;
+	UMAGetControlData( m_macControl, 0, kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ;
+	wxBuffer[actualsize] = 0 ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		return wxMacMakePCStringFromMac( wxBuffer ) ;
+	else
+    	return wxString(wxBuffer);
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::SetValue(const wxString& st)
 {
-    // TODO
+	wxString value ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		value = wxMacMakeMacStringFromPC( st ) ;
+	else
+		value = st ;
+	UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+	Refresh() ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 // Clipboard operations
 void wxTextCtrl::Copy()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TECopy( teH ) ;
 }
 
 void wxTextCtrl::Cut()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TECut( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Paste()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TEPaste( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetEditable(bool editable)
 {
-    // TODO
+    if ( editable )
+    	UMAActivateControl( m_macControl ) ;
+    else
+    	UMADeactivateControl( m_macControl ) ;
 }
 
 void wxTextCtrl::SetInsertionPoint(long pos)
 {
-    // TODO
+	SetSelection( pos , pos ) ;
 }
 
 void wxTextCtrl::SetInsertionPointEnd()
@@ -125,29 +175,72 @@ void wxTextCtrl::SetInsertionPointEnd()
 
 long wxTextCtrl::GetInsertionPoint() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).selStart ;
 }
 
 long wxTextCtrl::GetLastPosition() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).teLength ;
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& value)
 {
-    // TODO
+   	TEHandle teH ;
+   	long size ;
+   
+   	ControlEditTextSelectionRec selection ;
+   
+   	selection.selStart = from ;
+   	selection.selEnd = to ;
+   	UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+		UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   	TESetSelect( from , to  , teH ) ;
+   	TEDelete( teH ) ;
+		TEInsert( value , value.Length() , teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Remove(long from, long to)
 {
-    // TODO
+   	TEHandle teH ;
+   	long size ;
+   
+   	ControlEditTextSelectionRec selection ;
+   
+   	selection.selStart = from ;
+   	selection.selEnd = to ;
+   	UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+	UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   	TEDelete( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
-    // TODO
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+   selection.selStart = from ;
+   selection.selEnd = to ;
+   
+   UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   TESetSelect( selection.selStart , selection.selEnd , teH ) ;
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
@@ -217,23 +310,44 @@ bool wxTextCtrl::SaveFile(const wxString& file)
 
 void wxTextCtrl::WriteText(const wxString& text)
 {
-    // TODO write text to control
+    TEHandle teH ;
+    long size ;
+   
+   	memcpy( wxBuffer, text , text.Length() ) ;
+   	wxBuffer[text.Length() ] = 0 ;
+//    wxMacConvertNewlines( wxBuffer , wxBuffer ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+		TEInsert( wxBuffer , strlen( wxBuffer) , teH ) ;
+		Refresh() ;
 }
 
 void wxTextCtrl::AppendText(const wxString& text)
 {
-    // TODO append text to control
+    SetInsertionPointEnd();
+    WriteText(text);
 }
 
 void wxTextCtrl::Clear()
 {
-    // TODO
+    TEHandle teH ;
+    long size ;
+   	ControlEditTextSelectionRec selection ;
+   
+  	selection.selStart = 0 ;
+   	selection.selEnd = 32767 ;
+   
+    UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+		TECut( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 bool wxTextCtrl::IsModified() const
 {
-    // TODO
-    return FALSE;
+    return TRUE;
 }
 
 // Makes 'unmodified'
@@ -266,14 +380,12 @@ void wxTextCtrl::ShowPosition(long pos)
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
-    // TODO
-    return 0;
+    return GetValue().Length();
 }
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-    // TODO
-    return wxString("");
+    return GetValue();
 }
 
 /*
@@ -295,6 +407,76 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
+void wxTextCtrl::OnChar(wxKeyEvent& event)
+{
+	bool handleIt = true ;
+    switch( event.KeyCode() )
+    {
+        case WXK_RETURN:
+        {
+/* Oh yes it will, because we also specify DLGC_WANTCHARS
+            wxASSERT_MSG( m_windowStyle & wxTE_PROCESS_ENTER,
+                          "this text ctrl should never receive return" );
+*/
+
+            if ( (m_windowStyle & wxTE_MULTILINE) == 0 )
+            {
+            	wxWindow* parent = GetParent() ;
+            	while( parent )
+            	{
+            		if ( parent->GetDefaultItem() )
+            		{
+            			wxButton *defaultBtn = parent->GetDefaultItem() ;
+							    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, defaultBtn->GetId() );
+							    event.SetEventObject(defaultBtn);
+							    defaultBtn->Command(event);
+            			return ;
+					}
+            		parent = parent->GetParent() ;
+				} ;
+            }
+            break;
+        }
+        case WXK_TAB:
+            // only produce navigation event if we don't process TAB ourself or
+            // if it's a Shift-Tab keypress (we assume nobody will ever need
+            // this key combo for himself)
+            //
+            // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is
+            //     handled by Windows
+            if ( event.ShiftDown() || !(m_windowStyle & wxTE_PROCESS_TAB) )
+            {
+                wxNavigationKeyEvent eventNav;
+                eventNav.SetDirection(!event.ShiftDown());
+                eventNav.SetWindowChange(FALSE);
+                eventNav.SetEventObject(this);
+    
+                if ( GetEventHandler()->ProcessEvent(eventNav) )
+                    return;
+            }
+            break;
+    }
+    if ( handleIt )
+    {
+			EventRecord *ev = wxTheApp->MacGetCurrentEvent() ;
+			short keycode ;
+			short keychar ;
+			keychar = short(ev->message & charCodeMask);
+			keycode = short(ev->message & keyCodeMask) >> 8 ;
+			UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ;
+			if ( keychar >= 0x20 )
+			{
+      {
+        wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
+        wxString val(GetValue());
+        if ( !val.IsNull() )
+          event.m_commandString = WXSTRINGCAST val;
+        event.SetEventObject( this );
+        ProcessCommand(event);
+      }
+			}
+		}
+}
 // The streambuf code was partly taken from chapter 3 by Jerry Schwarz of
 // AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers
 
diff --git a/src/mac/carbon/toolbar.cpp b/src/mac/carbon/toolbar.cpp
index 3cb859e366..0620c12afb 100644
--- a/src/mac/carbon/toolbar.cpp
+++ b/src/mac/carbon/toolbar.cpp
@@ -14,6 +14,9 @@
 #endif
 
 #include "wx/wx.h"
+
+#if wxUSE_TOOLBAR
+
 #include "wx/toolbar.h"
 
 #if !USE_SHARED_LIBRARY
@@ -23,6 +26,8 @@ BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
 END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
 wxToolBar::wxToolBar()
 {
   m_maxWidth = -1;
@@ -35,22 +40,36 @@ wxToolBar::wxToolBar()
 bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    m_maxWidth = -1;
-    m_maxHeight = -1;
+  m_maxWidth = -1;
+  m_maxHeight = -1;
+
+  m_defaultWidth = 24;
+  m_defaultHeight = 22;
   
-    m_defaultWidth = 24;
-    m_defaultHeight = 22;
-    SetName(name);
+  int x = pos.x;
+  int y = pos.y;
+  int width = size.x;
+  int height = size.y;
 
-    m_windowStyle = style;
+  if (width <= 0)
+    width = 100;
+  if (height <= 0)
+    height = 30;
+  if (x < 0)
+    x = 0;
+  if (y < 0)
+    y = 0;
 
-    SetParent(parent);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , wxPoint( x , y ) , wxSize( width , height ) ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    if (parent) parent->AddChild(this);
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlPlacardProc , (long) this ) ;
+	MacPostControlCreate() ;
 
-    // TODO create toolbar
-  
-    return FALSE;
+  return TRUE;
 }
 
 wxToolBar::~wxToolBar()
@@ -58,19 +77,143 @@ wxToolBar::~wxToolBar()
     // TODO
 }
 
+PicHandle MakePict(GWorldPtr wp)
+{
+	CGrafPtr		origPort ;
+	GDHandle		origDev ;
+	
+	PicHandle		pict;				// this is the Picture we give back
+
+	RGBColor		gray = { 0xCCCC ,0xCCCC , 0xCCCC } ;
+	
+	GetGWorld( &origPort , &origDev ) ;
+	SetGWorld( wp , NULL ) ;
+	
+	pict = OpenPicture(&wp->portRect);	// open a picture, this disables drawing
+	if(!pict)	
+		return NULL;
+	
+	RGBBackColor( &gray ) ;
+	EraseRect(&wp->portRect) ;
+	CopyBits((BitMap*)*wp->portPixMap,			// src PixMap	- we copy image over itself -
+				(BitMap*)*wp->portPixMap,		// dst PixMap	- no drawing occurs -
+				&wp->portRect,			// srcRect		- it will be recorded and compressed -
+				&wp->portRect,			// dstRect		- into the picture that is open -
+				srcCopy,NULL);			// copyMode and no clip region
+
+	ClosePicture();						// We are done recording the picture
+	SetGWorld( origPort , origDev ) ;
+	return pict;						// return our groovy pict handle
+}
+
+PicHandle MakePictWhite(GWorldPtr wp)
+{
+	CGrafPtr		origPort ;
+	GDHandle		origDev ;
+	
+	PicHandle		pict;				// this is the Picture we give back
+
+	RGBColor		white = { 0xFFFF ,0xFFFF  , 0xFFFF  } ;
+	
+	GetGWorld( &origPort , &origDev ) ;
+	SetGWorld( wp , NULL ) ;
+	
+	pict = OpenPicture(&wp->portRect);	// open a picture, this disables drawing
+	if(!pict)	
+		return NULL;
+	
+	RGBBackColor( &white ) ;
+	EraseRect(&wp->portRect) ;
+	CopyBits((BitMap*)*wp->portPixMap,			// src PixMap	- we copy image over itself -
+				(BitMap*)*wp->portPixMap,		// dst PixMap	- no drawing occurs -
+				&wp->portRect,			// srcRect		- it will be recorded and compressed -
+				&wp->portRect,			// dstRect		- into the picture that is open -
+				srcCopy,NULL);			// copyMode and no clip region
+
+	ClosePicture();						// We are done recording the picture
+	SetGWorld( origPort , origDev ) ;
+	return pict;						// return our groovy pict handle
+}
+
+const short kwxMacToolBarTopMargin = 2 ;
+const short kwxMacToolBarLeftMargin = 2 ;
+
 bool wxToolBar::CreateTools()
 {
-    if (m_tools.Number() == 0)
-        return FALSE;
+  if (m_tools.Number() == 0)
+      return FALSE;
 
-    // TODO
-    return FALSE;
+	Rect toolbarrect = { m_y , m_x , m_y + m_height , m_x + m_width } ;
+	ControlFontStyleRec		controlstyle ;
+	WindowPtr				window = GetMacRootWindow() ;
+	controlstyle.flags = kControlUseFontMask ;
+	controlstyle.font = kControlFontSmallSystemFont ;
+	
+	wxNode *node = m_tools.First();
+	int noButtons = 0;
+	int x = 0 ;
+	
+	while (node)
+	{
+		wxToolBarTool *tool = (wxToolBarTool *)node->Data();
+		wxBitmapRefData * bmap = (wxBitmapRefData*) ( tool->m_bitmap1.GetRefData()) ;
+		
+		if( tool->m_toolStyle != wxTOOL_STYLE_SEPARATOR )
+		{
+			Rect toolrect = { toolbarrect.top + kwxMacToolBarTopMargin , toolbarrect.left + x + kwxMacToolBarLeftMargin , 0 , 0 } ;
+			toolrect.right = toolrect.left + m_defaultWidth ;
+			toolrect.bottom = toolrect.top + m_defaultHeight ;
+			
+			PicHandle	icon = NULL ;
+			if ( bmap )
+			{
+				if ( bmap->m_bitmapType == kMacBitmapTypePict )
+					icon = bmap->m_hPict ;
+				else if ( bmap->m_bitmapType == kMacBitmapTypeGrafWorld )
+				{
+					icon = MakePict( bmap->m_hBitmap ) ;
+				}
+			}
+			
+			ControlHandle m_macToolHandle ;
+				
+			if ( icon )
+			{
+				m_macToolHandle = UMANewControl( window , &toolrect , "\p" , true , 0 , 
+					kControlBehaviorOffsetContents + kControlContentPictHandle , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
+				ControlButtonContentInfo info ;
+				
+				info.contentType = kControlContentPictHandle ;
+				info.u.picture = icon ;
+				
+				UMASetControlData( m_macToolHandle , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
+			}
+			else
+			{
+						m_macToolHandle = UMANewControl( window , &toolrect , "\p" , true , 0 , 
+						kControlBehaviorOffsetContents  , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
+			}
+			m_macToolHandles.Add( m_macToolHandle ) ;
+			UMASetControlFontStyle( m_macToolHandle , &controlstyle ) ;
+			UMAEmbedControl( m_macToolHandle , m_macControl ) ;
+			
+			x += (int)m_defaultWidth;
+			noButtons ++;
+		}
+		else
+		{
+			m_macToolHandles.Add( NULL ) ;
+			x += (int)m_defaultWidth / 4;
+		}
+		node = node->Next();
+	}
+
+  return TRUE;
 }
 
 void wxToolBar::SetToolBitmapSize(const wxSize& size)
 {
     m_defaultWidth = size.x; m_defaultHeight = size.y;
-    // TODO
 }
 
 wxSize wxToolBar::GetMaxSize() const
@@ -82,10 +225,21 @@ wxSize wxToolBar::GetMaxSize() const
 // The button size is bigger than the bitmap size
 wxSize wxToolBar::GetToolSize() const
 {
-    // TODO
     return wxSize(m_defaultWidth + 8, m_defaultHeight + 7);
 }
 
+void wxToolBar::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	int index = 0 ;
+	for ( index = 0 ; index < m_macToolHandles.Count() ; ++index )
+	{
+		if ( m_macToolHandles[index] == (void*) control )
+		{
+			OnLeftClick( ( (wxToolBarTool*) (m_tools.Nth( index )->Data() ) ) ->m_index , ( (wxToolBarTool*) (m_tools.Nth( index )->Data() ) ) ->m_toggleState ) ;
+		}
+	}
+}
+
 void wxToolBar::EnableTool(int toolIndex, bool enable)
 {
     wxNode *node = m_tools.Find((long)toolIndex);
@@ -137,9 +291,11 @@ wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBit
   else
     tool->m_y = m_yMargin;
 
-  tool->SetSize(GetDefaultButtonWidth(), GetDefaultButtonHeight());
+  tool->SetSize(m_defaultWidth, m_defaultHeight);
 
   m_tools.Append((long)index, tool);
   return tool;
 }
 
+#endif // wxUSE_TOOLBAR
+
diff --git a/src/mac/carbon/utils.cpp b/src/mac/carbon/utils.cpp
index 940bdc21bc..817138cb63 100644
--- a/src/mac/carbon/utils.cpp
+++ b/src/mac/carbon/utils.cpp
@@ -196,7 +196,9 @@ bool wxGetResource(const wxString& section, const wxString& entry, int *value, c
 }
 #endif // wxUSE_RESOURCES
 
-static int wxBusyCursorCount = 0;
+int wxBusyCursorCount = 0;
+extern CursHandle	gMacCurrentCursor ;
+CursHandle			gMacStoredActiveCursor = NULL ;
 
 // Set the cursor to the busy cursor for all windows
 void wxBeginBusyCursor(wxCursor *cursor)
@@ -204,7 +206,8 @@ void wxBeginBusyCursor(wxCursor *cursor)
   wxBusyCursorCount ++;
   if (wxBusyCursorCount == 1)
   {
-        // TODO
+  	gMacStoredActiveCursor = gMacCurrentCursor ;
+		::SetCursor( *::GetCursor( watchCursor ) ) ;
   }
   else
   {
@@ -221,7 +224,11 @@ void wxEndBusyCursor()
   wxBusyCursorCount --;
   if (wxBusyCursorCount == 0)
   {
-    // TODO
+    if ( gMacStoredActiveCursor )
+    	::SetCursor( *gMacStoredActiveCursor ) ;
+    else
+    	::SetCursor( &qd.arrow ) ;
+   	gMacStoredActiveCursor = NULL ;
   }
 }
 
@@ -247,26 +254,40 @@ bool wxCheckForInterrupt(wxWindow *wnd)
 
 void wxGetMousePosition( int* x, int* y )
 {
-    // TODO
+    Point pt ;
+    
+    GetMouse( &pt ) ;
+    LocalToGlobal( &pt ) ;
+    *x = pt.h ;
+    *y = pt.v ;
 };
 
 // Return TRUE if we have a colour display
 bool wxColourDisplay()
 {
-    // TODO
     return TRUE;
 }
 
 // Returns depth of screen
 int wxDisplayDepth()
 {
-    // TODO
-    return 0;
+		// get max pixel depth
+		CGrafPtr port ;
+		GetCWMgrPort( &port ) ; 
+		GDHandle maxDevice ;
+		
+		maxDevice = GetMaxDevice( &port->portRect ) ;
+		if ( maxDevice )
+			return (**((**maxDevice).gdPMap)).pixelSize ;
+		else
+			return 8 ; 
 }
 
 // Get size of display
 void wxDisplaySize(int *width, int *height)
 {
-    // TODO
+    *width = qd.screenBits.bounds.right - qd.screenBits.bounds.left  ;
+    *height = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top ; 
+    *height -= LMGetMBarHeight() ;
 }
 
diff --git a/src/mac/carbon/wave.cpp b/src/mac/carbon/wave.cpp
index c25681858c..804d07a097 100644
--- a/src/mac/carbon/wave.cpp
+++ b/src/mac/carbon/wave.cpp
@@ -15,7 +15,7 @@
 
 #include "wx/object.h"
 #include "wx/string.h"
-#include "wx/stubs/wave.h"
+#include "wx/mac/wave.h"
 
 wxWave::wxWave()
   : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE)
diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp
index a54fd3331d..e8015acc3b 100644
--- a/src/mac/carbon/window.cpp
+++ b/src/mac/carbon/window.cpp
@@ -17,7 +17,7 @@
 #include "wx/menu.h"
 #include "wx/dc.h"
 #include "wx/dcclient.h"
-#include "wx/utils.h"
+#include "wx/utils.h" 
 #include "wx/app.h"
 #include "wx/panel.h"
 #include "wx/layout.h"
@@ -27,10 +27,20 @@
 #include "wx/settings.h"
 #include "wx/msgdlg.h"
 #include "wx/frame.h"
+#include "wx/notebook.h"
+#include "wx/tabctrl.h"
+// TODO remove the line below, just for lookup-up convenience CS
+#include "wx/mac/window.h"
 
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
+#define wxWINDOW_HSCROLL 5998
+#define wxWINDOW_VSCROLL 5997
+#define MAC_SCROLLBAR_SIZE 16
+
+#include <wx/mac/uma.h>
+
 #if  wxUSE_DRAG_AND_DROP
 #include "wx/dnd.h"
 #endif
@@ -38,6 +48,7 @@
 #include <string.h>
 
 extern wxList wxPendingDelete;
+wxWindow* gFocusWindow = NULL ;
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
@@ -48,6 +59,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
   EVT_IDLE(wxWindow::OnIdle)
+  EVT_PAINT(wxWindow::OnPaint)
 END_EVENT_TABLE()
 
 #endif
@@ -56,37 +68,58 @@ END_EVENT_TABLE()
 // Constructor
 wxWindow::wxWindow()
 {
-    // Generic
-    m_windowId = 0;
-    m_windowStyle = 0;
-    m_windowParent = NULL;
-    m_windowEventHandler = this;
-    m_windowName = "";
-    m_windowCursor = *wxSTANDARD_CURSOR;
-    m_children = new wxList;
-    m_constraints = NULL;
-    m_constraintsInvolvedIn = NULL;
-    m_windowSizer = NULL;
-    m_sizerParent = NULL;
-    m_autoLayout = FALSE;
-    m_windowValidator = NULL;
-    m_defaultItem = NULL;
-    m_returnCode = 0;
-    m_caretWidth = 0; m_caretHeight = 0;
-    m_caretEnabled = FALSE;
-    m_caretShown = FALSE;
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
-    // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
-    m_foregroundColour = *wxBLACK;
+	Init() ;
+}
+
+void wxWindow::Init()
+{
+	m_macWindowData = NULL ;
+  m_isWindow = TRUE;
+	m_x = 0;
+	m_y = 0 ;	
+	m_width = 0 ;
+	m_height = 0 ;
+	// these are the defaults for MSW
+	m_macShown = true ;
+	m_macEnabled = true ;
+  // Generic
+  m_windowId = 0;
+  m_windowStyle = 0;
+  m_windowParent = NULL;
+  m_windowEventHandler = this;
+  m_windowName = "";
+  m_windowCursor = *wxSTANDARD_CURSOR;
+  m_children = new wxWindowList;
+  m_constraints = NULL;
+  m_constraintsInvolvedIn = NULL;
+  m_windowSizer = NULL;
+  m_sizerParent = NULL;
+  m_autoLayout = FALSE;
+  m_windowValidator = NULL;
+  m_defaultItem = NULL;
+  m_returnCode = 0;
+  m_caretWidth = 0; m_caretHeight = 0;
+  m_caretEnabled = FALSE;
+  m_caretShown = FALSE;
+  m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
+  // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
+  m_foregroundColour = *wxBLACK;
+	m_hScrollBar = NULL ;
+	m_vScrollBar = NULL ;
+  m_mouseInWindow = FALSE;
 
 #if  wxUSE_DRAG_AND_DROP
-    m_pDropTarget = NULL;
+  m_pDropTarget = NULL;
 #endif
 }
 
 // Destructor
 wxWindow::~wxWindow()
 {
+	if ( s_lastMouseWindow == this )
+	{
+		s_lastMouseWindow = NULL ;
+	}
 	// Have to delete constraints/sizer FIRST otherwise
 	// sizers may try to look at deleted windows as they
 	// delete themselves.
@@ -110,12 +143,24 @@ wxWindow::~wxWindow()
         m_sizerParent->RemoveChild((wxWindow *)this);
 #endif
 
+		if ( FindFocus() == this )
+		{
+			// really a bad thing - maybe an error ?
+			// we cannot even send it a kill focus message at this stage
+			gFocusWindow = NULL ;
+		}
+
     if (m_windowParent)
         m_windowParent->RemoveChild(this);
 
     DestroyChildren();
 
-    // TODO: destroy the window
+		if ( m_macWindowData )
+		{
+    	UMADisposeWindow( m_macWindowData->m_macWindow ) ;
+    	delete m_macWindowData ;
+    	wxRemoveMacWindowAssociation( this ) ;
+    }
 
     delete m_children;
     m_children = NULL;
@@ -143,7 +188,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-    // Generic
+   m_isWindow = TRUE;
+     // Generic
     m_windowId = 0;
     m_windowStyle = 0;
     m_windowParent = NULL;
@@ -182,7 +228,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     if ( id == -1 )
     	m_windowId = (int)NewControlId();
     else
-	m_windowId = id;
+			m_windowId = id;
 
     // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
     m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
@@ -193,31 +239,68 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     if ( id == -1 )
     	m_windowId = (int)NewControlId();
     else
-	m_windowId = id;
+			m_windowId = id;
 
-    // TODO: create the window
+  	m_x = (int)pos.x;
+  	m_y = (int)pos.y;
+		AdjustForParentClientOrigin(m_x, m_y, wxSIZE_USE_EXISTING);
+  	m_width = size.x;
+	  m_height = size.y;
+
+    MacCreateScrollBars( style ) ;
 
     return TRUE;
 }
 
 void wxWindow::SetFocus()
 {
-    // TODO
+	if ( AcceptsFocus() )
+	{
+		if (gFocusWindow )
+		{
+			wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
+			if ( control && control->GetMacControl() )
+			{
+				UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlFocusNoPart ) ;
+			}
+	    wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
+	    event.SetEventObject(gFocusWindow);
+			gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
+		}
+		gFocusWindow = this ;
+		{
+			wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
+			if ( control && control->GetMacControl() )
+			{
+				UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlEditTextPart ) ;
+			}
+
+	    wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
+	    event.SetEventObject(this);
+			GetEventHandler()->ProcessEvent(event) ;
+		}
+	}
 }
 
 void wxWindow::Enable(bool enable)
 {
-    // TODO
+	if ( m_macEnabled == enable )
+		return ;
+		
+  m_macEnabled = enable ;
+		
+	MacSuperEnabled( enable ) ;
+  return;
 }
 
 void wxWindow::CaptureMouse()
 {
-    // TODO
+    wxTheApp->s_captureWindow = this ;
 }
 
 void wxWindow::ReleaseMouse()
 {
-    // TODO
+    wxTheApp->s_captureWindow = NULL ;
 }
 
 // Push/pop event handler (i.e. allow a chain of event handlers
@@ -274,22 +357,85 @@ void wxWindow::DragAcceptFiles(bool accept)
 // Get total size
 void wxWindow::GetSize(int *x, int *y) const
 {
-    // TODO
+    *x = m_width ;
+    *y = m_height ;
 }
 
 void wxWindow::GetPosition(int *x, int *y) const
 {
-    // TODO
+    *x = m_x ;
+    *y = m_y ;
+    if (GetParent())
+    {
+        wxPoint pt(GetParent()->GetClientAreaOrigin());
+        *x -= pt.x;
+        *y -= pt.y;
+    }
 }
 
 void wxWindow::ScreenToClient(int *x, int *y) const
 {
-    // TODO
+	WindowRef window = GetMacRootWindow() ;
+
+	Point		localwhere ;
+	localwhere.h = * x ;
+	localwhere.v = * y ;
+
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( window ) ) ;
+	::GlobalToLocal( &localwhere ) ;
+	::SetPort( port ) ;
+
+	*x = localwhere.h ;
+	*y = localwhere.v ;
+	
+	MacRootWindowToClient( x , y ) ;
 }
 
 void wxWindow::ClientToScreen(int *x, int *y) const
 {
-    // TODO
+	WindowRef window = GetMacRootWindow() ;
+	
+	MacClientToRootWindow( x , y ) ;
+	
+	Point		localwhere ;
+	localwhere.h = * x ;
+	localwhere.v = * y ;
+	
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( window ) ) ;
+	::LocalToGlobal( &localwhere ) ;
+	::SetPort( port ) ;
+	*x = localwhere.h ;
+	*y = localwhere.v ;
+}
+
+void wxWindow::MacClientToRootWindow( int *x , int *y ) const
+{
+	if ( m_macWindowData )
+	{
+	}
+	else
+	{
+		*x += m_x ;
+		*y += m_y ;
+		GetParent()->MacClientToRootWindow( x , y ) ;
+	}
+}
+
+void wxWindow::MacRootWindowToClient( int *x , int *y ) const
+{
+	if ( m_macWindowData )
+	{
+	}
+	else
+	{
+		*x -= m_x ;
+		*y -= m_y ;
+		GetParent()->MacRootWindowToClient( x , y ) ;
+	}
 }
 
 void wxWindow::SetCursor(const wxCursor& cursor)
@@ -297,7 +443,9 @@ void wxWindow::SetCursor(const wxCursor& cursor)
   m_windowCursor = cursor;
   if (m_windowCursor.Ok())
   {
-    // TODO
+		// since this only affects the window-cursor, we adopt the same
+		// behaviour as windows -> it will only change on mouse moved events
+		// otherwise the ::WxSetCursor routine will have to be used
   }
 }
 
@@ -305,21 +453,132 @@ void wxWindow::SetCursor(const wxCursor& cursor)
 // Get size *available for subwindows* i.e. excluding menu bar etc.
 void wxWindow::GetClientSize(int *x, int *y) const
 {
-    // TODO
-}
+    *x = m_width ;
+    *y = m_height ;
+
+  if (m_vScrollBar && m_vScrollBar->IsShown() )
+  	(*x) -= MAC_SCROLLBAR_SIZE;
+  if (m_hScrollBar  && m_hScrollBar->IsShown() )
+  	(*y) -= MAC_SCROLLBAR_SIZE;
+}
+
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+	int former_x = m_x ;
+	int former_y = m_y ;
+	int former_w = m_width ;
+	int former_h = m_height ;
+	
+  int currentX, currentY;
+  GetPosition(&currentX, &currentY);
+  int currentW,currentH;
+  GetSize(&currentW, &currentH);
+
+  int actualWidth = width;
+  int actualHeight = height;
+  int actualX = x;
+  int actualY = y;
+  if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualX = currentX;
+  if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualY = currentY;
+  if (width == -1)
+      actualWidth = currentW ;
+  if (height == -1)
+      actualHeight = currentH ;
+
+	if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
+	{
+		MacRepositionScrollBars() ; // we might have a real position shift
+		return ;
+	}
 
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
+	AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
+	
+	
+	bool doMove = false ;
+	bool doResize = false ;
+	
+	if ( actualX != former_x || actualY != former_y )
+	{
+		doMove = true ;
+	}
+	if ( actualWidth != former_w || actualHeight != former_h )
+	{
+		doResize = true ;
+	}
 
-void wxWindow::SetClientSize(int width, int height)
-{
-    // TODO
+	if ( doMove || doResize )
+	{
+		if ( m_macWindowData )
+		{
+		}
+		else
+		{
+			// erase former position
+			{
+				wxMacDrawingClientHelper focus( this ) ;
+				if ( focus.Ok() )
+				{
+			  	Rect clientrect = { 0 , 0 , m_height , m_width } ;
+			    InvalRect( &clientrect ) ;
+				}
+			}
+		}
+		m_x = actualX ;
+		m_y = actualY ;
+		m_width = actualWidth ;
+		m_height = actualHeight ;
+		if ( m_macWindowData )
+		{
+			if ( doMove )
+				::MoveWindow(m_macWindowData->m_macWindow, m_x, m_y, false); // don't make frontmost
+			
+			if ( doResize )
+				::SizeWindow(m_macWindowData->m_macWindow, m_width, m_height, true); 
+			
+			// the OS takes care of invalidating and erasing	
+			
+			if ( IsKindOf( CLASSINFO( wxFrame ) ) )
+			{
+				wxFrame* frame = (wxFrame*) this ;
+			  frame->PositionStatusBar();
+  			frame->PositionToolBar();
+			}
+		}
+		else
+		{
+			// erase new position
+			{
+				wxMacDrawingClientHelper focus( this ) ;
+				if ( focus.Ok() )
+				{
+			  	Rect clientrect = { 0 , 0 , m_height , m_width } ;
+			    InvalRect( &clientrect ) ;
+				}
+			}
+			if ( doMove )
+				wxWindow::MacSuperChangedPosition() ; // like this only children will be notified
+		}
+		MacRepositionScrollBars() ;
+		if ( doMove )
+		{
+    	wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+    	event.SetEventObject(this);
+    	GetEventHandler()->ProcessEvent(event) ;
+    }
+    if ( doResize )
+    {
+			MacRepositionScrollBars() ;
+	    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+	    event.SetEventObject(this);
+	    GetEventHandler()->ProcessEvent(event);
+    }
+	}
 }
-
 // For implementation purposes - sometimes decorations make the client area
 // smaller
+
 wxPoint wxWindow::GetClientAreaOrigin() const
 {
     return wxPoint(0, 0);
@@ -329,35 +588,118 @@ wxPoint wxWindow::GetClientAreaOrigin() const
 // a toolbar that it manages itself).
 void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
 {
+	if( !m_macWindowData )
+	{
     if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
     {
         wxPoint pt(GetParent()->GetClientAreaOrigin());
         x += pt.x; y += pt.y;
     }
+   }
+}
+
+void wxWindow::SetTitle(const wxString& title)
+{
+	wxString label ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+
+	if ( m_macWindowData )
+    	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+}
+
+wxString wxWindow::GetTitle() const
+{
+	if ( m_macWindowData )
+	{
+    	char title[256] ;
+		wxString label ;
+    	UMAGetWTitleC( m_macWindowData->m_macWindow , title ) ;
+		if( wxApp::s_macDefaultEncodingIsPC )
+			label = wxMacMakePCStringFromMac( title ) ;
+		else
+			label = title ;
+    	return label;
+  	}
+  
+  return wxEmptyString ;
+}
+
+void wxWindow::Centre(int direction)
+{
+  int x_offset,y_offset ;
+  int display_width, display_height;
+  int  width, height, x, y;
+  wxWindow *parent = GetParent();
+  if ((direction & wxCENTER_FRAME) && parent)
+  {
+      parent->GetPosition(&x_offset,&y_offset) ;
+      parent->GetSize(&display_width,&display_height) ;
+  }
+  else
+  {
+    wxDisplaySize(&display_width, &display_height);
+    x_offset = 0 ;
+    y_offset = LMGetMBarHeight() + LMGetMBarHeight() / 2 ; // approx. the window title height
+  }
+
+  GetSize(&width, &height);
+  GetPosition(&x, &y);
+
+  if (direction & wxHORIZONTAL)
+    x = (int)((display_width - width)/2);
+  if (direction & wxVERTICAL)
+    y = (int)((display_height - height)/2);
+
+  SetSize(x+x_offset, y+y_offset, width, height);
 }
 
+
 bool wxWindow::Show(bool show)
 {
-    // TODO
-    return FALSE;
+	if ( m_macShown == show )
+		return TRUE ;
+		
+	m_macShown = show ;
+	if ( m_macWindowData )
+	{
+	  if (show)
+	  {
+	  	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+	  	UMASelectWindow( m_macWindowData->m_macWindow ) ;
+			// no need to generate events here, they will get them triggered by macos
+	    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+	    event.SetEventObject(this);
+	    GetEventHandler()->ProcessEvent(event);
+	  }
+	  else
+	  {
+	  	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	}
+	Refresh() ;
+	MacSuperShown( show ) ;
+  return TRUE;
 }
 
 bool wxWindow::IsShown() const
 {
-    // TODO
-    return FALSE;
+    return m_macShown;
 }
 
 int wxWindow::GetCharHeight() const
 {
-    // TODO
-    return 0;
+	wxClientDC dc ( (wxWindow*)this ) ;
+	return dc.GetCharHeight() ;
 }
 
 int wxWindow::GetCharWidth() const
 {
-    // TODO
-    return 0;
+	wxClientDC dc ( (wxWindow*)this ) ;
+	return dc.GetCharWidth() ;
 }
 
 void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
@@ -370,9 +712,104 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
     // TODO
 }
 
+void wxWindow::MacEraseBackground( Rect *rect )
+{
+	WindowRef window = GetMacRootWindow() ;
+	if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
+	{
+			UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
+	}
+	else if (  m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+	{
+		// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
+		// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
+		// either a non gray background color or a non control window
+		
+			wxWindow* parent = GetParent() ;
+			while( parent )
+			{
+				if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+				{
+					// if we have any other colours in the hierarchy
+  				RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+  				break ;
+				}
+				if( parent->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)parent)->GetMacControl() )
+				{
+					// if we have the normal colours in the hierarchy but another control etc. -> use it's background
+					if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+					{
+						ApplyThemeBackground			(kThemeBackgroundTabPane, rect, kThemeStateActive,8,true);
+						break ;
+					}
+				}
+				else
+				{
+					// we have arrived at a non control item
+					parent = NULL ;
+					break ;
+				}
+				parent = parent->GetParent() ;
+			}
+			if ( !parent )
+			{
+				// if there is nothing special -> use default
+				UMASetThemeWindowBackground( window , kThemeBrushDialogBackgroundActive , false ) ;
+			}
+	}
+	else
+	{
+  		RGBBackColor( &m_backgroundColour.GetPixel()) ;
+	}
+
+	EraseRect( rect ) ;	
+	
+	for (wxNode *node = m_children->First(); node; node = node->Next())
+	{
+		wxWindow *child = (wxWindow*)node->Data();
+//			int width ;
+//			int height ;
+		
+//			child->GetClientSize( &width , &height ) ;
+		
+		Rect clientrect = { child->m_x , child->m_y , child->m_x +child->m_width , child->m_y + child->m_height } ;
+		SectRect( &clientrect , rect , &clientrect ) ;    	
+
+		OffsetRect( &clientrect , -child->m_x , -child->m_y ) ;
+		if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+		{
+			wxMacDrawingClientHelper focus( this ) ;
+			if ( focus.Ok() )
+			{
+				child->MacEraseBackground( &clientrect ) ;
+			}
+		}
+	}
+}
+
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
-    // TODO
+	wxMacDrawingClientHelper focus( this ) ;
+	if ( focus.Ok() )
+	{
+  	int width , height ;
+  	GetClientSize( &width , &height ) ;
+  	Rect clientrect = { 0 , 0 , height , width } ;
+  	ClipRect( &clientrect ) ;
+
+    if ( rect )
+    {
+    	Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+			SectRect( &clientrect , &r , &clientrect ) ;    	
+    }
+    InvalRect( &clientrect ) ;
+    /*
+    if ( eraseBack )
+    {
+    	MacEraseBackground( &clientrect ) ;
+   	}
+   	*/
+	}
 }
 
 // Responds to colour changes: passes event on to children.
@@ -451,7 +888,7 @@ void wxWindow::GetCaretPos(int *x, int *y) const
 
 wxWindow *wxGetActiveWindow()
 {
-    // TODO
+    // actually this is a windows-only concept
     return NULL;
 }
 
@@ -463,46 +900,31 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int WXUNUSED
   m_maxSizeY = maxH;
 }
 
-void wxWindow::Centre(int direction)
-{
-  int x, y, width, height, panel_width, panel_height, new_x, new_y;
-
-  wxWindow *father = (wxWindow *)GetParent();
-  if (!father)
-    return;
-
-  father->GetClientSize(&panel_width, &panel_height);
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
-
-  new_x = -1;
-  new_y = -1;
-
-  if (direction & wxHORIZONTAL)
-    new_x = (int)((panel_width - width)/2);
-
-  if (direction & wxVERTICAL)
-    new_y = (int)((panel_height - height)/2);
-
-  SetSize(new_x, new_y, -1, -1);
-
-}
 
 // Coordinates relative to the window
 void wxWindow::WarpPointer (int x_pos, int y_pos)
 {
-    // TODO
+    // We really dont move the mouse programmatically under mac
 }
 
 void wxWindow::OnEraseBackground(wxEraseEvent& event)
 {
-    // TODO
+    // TODO : probably we would adopt the EraseEvent structure
     Default();
 }
 
 int wxWindow::GetScrollPos(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetThumbPosition() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetThumbPosition() ;
+		}
     return 0;
 }
 
@@ -510,34 +932,110 @@ int wxWindow::GetScrollPos(int orient) const
 // of positions that we can scroll.
 int wxWindow::GetScrollRange(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetRange() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetRange() ;
+		}
     return 0;
 }
 
 int wxWindow::GetScrollThumb(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetThumbSize() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetThumbSize() ;
+		}
     return 0;
 }
 
 void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
 {
-    // TODO
-    return;
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				m_hScrollBar->SetThumbPosition( pos ) ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				m_vScrollBar->SetThumbPosition( pos ) ;
+		}
 }
 
 // New function that will replace some of the above.
 void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
     int range, bool refresh)
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+			{
+				if ( range == 0 || thumbVisible >= range )
+				{
+					if ( m_hScrollBar->IsShown() )
+						m_hScrollBar->Show(false) ;
+				}
+				else
+				{
+					if ( !m_hScrollBar->IsShown() )
+						m_hScrollBar->Show(true) ;
+					m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+				}
+			}
+		}
+		else
+		{
+			if ( m_vScrollBar )
+			{
+				if ( range == 0 || thumbVisible >= range )
+				{
+					if ( m_vScrollBar->IsShown() )
+						m_vScrollBar->Show(false) ;
+				}
+				else
+				{
+					if ( !m_vScrollBar->IsShown() )
+						m_vScrollBar->Show(true) ;
+					m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+				}
+			}
+		}
+		MacRepositionScrollBars() ;
 }
 
 // Does a physical scroll
 void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
-    // TODO
-    return;
+	wxMacDrawingClientHelper focus( this ) ;
+	if ( focus.Ok() )
+	{
+  	int width , height ;
+  	GetClientSize( &width , &height ) ;
+  	Rect scrollrect = { 0 , 0 , height , width } ;
+  	
+  	RgnHandle updateRgn = NewRgn() ;
+  	ClipRect( &scrollrect ) ;
+    if ( rect )
+    {
+    	Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+			SectRect( &scrollrect , &r , &scrollrect ) ;    	
+    }
+   	ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
+    InvalRgn( updateRgn ) ;
+    DisposeRgn( updateRgn ) ;
+	}
 }
 
 void wxWindow::SetFont(const wxFont& font)
@@ -563,13 +1061,31 @@ void wxWindow::OnChar(wxKeyEvent& event)
 
 void wxWindow::OnPaint(wxPaintEvent& event)
 {
-	Default();
+/*
+	if ( m_macWindowData )
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		long x ,y ,w ,h ;
+		GetUpdateRegion().GetBox( x , y , w , h ) ;
+		UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+		Rect r = { y , x, y+h , x+w } ;
+		EraseRect( &r ) ;
+	}
+	else
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		long x ,y ,w ,h ;
+		GetUpdateRegion().GetBox( x , y , w , h ) ;
+		RGBBackColor( &m_backgroundColour.GetPixel() ) ;
+		Rect r = { y , x, y+h , x+w } ;
+		EraseRect( &r ) ;
+	}
+*/
 }
 
 bool wxWindow::IsEnabled() const
 {
-    // TODO
-    return FALSE;
+	return m_macEnabled ;
 }
 
 // Dialog support: override these and call
@@ -636,8 +1152,16 @@ bool wxWindow::Validate()
 // Get the window with the focus
 wxWindow *wxWindow::FindFocus()
 {
-    // TODO
-    return NULL;
+	return gFocusWindow ;
+}
+
+// ----------------------------------------------------------------------------
+// RTTI
+// ----------------------------------------------------------------------------
+
+bool wxWindow::IsTopLevel() const
+{
+    return wxDynamicCast(this, wxFrame) || wxDynamicCast(this, wxDialog);
 }
 
 void wxWindow::AddChild(wxWindow *child)
@@ -659,7 +1183,7 @@ void wxWindow::DestroyChildren()
       wxWindow *child;
       if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) {
         delete child;
-		if ( GetChildren().Member(child) )
+		if ( GetChildren().Find(child) )
 			delete node;
       }
     } /* while */
@@ -693,419 +1217,384 @@ void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
     m_windowParent->GetEventHandler()->OnCommand(win, event);
 }
 
-void wxWindow::SetConstraints(wxLayoutConstraints *c)
+// ----------------------------------------------------------------------------
+// constraints and sizers
+// ----------------------------------------------------------------------------
+
+#if wxUSE_CONSTRAINTS
+
+void wxWindow::SetConstraints( wxLayoutConstraints *constraints )
 {
-  if (m_constraints)
-  {
-    UnsetConstraints(m_constraints);
-    delete m_constraints;
-  }
-  m_constraints = c;
-  if (m_constraints)
-  {
-    // Make sure other windows know they're part of a 'meaningful relationship'
-    if (m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this))
-      m_constraints->left.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this))
-      m_constraints->top.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this))
-      m_constraints->right.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this))
-      m_constraints->bottom.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this))
-      m_constraints->width.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this))
-      m_constraints->height.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this))
-      m_constraints->centreX.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this))
-      m_constraints->centreY.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-  }
+    if ( m_constraints )
+    {
+        UnsetConstraints(m_constraints);
+        delete m_constraints;
+    }
+    m_constraints = constraints;
+    if ( m_constraints )
+    {
+        // Make sure other windows know they're part of a 'meaningful relationship'
+        if ( m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this) )
+            m_constraints->left.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this) )
+            m_constraints->top.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this) )
+            m_constraints->right.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this) )
+            m_constraints->bottom.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this) )
+            m_constraints->width.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this) )
+            m_constraints->height.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this) )
+            m_constraints->centreX.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this) )
+            m_constraints->centreY.GetOtherWindow()->AddConstraintReference(this);
+    }
 }
 
-// This removes any dangling pointers to this window
-// in other windows' constraintsInvolvedIn lists.
+// This removes any dangling pointers to this window in other windows'
+// constraintsInvolvedIn lists.
 void wxWindow::UnsetConstraints(wxLayoutConstraints *c)
 {
-  if (c)
-  {
-    if (c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this))
-      c->left.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this))
-      c->top.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this))
-      c->right.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this))
-      c->bottom.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this))
-      c->width.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this))
-      c->height.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this))
-      c->centreX.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this))
-      c->centreY.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-  }
+    if ( c )
+    {
+        if ( c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
+            c->left.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
+            c->top.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this) )
+            c->right.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this) )
+            c->bottom.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this) )
+            c->width.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this) )
+            c->height.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this) )
+            c->centreX.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this) )
+            c->centreY.GetOtherWindow()->RemoveConstraintReference(this);
+    }
 }
 
-// Back-pointer to other windows we're involved with, so if we delete
-// this window, we must delete any constraints we're involved with.
+// Back-pointer to other windows we're involved with, so if we delete this
+// window, we must delete any constraints we're involved with.
 void wxWindow::AddConstraintReference(wxWindow *otherWin)
 {
-  if (!m_constraintsInvolvedIn)
-    m_constraintsInvolvedIn = new wxList;
-  if (!m_constraintsInvolvedIn->Member(otherWin))
-    m_constraintsInvolvedIn->Append(otherWin);
+    if ( !m_constraintsInvolvedIn )
+        m_constraintsInvolvedIn = new wxWindowList;
+    if ( !m_constraintsInvolvedIn->Find(otherWin) )
+        m_constraintsInvolvedIn->Append(otherWin);
 }
 
 // REMOVE back-pointer to other windows we're involved with.
 void wxWindow::RemoveConstraintReference(wxWindow *otherWin)
 {
-  if (m_constraintsInvolvedIn)
-    m_constraintsInvolvedIn->DeleteObject(otherWin);
+    if ( m_constraintsInvolvedIn )
+        m_constraintsInvolvedIn->DeleteObject(otherWin);
 }
 
 // Reset any constraints that mention this window
 void wxWindow::DeleteRelatedConstraints()
 {
-  if (m_constraintsInvolvedIn)
-  {
-    wxNode *node = m_constraintsInvolvedIn->First();
-    while (node)
+    if ( m_constraintsInvolvedIn )
     {
-      wxWindow *win = (wxWindow *)node->Data();
-      wxNode *next = node->Next();
-      wxLayoutConstraints *constr = win->GetConstraints();
-
-      // Reset any constraints involving this window
-      if (constr)
-      {
-        constr->left.ResetIfWin((wxWindow *)this);
-        constr->top.ResetIfWin((wxWindow *)this);
-        constr->right.ResetIfWin((wxWindow *)this);
-        constr->bottom.ResetIfWin((wxWindow *)this);
-        constr->width.ResetIfWin((wxWindow *)this);
-        constr->height.ResetIfWin((wxWindow *)this);
-        constr->centreX.ResetIfWin((wxWindow *)this);
-        constr->centreY.ResetIfWin((wxWindow *)this);
-      }
-      delete node;
-      node = next;
+        wxWindowList::Node *node = m_constraintsInvolvedIn->GetFirst();
+        while (node)
+        {
+            wxWindow *win = node->GetData();
+            wxLayoutConstraints *constr = win->GetConstraints();
+
+            // Reset any constraints involving this window
+            if ( constr )
+            {
+                constr->left.ResetIfWin(this);
+                constr->top.ResetIfWin(this);
+                constr->right.ResetIfWin(this);
+                constr->bottom.ResetIfWin(this);
+                constr->width.ResetIfWin(this);
+                constr->height.ResetIfWin(this);
+                constr->centreX.ResetIfWin(this);
+                constr->centreY.ResetIfWin(this);
+            }
+
+            wxWindowList::Node *next = node->GetNext();
+            delete node;
+            node = next;
+        }
+
+        delete m_constraintsInvolvedIn;
+        m_constraintsInvolvedIn = (wxWindowList *) NULL;
     }
-    delete m_constraintsInvolvedIn;
-    m_constraintsInvolvedIn = NULL;
-  }
 }
 
 void wxWindow::SetSizer(wxSizer *sizer)
 {
-  m_windowSizer = sizer;
-  if (sizer)
-    sizer->SetSizerParent((wxWindow *)this);
+    if (m_windowSizer) delete m_windowSizer;
+
+    m_windowSizer = sizer;
 }
 
-/*
- * New version
- */
-
 bool wxWindow::Layout()
 {
-  if (GetConstraints())
-  {
     int w, h;
     GetClientSize(&w, &h);
-    GetConstraints()->width.SetValue(w);
-    GetConstraints()->height.SetValue(h);
-  }
-  
-  // If top level (one sizer), evaluate the sizer's constraints.
-  if (GetSizer())
-  {
-    int noChanges;
-    GetSizer()->ResetConstraints();   // Mark all constraints as unevaluated
-    GetSizer()->LayoutPhase1(&noChanges);
-    GetSizer()->LayoutPhase2(&noChanges);
-    GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
-    return TRUE;
-  }
-  else
-  {
-    // Otherwise, evaluate child constraints
+    
+    // If there is a sizer, use it instead of the constraints
+    if ( GetSizer() )
+    {
+        GetSizer()->SetDimension( 0, 0, w, h );
+        return TRUE;
+    }
+    
+    if ( GetConstraints() )
+    {
+        GetConstraints()->width.SetValue(w);
+        GetConstraints()->height.SetValue(h);
+    }
+	
+    // Evaluate child constraints
     ResetConstraints();   // Mark all constraints as unevaluated
     DoPhase(1);           // Just one phase need if no sizers involved
     DoPhase(2);
     SetConstraintSizes(); // Recursively set the real window sizes
-  }
-  return TRUE;
+    
+    return TRUE;
 }
 
 
-// Do a phase of evaluating constraints:
-// the default behaviour. wxSizers may do a similar
-// thing, but also impose their own 'constraints'
-// and order the evaluation differently.
+// Do a phase of evaluating constraints: the default behaviour. wxSizers may
+// do a similar thing, but also impose their own 'constraints' and order the
+// evaluation differently.
 bool wxWindow::LayoutPhase1(int *noChanges)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    return constr->SatisfyConstraints((wxWindow *)this, noChanges);
-  }
-  else
-    return TRUE;
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        return constr->SatisfyConstraints(this, noChanges);
+    }
+    else
+        return TRUE;
 }
 
 bool wxWindow::LayoutPhase2(int *noChanges)
 {
-  *noChanges = 0;
-  
-  // Layout children
-  DoPhase(1);
-  DoPhase(2);
-  return TRUE;
+    *noChanges = 0;
+
+    // Layout children
+    DoPhase(1);
+    DoPhase(2);
+    return TRUE;
 }
 
 // Do a phase of evaluating child constraints
 bool wxWindow::DoPhase(int phase)
 {
-  int noIterations = 0;
-  int maxIterations = 500;
-  int noChanges = 1;
-  int noFailures = 0;
-  wxList succeeded;
-  while ((noChanges > 0) && (noIterations < maxIterations))
-  {
-    noChanges = 0;
-    noFailures = 0;
-    wxNode *node = GetChildren().First();
-    while (node)
+    int noIterations = 0;
+    int maxIterations = 500;
+    int noChanges = 1;
+    int noFailures = 0;
+    wxWindowList succeeded;
+    while ((noChanges > 0) && (noIterations < maxIterations))
     {
-      wxWindow *child = (wxWindow *)node->Data();
-      if (!child->IsKindOf(CLASSINFO(wxFrame)) && !child->IsKindOf(CLASSINFO(wxDialog)))
-      {
-        wxLayoutConstraints *constr = child->GetConstraints();
-        if (constr)
+        noChanges = 0;
+        noFailures = 0;
+        wxWindowList::Node *node = GetChildren().GetFirst();
+        while (node)
         {
-          if (succeeded.Member(child))
-          {
-          }
-          else
-          {
-            int tempNoChanges = 0;
-            bool success = ( (phase == 1) ? child->LayoutPhase1(&tempNoChanges) : child->LayoutPhase2(&tempNoChanges) ) ;
-            noChanges += tempNoChanges;
-            if (success)
+            wxWindow *child = node->GetData();
+            if ( !child->IsTopLevel() )
             {
-              succeeded.Append(child);
+                wxLayoutConstraints *constr = child->GetConstraints();
+                if ( constr )
+                {
+                    if ( !succeeded.Find(child) )
+                    {
+                        int tempNoChanges = 0;
+                        bool success = ( (phase == 1) ? child->LayoutPhase1(&tempNoChanges) : child->LayoutPhase2(&tempNoChanges) ) ;
+                        noChanges += tempNoChanges;
+                        if ( success )
+                        {
+                            succeeded.Append(child);
+                        }
+                    }
+                }
             }
-          }
+            node = node->GetNext();
         }
-      }
-      node = node->Next();
+
+        noIterations++;
     }
-    noIterations ++;
-  }
-  return TRUE;
+
+    return TRUE;
 }
 
 void wxWindow::ResetConstraints()
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    constr->left.SetDone(FALSE);
-    constr->top.SetDone(FALSE);
-    constr->right.SetDone(FALSE);
-    constr->bottom.SetDone(FALSE);
-    constr->width.SetDone(FALSE);
-    constr->height.SetDone(FALSE);
-    constr->centreX.SetDone(FALSE);
-    constr->centreY.SetDone(FALSE);
-  }
-  wxNode *node = GetChildren().First();
-  while (node)
-  {
-    wxWindow *win = (wxWindow *)node->Data();
-    if (!win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)))
-      win->ResetConstraints();
-    node = node->Next();
-  }
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        constr->left.SetDone(FALSE);
+        constr->top.SetDone(FALSE);
+        constr->right.SetDone(FALSE);
+        constr->bottom.SetDone(FALSE);
+        constr->width.SetDone(FALSE);
+        constr->height.SetDone(FALSE);
+        constr->centreX.SetDone(FALSE);
+        constr->centreY.SetDone(FALSE);
+    }
+    wxWindowList::Node *node = GetChildren().GetFirst();
+    while (node)
+    {
+        wxWindow *win = node->GetData();
+        if ( !win->IsTopLevel() )
+            win->ResetConstraints();
+        node = node->GetNext();
+    }
 }
 
-// Need to distinguish between setting the 'fake' size for
-// windows and sizers, and setting the real values.
+// Need to distinguish between setting the 'fake' size for windows and sizers,
+// and setting the real values.
 void wxWindow::SetConstraintSizes(bool recurse)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr && constr->left.GetDone() && constr->right.GetDone() &&
-                constr->width.GetDone() && constr->height.GetDone())
-  {
-    int x = constr->left.GetValue();
-    int y = constr->top.GetValue();
-    int w = constr->width.GetValue();
-    int h = constr->height.GetValue();
-
-    // If we don't want to resize this window, just move it...
-    if ((constr->width.GetRelationship() != wxAsIs) ||
-        (constr->height.GetRelationship() != wxAsIs))
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr && constr->left.GetDone() && constr->right.GetDone( ) &&
+            constr->width.GetDone() && constr->height.GetDone())
     {
-      // Calls Layout() recursively. AAAGH. How can we stop that.
-      // Simply take Layout() out of non-top level OnSizes.
-      SizerSetSize(x, y, w, h);
+        int x = constr->left.GetValue();
+        int y = constr->top.GetValue();
+        int w = constr->width.GetValue();
+        int h = constr->height.GetValue();
+
+        if ( (constr->width.GetRelationship() != wxAsIs ) ||
+             (constr->height.GetRelationship() != wxAsIs) )
+        {
+            SetSize(x, y, w, h);
+        }
+        else
+        {
+            // If we don't want to resize this window, just move it...
+            Move(x, y);
+        }
     }
-    else
+    else if ( constr )
     {
-      SizerMove(x, y);
+        char *windowClass = GetClassInfo()->GetClassName();
+
+        wxString winName;
+        if ( GetName() == _T("") )
+            winName = _T("unnamed");
+        else
+            winName = GetName();
+        wxLogDebug( _T("Constraint(s) not satisfied for window of type %s, name %s:\n"),
+                (const char *)windowClass,
+                (const char *)winName);
+        if ( !constr->left.GetDone()) wxLogDebug( _T("  unsatisfied 'left' constraint.\n")  );
+        if ( !constr->right.GetDone()) wxLogDebug( _T("  unsatisfied 'right' constraint.\n")  );
+        if ( !constr->width.GetDone()) wxLogDebug( _T("  unsatisfied 'width' constraint.\n")  );
+        if ( !constr->height.GetDone())  wxLogDebug( _T("  unsatisfied 'height' constraint.\n")  );
+        wxLogDebug( _T("Please check constraints: try adding AsIs() constraints.\n") );
     }
-  }
-  else if (constr)
-  {
-    char *windowClass = this->GetClassInfo()->GetClassName();
 
-    wxString winName;
-	if (GetName() == "")
-		winName = "unnamed";
-	else
-		winName = GetName();
-    wxDebugMsg("Constraint(s) not satisfied for window of type %s, name %s:\n", (const char *)windowClass, (const char *)winName);
-    if (!constr->left.GetDone())
-      wxDebugMsg("  unsatisfied 'left' constraint.\n");
-    if (!constr->right.GetDone())
-      wxDebugMsg("  unsatisfied 'right' constraint.\n");
-    if (!constr->width.GetDone())
-      wxDebugMsg("  unsatisfied 'width' constraint.\n");
-    if (!constr->height.GetDone())
-      wxDebugMsg("  unsatisfied 'height' constraint.\n");
-    wxDebugMsg("Please check constraints: try adding AsIs() constraints.\n");
-  }
-
-  if (recurse)
-  {
-    wxNode *node = GetChildren().First();
-    while (node)
+    if ( recurse )
     {
-      wxWindow *win = (wxWindow *)node->Data();
-      if (!win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)))
-        win->SetConstraintSizes();
-      node = node->Next();
+        wxWindowList::Node *node = GetChildren().GetFirst();
+        while (node)
+        {
+            wxWindow *win = node->GetData();
+            if ( !win->IsTopLevel() )
+                win->SetConstraintSizes();
+            node = node->GetNext();
+        }
     }
-  }
-}
-
-// This assumes that all sizers are 'on' the same
-// window, i.e. the parent of this window.
-void wxWindow::TransformSizerToActual(int *x, int *y) const
-{
-  if (!m_sizerParent || m_sizerParent->IsKindOf(CLASSINFO(wxDialog)) ||
-  			 m_sizerParent->IsKindOf(CLASSINFO(wxFrame)) )
-    return;
-    
-  int xp, yp;
-  m_sizerParent->GetPosition(&xp, &yp);
-  m_sizerParent->TransformSizerToActual(&xp, &yp);
-  *x += xp;
-  *y += yp;
-}
-
-void wxWindow::SizerSetSize(int x, int y, int w, int h)
-{
-	int xx = x;
-	int yy = y;
-  TransformSizerToActual(&xx, &yy);
-  SetSize(xx, yy, w, h);
-}
-
-void wxWindow::SizerMove(int x, int y)
-{
-	int xx = x;
-	int yy = y;
-  TransformSizerToActual(&xx, &yy);
-  Move(xx, yy);
 }
 
 // Only set the size/position of the constraint (if any)
 void wxWindow::SetSizeConstraint(int x, int y, int w, int h)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    if (x != -1)
-    {
-      constr->left.SetValue(x);
-      constr->left.SetDone(TRUE);
-    }
-    if (y != -1)
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
     {
-      constr->top.SetValue(y);
-      constr->top.SetDone(TRUE);
-    }
-    if (w != -1)
-    {
-      constr->width.SetValue(w);
-      constr->width.SetDone(TRUE);
-    }
-    if (h != -1)
-    {
-      constr->height.SetValue(h);
-      constr->height.SetDone(TRUE);
+        if ( x != -1 )
+        {
+            constr->left.SetValue(x);
+            constr->left.SetDone(TRUE);
+        }
+        if ( y != -1 )
+        {
+            constr->top.SetValue(y);
+            constr->top.SetDone(TRUE);
+        }
+        if ( w != -1 )
+        {
+            constr->width.SetValue(w);
+            constr->width.SetDone(TRUE);
+        }
+        if ( h != -1 )
+        {
+            constr->height.SetValue(h);
+            constr->height.SetDone(TRUE);
+        }
     }
-  }
 }
 
 void wxWindow::MoveConstraint(int x, int y)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    if (x != -1)
-    {
-      constr->left.SetValue(x);
-      constr->left.SetDone(TRUE);
-    }
-    if (y != -1)
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
     {
-      constr->top.SetValue(y);
-      constr->top.SetDone(TRUE);
+        if ( x != -1 )
+        {
+            constr->left.SetValue(x);
+            constr->left.SetDone(TRUE);
+        }
+        if ( y != -1 )
+        {
+            constr->top.SetValue(y);
+            constr->top.SetDone(TRUE);
+        }
     }
-  }
 }
 
 void wxWindow::GetSizeConstraint(int *w, int *h) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *w = constr->width.GetValue();
-    *h = constr->height.GetValue();
-  }
-  else
-    GetSize(w, h);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *w = constr->width.GetValue();
+        *h = constr->height.GetValue();
+    }
+    else
+        GetSize(w, h);
 }
 
 void wxWindow::GetClientSizeConstraint(int *w, int *h) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *w = constr->width.GetValue();
-    *h = constr->height.GetValue();
-  }
-  else
-    GetClientSize(w, h);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *w = constr->width.GetValue();
+        *h = constr->height.GetValue();
+    }
+    else
+        GetClientSize(w, h);
 }
 
 void wxWindow::GetPositionConstraint(int *x, int *y) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *x = constr->left.GetValue();
-    *y = constr->top.GetValue();
-  }
-  else
-    GetPosition(x, y);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *x = constr->left.GetValue();
+        *y = constr->top.GetValue();
+    }
+    else
+        GetPosition(x, y);
 }
 
+#endif // wxUSE_CONSTRAINTS
+
 bool wxWindow::Close(bool force)
 {
   wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId);
@@ -1141,10 +1630,23 @@ void wxWindow::OnDefaultAction(wxControl *initiatingItem)
 
 void wxWindow::Clear()
 {
-	wxClientDC dc(this);
+	if ( m_macWindowData )
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		int w ,h ;
+		wxPoint origin = GetClientAreaOrigin() ;
+		GetClientSize( &w , &h ) ;
+		UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+		Rect r = { origin.y , origin.x, origin.y+h , origin.x+w } ;
+		EraseRect( &r ) ;
+	}
+	else
+	{
+		wxClientDC dc(this);
     wxBrush brush(GetBackgroundColour(), wxSOLID);
     dc.SetBackground(brush);
     dc.Clear();
+	}
 }
 
 // Fits the panel around the items
@@ -1221,20 +1723,18 @@ wxWindow *wxWindow::FindWindow(const wxString& name)
 
 void wxWindow::OnIdle(wxIdleEvent& event)
 {
-/* TODO: you may need to do something like this
- * if your GUI doesn't generate enter/leave events
-
-    // Check if we need to send a LEAVE event
-    if (m_mouseInWindow)
-    {
-        POINT pt;
-        ::GetCursorPos(&pt);
-        if (::WindowFromPoint(pt) != (HWND) GetHWND())
-        {
-            // Generate a LEAVE event
-            m_mouseInWindow = FALSE;
-            MSWOnMouseLeave(pt.x, pt.y, 0);
-        }
+/*
+   // Check if we need to send a LEAVE event
+   if (m_mouseInWindow)
+   {
+       POINT pt;
+       ::GetCursorPos(&pt);
+       if (::WindowFromPoint(pt) != (HWND) GetHWND())
+       {
+           // Generate a LEAVE event
+           m_mouseInWindow = FALSE;
+           MSWOnMouseLeave(pt.x, pt.y, 0);
+       }
     }
 */
 
@@ -1257,7 +1757,7 @@ void wxWindow::Lower()
 
 bool wxWindow::AcceptsFocus() const
 {
-  return IsShown() && IsEnabled();
+  return IsShown() && IsEnabled() && MacCanFocus() ;
 }
 
 // Update region access
@@ -1292,4 +1792,818 @@ int wxWindow::NewControlId()
     return s_controlId;
 }
 
+void wxWindow::DoSetClientSize(int width, int height)
+{
+	if ( width != -1 || height != -1 )
+	{
+		
+		if ( width != -1 && m_vScrollBar )
+			width += MAC_SCROLLBAR_SIZE ;
+		if ( height != -1 && m_vScrollBar )
+			height += MAC_SCROLLBAR_SIZE ;
+
+		DoSetSize( -1 , -1 , width , height ) ;
+	}
+}
+
+// ------------------------
+wxList *wxWinMacWindowList = NULL;
+wxWindow *wxFindWinFromMacWindow(WindowRef inWindowRef)
+{
+    wxNode *node = wxWinMacWindowList->Find((long)inWindowRef);
+    if (!node)
+        return NULL;
+    return (wxWindow *)node->Data();
+}
+
+void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxWindow *win)
+{
+    // adding NULL WindowRef is (first) surely a result of an error and
+    // (secondly) breaks menu command processing
+    wxCHECK_RET( inWindowRef != (WindowRef) NULL, "attempt to add a NULL WindowRef to window list" );
+
+    if ( !wxWinMacWindowList->Find((long)inWindowRef) )
+        wxWinMacWindowList->Append((long)inWindowRef, win);
+}
+
+void wxRemoveMacWindowAssociation(wxWindow *win)
+{
+    wxWinMacWindowList->DeleteObject(win);
+}
+
+wxWindow* wxWindow::s_lastMouseWindow = NULL ;
+
+bool wxWindow::MacGetWindowFromPointSub( const wxPoint &point , wxWindow** outWin ) 
+{
+	if ((point.x < m_x) || (point.y < m_y) ||
+		(point.x > (m_x + m_width)) || (point.y > (m_y + m_height)))
+		return FALSE;
+	
+	WindowRef window = GetMacRootWindow() ;
+
+	wxPoint newPoint( point ) ;
+
+	newPoint.x -= m_x;
+	newPoint.y -= m_y;
+	
+	if ( m_children )
+	{
+		for (wxNode *node = m_children->First(); node; node = node->Next())
+		{
+			wxWindow *child = (wxWindow*)node->Data();
+			if ( child->GetMacRootWindow() == window )
+			{
+				if (child->MacGetWindowFromPointSub(newPoint , outWin ))
+					return TRUE;
+			}
+		}
+	}
+
+	*outWin = this ;
+	return TRUE;
+}
+
+bool wxWindow::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindow** outWin ) 
+{
+	WindowRef window ;
+	Point pt = { screenpoint.y , screenpoint.x } ;
+	if ( ::FindWindow( pt , &window ) == 3 )
+	{
+			wxPoint point( screenpoint ) ;
+			wxWindow* win = wxFindWinFromMacWindow( window ) ;
+			win->ScreenToClient( point ) ;
+			return win->MacGetWindowFromPointSub( point , outWin ) ;
+	}
+	return FALSE ;
+}
+
+extern int wxBusyCursorCount ;
+
+bool wxWindow::MacDispatchMouseEvent(wxMouseEvent& event)
+{
+	if ((event.m_x < m_x) || (event.m_y < m_y) ||
+		(event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height)))
+		return FALSE;
+	
+	if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) )
+		return FALSE ; 
+	
+	WindowRef window = GetMacRootWindow() ;
+
+	event.m_x -= m_x;
+	event.m_y -= m_y;
+	
+	int x = event.m_x ;
+	int y = event.m_y ;
+
+	if ( m_children )
+	{
+		for (wxNode *node = m_children->First(); node; node = node->Next())
+		{
+			wxWindow *child = (wxWindow*)node->Data();
+			if ( child->GetMacRootWindow() == window && child->IsReallyShown() && child->IsReallyEnabled() )
+			{
+				if (child->MacDispatchMouseEvent(event))
+					return TRUE;
+			}
+		}
+	}
+
+	event.m_x = x ;
+	event.m_y = y ;
+	
+	if ( wxBusyCursorCount == 0 )
+	{
+		m_windowCursor.MacInstall() ;
+	}
+	GetEventHandler()->ProcessEvent( event ) ;
+	return TRUE;
+}
+
+void wxWindow::MacFireMouseEvent( EventRecord *ev )
+{
+	wxMouseEvent event(wxEVT_LEFT_DOWN);
+	bool isDown = !(ev->modifiers & btnState) ; // 1 is for up
+	bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse
+	
+	event.m_leftDown = isDown && !controlDown;
+	event.m_middleDown = FALSE;
+	event.m_rightDown = isDown && controlDown;
+
+	if ( ev->what == mouseDown )
+	{
+		if ( controlDown )
+			event.SetEventType(wxEVT_RIGHT_DOWN ) ;
+		else
+			event.SetEventType(wxEVT_LEFT_DOWN ) ;
+	}
+	else if ( ev->what == mouseUp )
+	{
+		if ( controlDown )
+			event.SetEventType(wxEVT_RIGHT_UP ) ;
+		else
+			event.SetEventType(wxEVT_LEFT_UP ) ;
+	}
+	else
+	{
+		event.SetEventType(wxEVT_MOTION ) ;
+	}
+
+	event.m_shiftDown = ev->modifiers & shiftKey;
+	event.m_controlDown = ev->modifiers & controlKey;
+	event.m_altDown = ev->modifiers & optionKey;
+	event.m_metaDown = ev->modifiers & cmdKey;
+
+	Point		localwhere = ev->where ;
+		
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( m_macWindowData->m_macWindow ) ) ;
+	::GlobalToLocal( &localwhere ) ;
+	::SetPort( port ) ;
+
+	event.m_x = localwhere.h;
+	event.m_y = localwhere.v;
+	event.m_x += m_x;
+	event.m_y += m_y;
+
+/*
+	wxPoint origin = GetClientAreaOrigin() ;
+
+	event.m_x += origin.x ;
+	event.m_y += origin.y ;
+*/
+	
+	event.m_timeStamp = ev->when;
+	event.SetEventObject(this);
+	if ( wxTheApp->s_captureWindow )
+	{
+		int x = event.m_x ;
+		int y = event.m_y ;
+		wxTheApp->s_captureWindow->ScreenToClient( &x , &y ) ;
+		event.m_x = x ;
+		event.m_y = y ;
+		wxTheApp->s_captureWindow->GetEventHandler()->ProcessEvent( event ) ;
+		if ( ev->what == mouseUp )
+		{
+			wxTheApp->s_captureWindow = NULL ;
+			if ( wxBusyCursorCount == 0 )
+			{
+				m_windowCursor.MacInstall() ;
+			}
+		}
+	}
+	else
+	{
+		MacDispatchMouseEvent( event ) ;
+	}
+}
+
+void wxWindow::MacMouseDown( EventRecord *ev , short part)
+{
+	MacFireMouseEvent( ev ) ;
+}
+
+void wxWindow::MacMouseUp( EventRecord *ev , short part)
+{
+	WindowPtr frontWindow ;
+	switch (part)
+	{
+		case inContent:		
+			{
+				MacFireMouseEvent( ev ) ;
+			}
+			break ;
+	}
+}
+
+void wxWindow::MacMouseMoved( EventRecord *ev , short part)
+{
+	WindowPtr frontWindow ;
+	switch (part)
+	{
+		case inContent:		
+			{
+				MacFireMouseEvent( ev ) ;
+			}
+			break ;
+	}
+}
+void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating )
+{
+	wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating);
+	event.m_timeStamp = ev->when ;
+	event.SetEventObject(this);
+	
+	GetEventHandler()->ProcessEvent(event);
+	
+	UMAHighlightAndActivateWindow( m_macWindowData->m_macWindow , inIsActivating ) ;
+}
+
+void wxWindow::MacRedraw( RgnHandle updatergn , long time)
+{
+	// updatergn is always already clipped to our boundaries
+	WindowRef window = GetMacRootWindow() ;
+	wxWindow* win = wxFindWinFromMacWindow( window ) ;
+	{
+		wxMacDrawingClientHelper focus( this ) ;
+		if ( focus.Ok() )
+		{
+			WindowRef window = GetMacRootWindow() ;
+			if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
+			{
+					UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
+			}
+			else if (  m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+			{
+					// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
+					// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
+					// either a non gray background color or a non control window
+		
+
+					wxWindow* parent = GetParent() ;
+					while( parent )
+					{
+						if ( parent->GetMacRootWindow() != window )
+						{
+							// we are in a different window on the mac system
+							parent = NULL ;
+							break ;
+						}
+						
+						if( parent->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)parent)->GetMacControl() )
+						{
+							if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+							{
+								// if we have any other colours in the hierarchy
+			  				RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+			  				break ;
+							}
+							// if we have the normal colours in the hierarchy but another control etc. -> use it's background
+							if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+							{
+								ApplyThemeBackground			(kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
+								break ;
+							}
+						}
+						else
+						{
+							parent = NULL ;
+							break ;
+						}
+						parent = parent->GetParent() ;
+					}
+					if ( !parent )
+					{
+						// if there is nothing special -> use default
+						UMASetThemeWindowBackground( window , kThemeBrushDialogBackgroundActive , false ) ;
+					}
+			}
+			else
+			{
+		  		RGBBackColor( &m_backgroundColour.GetPixel()) ;
+			}
+			SetClip( updatergn ) ;
+			EraseRgn( updatergn ) ;	
+		}
+	}
+
+	
+	m_updateRegion = updatergn ;
+	wxPaintEvent event;
+	event.m_timeStamp = time ;
+	event.SetEventObject(this);
+	
+	GetEventHandler()->ProcessEvent(event);
+	
+	RgnHandle childupdate = NewRgn() ;
+
+	for (wxNode *node = m_children->First(); node; node = node->Next())
+	{
+		wxWindow *child = (wxWindow*)node->Data();
+		int width ;
+		int height ;
+		
+		child->GetClientSize( &width , &height ) ;
+		
+		SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x +width ,  child->m_y + height ) ;
+		SectRgn( childupdate , m_updateRegion.GetWXHRGN() , childupdate ) ;
+		OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
+		if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+		{
+			// because dialogs may also be children
+			child->MacRedraw( childupdate , time ) ;
+		}
+	}
+	DisposeRgn( childupdate ) ;
+	// eventually a draw grow box here
+}
+
+void wxWindow::MacUpdateImmediately()
+{
+	WindowRef window = GetMacRootWindow() ;
+	if ( window )
+	{
+		wxWindow* win = wxFindWinFromMacWindow( window ) ;
+		BeginUpdate( window ) ;
+		if ( win )
+		{
+		#if ! TARGET_CARBON
+			if ( !EmptyRgn( window->visRgn ) )
+		#endif
+			{
+				win->MacRedraw( window->visRgn , wxTheApp->sm_lastMessageTime ) ;
+/*
+				{
+					wxMacDrawingHelper help( win ) ;
+					SetOrigin( 0 , 0 ) ;
+					UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+					UMAUpdateControls( window , window->visRgn ) ;
+					UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+				}
+*/
+			}
+		}
+		EndUpdate( window ) ;
+	}
+}
+
+void wxWindow::MacUpdate( EventRecord *ev )
+{
+	WindowRef window = (WindowRef) ev->message ;
+	wxWindow * win = wxFindWinFromMacWindow( window ) ;
+	
+	BeginUpdate( window ) ;
+	if ( win )
+	{
+		// if windowshade gives incompatibility , take the follwing out
+		#if ! TARGET_CARBON
+		if ( !EmptyRgn( window->visRgn ) )
+		#endif
+		{
+			MacRedraw( window->visRgn , ev->when ) ;
+			/*
+			{
+				wxMacDrawingHelper help( this ) ;
+				SetOrigin( 0 , 0 ) ;
+				UMASetThemeWindowBackground( m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+				UMAUpdateControls( window , window->visRgn ) ;
+				UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+			}
+			*/
+		}
+	}
+	EndUpdate( window ) ;
+}
+
+WindowRef wxWindow::GetMacRootWindow() const
+{
+	WindowRef window = NULL ;
+	wxWindow *iter = (wxWindow*)this ;
+	
+	while( iter )
+	{
+		if ( iter->m_macWindowData )
+			return iter->m_macWindowData->m_macWindow ;
+
+		iter = iter->GetParent() ;
+	} 
+	wxASSERT_MSG( 1 , "No valid mac root window" ) ;
+	return NULL ;
+}
+
+void wxWindow::MacCreateScrollBars( long style ) 
+{
+	wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ;
+	bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ;
+	int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ;
+	
+	if ( style & wxVSCROLL )
+	{
+		m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, wxPoint(m_width-MAC_SCROLLBAR_SIZE, 0), 
+			wxSize(MAC_SCROLLBAR_SIZE, m_height - adjust), wxVERTICAL);
+	}
+	if ( style  & wxHSCROLL )
+	{
+		m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, wxPoint(0 , m_height-MAC_SCROLLBAR_SIZE ), 
+			wxSize( m_width - adjust, MAC_SCROLLBAR_SIZE), wxHORIZONTAL);
+	}
+	// because the create does not take into account the client area origin
+	MacRepositionScrollBars() ; // we might have a real position shift
+}
+
+void wxWindow::MacRepositionScrollBars()
+{
+	bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ;
+	int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ;
+	
+	if ( m_vScrollBar )
+	{
+		m_vScrollBar->SetSize( m_width-MAC_SCROLLBAR_SIZE, 0, MAC_SCROLLBAR_SIZE, m_height - adjust , wxSIZE_USE_EXISTING);
+	}
+	if ( m_hScrollBar )
+	{
+		m_hScrollBar->SetSize( 0 , m_height-MAC_SCROLLBAR_SIZE ,m_width - adjust, MAC_SCROLLBAR_SIZE, wxSIZE_USE_EXISTING);
+	}
+}
+
+void wxWindow::MacKeyDown( EventRecord *ev ) 
+{
+}
+
+
+
+
+ControlHandle wxWindow::MacGetContainerForEmbedding() 
+{
+	if ( m_macWindowData )
+		return m_macWindowData->m_macRootControl ;
+	else
+		return GetParent()->MacGetContainerForEmbedding() ;
+}
+
+void wxWindow::MacSuperChangedPosition() 
+{
+	// only window-absolute structures have to be moved i.e. controls
+
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		child->MacSuperChangedPosition() ;
+		node = node->Next();
+	}
+}
+
+bool wxWindow::IsReallyShown() const
+{
+	if ( m_macWindowData )
+		return m_macShown ;
+	else
+		return m_macShown && GetParent()->IsReallyShown() ;
+}
+
+bool wxWindow::IsReallyEnabled() const
+{
+	if ( m_macWindowData )
+		return m_macEnabled ;
+	else
+		return m_macEnabled && GetParent()->IsReallyEnabled() ;
+}
+
+void wxWindow::MacSuperEnabled( bool enabled ) 
+{
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		if ( child->m_macEnabled )
+			child->MacSuperEnabled( enabled ) ;
+		node = node->Next();
+	}
+}
+void wxWindow::MacSuperShown( bool show ) 
+{
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		if ( child->m_macShown )
+			child->MacSuperShown( show ) ;
+		node = node->Next();
+	}
+}
+	
+bool wxWindow::MacSetupFocusPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupFocusClientPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupDrawingPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupDrawingClientPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+
+bool wxWindow::MacSetPortFocusParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win ) 
+{
+	if ( window == NULL )
+		return false ;
+		
+	GrafPtr currPort;
+	GrafPtr port ;
+
+	::GetPort(&currPort);
+	port = UMAGetWindowPort( window) ;
+	if (currPort != port )
+			::SetPort(port);
+				
+	::SetOrigin(-localOrigin.h, -localOrigin.v);
+	return true;			
+}
+
+bool wxWindow::MacSetPortDrawingParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win ) 
+{
+	if ( window == NULL )
+		return false ;
+		
+	GrafPtr currPort;
+	GrafPtr port ;
+	::GetPort(&currPort);
+	port = UMAGetWindowPort( window) ;
+	if (currPort != port )
+			::SetPort(port);
+				
+	::SetOrigin(-localOrigin.h, -localOrigin.v);
+	::ClipRect(&clipRect);
+
+	::PenNormal() ;
+	::RGBBackColor(& win->GetBackgroundColour().GetPixel() ) ;
+	::RGBForeColor(& win->GetForegroundColour().GetPixel() ) ;
+	::BackPat( &qd.white ) ;
+	::UMASetThemeWindowBackground(  win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme ,  false ) ;
+	return true;			
+}
+
+void wxWindow::MacGetPortParams(Point* localOrigin, Rect* clipRect, WindowRef *window  , wxWindow** rootwin) 
+{
+	if ( m_macWindowData )
+	{
+		localOrigin->h = 0;
+		localOrigin->v = 0;
+		clipRect->left = 0;
+		clipRect->top = 0;
+		clipRect->right = m_width;
+		clipRect->bottom = m_height;
+		*window = m_macWindowData->m_macWindow ;
+		*rootwin = this ;
+	}
+	else
+	{
+		wxASSERT( GetParent() != NULL ) ;
+		GetParent()->MacGetPortParams( localOrigin , clipRect , window, rootwin) ;
+		localOrigin->h += m_x;
+		localOrigin->v += m_y;
+		OffsetRect(clipRect, -m_x, -m_y);
+	
+		Rect myClip;
+		myClip.left = 0;
+		myClip.top = 0;
+		myClip.right = m_width;
+		myClip.bottom = m_height;
+		SectRect(clipRect, &myClip, clipRect);
+	}
+}
+
+void wxWindow::MacGetPortClientParams(Point* localOrigin, Rect* clipRect, WindowRef *window , wxWindow** rootwin ) 
+{
+	int width , height ;
+	GetClientSize( &width , &height ) ;
+	
+	if ( m_macWindowData )
+	{
+		localOrigin->h = 0;
+		localOrigin->v = 0;
+		clipRect->left = 0;
+		clipRect->top = 0;
+		clipRect->right = m_width ;//width;
+		clipRect->bottom = m_height ;// height;
+		*window = m_macWindowData->m_macWindow ;
+		*rootwin = this ;
+	}
+	else
+	{
+		wxASSERT( GetParent() != NULL ) ;
+		
+		GetParent()->MacGetPortClientParams( localOrigin , clipRect , window, rootwin) ;
+
+		localOrigin->h += m_x;
+		localOrigin->v += m_y;
+		OffsetRect(clipRect, -m_x, -m_y);
+	
+		Rect myClip;
+		myClip.left = 0;
+		myClip.top = 0;
+		myClip.right = width;
+		myClip.bottom = height;
+		SectRect(clipRect, &myClip, clipRect);
+	}
+}
+
+wxMacFocusHelper::wxMacFocusHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	GetPort( &m_formerPort ) ;
+	if ( theWindow )
+	{
+	
+		theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacFocusHelper::~wxMacFocusHelper() 
+{
+	if ( m_ok )
+	{
+		SetOrigin( 0 , 0 ) ;
+	}
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacDrawingHelper::wxMacDrawingHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+	if ( theWindow )
+	{
+		theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		if ( m_formerPort != m_currentPort )
+			SetPort( m_currentPort ) ;
+		GetPenState( &m_savedPenState ) ;
+		theWindow->MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacDrawingHelper::~wxMacDrawingHelper() 
+{
+	if ( m_ok )
+	{
+		SetPenState( &m_savedPenState ) ;
+		SetOrigin( 0 , 0 ) ;
+		ClipRect( &m_currentPort->portRect ) ;
+	}
+		
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacFocusClientHelper::wxMacFocusClientHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+
+	if ( theWindow )
+	{
+		theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacFocusClientHelper::~wxMacFocusClientHelper() 
+{
+	if ( m_ok )
+	{
+		SetOrigin( 0 , 0 ) ;
+	}
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacDrawingClientHelper::wxMacDrawingClientHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+
+	if ( theWindow )
+	{
+		theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		if ( m_formerPort != m_currentPort )
+			SetPort( m_currentPort ) ;
+		GetPenState( &m_savedPenState ) ;
+		theWindow->MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacDrawingClientHelper::~wxMacDrawingClientHelper() 
+{
+	if ( m_ok )
+	{
+		SetPenState( &m_savedPenState ) ;
+		SetOrigin( 0 , 0 ) ;
+		ClipRect( &m_currentPort->portRect ) ;
+	}
+		
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+// ----------------------------------------------------------------------------
+// list classes implementation
+// ----------------------------------------------------------------------------
+
+void wxWindowListNode::DeleteData()
+{
+    delete (wxWindow *)GetData();
+}
 
diff --git a/src/mac/checkbox.cpp b/src/mac/checkbox.cpp
index dd2e2abe7a..ca99c4b778 100644
--- a/src/mac/checkbox.cpp
+++ b/src/mac/checkbox.cpp
@@ -20,6 +20,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl)
 IMPLEMENT_DYNAMIC_CLASS(wxBitmapCheckBox, wxCheckBox)
 #endif
 
+#include <wx/mac/uma.h>
+
 // Single check box item
 bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxPoint& pos,
@@ -27,41 +29,27 @@ bool wxCheckBox::Create(wxWindow *parent, wxWindowID id, const wxString& label,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-        m_windowId = NewControlId();
-    else
-        m_windowId = id;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, validator , name , &bounds , title ) ;
 
-    // TODO: create checkbox
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlCheckBoxProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
 
-    return FALSE;
-}
-
-void wxCheckBox::SetLabel(const wxString& label)
-{
-    // TODO
-}
-
-void wxCheckBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+  return TRUE;
 }
 
 void wxCheckBox::SetValue(bool val)
 {
-    // TODO
+   ::SetControlValue( m_macControl , val ) ;
 }
 
 bool wxCheckBox::GetValue() const
 {
-    // TODO
-    return FALSE;
+    return ::GetControlValue( m_macControl ) ;
 }
 
 void wxCheckBox::Command (wxCommandEvent & event)
@@ -70,6 +58,11 @@ void wxCheckBox::Command (wxCommandEvent & event)
     ProcessCommand (event);
 }
 
+void wxCheckBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	SetValue( !GetValue() ) ;
+}
+
 // Bitmap checkbox
 bool wxBitmapCheckBox::Create(wxWindow *parent, wxWindowID id, const wxBitmap *label,
            const wxPoint& pos,
@@ -100,7 +93,7 @@ void wxBitmapCheckBox::SetLabel(const wxBitmap *bitmap)
 
 void wxBitmapCheckBox::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxBitmapCheckBox::SetValue(bool val)
diff --git a/src/mac/choice.cpp b/src/mac/choice.cpp
index a584d5303f..da3c4efc92 100644
--- a/src/mac/choice.cpp
+++ b/src/mac/choice.cpp
@@ -15,6 +15,7 @@
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/choice.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
@@ -23,71 +24,103 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
 bool wxChoice::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos,
            const wxSize& size,
-		   int n, const wxString choices[],
-		   long style,
+		   		int n, const wxString choices[],
+		   		long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
     m_noStrings = n;
-    m_windowStyle = style;
 
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-    	m_windowId = (int)NewControlId();
-    else
-	m_windowId = id;
-
-    // TODO: create choice control
-    return FALSE;
+		Rect bounds ;
+		Str255 title ;
+	
+		MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+	
+		m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0, 
+	  	kControlPopupButtonProc , (long) this ) ; 
+	
+		m_macPopUpMenuHandle =  NewMenu( 1 , "\pPopUp Menu" ) ;
+		SetControlData( m_macControl , kControlNoPart , kControlPopupButtonMenuHandleTag , sizeof( MenuHandle ) , (char*) &m_macPopUpMenuHandle) ;
+		for ( int i = 0 ; i < n ; i++ )
+		{
+			appendmenu( m_macPopUpMenuHandle , choices[i] ) ;
+		}
+		SetControlMinimum( m_macControl , 0 ) ;
+		SetControlMaximum( m_macControl , m_noStrings) ;
+		SetControlValue( m_macControl , 1 ) ;
+
+		MacPostControlCreate() ;
+
+  	return TRUE;
 }
 
 void wxChoice::Append(const wxString& item)
 {
-    // TODO
+	appendmenu( m_macPopUpMenuHandle , item ) ;
     m_noStrings ++;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxChoice::Delete(int n)
 {
-    // TODO
+	wxASSERT( n < m_noStrings ) ;
+    ::DeleteMenuItem( m_macPopUpMenuHandle , n + 1) ;
     m_noStrings --;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxChoice::Clear()
 {
-    // TODO
+    for ( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	::DeleteMenuItem( m_macPopUpMenuHandle , 1 ) ;
+	}
     m_noStrings = 0;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 int wxChoice::GetSelection() const
 {
-    // TODO
-    return 0;
+    return GetControlValue( m_macControl ) -1 ;
 }
 
+void wxChoice::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+    wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, m_windowId );
+	event.SetInt(GetSelection());
+    event.SetEventObject(this);
+    event.SetString(copystring(GetStringSelection()));
+    ProcessCommand(event);
+    delete[] event.GetString();
+}
+
+
 void wxChoice::SetSelection(int n)
 {
-    // TODO
+    SetControlValue( m_macControl , n + 1 ) ;
 }
 
 int wxChoice::FindString(const wxString& s) const
 {
-    // TODO
-    return 0;
+    for( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	if ( GetString( i ) == s )
+    		return i ; 
+    }
+    return -1;
 }
 
 wxString wxChoice::GetString(int n) const
 {
-    // TODO
-    return wxString("");
+	Str255 text ;
+    ::GetMenuItemText( m_macPopUpMenuHandle , n+1 , text ) ;
+    p2cstr( text ) ;
+    return wxString( text );
 }
 
 void wxChoice::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+  wxControl::SetSize( x,y,width,height,sizeFlags ) ;
 }
 
 wxString wxChoice::GetStringSelection () const
diff --git a/src/mac/clipbrd.cpp b/src/mac/clipbrd.cpp
index 3fe9ebfb72..28a4b9ef3f 100644
--- a/src/mac/clipbrd.cpp
+++ b/src/mac/clipbrd.cpp
@@ -30,19 +30,17 @@ IMPLEMENT_ABSTRACT_CLASS(wxClipboardClient, wxObject)
 
 bool wxOpenClipboard()
 {
-    // TODO
-    return FALSE;
+    return TRUE;
 }
 
 bool wxCloseClipboard()
 {
-    // TODO
     return FALSE;
 }
 
 bool wxEmptyClipboard()
 {
-    // TODO
+		ZeroScrap() ;
     return FALSE;
 }
 
@@ -169,7 +167,7 @@ wxClipboardClient *wxClipboard::GetClipboardClient()
 }
 
 void wxClipboard::SetClipboardString(char *str, long time)
-{
+{/*
   bool got_selection;
 
   if (clipOwner) {
@@ -195,6 +193,7 @@ void wxClipboard::SetClipboardString(char *str, long time)
     delete[] cbString;
     cbString = NULL;
   }
+  */
 }
 
 char *wxClipboard::GetClipboardString(long time)
diff --git a/src/mac/colordlg.cpp b/src/mac/colordlg.cpp
index 2275a9a39d..c6037a9f96 100644
--- a/src/mac/colordlg.cpp
+++ b/src/mac/colordlg.cpp
@@ -14,7 +14,7 @@
 #pragma implementation "colordlg.h"
 #endif
 
-#include "wx/stubs/colordlg.h"
+#include "wx/mac/colordlg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxColourDialog, wxDialog)
@@ -45,8 +45,20 @@ bool wxColourDialog::Create(wxWindow *parent, wxColourData *data)
 
 int wxColourDialog::ShowModal()
 {
-    /* TODO: implement dialog
-     */
+	Point where ;
+	RGBColor currentColor = m_colourData.dataColour.GetPixel() , newColor ;
+	
+	where.h = where.v = -1;
+
+	if (GetColor( where, "\pSelect a new palette color.", &currentColor, &newColor ))
+	{
+		m_colourData.dataColour.Set( newColor ) ;
+    	return wxID_OK;
+	}
+	else
+	{
+    	return wxID_CANCEL;
+	}
 
     return wxID_CANCEL;
 }
diff --git a/src/mac/colour.cpp b/src/mac/colour.cpp
index 8d0827ef1d..cc549b5f11 100644
--- a/src/mac/colour.cpp
+++ b/src/mac/colour.cpp
@@ -22,13 +22,20 @@ IMPLEMENT_DYNAMIC_CLASS(wxColour, wxObject)
 
 // Colour
 
+static void wxComposeRGBColor( RGBColor * col , int red, int blue, int green ) ;
+static void wxComposeRGBColor( RGBColor * col , int red, int blue, int green ) 
+{
+	col->red = (red << 8) + red;
+	col->blue = (blue << 8) + blue;
+	col->green = (green << 8) + green;
+}
+
 wxColour::wxColour ()
 {
-    m_isInit = FALSE;
-    m_red = m_blue = m_green = 0;
-/* TODO
-    m_pixel = 0;
-*/
+  m_isInit = FALSE;
+  m_red = m_blue = m_green = 0;
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::wxColour (unsigned char r, unsigned char g, unsigned char b)
@@ -37,9 +44,8 @@ wxColour::wxColour (unsigned char r, unsigned char g, unsigned char b)
     m_green = g;
     m_blue = b;
     m_isInit = TRUE;
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::wxColour (const wxColour& col)
@@ -48,9 +54,18 @@ wxColour::wxColour (const wxColour& col)
     m_green = col.m_green;
     m_blue = col.m_blue;
     m_isInit = col.m_isInit;
-/* TODO
+
     m_pixel = col.m_pixel;
-*/
+}
+
+wxColour::wxColour (const wxColour* col)
+{
+    m_red = col->m_red;
+    m_green = col->m_green;
+    m_blue = col->m_blue;
+    m_isInit = col->m_isInit;
+
+    m_pixel = col->m_pixel;
 }
 
 wxColour& wxColour::operator =(const wxColour& col)
@@ -59,9 +74,9 @@ wxColour& wxColour::operator =(const wxColour& col)
   m_green = col.m_green;
   m_blue = col.m_blue;
   m_isInit = col.m_isInit;
-/* TODO
+ 
   m_pixel = col.m_pixel;
-*/
+
   return *this;
 }
 
@@ -82,9 +97,8 @@ void wxColour::InitFromName(const wxString& col)
         m_blue = 0;
         m_isInit = FALSE;
     }
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
 
 wxColour::~wxColour ()
@@ -97,7 +111,6 @@ void wxColour::Set (unsigned char r, unsigned char g, unsigned char b)
     m_green = g;
     m_blue = b;
     m_isInit = TRUE;
-/* TODO
-    m_pixel = PALETTERGB (m_red, m_green, m_blue);
-*/
+
+	wxComposeRGBColor( &m_pixel , m_red , m_blue , m_green ) ;
 }
diff --git a/src/mac/combobox.cpp b/src/mac/combobox.cpp
index 0be841bad4..905f3180aa 100644
--- a/src/mac/combobox.cpp
+++ b/src/mac/combobox.cpp
@@ -14,11 +14,15 @@
 #endif
 
 #include "wx/combobox.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
 #endif
 
+// right now we don't support editable comboboxes
+
+
 bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
            const wxString& value,
            const wxPoint& pos,
@@ -28,32 +32,39 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
     m_noStrings = n;
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-    	m_windowId = (int)NewControlId();
-    else
-	m_windowId = id;
-
-    // TODO: create combobox control
 
-    return TRUE;
+		Rect bounds ;
+		Str255 title ;
+	
+		MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+	
+		m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , -12345 , 0, 
+	  	kControlPopupButtonProc , (long) this ) ; 
+	
+		m_macPopUpMenuHandle =  NewMenu( 1 , "\pPopUp Menu" ) ;
+		SetControlData( m_macControl , kControlNoPart , kControlPopupButtonMenuHandleTag , sizeof( MenuHandle ) , (char*) &m_macPopUpMenuHandle) ;
+		for ( int i = 0 ; i < n ; i++ )
+		{
+			appendmenu( m_macPopUpMenuHandle , choices[i] ) ;
+		}
+		SetControlMinimum( m_macControl , 0 ) ;
+		SetControlMaximum( m_macControl , m_noStrings) ;
+		SetControlValue( m_macControl , 1 ) ;
+
+		MacPostControlCreate() ;
+
+  	return TRUE;
 }
 
 wxString wxComboBox::GetValue() const
 {
-    // TODO
-    return wxString("");
+    return GetStringSelection() ;
 }
 
 void wxComboBox::SetValue(const wxString& value)
 {
-    // TODO
+    SetStringSelection( value ) ;
 }
 
 // Clipboard operations
@@ -116,50 +127,85 @@ void wxComboBox::SetSelection(long from, long to)
 
 void wxComboBox::Append(const wxString& item)
 {
-    // TODO
+	appendmenu( m_macPopUpMenuHandle , item ) ;
+    m_noStrings ++;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxComboBox::Delete(int n)
 {
-    // TODO
+	wxASSERT( n < m_noStrings ) ;
+    ::DeleteMenuItem( m_macPopUpMenuHandle , n + 1) ;
+    m_noStrings --;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 void wxComboBox::Clear()
 {
-    // TODO
+    for ( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	::DeleteMenuItem( m_macPopUpMenuHandle , 1 ) ;
+	}
+    m_noStrings = 0;
+	SetControlMaximum( m_macControl , m_noStrings) ;
 }
 
 int wxComboBox::GetSelection() const
 {
-    // TODO
-    return -1;
+    return GetControlValue( m_macControl ) -1 ;
 }
 
 void wxComboBox::SetSelection(int n)
 {
-    // TODO
+    SetControlValue( m_macControl , n + 1 ) ;
 }
 
 int wxComboBox::FindString(const wxString& s) const
 {
-    // TODO
+    for( int i = 0 ; i < m_noStrings ; i++ )
+    {
+    	if ( GetString( i ) == s )
+    		return i ; 
+    }
     return -1;
 }
 
 wxString wxComboBox::GetString(int n) const
 {
-    // TODO
-    return wxString("");
+	Str255 text ;
+    ::GetMenuItemText( m_macPopUpMenuHandle , n+1 , text ) ;
+    p2cstr( text ) ;
+    return wxString( text );
 }
 
 wxString wxComboBox::GetStringSelection() const
 {
-    // TODO
-    return wxString("");
+    int sel = GetSelection ();
+    if (sel > -1)
+        return wxString(this->GetString (sel));
+    else
+        return wxString("");
 }
 
 bool wxComboBox::SetStringSelection(const wxString& sel)
 {
-    // TODO
-    return FALSE;
+    int s = FindString (sel);
+    if (s > -1)
+        {
+            SetSelection (s);
+            return TRUE;
+        }
+    else
+        return FALSE;
+}
+
+void wxComboBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+    wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_SELECTED, m_windowId );
+	event.SetInt(GetSelection());
+    event.SetEventObject(this);
+    event.SetString(copystring(GetStringSelection()));
+    ProcessCommand(event);
+    delete[] event.GetString();
 }
+
diff --git a/src/mac/control.cpp b/src/mac/control.cpp
index b141a80ff1..d570e2c5a1 100644
--- a/src/mac/control.cpp
+++ b/src/mac/control.cpp
@@ -14,20 +14,51 @@
 #endif
 
 #include "wx/control.h"
+#include "wx/notebook.h"
+#include "wx/tabctrl.h"
+#include "wx/spinbutt.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxControl, wxWindow)
 
 BEGIN_EVENT_TABLE(wxControl, wxWindow)
+	EVT_MOUSE_EVENTS( wxControl::OnMouseEvent ) 
+	EVT_CHAR( wxControl::OnKeyDown ) 
+	EVT_PAINT( wxControl::OnPaint ) 
 END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
 // Item members
+
+ControlActionUPP wxMacLiveScrollbarActionUPP = NULL ;
+
+pascal void wxMacLiveScrollbarActionProc( ControlHandle control , ControlPartCode partCode )
+{
+	if ( partCode != 0)
+	{
+		wxControl*	wx = (wxControl*) GetControlReference( control ) ;
+		if ( wx )
+		{
+			wx->MacHandleControlClick( control , partCode ) ;
+		}
+	}
+}
+
 wxControl::wxControl()
 {
+		m_macControl = NULL ;
+		m_macHorizontalBorder = 0 ; // additional pixels around the real control
+		m_macVerticalBorder = 0 ;
     m_backgroundColour = *wxWHITE;
     m_foregroundColour = *wxBLACK;
     m_callback = 0;
+
+	if ( wxMacLiveScrollbarActionUPP == NULL )
+	{
+		wxMacLiveScrollbarActionUPP = NewControlActionProc( wxMacLiveScrollbarActionProc ) ;
+	}
 }
 
 wxControl::~wxControl()
@@ -40,17 +71,31 @@ wxControl::~wxControl()
         if (parent->GetDefaultItem() == (wxButton*) this)
             parent->SetDefaultItem(NULL);
     }
+    if ( m_macControl )
+    {
+    	UMADisposeControl( m_macControl ) ;
+    	m_macControl = NULL ;
+    }
 }
 
 void wxControl::SetLabel(const wxString& label)
 {
-    // TODO
+	m_label = label ;
+
+	if ( m_macControl )
+	{
+		Str255 maclabel ;
+		
+		strcpy( (char*) maclabel , label ) ;
+		c2pstr( (char*) maclabel ) ;
+	
+		::SetControlTitle( m_macControl , maclabel ) ;
+	}
 }
 
 wxString wxControl::GetLabel() const
 {
-    // TODO
-    return wxString("");
+    return m_label ;
 }
 
 void wxControl::ProcessCommand (wxCommandEvent & event)
@@ -93,3 +138,566 @@ void wxControl::Centre (int direction)
   SetSize (new_x, new_y, width, height);
 }
 
+void wxControl::SetClientSize (int width, int height)
+{
+  SetSize (-1, -1, width, height);
+}
+
+// ------------------------
+wxList *wxWinMacControlList = NULL;
+wxControl *wxFindControlFromMacControl(ControlHandle inControl )
+{
+    wxNode *node = wxWinMacControlList->Find((long)inControl);
+    if (!node)
+        return NULL;
+    return (wxControl *)node->Data();
+}
+
+void wxAssociateControlWithMacControl(ControlHandle inControl, wxControl *control)
+{
+    // adding NULL WindowRef is (first) surely a result of an error and
+    // (secondly) breaks menu command processing
+    wxCHECK_RET( inControl != (ControlHandle) NULL, "attempt to add a NULL WindowRef to window list" );
+
+    if ( !wxWinMacControlList->Find((long)inControl) )
+        wxWinMacControlList->Append((long)inControl, control);
+}
+
+void wxRemoveMacControlAssociation(wxControl *control)
+{
+    wxWinMacControlList->DeleteObject(control);
+}
+
+void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString label , 
+			 const wxPoint& pos,
+			 const wxSize& size, long style,
+			 const wxValidator& validator,
+			 const wxString& name , Rect *outBounds , StringPtr maclabel ) 
+{
+	m_label = label ;
+  SetName(name);
+  if ( &validator )
+  	SetValidator(validator);
+
+  m_windowStyle = style;
+  parent->AddChild((wxButton *)this);
+
+  m_backgroundColour = parent->GetBackgroundColour() ;
+  m_foregroundColour = parent->GetForegroundColour() ;
+
+  if (id == -1)
+      m_windowId = NewControlId();
+  else
+      m_windowId = id;
+
+	m_width = size.x ;
+	m_height = size.y ;
+	int x = pos.x ;
+	int y = pos.y ;
+	AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING);
+	m_x = x ;
+	m_y = y ;
+		
+
+	Point localOrigin ;
+	Rect	clipRect ;
+	
+	parent->MacClientToRootWindow( &x , &y ) ;
+	outBounds->top = y + m_macVerticalBorder ;
+	outBounds->left = x + m_macHorizontalBorder ;
+	outBounds->bottom = outBounds->top + m_height - 2 * m_macVerticalBorder;
+	outBounds->right = outBounds->left + m_width - 2 * m_macHorizontalBorder ;
+
+	strcpy( (char*) maclabel , label ) ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		wxMacConvertFromPCForControls( (char*) maclabel ) ;
+	}
+
+	c2pstr( (char*) maclabel ) ;
+}
+
+void wxControl::MacPostControlCreate()
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	
+	if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+	{
+		// no font
+	}
+	else if ( IsKindOf( CLASSINFO( wxStaticBox ) ) )
+	{
+		ControlFontStyleRec		controlstyle ;
+		controlstyle.flags = kControlUseFontMask ;
+		controlstyle.font = kControlFontSmallBoldSystemFont ;
+		
+		::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+	}
+	else
+	{
+		ControlFontStyleRec		controlstyle ;
+		controlstyle.flags = kControlUseFontMask ;
+		controlstyle.font = kControlFontSmallSystemFont ;
+		
+		::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+	}
+	ControlHandle container = GetParent()->MacGetContainerForEmbedding() ;
+	wxASSERT_MSG( container != NULL , "No valid mac container control" ) ;
+	::UMAEmbedControl( m_macControl , container ) ;
+	MacAdjustControlRect() ;
+	wxAssociateControlWithMacControl( m_macControl , this ) ;
+}
+
+void wxControl::MacAdjustControlRect() 
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+	if ( m_width == -1 || m_height == -1 )
+	{
+		Rect 	bestsize = { 0 , 0 , 0 , 0 } ;
+		short	baselineoffset ;
+		
+		UMAGetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ;
+
+		if ( EmptyRect( &bestsize ) )
+		{
+			baselineoffset = 0;
+			bestsize.left = bestsize.top = 0 ;
+			bestsize.right = 16 ;
+			bestsize.bottom = 16 ;
+			if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
+			{
+				bestsize.bottom = 16 ;
+			}
+			else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
+			{
+				bestsize.bottom = 24 ; 
+			}
+		}
+
+		if ( m_width == -1 )
+		{
+			if ( IsKindOf( CLASSINFO( wxButton ) ) )
+			{
+				m_width = m_label.Length() * 8 + 12 + 2 * m_macHorizontalBorder;
+			}
+			else if ( IsKindOf( CLASSINFO( wxStaticText ) ) )
+			{
+				m_width = m_label.Length() * 8 ;
+			}
+			else
+				m_width = bestsize.right - bestsize.left + 2 * m_macHorizontalBorder;
+		}
+		if ( m_height == -1 )
+		{
+			m_height = bestsize.bottom - bestsize.top ;
+			if ( m_height < 10 )
+				m_height = 13 ;
+
+			m_height += 2 * m_macVerticalBorder;
+		}
+		
+		wxMacDrawingHelper helper ( wxFindWinFromMacWindow( GetMacRootWindow() ) ) ;
+		if ( helper.Ok() )
+		{
+	    UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+  		}
+	}
+}
+ControlHandle wxControl::MacGetContainerForEmbedding() 
+{
+	if ( m_macControl )
+		return m_macControl ;
+
+	return wxWindow::MacGetContainerForEmbedding() ;
+}
+
+void wxControl::MacSuperChangedPosition() 
+{
+	if ( m_macControl )
+	{
+		int former_mac_x = (**m_macControl).contrlRect.left ;
+		int former_mac_y = (**m_macControl).contrlRect.top ;
+		int mac_x = m_x ;
+		int mac_y = m_y ;
+		GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ;
+		
+		WindowRef rootwindow = GetMacRootWindow() ;
+		wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
+		UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
+		wxMacDrawingHelper focus( wxrootwindow ) ;
+	
+		if ( mac_x != former_mac_x || mac_y != former_mac_y )
+		{
+			{
+				Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
+				InvalRect( &inval ) ;
+			}
+	  	UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ;
+			{
+				Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+				InvalRect( &inval ) ;
+			}
+		}
+		if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
+		{
+		}
+		else
+		{
+			UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ;
+		}
+	}
+
+	wxWindow::MacSuperChangedPosition() ;
+}
+
+void wxControl::MacSuperEnabled( bool enabled ) 
+{
+	if ( m_macControl )
+	{
+		if ( UMAHasAppearance() )
+		{
+			if ( !enabled )
+			{
+				::DeactivateControl( m_macControl ) ; 
+			}
+			else
+			{
+				if ( m_macEnabled )
+					::ActivateControl( m_macControl ) ;
+			}
+		}
+		else
+		{
+			if ( !enabled )
+			{
+				::HiliteControl( m_macControl , 255 ) ;
+			}
+			else
+			{
+				if ( m_macEnabled )
+					::HiliteControl( m_macControl , 0 ) ;
+			}
+		}
+	}
+	wxWindow::MacSuperEnabled( enabled ) ;
+}
+
+void  wxControl::MacSuperShown( bool show ) 
+{
+	if ( m_macControl )
+	{
+		if ( !show )
+		{
+			::UMAHideControl( m_macControl ) ;
+		}
+		else
+		{
+			if ( m_macShown )
+				::UMAShowControl( m_macControl ) ;
+		}
+	}
+		
+	wxWindow::MacSuperShown( show ) ;
+}
+
+void  wxControl::DoSetSize(int x, int y,
+            int width, int height,
+            int sizeFlags )
+{
+	if ( m_macControl == NULL )
+	{
+		wxWindow::DoSetSize( x , y ,width , height ,sizeFlags ) ;
+		return ;
+	}
+
+	WindowRef rootwindow = GetMacRootWindow() ;
+	wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ;
+	UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ;
+		
+	int former_x = m_x ;
+	int former_y = m_y ;
+	int former_w = m_width ;
+	int former_h = m_height ;
+	
+	int former_mac_x = (**m_macControl).contrlRect.left ;
+	int former_mac_y = (**m_macControl).contrlRect.top ;
+	
+  int currentX, currentY;
+  GetPosition(&currentX, &currentY);
+  int currentW,currentH;
+  GetSize(&currentW, &currentH);
+
+  int actualWidth = width;
+  int actualHeight = height;
+  int actualX = x;
+  int actualY = y;
+  if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualX = currentX;
+  if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualY = currentY;
+  if (width == -1)
+      actualWidth = currentW ;
+  if (height == -1)
+      actualHeight = currentH ;
+
+	if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
+		return ;
+		
+	AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
+	wxMacDrawingHelper focus( wxFindWinFromMacWindow( GetMacRootWindow() ) ) ;
+
+	int mac_x = actualX ;
+	int mac_y = actualY ;
+	GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ;
+	
+	if ( mac_x != former_mac_x || mac_y != former_mac_y )
+	{
+		{
+			Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+  	UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y  + m_macVerticalBorder ) ;
+		{
+			Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+	}
+
+	if ( actualX != former_x || actualY != former_y )
+	{
+		m_x = actualX ;
+		m_y = actualY ;
+
+		MacRepositionScrollBars() ;
+		// To consider -> should the parameters be the effective or the virtual coordinates (AdjustForParent..)
+    wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+	}		
+	if ( actualWidth != former_w || actualHeight != former_h )
+	{
+		{
+			Rect inval = { mac_y , mac_x , mac_y + former_h , mac_x + former_w } ;
+			InvalRect( &inval ) ;
+		}
+		m_width = actualWidth ;
+		m_height = actualHeight ;
+
+   	UMASizeControl( m_macControl ,  m_width - 2 * m_macHorizontalBorder, m_height -  2 * m_macVerticalBorder ) ;
+		{
+			Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ;
+			InvalRect( &inval ) ;
+		}
+
+		MacRepositionScrollBars() ;
+    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+	}
+	if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) )
+	{
+	}
+	else
+	{
+		UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ;
+	}
+}
+
+void  wxControl::DoSetClientSize(int width, int height)
+{
+	DoSetSize( -1 , -1 , width , height ) ;
+}
+
+bool  wxControl::Show(bool show) 
+{
+	if ( m_macControl == NULL )
+		return wxWindow::Show( show ) ;
+	
+	if ( m_macShown == show )
+		return TRUE ;
+
+	if ( show )
+		::UMAShowControl( m_macControl ) ;
+	else
+		::UMAHideControl( m_macControl ) ;
+
+	return wxWindow::Show( show ) ;
+}
+
+void  wxControl::Enable(bool enable) 
+{
+	if ( m_macControl == NULL )
+		return wxWindow::Enable( enable ) ;
+	
+	if ( m_macEnabled == enable )
+		return ;
+
+	if ( UMAHasAppearance() )
+	{
+		if ( enable )
+			::ActivateControl( m_macControl ) ;
+		else
+			::DeactivateControl( m_macControl ) ;
+	}
+	else
+	{
+		if ( enable )
+			::HiliteControl( m_macControl , 0 ) ;
+		else
+			::HiliteControl( m_macControl , 255 ) ;
+	}
+
+	return wxWindow::Enable( enable ) ;
+}
+
+void wxControl::Refresh(bool eraseBack, const wxRect *rect)
+{
+  if ( m_macControl )
+  {
+  	wxWindow::Refresh( eraseBack , rect ) ;
+	}
+  else
+  {
+  	wxWindow::Refresh( eraseBack , rect ) ;
+  }
+}
+
+void wxControl::OnPaint(wxPaintEvent& event)
+{
+	if ( m_macControl )
+	{
+		WindowRef window = GetMacRootWindow() ;
+		if ( window )
+		{
+			wxWindow* win = wxFindWinFromMacWindow( window ) ;
+			if ( win )
+			{
+				wxMacDrawingHelper help( win ) ;
+				SetOrigin( 0 , 0 ) ;
+				
+				bool			hasTabBehind = false ;
+				wxWindow* parent = GetParent() ;
+				while ( parent )
+				{
+					if( parent->m_macWindowData )
+					{
+						UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+						break ;
+					}
+					
+					if( parent->IsKindOf( CLASSINFO( wxNotebook ) ) ||  parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+					{
+						if ( ((wxControl*)parent)->m_macControl )
+							SetUpControlBackground( ((wxControl*)parent)->m_macControl , -1 , true ) ;
+						break ;
+					}
+					
+					parent = parent->GetParent() ;
+				} 
+				
+				UMADrawControl( m_macControl ) ;
+				UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+			}
+		}
+	}
+	else
+	{
+		wxWindow::OnPaint( event ) ;
+	}
+}
+
+void  wxControl::OnKeyDown( wxKeyEvent &event ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+	EventRecord *ev = wxTheApp->MacGetCurrentEvent() ;
+	short keycode ;
+	short keychar ;
+	keychar = short(ev->message & charCodeMask);
+	keycode = short(ev->message & keyCodeMask) >> 8 ;
+
+	UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ;
+}
+
+void  wxControl::OnMouseEvent( wxMouseEvent &event ) 
+{
+	if ( m_macControl == NULL )
+	{
+		event.Skip() ;
+		return ;
+	}
+		
+	if (event.GetEventType() == wxEVT_LEFT_DOWN )
+	{
+			
+		int x = event.m_x ;
+		int y = event.m_y ;
+		
+		MacClientToRootWindow( &x , &y ) ;
+			
+		ControlHandle	control ;
+		Point		localwhere ;
+		GrafPtr		port ;
+		SInt16		controlpart ;
+		WindowRef	window = GetMacRootWindow() ;
+		
+		localwhere.h = x ;
+		localwhere.v = y ;
+	
+		short modifiers = 0;
+		
+		if ( !event.m_leftDown && !event.m_rightDown )
+			modifiers  |= btnState ;
+	
+		if ( event.m_shiftDown )
+			modifiers |= shiftKey ;
+			
+		if ( event.m_controlDown )
+			modifiers |= controlKey ;
+	
+		if ( event.m_altDown )
+			modifiers |= optionKey ;
+	
+		if ( event.m_metaDown )
+			modifiers |= cmdKey ;
+	
+		controlpart = FindControl( localwhere , window , &control ) ;
+		{
+			if ( AcceptsFocus() && FindFocus() != this )
+			{
+				SetFocus() ;
+			}
+			if ( control && UMAIsControlActive( control ) )
+			{
+				{
+					if ( controlpart == kControlIndicatorPart && !UMAHasAppearance() )
+						controlpart = UMAHandleControlClick( control , localwhere , modifiers , (ControlActionUPP) NULL ) ;
+					else
+						controlpart = UMAHandleControlClick( control , localwhere , modifiers , (ControlActionUPP) -1 ) ;
+					wxTheApp->s_lastMouseDown = 0 ;
+					if ( controlpart && ! ( ( UMAHasAppearance() || (controlpart != kControlIndicatorPart) ) 
+						&& (IsKindOf( CLASSINFO( wxScrollBar ) ) ) ) ) // otherwise we will get the event twice
+					{
+						MacHandleControlClick( control , controlpart ) ;
+					}
+				}
+			}
+		}
+	}
+}
+
+bool wxControl::MacCanFocus() const
+{
+		{ if ( m_macControl == NULL ) 
+				return true ; 
+			else
+			return false ; 
+		}
+}
+
+void wxControl::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+}
+
diff --git a/src/mac/corersrc.r b/src/mac/corersrc.r
index a37b064b21..528e794811 100644
--- a/src/mac/corersrc.r
+++ b/src/mac/corersrc.r
@@ -1,8 +1,50 @@
 #include <Types.r>
 
-resource 'ALRT' (128, purgeable) {
+#if UNIVERSAL_INTERFACES_VERSION > 0x320
+	#include <ControlDefinitions.r>
+#endif
+
+#define kMacOKAlertResourceID 128
+#define kMacYesNoAlertResourceID 129
+#define kMacYesNoCancelAlertResourceID 130
+#define kMacNoYesAlertResourceID 131
+#define kMacNoYesCancelAlertResourceID 132
+
+resource 'ALRT' (kMacOKAlertResourceID, purgeable) {
+	{70, 50, 198, 470},
+	kMacOKAlertResourceID,
+	{	/* array: 4 elements */
+		/* [1] */
+		OK, visible, sound1,
+		/* [2] */
+		OK, visible, sound1,
+		/* [3] */
+		OK, visible, sound1,
+		/* [4] */
+		OK, visible, sound1
+	},
+	noAutoCenter
+};
+
+resource 'ALRT' (kMacYesNoAlertResourceID, purgeable) {
+	{70, 50, 198, 470},
+	kMacYesNoAlertResourceID,
+	{	/* array: 4 elements */
+		/* [1] */
+		OK, visible, sound1,
+		/* [2] */
+		OK, visible, sound1,
+		/* [3] */
+		OK, visible, sound1,
+		/* [4] */
+		OK, visible, sound1
+	},
+	noAutoCenter
+};
+
+resource 'ALRT' (kMacYesNoAlertResourceID + 10, purgeable) {
 	{70, 50, 198, 470},
-	128,
+	kMacYesNoAlertResourceID + 10,
 	{	/* array: 4 elements */
 		/* [1] */
 		OK, visible, sound1,
@@ -16,9 +58,9 @@ resource 'ALRT' (128, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (129, purgeable) {
+resource 'ALRT' (kMacYesNoAlertResourceID + 20, purgeable) {
 	{70, 50, 198, 470},
-	129,
+	kMacYesNoAlertResourceID + 20,
 	{	/* array: 4 elements */
 		/* [1] */
 		OK, visible, sound1,
@@ -32,7 +74,7 @@ resource 'ALRT' (129, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (130, purgeable) {
+resource 'ALRT' (kMacYesNoCancelAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	130,
 	{	/* array: 4 elements */
@@ -48,7 +90,7 @@ resource 'ALRT' (130, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (131, purgeable) {
+resource 'ALRT' (kMacNoYesAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	131,
 	{	/* array: 4 elements */
@@ -64,7 +106,7 @@ resource 'ALRT' (131, purgeable) {
 	noAutoCenter
 };
 
-resource 'ALRT' (132, purgeable) {
+resource 'ALRT' (kMacNoYesCancelAlertResourceID, purgeable) {
 	{70, 50, 198, 470},
 	132,
 	{	/* array: 4 elements */
@@ -80,7 +122,7 @@ resource 'ALRT' (132, purgeable) {
 	noAutoCenter
 };
 
-resource 'DITL' (128, purgeable) {
+resource 'DITL' (kMacOKAlertResourceID, purgeable) {
 	{	/* array DITLarray: 3 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -103,13 +145,71 @@ resource 'DITL' (128, purgeable) {
 	}
 };
 
-resource 'DITL' (129, purgeable) {
+resource 'DITL' (kMacYesNoAlertResourceID, purgeable) {
 	{	/* array DITLarray: 4 elements */
 		/* [1] */
 		{100, 340, 120, 408},
 		Button {
 			enabled,
-			"Yes"
+			"Ja"
+		},
+		/* [2] */
+		{100, 260, 120, 324},
+		Button {
+			enabled,
+			"Nein"
+		},
+		/* [3] */
+		{38, 64, 88, 408},
+		StaticText {
+			disabled,
+			"^1"
+		},
+		/* [4] */
+		{10, 64, 30, 412},
+		StaticText {
+			disabled,
+			"^0"
+		}
+	}
+};
+
+resource 'DITL' (kMacYesNoAlertResourceID + 10, purgeable) {
+	{	/* array DITLarray: 4 elements */
+		/* [1] */
+		{100, 340, 120, 408},
+		Button {
+			enabled,
+			"Oui"
+		},
+		/* [2] */
+		{100, 260, 120, 324},
+		Button {
+			enabled,
+			"Non"
+		},
+		/* [3] */
+		{38, 64, 88, 408},
+		StaticText {
+			disabled,
+			"^1"
+		},
+		/* [4] */
+		{10, 64, 30, 412},
+		StaticText {
+			disabled,
+			"^0"
+		}
+	}
+};
+
+resource 'DITL' (kMacYesNoAlertResourceID + 20, purgeable) {
+	{	/* array DITLarray: 4 elements */
+		/* [1] */
+		{100, 340, 120, 408},
+		Button {
+			enabled,
+			"Si"
 		},
 		/* [2] */
 		{100, 260, 120, 324},
@@ -132,7 +232,7 @@ resource 'DITL' (129, purgeable) {
 	}
 };
 
-resource 'DITL' (130, purgeable) {
+resource 'DITL' (kMacYesNoCancelAlertResourceID, purgeable) {
 	{	/* array DITLarray: 5 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -167,7 +267,7 @@ resource 'DITL' (130, purgeable) {
 	}
 };
 
-resource 'DITL' (131, purgeable) {
+resource 'DITL' (kMacNoYesAlertResourceID, purgeable) {
 	{	/* array DITLarray: 4 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -196,7 +296,7 @@ resource 'DITL' (131, purgeable) {
 	}
 };
 
-resource 'DITL' (132, purgeable) {
+resource 'DITL' (kMacNoYesCancelAlertResourceID, purgeable) {
 	{	/* array DITLarray: 5 elements */
 		/* [1] */
 		{100, 340, 120, 408},
@@ -278,54 +378,17 @@ data 'DLGX' (132) {
 	$"0000 0006 0000 0000 0000 0000 0000"                 /* .............. */
 };
 
-data 'ics#' (200, "¥ New File") {
-	$"0000 3FE0 2C70 3458 2C78 3408 2C08 3408"            /* ..?à,p4X,x4.,.4. */
-	$"2C08 3408 2C08 3408 2C0E 340F 3FFE 0000"            /* ,.4.,.4.,.4.?þ.. */
-	$"0000 3FE0 3FF0 3FF8 3FF8 3FF8 3FF8 3FF8"            /* ..?à?ð?ø?ø?ø?ø?ø */
-	$"3FF8 3FF8 3FF8 3FF8 3FFE 3FFF 3FFE 0000"            /* ?ø?ø?ø?ø?þ?ÿ?þ.. */
-};
-
-data 'ics4' (200, "¥ New File") {
-	$"0000 0000 0000 0000 00FF FFFF FFF0 0000"            /* .........ÿÿÿÿð.. */
-	$"00F1 FFED EFFF 0000 00FF 1FDE DFCF F000"            /* .ñÿíïÿ...ÿ.ÞßÏð. */
-	$"00F1 FFED EFFF F000 00FF 1FDE DEEE F000"            /* .ñÿíïÿð..ÿ.ÞÞîð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED F000 00FF 1FDE DEDE F000"            /* .ñÿíííð..ÿ.ÞÞÞð. */
-	$"00F1 FFED EDED FEE0 00FF 1FDE DEDE FEEE"            /* .ñÿíííþà.ÿ.ÞÞÞþî */
-	$"00FF FFFF FFFF FEE0 0000 0000 0000 0000"            /* .ÿÿÿÿÿþà........ */
-};
-
-data 'ics8' (200, "¥ New File") {
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
-	$"0000 FFFF FFFF FFFF FFFF FF00 0000 0000"            /* ..ÿÿÿÿÿÿÿÿÿ..... */
-	$"0000 FF05 FFFF FB7F FBFF FFFF 0000 0000"            /* ..ÿ.ÿÿû.ûÿÿÿ.... */
-	$"0000 FFFF 0BFF 7FFB 7FFF F6FF FF00 0000"            /* ..ÿÿ.ÿ.û.ÿöÿÿ... */
-	$"0000 FF05 FFFF FB7F FBFF FFFF FF00 0000"            /* ..ÿ.ÿÿû.ûÿÿÿÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB FBFB FF00 0000"            /* ..ÿÿ.ÿ.û.ûûûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FF00 0000"            /* ..ÿ.ÿÿû.û.û.ÿ... */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FF00 0000"            /* ..ÿÿ.ÿ.û.û.ûÿ... */
-	$"0000 FF05 FFFF FB7F FB7F FB7F FFFC FC00"            /* ..ÿ.ÿÿû.û.û.ÿüü. */
-	$"0000 FFFF 0BFF 7FFB 7FFB 7FFB FFFC FCFC"            /* ..ÿÿ.ÿ.û.û.ûÿüüü */
-	$"0000 FFFF FFFF FFFF FFFF FFFF FFFC FC00"            /* ..ÿÿÿÿÿÿÿÿÿÿÿüü. */
-	$"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */
-};
-
 resource 'ldes' ( 128 )
 {
 	versionZero 
 	{
 		0 , 
-		1 ,
+		0 ,
 		0 , 
 		0 , 
 		hasVertScroll , 
 		noHorizScroll , 
-		0 , 
+		128 , 
 		noGrowSpace , 
 	}
 } ;
@@ -536,3 +599,4 @@ resource 'STR#' (251) {
 	}
 };
 
+// end of get file
\ No newline at end of file
diff --git a/src/mac/cursor.cpp b/src/mac/cursor.cpp
index 4333364c93..bcbe30008b 100644
--- a/src/mac/cursor.cpp
+++ b/src/mac/cursor.cpp
@@ -20,18 +20,24 @@
 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
 #endif
 
+const short kwxCursorHandId = 9 ;
+const short kwxCursorSizeWEId = 10 ;
+const short kwxCursorSizeNSId = 11 ;
+Cursor*		MacArrowCursorPtr = &qd.arrow ;
+CursHandle	MacArrowCursor = &MacArrowCursorPtr ;
+CursHandle	gMacCurrentCursor = NULL ;
+
 wxCursorRefData::wxCursorRefData()
 {
-    m_width = 32; m_height = 32;
-
-/* TODO
-    m_hCursor = 0 ;
-*/
+    m_width = 32; 
+    m_height = 32;
+    m_hCursor = NULL ;
 }
 
 wxCursorRefData::~wxCursorRefData()
 {
-    // TODO: destroy cursor
+	if ( m_hCursor && ( m_hCursor != MacArrowCursor ) )
+		::DisposeHandle( (Handle) m_hCursor ) ;
 }
 
 // Cursors
@@ -56,122 +62,133 @@ wxCursor::wxCursor(int cursor_type)
 {
   m_refData = new wxCursorRefData;
 
-/* TODO
   switch (cursor_type)
   {
     case wxCURSOR_WAIT:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_WAIT);
+      M_CURSORDATA->m_hCursor = ::GetCursor(watchCursor);
       break;
     case wxCURSOR_IBEAM:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_IBEAM);
+      M_CURSORDATA->m_hCursor = ::GetCursor(iBeamCursor);
       break;
     case wxCURSOR_CROSS:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_CROSS);
+      M_CURSORDATA->m_hCursor = ::GetCursor(crossCursor);
       break;
     case wxCURSOR_SIZENWSE:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENWSE);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZENESW:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENESW);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZEWE:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZEWE);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeWEId);
       break;
     case wxCURSOR_SIZENS:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_SIZENS);
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorSizeNSId);
       break;
     case wxCURSOR_CHAR:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_HAND:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_HAND");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_BULLSEYE:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BULLSEYE");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_PENCIL:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PENCIL");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_MAGNIFIER:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_MAGNIFIER");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_NO_ENTRY:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_NO_ENTRY");
+      M_CURSORDATA->m_hCursor = ::GetCursor(kwxCursorHandId);
       break;
     }
     case wxCURSOR_LEFT_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_RIGHT_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_MIDDLE_BUTTON:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_SIZING:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_SIZING");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_WATCH:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_WATCH");
+      M_CURSORDATA->m_hCursor = ::GetCursor(watchCursor);
       break;
     }
     case wxCURSOR_SPRAYCAN:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_ROLLER");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_PAINT_BRUSH:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PBRUSH");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_POINT_LEFT:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PLEFT");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_POINT_RIGHT:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_PRIGHT");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_QUESTION_ARROW:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_QARROW");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     case wxCURSOR_BLANK:
     {
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), "wxCURSOR_BLANK");
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
     }
     default:
     case wxCURSOR_ARROW:
-      M_CURSORDATA->m_hCursor = (WXHCURSOR) LoadCursor(NULL, IDC_ARROW);
+      M_CURSORDATA->m_hCursor = MacArrowCursor;
       break;
-  }
-*/
+	}
+}
 
+void wxCursor::MacInstall() const 
+{
+	if ( m_refData && M_CURSORDATA->m_hCursor )
+	{
+		::SetCursor( *M_CURSORDATA->m_hCursor ) ;
+		gMacCurrentCursor = M_CURSORDATA->m_hCursor ;
+	}
+	else
+	{
+		::SetCursor( *MacArrowCursor ) ;
+		gMacCurrentCursor = NULL ;
+	}
 }
 
 wxCursor::~wxCursor()
@@ -181,7 +198,7 @@ wxCursor::~wxCursor()
 // Global cursor setting
 void wxSetCursor(const wxCursor& cursor)
 {
-  // TODO (optional on platforms with no global cursor)
+	cursor.MacInstall() ;
 }
 
 
diff --git a/src/mac/data.cpp b/src/mac/data.cpp
index 138289a5bf..297686b9d1 100644
--- a/src/mac/data.cpp
+++ b/src/mac/data.cpp
@@ -25,7 +25,7 @@
 char *wxBuffer = NULL;
 
 // Windows List
-wxList wxTopLevelWindows;
+wxWindowList wxTopLevelWindows;
 
 // List of windows pending deletion
 wxList wxPendingDelete;
diff --git a/src/mac/dc.cpp b/src/mac/dc.cpp
index 2c1c613595..e021274157 100644
--- a/src/mac/dc.cpp
+++ b/src/mac/dc.cpp
@@ -30,6 +30,8 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #define mm2pt			2.83464566929
 #define pt2mm			0.352777777778
 
+long wxDC::m_macCurrentPortId = 1 ;
+
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
@@ -83,14 +85,136 @@ wxDC::wxDC(void)
   m_backgroundBrush = *wxWHITE_BRUSH;
   
 //  m_palette = wxAPP_COLOURMAP;
+  m_macPort = NULL ;
+  m_ok = FALSE ;
+  
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;
+	
+	m_macPortId = 0 ;
+	m_macLocalOrigin.h = m_macLocalOrigin.v = 0 ;
+	m_macClipRect.left = -32000 ;
+	m_macClipRect.top = -32000 ;
+	m_macClipRect.right = 32000 ;
+	m_macClipRect.bottom = 32000 ;
+	::GetPort( &m_macOrigPort ) ;
 };
 
 wxDC::~wxDC(void)
 {
+	if ( m_macPort )
+	{
+		::SetOrigin( 0 , 0 ) ;
+		::ClipRect( &m_macPort->portRect ) ;
+		::PenNormal() ;
+		::SetPort( m_macOrigPort ) ;
+	}
+	++m_macCurrentPortId ;
 };
 
-void wxDC::DrawIcon( const wxIcon &WXUNUSED(icon), long WXUNUSED(x), long WXUNUSED(y), bool WXUNUSED(useMask) )
+void wxDC::MacSetupPort() const
+{
+	m_macPortId = ++m_macCurrentPortId ;
+	::SetPort(m_macPort);
+	::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
+	::ClipRect(&m_macClipRect);
+
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;	
+}
+
+void wxDC::DrawBitmap( const wxBitmap &bmp, long x, long y, bool useMask )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  long xx1 = XLOG2DEV(x); 
+  long yy1 = YLOG2DEV(y);
+	
+	{
+		wxBitmapRefData * bmap = (wxBitmapRefData*) ( bmp.GetRefData()) ;
+	   	
+   	if ( bmap )
+    {
+			if ( bmap->m_bitmapType == kMacBitmapTypePict )
+			{ 
+    		Rect bitmaprect = { 0 , 0 , bmap->m_height , bmap->m_width } ;
+				::OffsetRect( &bitmaprect , xx1 , yy1 ) ;
+				::DrawPicture( bmap->m_hPict , &bitmaprect ) ;
+			}
+			else if ( bmap->m_bitmapType == kMacBitmapTypeGrafWorld )
+			{
+				if ( bmap->m_hBitmap )
+				{
+					GWorldPtr 		bmapworld = bmap->m_hBitmap ;
+					PixMapHandle	bmappixels ;
+					RGBColor		white = { 0xFFFF, 0xFFFF,0xFFFF} ;
+					RGBColor		black = { 0,0,0} ;
+					RGBForeColor( &black ) ;
+					RGBBackColor( &white ) ;
+			//		RGBForeColor( &m_textForegroundColour.GetPixel() ) ;
+			//		RGBBackColor( &m_textBackgroundColour.GetPixel() ) ;
+			
+					bmappixels = GetGWorldPixMap( bmapworld ) ;
+					if ( LockPixels(bmappixels) )
+					{
+						Rect source , dest ;
+						source.top = 0 ;
+						source.left = 0 ;
+						source.right = bmap->m_width ;
+						source.bottom = bmap->m_height ;
+						dest.top = YLOG2DEV(y) ;
+						dest.left = XLOG2DEV(x) ;
+						dest.bottom = YLOG2DEV(y + bmap->m_height )  ;
+						dest.right = XLOG2DEV(x + bmap->m_width ) ;
+						// ::ClipRect(&m_macClipRect);
+						CopyBits( &GrafPtr( bmapworld )->portBits , &GrafPtr( m_macPort )->portBits ,
+							&source, &dest, srcCopy, NULL ) ;
+						/*
+						if ( m_clipping )
+						{
+							long x1 = XLOG2DEV(m_clipX1);
+							long y1 = YLOG2DEV(m_clipY1);
+							long x2 = XLOG2DEV(m_clipX2);
+							long y2 = YLOG2DEV(m_clipY2);
+	
+							Rect clip = { y1 , x1 , y2 , x2 } ;
+							::ClipRect(&clip);
+						}
+						*/
+						UnlockPixels( bmappixels ) ;
+					} 
+					m_macPenInstalled = false ;
+					m_macBrushInstalled = false ;
+					m_macFontInstalled = false ;
+				}
+			}
+    }
+	}
+}
+
+void wxDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
 {
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  long xx1 = XLOG2DEV(x); 
+  long yy1 = YLOG2DEV(y);
+	
+	{
+		wxIconRefData * iconref = (wxIconRefData*) ( icon.GetRefData()) ;
+	   	
+   	if ( iconref && iconref->m_ok && iconref->m_hIcon )
+    {
+    	Rect bitmaprect = { 0 , 0 , iconref->m_height , iconref->m_width } ;
+			OffsetRect( &bitmaprect , xx1 , yy1 ) ;
+    	PlotCIconHandle( &bitmaprect , atNone , ttNone , iconref->m_hIcon ) ;
+    }
+	}
 };
 
 void wxDC::DrawPoint( wxPoint& point ) 
@@ -155,16 +279,41 @@ void wxDC::DrawSpline( int n, wxPoint points[] )
 
 void wxDC::SetClippingRegion( long x, long y, long width, long height )
 {
-  m_clipping = TRUE;
-  m_clipX1 = x;
-  m_clipY1 = y;
-  m_clipX2 = x + width;
-  m_clipY2 = y + height;
+  MacVerifySetup() ;
+	if( m_clipping )
+	{
+		m_clipX1 = wxMax( m_clipX1 , x ) ;
+  		m_clipY1 = wxMax( m_clipY1 ,y );
+  		m_clipX2 = wxMin( m_clipX2, (x + width));
+  		m_clipY2 = wxMin( m_clipY2,(y + height));
+		
+	}
+	else
+	{
+	  m_clipping = TRUE;
+	  m_clipX1 = x;
+	  m_clipY1 = y;
+	  m_clipX2 = x + width;
+	  m_clipY2 = y + height;
+	}
+  
+	long x1 = XLOG2DEV(m_clipX1);
+	long y1 = YLOG2DEV(m_clipY1);
+	long x2 = XLOG2DEV(m_clipX2);
+	long y2 = XLOG2DEV(m_clipY2);
+	
+	Rect clip = { y1 , x1 , y2 , x2 } ;
+	
+  ::ClipRect( &clip ) ;
+
 };
 
 void wxDC::DestroyClippingRegion(void)
 {
+  MacVerifySetup() ;
   m_clipping = FALSE;
+//	Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
+	::ClipRect(&m_macClipRect);
 };
 
 void wxDC::GetClippingBox( long *x, long *y, long *width, long *height ) const
@@ -199,12 +348,14 @@ void wxDC::SetTextForeground( const wxColour &col )
 {
   if (!Ok()) return;
   m_textForegroundColour = col;
+  m_macFontInstalled = false ;
 };
 
 void wxDC::SetTextBackground( const wxColour &col )
 {
   if (!Ok()) return;
   m_textBackgroundColour = col;
+  m_macFontInstalled = false ;
 };
 
 void wxDC::SetMapMode( int mode )
@@ -383,3 +534,1044 @@ void wxDC::ComputeScaleAndOrigin(void)
   }
 };
 
+void  wxDC::SetPalette( const wxPalette& palette )
+{
+}
+
+void  wxDC::SetBackgroundMode( int mode )
+{
+	m_backgroundMode = mode ;
+}
+
+void  wxDC::SetFont( const wxFont &font )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  m_font = font;
+  m_macFontInstalled = false ;
+}
+
+void  wxDC::SetPen( const wxPen &pen )
+{
+  if (!Ok()  ) 
+  	return;
+
+  MacVerifySetup() ;
+
+	if ( m_pen == pen )
+		return ;
+		
+  m_pen = pen;
+/*  
+  if (!m_pen.Ok()) 
+  	return;
+*/  	
+  m_macPenInstalled = false ;
+}
+
+void  wxDC::SetBrush( const wxBrush &brush )
+{
+  if (!Ok() ) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_brush == brush) 
+  	return;
+  
+  m_brush = brush;
+  m_macBrushInstalled = false ;
+}
+
+void  wxDC::SetBackground( const wxBrush &brush )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_backgroundBrush == brush) 
+  	return;
+  
+  m_backgroundBrush = brush;
+  
+  if (!m_backgroundBrush.Ok()) 
+  	return;
+   m_macBrushInstalled = false ;
+}
+
+void  wxDC::SetLogicalFunction( int function )
+{
+ 	if (m_logicalFunction == function) 
+ 		return;
+
+	m_logicalFunction = function ;
+	m_macFontInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macPenInstalled = false ;
+}
+
+void  wxDC::FloodFill( long x1, long y1, const wxColour& col, int style )
+{
+}
+
+bool  wxDC::GetPixel( long x1, long y1, wxColour *col ) const 
+{
+	return true ;
+}
+
+void  wxDC::DrawLine( long x1, long y1, long x2, long y2 )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() != wxTRANSPARENT)
+  {
+		MacInstallPen() ;
+		int offset = (m_pen.GetWidth()	- 1) / 2 ;	
+  	long xx1 = XLOG2DEV(x1); 
+  	long yy1 = YLOG2DEV(y1);
+  	long xx2 = XLOG2DEV(x2); 
+  	long yy2 = YLOG2DEV(y2);
+	
+		::MoveTo(xx1 - offset ,yy1 - offset);
+		::LineTo(xx2 - offset , yy2 - offset );
+  };
+}
+
+void  wxDC::CrossHair( long x, long y )
+{
+}
+
+void  wxDC::DrawArc( long x1, long y1, long x2, long y2, long xc, long yc )
+{
+}
+
+void  wxDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea )
+{
+}
+
+void  wxDC::DrawPoint( long x, long y )
+{
+  if (!Ok()) 
+  	return;
+  	
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() != wxTRANSPARENT) 
+  {
+		MacInstallPen() ;
+  	long xx1 = XLOG2DEV(x); 
+  	long yy1 = YLOG2DEV(y);
+	
+		::MoveTo(xx1,yy1);
+		::LineTo(xx1+1, yy1+1);
+  };
+}
+
+void  wxDC::DrawLines( int n, wxPoint points[], long xoffset , long yoffset  )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  if (m_pen.GetStyle() == wxTRANSPARENT) 
+  	return;
+
+	MacInstallPen() ;
+  
+	int offset = (m_pen.GetWidth()	- 1 ) / 2 ;	
+  long x1, x2 , y1 , y2 ;
+  x1 = XLOG2DEV(points[0].x + xoffset);
+	y1 = YLOG2DEV(points[0].y + yoffset);   
+	::MoveTo(x1 - offset ,y1 - offset );
+  
+  for (int i = 0; i < n-1; i++)
+  {
+    long x2 = XLOG2DEV(points[i+1].x + xoffset);
+    long y2 = YLOG2DEV(points[i+1].y + yoffset);
+		::LineTo(x2 - offset  , y2 - offset );
+  }
+}
+
+void  wxDC::DrawPolygon( int n, wxPoint points[], long xoffset , long yoffset , 
+                              int fillStyle )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+  
+  PolyHandle polygon = OpenPoly() ;
+  long x1, x2 , y1 , y2 ;
+  x1 = XLOG2DEV(points[0].x + xoffset);
+	y1 = YLOG2DEV(points[0].y + yoffset);   
+	::MoveTo(x1,y1);
+  
+  for (int i = 0; i < n-1; i++)
+  {
+    long x2 = XLOG2DEV(points[i+1].x + xoffset);
+    long y2 = YLOG2DEV(points[i+1].y + yoffset);
+		::LineTo(x2, y2);
+  }
+
+  ClosePoly() ;
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintPoly( polygon ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FramePoly( polygon ) ;
+	};
+  KillPoly( polygon ) ;
+}
+
+void  wxDC::DrawRectangle( long x, long y, long width, long height )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+	
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0) 
+		return;
+	
+	// CMB: handle -ve width and/or height
+	if (ww < 0) 
+	{ 
+		ww = -ww; 
+		xx = xx - ww; 
+	}
+	
+	if (hh < 0) 
+	{ 
+		hh = -hh; 
+		yy = yy - hh; 
+	}
+	
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+	
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintRect( &rect ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FrameRect( &rect ) ;
+	};
+}
+
+void  wxDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius  )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	
+  if (radius < 0.0) 
+  	radius = - radius * ((width < height) ? width : height);
+	
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+	
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0) 
+		return;
+	
+	// CMB: handle -ve width and/or height
+	if (ww < 0) 
+	{ 
+		ww = -ww; 
+		xx = xx - ww; 
+	}
+	
+	if (hh < 0) 
+	{ 
+		hh = -hh; 
+		yy = yy - hh; 
+	}
+	
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+	
+	if (m_brush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::PaintRoundRect( &rect , radius * 2 , radius * 2 ) ;
+	};
+	
+	if (m_pen.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallPen() ;
+		::FrameRoundRect( &rect , radius * 2 , radius * 2 ) ;
+	};
+}
+
+void  wxDC::DrawEllipse( long x, long y, long width, long height )
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+	long ww = m_signX * XLOG2DEVREL(width);
+	long hh = m_signY * YLOG2DEVREL(height);
+
+	// CMB: draw nothing if transformed w or h is 0
+	if (ww == 0 || hh == 0)
+		return;
+
+	// CMB: handle -ve width and/or height
+	if (ww < 0)
+	{
+		ww = -ww;
+		xx = xx - ww;
+	}
+
+	if (hh < 0)
+	{
+		hh = -hh;
+		yy = yy - hh;
+	}
+
+	Rect rect = { yy , xx , yy + hh , xx + ww } ;
+
+	if (m_brush.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallBrush() ;
+		::PaintOval( &rect ) ;
+	};
+
+	if (m_pen.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallPen() ;
+		::FrameOval( &rect ) ;
+	};
+}
+
+// ----------------------------------- spline code ----------------------------------------
+
+static void wx_quadratic_spline(double a1, double b1, double a2, double b2,
+                         double a3, double b3, double a4, double b4);
+static void wx_clear_stack(void);
+static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
+        double *y3, double *x4, double *y4);
+static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
+          double x4, double y4);
+static bool wx_spline_add_point(double x, double y);
+static void wx_spline_draw_point_array(wxDC *dc);
+
+static wxList wx_spline_point_list;
+
+#define		half(z1, z2)	((z1+z2)/2.0)
+#define		THRESHOLD	5
+
+/* iterative version */
+
+static void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4,
+                 double b4)
+{
+    register double  xmid, ymid;
+    double           x1, y1, x2, y2, x3, y3, x4, y4;
+
+    wx_clear_stack();
+    wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4);
+
+    while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
+        xmid = (double)half(x2, x3);
+        ymid = (double)half(y2, y3);
+	if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD &&
+	    fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) {
+            wx_spline_add_point( x1, y1 );
+            wx_spline_add_point( xmid, ymid );
+	} else {
+            wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
+                 (double)half(x3, x4), (double)half(y3, y4), x4, y4);
+            wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
+                 (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
+	}
+    }
+}
+
+/* utilities used by spline drawing routines */
+
+typedef struct wx_spline_stack_struct {
+    double           x1, y1, x2, y2, x3, y3, x4, y4;
+} Stack;
+
+#define         SPLINE_STACK_DEPTH             20
+static Stack    wx_spline_stack[SPLINE_STACK_DEPTH];
+static Stack   *wx_stack_top;
+static int      wx_stack_count;
+
+static void wx_clear_stack(void)
+{
+    wx_stack_top = wx_spline_stack;
+    wx_stack_count = 0;
+}
+
+static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
+{
+    wx_stack_top->x1 = x1;
+    wx_stack_top->y1 = y1;
+    wx_stack_top->x2 = x2;
+    wx_stack_top->y2 = y2;
+    wx_stack_top->x3 = x3;
+    wx_stack_top->y3 = y3;
+    wx_stack_top->x4 = x4;
+    wx_stack_top->y4 = y4;
+    wx_stack_top++;
+    wx_stack_count++;
+}
+
+static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2,
+                  double *x3, double *y3, double *x4, double *y4)
+{
+    if (wx_stack_count == 0)
+	return (0);
+    wx_stack_top--;
+    wx_stack_count--;
+    *x1 = wx_stack_top->x1;
+    *y1 = wx_stack_top->y1;
+    *x2 = wx_stack_top->x2;
+    *y2 = wx_stack_top->y2;
+    *x3 = wx_stack_top->x3;
+    *y3 = wx_stack_top->y3;
+    *x4 = wx_stack_top->x4;
+    *y4 = wx_stack_top->y4;
+    return (1);
+}
+
+static bool wx_spline_add_point(double x, double y)
+{
+  wxPoint *point = new wxPoint ;
+  point->x = (int) x;
+  point->y = (int) y;
+  wx_spline_point_list.Append((wxObject*)point);
+  return TRUE;
+}
+
+static void wx_spline_draw_point_array(wxDC *dc)
+{
+  dc->DrawLines(&wx_spline_point_list, 0, 0 );
+  wxNode *node = wx_spline_point_list.First();
+  while (node)
+  {
+    wxPoint *point = (wxPoint *)node->Data();
+    delete point;
+    delete node;
+    node = wx_spline_point_list.First();
+  }
+}
+
+void  wxDC::DrawSpline( wxList *points )
+{
+    wxPoint *p;
+    double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
+    double           x1, y1, x2, y2;
+
+    wxNode *node = points->First();
+    p = (wxPoint *)node->Data();
+
+    x1 = p->x;
+    y1 = p->y;
+
+    node = node->Next();
+    p = (wxPoint *)node->Data();
+
+    x2 = p->x;
+    y2 = p->y;
+    cx1 = (double)((x1 + x2) / 2);
+    cy1 = (double)((y1 + y2) / 2);
+    cx2 = (double)((cx1 + x2) / 2);
+    cy2 = (double)((cy1 + y2) / 2);
+
+    wx_spline_add_point(x1, y1);
+
+    while ((node = node->Next()) != NULL)
+    {
+        p = (wxPoint *)node->Data();
+	x1 = x2;
+	y1 = y2;
+	x2 = p->x;
+	y2 = p->y;
+        cx4 = (double)(x1 + x2) / 2;
+        cy4 = (double)(y1 + y2) / 2;
+        cx3 = (double)(x1 + cx4) / 2;
+        cy3 = (double)(y1 + cy4) / 2;
+
+        wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
+
+	cx1 = cx4;
+	cy1 = cy4;
+        cx2 = (double)(cx1 + x2) / 2;
+        cy2 = (double)(cy1 + y2) / 2;
+    }
+
+    wx_spline_add_point( cx1, cy1 );
+    wx_spline_add_point( x2, y2 );
+
+    wx_spline_draw_point_array( this );
+}
+
+
+    
+bool  wxDC::CanDrawBitmap(void) const 
+{
+	return true ;
+}
+
+
+bool  wxDC::Blit( long xdest, long ydest, long width, long height,
+       wxDC *source, long xsrc, long ysrc, int logical_func , bool useMask )
+{
+  if (!Ok()) return FALSE;
+  MacVerifySetup() ;
+
+	CGrafPtr			sourcePort = (CGrafPtr) source->m_macPort ;
+	PixMapHandle	bmappixels =  GetGWorldPixMap( sourcePort ) ; 
+	RGBColor		white = { 0xFFFF, 0xFFFF,0xFFFF} ;
+	RGBColor		black = { 0,0,0} ;
+//		RGBForeColor( &black ) ;
+//		RGBBackColor( &white ) ;
+		RGBForeColor( &m_textForegroundColour.GetPixel() ) ;
+		RGBBackColor( &m_textBackgroundColour.GetPixel() ) ;
+
+	if ( LockPixels(bmappixels) )
+	{
+		Rect srcrect , dstrect ;
+		srcrect.top = source->YLOG2DEV(ysrc) ;
+		srcrect.left = source->XLOG2DEV(xsrc) ;
+		srcrect.right = source->XLOG2DEV(xsrc + width ) ;
+		srcrect.bottom = source->YLOG2DEV(ysrc + height) ;
+		dstrect.top = YLOG2DEV(ydest) ;
+		dstrect.left = XLOG2DEV(xdest) ;
+		dstrect.bottom = YLOG2DEV(ydest + height )  ;
+		dstrect.right = XLOG2DEV(xdest + width ) ;
+//		::ClipRect(&m_macClipRect);
+		CopyBits( &GrafPtr( sourcePort )->portBits , &GrafPtr( m_macPort )->portBits ,
+			&srcrect, &dstrect, srcCopy, NULL ) ;
+/*
+						if ( m_clipping )
+						{
+							long x1 = XLOG2DEV(m_clipX1);
+							long y1 = YLOG2DEV(m_clipY1);
+							long x2 = XLOG2DEV(m_clipX2);
+							long y2 = YLOG2DEV(m_clipY2);
+	
+							Rect clip = { y1 , x1 , y2 , x2 } ;
+							::ClipRect(&clip);
+						}
+*/
+		UnlockPixels( bmappixels ) ;
+	} 
+	
+	m_macPenInstalled = false ;
+	m_macBrushInstalled = false ;
+	m_macFontInstalled = false ;
+  	
+  return TRUE;
+}
+
+void  wxDC::DrawText( const wxString &string, long x, long y, bool use16)
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	long xx = XLOG2DEV(x);
+	long yy = YLOG2DEV(y);
+  
+//	if (m_pen.GetStyle() != wxTRANSPARENT)
+	{
+		MacInstallFont() ;
+		/*
+		Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
+			
+		  ::ClipRect( &clip ) ;
+		*/
+		
+		FontInfo fi ;
+		::GetFontInfo( &fi ) ;
+		
+		yy += fi.ascent ;
+		::MoveTo( xx , yy );
+		if (  m_backgroundMode == wxTRANSPARENT )
+		{
+			::TextMode( srcOr) ;
+		}
+		else
+		{
+			::TextMode( srcCopy ) ;
+		}
+
+		const char *text = NULL ;
+		int length = 0 ;
+		wxString macText ;
+
+		if ( wxApp::s_macDefaultEncodingIsPC )
+		{
+			macText = wxMacMakeMacStringFromPC( string ) ;
+			text = macText ;
+			length = macText.Length() ;
+		}
+		else
+		{
+			text = string ;
+			length = string.Length() ;
+		}
+		
+		int laststop = 0 ;
+		int i = 0 ;
+		int line = 0 ;
+		
+		while( i < length )
+		{
+			if( text[i] == 13 || text[i] == 10)
+			{
+				::DrawText( text , laststop , i - laststop ) ;
+				line++ ;
+				::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
+				laststop = i+1 ;
+			}
+			i++ ;
+		}
+				
+		::DrawText( text , laststop , i - laststop ) ;
+		::TextMode( srcOr ) ;
+	}
+}
+
+bool  wxDC::CanGetTextExtent(void) const 
+{
+	if ( !Ok() )
+		return false  ;
+		
+	return true ;
+}
+
+void  wxDC::GetTextExtent( const wxString &string, long *width, long *height,
+                     long *descent, long *externalLeading ,
+                     wxFont *theFont , bool use16  ) const
+{
+  if (!Ok()) 
+  	return;
+ 
+   MacVerifySetup() ;
+
+ 	wxFont formerFont = m_font ; 
+ 	
+	if ( theFont )
+	{
+		wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
+	
+		if ( font )
+		{
+	  	long yy1 = YLOG2DEV(0);
+	 		long yy2 = YLOG2DEV(font->m_macFontSize);
+	
+			::TextFont( font->m_macFontNum ) ;
+			::TextSize( abs( yy2-yy1) ) ;
+			::TextFace( font->m_macFontStyle ) ;
+		}
+	}
+	else
+	{
+		MacInstallFont() ;
+	}
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	*height = fi.descent + fi.ascent ;
+	*descent = fi.descent ;
+	*externalLeading = fi.leading ;
+	
+	const char *text = NULL ;
+	int length = 0 ;
+	wxString macText ;
+	if ( wxApp::s_macDefaultEncodingIsPC )
+	{
+		macText = wxMacMakeMacStringFromPC( string ) ;
+		text = macText ;
+		length = macText.Length() ;
+	}
+	else
+	{
+		text = string ;
+		length = string.Length() ;
+	}
+	
+	int laststop = 0 ;
+	int i = 0 ;
+	int curwidth = 0 ;
+	*width = 0 ;
+	
+	while( i < length )
+	{
+		if( text[i] == 13 || text[i] == 10)
+		{
+			*height += fi.descent + fi.ascent + fi.leading;
+			curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+			if ( curwidth > *width )
+				*width = curwidth ;
+			laststop = i+1 ;
+		}
+		i++ ;
+	}
+			
+	curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+	if ( curwidth > *width )
+		*width = curwidth ;
+
+	if ( theFont )
+	{
+		m_macFontInstalled = false ;
+	}
+}
+
+long   wxDC::GetCharWidth(void)
+{
+  if (!Ok()) 
+  	return 1;
+ 
+   MacVerifySetup() ;
+
+	MacInstallFont() ;
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	return (fi.descent + fi.ascent) / 2 ;
+}
+
+long   wxDC::GetCharHeight(void)
+{
+  if (!Ok()) 
+  	return 1;
+ 
+   MacVerifySetup() ;
+
+	MacInstallFont() ;
+
+	FontInfo fi ;
+	::GetFontInfo( &fi ) ;
+
+	return fi.descent + fi.ascent ;
+}
+
+void  wxDC::Clear(void)
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+	Rect rect = { -32767 , -32767 , 32767 , 32767 } ;
+	
+	if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) 
+	{
+		MacInstallBrush() ;
+		::EraseRect( &rect ) ;
+	};
+}
+
+void wxDC::MacInstallFont() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macFontInstalled )
+		return ;
+		
+	wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
+
+	if ( font )
+	{
+		::TextFont( font->m_macFontNum ) ;
+		::TextSize( m_scaleY * font->m_macFontSize ) ;
+		::TextFace( font->m_macFontStyle ) ;
+	
+		m_macFontInstalled = true ;
+		m_macBrushInstalled = false ;
+		m_macPenInstalled = false ;
+	
+		::RGBForeColor(&m_textForegroundColour.GetPixel() );
+		::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+	}
+	else
+	{
+		short fontnum ;
+		
+		GetFNum( "\pGeneva" , &fontnum ) ;
+		::TextFont( fontnum ) ;
+		::TextSize( m_scaleY * 10 ) ;
+		::TextFace( 0 ) ;
+	
+		// todo reset after spacing changes - or store the current spacing somewhere
+	
+		m_macFontInstalled = true ;
+		m_macBrushInstalled = false ;
+		m_macPenInstalled = false ;
+		::RGBForeColor( &(m_textForegroundColour.GetPixel()) );
+		::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+	}
+
+
+	short mode = patCopy ;
+
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+}
+
+static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern)
+{
+	int thePatListID = sysPatListID;
+	int theIndex;
+	switch(hatchStyle)
+	{
+		case wxBDIAGONAL_HATCH:
+			theIndex = 34; // WCH: this is not good
+			break;
+		case wxFDIAGONAL_HATCH:
+			theIndex = 26;
+			break;
+		case wxCROSS_HATCH:
+			theIndex = 5;
+			break;
+		case wxHORIZONTAL_HATCH:
+			theIndex = 25;
+			break;
+		case wxVERTICAL_HATCH:
+			theIndex = 6;
+			break;
+		case wxCROSSDIAG_HATCH:
+			theIndex = 4; // WCH: this is not good
+			break;
+		default:
+			theIndex = 1; // solid pattern
+			break;
+	}
+	GetIndPattern( pattern, thePatListID, theIndex);	
+}
+
+void wxDC::MacInstallPen() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macPenInstalled )
+		return ;
+
+	::RGBForeColor(&m_pen.GetColour().GetPixel() );
+	::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+	
+	::PenNormal() ;
+	int penWidth = m_pen.GetWidth();
+	::PenSize(penWidth, penWidth);
+
+	int penStyle = m_pen.GetStyle();
+	
+	if (penStyle == wxSOLID)
+		::PenPat(&qd.black);
+	else if (IS_HATCH(penStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(penStyle, &pat);
+		::PenPat(&pat);
+	}
+	else
+	{
+		::PenPat(&qd.black);
+	}
+
+	short mode = patCopy ;
+	
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+	m_macPenInstalled = true ;
+	m_macBrushInstalled = false ;
+	m_macFontInstalled = false ;
+}
+
+void wxDC::MacInstallBrush() const
+{
+  if (!Ok()) 
+  	return;
+  MacVerifySetup() ;
+
+	if ( m_macBrushInstalled )
+		return ;
+
+	// foreground
+
+	::RGBForeColor(&m_brush.GetColour().GetPixel() );
+	::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+
+	int brushStyle = m_brush.GetStyle();
+	if (brushStyle == wxSOLID)
+		::PenPat(&qd.black);
+	else if (IS_HATCH(brushStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(brushStyle, &pat);
+		::PenPat(&pat);
+	}
+	else
+	{
+		::PenPat(&qd.black);
+	}
+
+	
+	// background
+	
+	brushStyle = m_backgroundBrush.GetStyle();
+	if (brushStyle == wxSOLID)
+		::BackPat(&qd.white);
+	else if (IS_HATCH(brushStyle))
+	{
+		Pattern pat ;
+		wxMacGetHatchPattern(brushStyle, &pat);
+		::BackPat(&pat);
+	}
+	else
+	{
+		::BackPat(&qd.white);
+	}
+	
+	short mode = patCopy ;
+
+	// todo :
+	
+	switch( m_logicalFunction )
+	{
+		case wxCOPY:       // src
+			mode = patCopy ;
+			break ;
+		case wxINVERT:     // NOT dst
+			::PenPat(&qd.black);
+			mode = patXor ;
+			break ;
+		case wxXOR:        // src XOR dst
+			mode = patXor ;
+			break ;
+		case wxOR_REVERSE: // src OR (NOT dst)
+			mode = notPatOr ;
+			break ;
+		case wxSRC_INVERT: // (NOT src)
+			mode = notPatCopy ;
+			break ;
+
+		// unsupported TODO
+
+		case wxCLEAR:      // 0
+		case wxAND_REVERSE:// src AND (NOT dst)
+		case wxAND:        // src AND dst
+		case wxAND_INVERT: // (NOT src) AND dst
+		case wxNO_OP:      // dst
+		case wxNOR:        // (NOT src) AND (NOT dst)
+		case wxEQUIV:      // (NOT src) XOR dst
+		case wxOR_INVERT:  // (NOT src) OR dst
+		case wxNAND:       // (NOT src) OR (NOT dst)
+		case wxOR:         // src OR dst
+		case wxSET:        // 1
+		case wxSRC_OR:     // source _bitmap_ OR destination
+		case wxSRC_AND:     // source _bitmap_ AND destination
+			break ;
+	}
+	::PenMode( mode ) ;
+	m_macBrushInstalled = true ;
+	m_macPenInstalled = false ;
+	m_macFontInstalled = false ;
+}
+
+
diff --git a/src/mac/dcclient.cpp b/src/mac/dcclient.cpp
index 925d9609ee..08aeff0504 100644
--- a/src/mac/dcclient.cpp
+++ b/src/mac/dcclient.cpp
@@ -38,598 +38,78 @@ IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
  * wxWindowDC
  */
 
+#include <wx/mac/uma.h>
+
 wxWindowDC::wxWindowDC(void)
 {
-};
+}
 
-wxWindowDC::wxWindowDC( wxWindow *window )
-{
-};
+wxWindowDC::wxWindowDC(wxWindow *the_canvas)
+{
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	// this time it is really the full window
+	
+	the_canvas->MacGetPortParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+}
 
 wxWindowDC::~wxWindowDC(void)
 {
-};
-
-void wxWindowDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1), 
-  const wxColour& WXUNUSED(col), int WXUNUSED(style) )
-{
-};
-
-bool wxWindowDC::GetPixel( long WXUNUSED(x1), long WXUNUSED(y1), wxColour *WXUNUSED(col) ) const
-{
-  return FALSE;
-};
-
-void wxWindowDC::DrawLine( long x1, long y1, long x2, long y2 )
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::CrossHair( long x, long y )
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::DrawArc( long x1, long y1, long x2, long y2, long xc, long yc )
-{
-  if (!Ok()) return;
-  
-  long xx1 = XLOG2DEV(x1); 
-  long yy1 = YLOG2DEV(y1);
-  long xx2 = XLOG2DEV(x2); 
-  long yy2 = YLOG2DEV(y2);
-  long xxc = XLOG2DEV((long)xc); 
-  long yyc = YLOG2DEV((long)yc);
-  double dx = xx1 - xxc; 
-  double dy = yy1 - yyc;
-  double radius = sqrt(dx*dx+dy*dy);
-  long   r      = (long)radius;
-  double radius1, radius2;
-
-  if (xx1 == xx2 && yy1 == yy2) 
-  {
-    radius1 = 0.0;
-    radius2 = 360.0;
-  } 
-  else 
-  if (radius == 0.0) 
-  {
-    radius1 = radius2 = 0.0;
-  } 
-  else 
-  {
-    radius1 = (xx1 - xxc == 0) ?
-	    (yy1 - yyc < 0) ? 90.0 : -90.0 :
-	    -atan2(double(yy1-yyc), double(xx1-xxc)) * RAD2DEG;
-    radius2 = (xx2 - xxc == 0) ?
-	    (yy2 - yyc < 0) ? 90.0 : -90.0 :
-	    -atan2(double(yy2-yyc), double(xx2-xxc)) * RAD2DEG;
-  };
-  long alpha1 = long(radius1 * 64.0);
-  long alpha2 = long((radius2 - radius1) * 64.0);
-  while (alpha2 <= 0) alpha2 += 360*64;
-  while (alpha1 > 360*64) alpha1 -= 360*64;
-
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-    
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-  
-};
-
-void wxWindowDC::DrawEllipticArc( long x, long y, long width, long height, double sa, double ea )
-{
-  if (!Ok()) return;
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-  
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-  
-  long start = long(sa * 64.0);
-  long end = long(ea * 64.0);
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawPoint( long x, long y )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawLines( int n, wxPoint points[], long xoffset, long yoffset )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() == wxTRANSPARENT) return;
-  
-  for (int i = 0; i < n-1; i++)
-  {
-    long x1 = XLOG2DEV(points[i].x + xoffset);
-    long x2 = XLOG2DEV(points[i+1].x + xoffset);
-    long y1 = YLOG2DEV(points[i].y + yoffset);     // oh, what a waste
-    long y2 = YLOG2DEV(points[i+1].y + yoffset);
-  };
-};
-
-void wxWindowDC::DrawLines( wxList *points, long xoffset, long yoffset )
-{
-  if (!Ok()) return;
-  
-  if (m_pen.GetStyle() == wxTRANSPARENT) return;
-  
-  wxNode *node = points->First();
-  while (node->Next())
-  {
-    wxPoint *point = (wxPoint*)node->Data();
-    wxPoint *npoint = (wxPoint*)node->Next()->Data();
-    long x1 = XLOG2DEV(point->x + xoffset);
-    long x2 = XLOG2DEV(npoint->x + xoffset);
-    long y1 = YLOG2DEV(point->y + yoffset);    // and again...
-    long y2 = YLOG2DEV(npoint->y + yoffset);
-    node = node->Next();
-  };
-};
-
-void wxWindowDC::DrawPolygon( int WXUNUSED(n), wxPoint WXUNUSED(points)[], 
-  long WXUNUSED(xoffset), long WXUNUSED(yoffset), int WXUNUSED(fillStyle) )
-{
-  if (!Ok()) return;
-};
-
-void wxWindowDC::DrawPolygon( wxList *WXUNUSED(lines), long WXUNUSED(xoffset), 
-                             long WXUNUSED(yoffset), int WXUNUSED(fillStyle) )
-{
-  if (!Ok()) return;
-};
-
-void wxWindowDC::DrawRectangle( long x, long y, long width, long height )
-{
-  if (!Ok()) return;
-
-  long xx = XLOG2DEV(x);
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width);
-  long hh = m_signY * YLOG2DEVREL(height);
-    
-  // CMB: draw nothing if transformed w or h is 0
-  if (ww == 0 || hh == 0) return;
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-    
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-void wxWindowDC::DrawRoundedRectangle( long x, long y, long width, long height, double radius )
-{
-  if (!Ok()) return;
-  
-  if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-  long rr = XLOG2DEVREL((long)radius);
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-
-  // CMB: if radius is zero use DrawRectangle() instead to avoid
-  // X drawing errors with small radii
-  if (rr == 0)
-  {
-    DrawRectangle( x, y, width, height );
-    return;
-  }
-
-  // CMB: draw nothing if transformed w or h is 0
-  if (ww == 0 || hh == 0) return;
-
-  // CMB: adjust size if outline is drawn otherwise the result is
-  // 1 pixel too wide and high
-  if (m_pen.GetStyle() != wxTRANSPARENT)
-  {
-    ww--;
-    hh--;
-  }
-
-  // CMB: ensure dd is not larger than rectangle otherwise we
-  // get an hour glass shape
-  long dd = 2 * rr;
-  if (dd > ww) dd = ww;
-  if (dd > hh) dd = hh;
-  rr = dd / 2;
-
-  if (m_brush.GetStyle() != wxTRANSPARENT)
-  {
-  };
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT)
-  {
-  };
-};
-
-void wxWindowDC::DrawEllipse( long x, long y, long width, long height )
-{
-  if (!Ok()) return;
-  
-  long xx = XLOG2DEV(x);    
-  long yy = YLOG2DEV(y);
-  long ww = m_signX * XLOG2DEVREL(width); 
-  long hh = m_signY * YLOG2DEVREL(height);
-
-  // CMB: handle -ve width and/or height
-  if (ww < 0) { ww = -ww; xx = xx - ww; }
-  if (hh < 0) { hh = -hh; yy = yy - hh; }
-  
-  if (m_brush.GetStyle() != wxTRANSPARENT) {};
-  
-  if (m_pen.GetStyle() != wxTRANSPARENT) {};
-};
-
-bool wxWindowDC::CanDrawBitmap(void) const
-{
-  return TRUE;
-};
-
-void wxWindowDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask )
-{
-  if (!Ok()) return;
-  
-  if (!icon.Ok()) return;
-  
-  int xx = XLOG2DEV(x);
-  int yy = YLOG2DEV(y);
-  
-};
-
-bool wxWindowDC::Blit( long xdest, long ydest, long width, long height,
-       wxDC *source, long xsrc, long ysrc, int WXUNUSED(logical_func), bool WXUNUSED(useMask) )
-{
-  if (!Ok()) return FALSE;
-  
-  // CMB 20/5/98: add blitting of bitmaps
-  if (source->IsKindOf(CLASSINFO(wxMemoryDC)))
-  {
-    wxMemoryDC* srcDC = (wxMemoryDC*)source;
-    /*
-     GdkBitmap* bmap = srcDC->m_selected.GetBitmap();
-    if (bmap)
-    {
-      gdk_draw_bitmap (
-          m_window,
-          m_textGC,
-          bmap,
-          source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc),
-          XLOG2DEV(xdest), YLOG2DEV(ydest),
-          source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height)
-          );
-      return TRUE;
-    }
-    */
-  }
-
-  return TRUE;
-};
-
-void wxWindowDC::DrawText( const wxString &text, long x, long y, bool
-WXUNUSED(use16) )
-{
-  if (!Ok()) return;
-
-};
-
-
-
-bool wxWindowDC::CanGetTextExtent(void) const
-{
-  return TRUE;
-};
-
-void wxWindowDC::GetTextExtent( const wxString &string, long *width, long *height,
-                     long *WXUNUSED(descent), long *WXUNUSED(externalLeading),
-                     wxFont *WXUNUSED(theFont), bool WXUNUSED(use16) )
-{
-  if (!Ok()) return;
-  
-};
-
-long wxWindowDC::GetCharWidth(void)
-{
-  if (!Ok()) return 0;
-  return 0;
-};
-
-long wxWindowDC::GetCharHeight(void)
-{
-  if (!Ok()) return 0;
-  return 0;
-};
-
-void wxWindowDC::Clear(void)
-{
-  if (!Ok()) return;
-  
-};
-
-void wxWindowDC::SetFont( const wxFont &font )
-{
-  if (!Ok()) return;
-  
-  m_font = font;
-};
-
-void wxWindowDC::SetPen( const wxPen &pen )
-{
-  if (!Ok()) return;
-
-  if (m_pen == pen) return;
-  
-  m_pen = pen;
-  
-  if (!m_pen.Ok()) return;
-};
-
-void wxWindowDC::SetBrush( const wxBrush &brush )
-{
-  if (!Ok()) return;
-  
-  if (m_brush == brush) return;
-  
-  m_brush = brush;
-  
-  if (!m_brush.Ok()) return;
-  
-};
-
-void wxWindowDC::SetBackground( const wxBrush &brush )
-{
-  if (!Ok()) return;
-  
-  if (m_backgroundBrush == brush) return;
-  
-  m_backgroundBrush = brush;
-  
-  if (!m_backgroundBrush.Ok()) return;
-  
-};
-
-void wxWindowDC::SetLogicalFunction( int function )
-{
-  if (m_logicalFunction == function) return;
-};
-
-void wxWindowDC::SetTextForeground( const wxColour &col )
-{
-  if (!Ok()) return;
-  
-  if (m_textForegroundColour == col) return;
-  
-  m_textForegroundColour = col;
-  if (!m_textForegroundColour.Ok()) return;
-};
-
-void wxWindowDC::SetTextBackground( const wxColour &col )
-{
-  if (!Ok()) return;
-  
-  if (m_textBackgroundColour == col) return;
-  
-  m_textBackgroundColour = col;
-  if (!m_textBackgroundColour.Ok()) return;
-};
-
-void wxWindowDC::SetBackgroundMode( int mode )
-{
-  m_backgroundMode = mode;
-
-  if (m_brush.GetStyle() != wxSOLID && m_brush.GetStyle() != wxTRANSPARENT)
-  {
-  }
-};
-
-void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) )
-{
-};
-
-void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
-{
-  wxDC::SetClippingRegion( x, y, width, height );
+}
 
-  // TODO
-  
-};
+/*
+ * wxClientDC
+ */
 
-void wxWindowDC::SetClippingRegion( const wxRegion& region )
+wxClientDC::wxClientDC(void)
 {
-  wxRect box = region.GetBox();
-
-  wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
-
-  // TODO
 }
 
-void wxWindowDC::DestroyClippingRegion(void)
+wxClientDC::wxClientDC(wxWindow *window)
 {
-  wxDC::DestroyClippingRegion();
-  
-};
-
-// ----------------------------------- spline code ----------------------------------------
-
-void wx_quadratic_spline(double a1, double b1, double a2, double b2,
-                         double a3, double b3, double a4, double b4);
-void wx_clear_stack(void);
-int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
-        double *y3, double *x4, double *y4);
-void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
-          double x4, double y4);
-static bool wx_spline_add_point(double x, double y);
-static void wx_spline_draw_point_array(wxDC *dc);
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	window->MacGetPortClientParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+  SetBackground(wxBrush(window->GetBackgroundColour(), wxSOLID));
 
-wxList wx_spline_point_list;
-
-#define		half(z1, z2)	((z1+z2)/2.0)
-#define		THRESHOLD	5
-
-/* iterative version */
-
-void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4,
-                 double b4)
-{
-    register double  xmid, ymid;
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-
-    wx_clear_stack();
-    wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4);
-
-    while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
-        xmid = (double)half(x2, x3);
-        ymid = (double)half(y2, y3);
-	if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD &&
-	    fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) {
-            wx_spline_add_point( x1, y1 );
-            wx_spline_add_point( xmid, ymid );
-	} else {
-            wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
-                 (double)half(x3, x4), (double)half(y3, y4), x4, y4);
-            wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
-                 (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
-	}
-    }
 }
 
-/* utilities used by spline drawing routines */
-
-typedef struct wx_spline_stack_struct {
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-} Stack;
-
-#define         SPLINE_STACK_DEPTH             20
-static Stack    wx_spline_stack[SPLINE_STACK_DEPTH];
-static Stack   *wx_stack_top;
-static int      wx_stack_count;
-
-void wx_clear_stack(void)
+wxClientDC::~wxClientDC(void)
 {
-    wx_stack_top = wx_spline_stack;
-    wx_stack_count = 0;
 }
 
-void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
-{
-    wx_stack_top->x1 = x1;
-    wx_stack_top->y1 = y1;
-    wx_stack_top->x2 = x2;
-    wx_stack_top->y2 = y2;
-    wx_stack_top->x3 = x3;
-    wx_stack_top->y3 = y3;
-    wx_stack_top->x4 = x4;
-    wx_stack_top->y4 = y4;
-    wx_stack_top++;
-    wx_stack_count++;
-}
+/*
+ * wxPaintDC
+ */
 
-int wx_spline_pop(double *x1, double *y1, double *x2, double *y2,
-                  double *x3, double *y3, double *x4, double *y4)
+wxPaintDC::wxPaintDC(void)
 {
-    if (wx_stack_count == 0)
-	return (0);
-    wx_stack_top--;
-    wx_stack_count--;
-    *x1 = wx_stack_top->x1;
-    *y1 = wx_stack_top->y1;
-    *x2 = wx_stack_top->x2;
-    *y2 = wx_stack_top->y2;
-    *x3 = wx_stack_top->x3;
-    *y3 = wx_stack_top->y3;
-    *x4 = wx_stack_top->x4;
-    *y4 = wx_stack_top->y4;
-    return (1);
 }
 
-static bool wx_spline_add_point(double x, double y)
+wxPaintDC::wxPaintDC(wxWindow *window)
 {
-  wxPoint *point = new wxPoint ;
-  point->x = (int) x;
-  point->y = (int) y;
-  wx_spline_point_list.Append((wxObject*)point);
-  return TRUE;
-}
+	WindowRef windowref ;
+	wxWindow* rootwindow ;
+	
+	window->MacGetPortClientParams(&m_macLocalOrigin, &m_macClipRect , &windowref , &rootwindow );
 
-static void wx_spline_draw_point_array(wxDC *dc)
-{
-  dc->DrawLines(&wx_spline_point_list, 0, 0 );
-  wxNode *node = wx_spline_point_list.First();
-  while (node)
-  {
-    wxPoint *point = (wxPoint *)node->Data();
-    delete point;
-    delete node;
-    node = wx_spline_point_list.First();
-  }
+	m_macPort = UMAGetWindowPort( windowref ) ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
+	long x , y ,w , h ;
+	window->GetUpdateRegion().GetBox( x , y , w , h ) ;
+	SetClippingRegion( x , y , w , h ) ;
+  	SetBackground(wxBrush(window->GetBackgroundColour(), wxSOLID));
 }
 
-void wxWindowDC::DrawSpline( wxList *points )
+wxPaintDC::~wxPaintDC()
 {
-    wxPoint *p;
-    double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
-    double           x1, y1, x2, y2;
-
-    wxNode *node = points->First();
-    p = (wxPoint *)node->Data();
-
-    x1 = p->x;
-    y1 = p->y;
-
-    node = node->Next();
-    p = (wxPoint *)node->Data();
-
-    x2 = p->x;
-    y2 = p->y;
-    cx1 = (double)((x1 + x2) / 2);
-    cy1 = (double)((y1 + y2) / 2);
-    cx2 = (double)((cx1 + x2) / 2);
-    cy2 = (double)((cy1 + y2) / 2);
-
-    wx_spline_add_point(x1, y1);
-
-    while ((node = node->Next()) != NULL)
-    {
-        p = (wxPoint *)node->Data();
-	x1 = x2;
-	y1 = y2;
-	x2 = p->x;
-	y2 = p->y;
-        cx4 = (double)(x1 + x2) / 2;
-        cy4 = (double)(y1 + y2) / 2;
-        cx3 = (double)(x1 + cx4) / 2;
-        cy3 = (double)(y1 + cy4) / 2;
-
-        wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
-
-	cx1 = cx4;
-	cy1 = cy4;
-        cx2 = (double)(cx1 + x2) / 2;
-        cy2 = (double)(cy1 + y2) / 2;
-    }
-
-    wx_spline_add_point( cx1, cy1 );
-    wx_spline_add_point( x2, y2 );
-
-    wx_spline_draw_point_array( this );
-};
+}
diff --git a/src/mac/dcmemory.cpp b/src/mac/dcmemory.cpp
index 7cbd330821..28a652368a 100644
--- a/src/mac/dcmemory.cpp
+++ b/src/mac/dcmemory.cpp
@@ -40,6 +40,18 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap )
   m_selected = bitmap;
   if (m_selected.Ok())
   {
+		wxBitmapRefData * bmap = (wxBitmapRefData*) (m_selected.GetRefData()) ;
+		if ( bmap->m_hBitmap )
+		{
+			m_macPort = (GrafPtr) bmap->m_hBitmap ;
+			MacSetupPort() ;
+ 			m_ok = TRUE ;
+			// SetBackground(wxBrush(*wxWHITE, wxSOLID));
+ 		}
+ 		else
+ 		{
+	    m_ok = FALSE;
+ 		}
   }
   else
   {
diff --git a/src/mac/dcscreen.cpp b/src/mac/dcscreen.cpp
index e03bbac0c8..1ea12f3d29 100644
--- a/src/mac/dcscreen.cpp
+++ b/src/mac/dcscreen.cpp
@@ -22,7 +22,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxWindowDC)
 // Create a DC representing the whole screen
 wxScreenDC::wxScreenDC()
 {
-    // TODO
+	m_macPort = LMGetWMgrPort() ;
+	MacSetupPort() ;
+ 	m_ok = TRUE ;
 }
 
 wxScreenDC::~wxScreenDC()
diff --git a/src/mac/dialog.cpp b/src/mac/dialog.cpp
index bf3cae5e35..7e82133eb2 100644
--- a/src/mac/dialog.cpp
+++ b/src/mac/dialog.cpp
@@ -19,6 +19,8 @@
 #include "wx/app.h"
 #include "wx/settings.h"
 
+#include <wx/mac/uma.h>
+
 // Lists to keep track of windows, so we can disable/enable them
 // for modal dialogs
 wxList wxModalDialogs;
@@ -29,6 +31,7 @@ extern wxList wxPendingDelete;
 IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
 
 BEGIN_EVENT_TABLE(wxDialog, wxPanel)
+	EVT_SIZE(wxDialog::OnSize)
   EVT_BUTTON(wxID_OK, wxDialog::OnOK)
   EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
   EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
@@ -66,9 +69,47 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
   else
 	m_windowId = id;
 
-  // TODO: create dialog
+	Rect theBoundsRect;
+
+  m_x = (int)pos.x;
+  m_y = (int)pos.y;
+  if ( m_y < 50 )
+  	m_y = 50 ;
+  if ( m_x < 20 )
+  	m_x = 20 ;
+  	
+  m_width = size.x;
+	if (m_width == -1) 
+		m_width = 20;
+  m_height = size.y;
+	if (m_height == -1) 
+		m_height = 20;
+
+	::SetRect(&theBoundsRect, m_x, m_y, m_x + m_width, m_y + m_height);
+	m_macWindowData = new MacWindowData() ;
+
+	WindowClass wclass = kMovableModalWindowClass ;
+	WindowAttributes attr = kWindowNoAttributes ;
+	
+	if ( ( m_windowStyle & wxMINIMIZE_BOX ) || ( m_windowStyle & wxMAXIMIZE_BOX ) )
+	{
+		attr |= kWindowFullZoomAttribute ;
+		attr |= kWindowResizableAttribute ;
+	}
 
-  return FALSE;
+	UMACreateNewWindow( wclass , attr , &theBoundsRect , &m_macWindowData->m_macWindow ) ;
+	wxAssociateWinWithMacWindow( m_macWindowData->m_macWindow , this ) ;
+	wxString label ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+	m_macWindowData->m_macWindowBackgroundTheme = kThemeBrushDialogBackgroundActive ;
+	UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ;
+	m_macWindowData->m_macFocus = NULL ;
+	m_macShown = false ;
+  return TRUE;
 }
 
 void wxDialog::SetModal(bool flag)
@@ -86,7 +127,6 @@ void wxDialog::SetModal(bool flag)
 
 wxDialog::~wxDialog()
 {
-    // TODO
     wxTopLevelWindows.DeleteObject(this);
 
     if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
@@ -99,7 +139,7 @@ wxDialog::~wxDialog()
 
       if (wxTheApp->GetExitOnFrameDelete())
       {
-         // TODO: exit
+       	wxTheApp->ExitMainLoop() ;
       }
     }
 }
@@ -132,67 +172,65 @@ bool wxDialog::IsIconized() const
     return FALSE;
 }
 
-void wxDialog::SetClientSize(int width, int height)
-{
-    // TODO
-}
-
-void wxDialog::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
+extern bool s_macIsInModalLoop ;
 
 bool wxDialog::Show(bool show)
 {
-    // TODO
-    return FALSE;
-}
+	if ( m_macShown == show )
+		return TRUE ;
 
-void wxDialog::SetTitle(const wxString& title)
-{
-    // TODO
-}
+	m_macShown = show ;
 
-wxString wxDialog::GetTitle() const
-{
-    // TODO
-    return wxString("");
-}
+  bool modal =  ((GetWindowStyleFlag() & wxDIALOG_MODAL) == wxDIALOG_MODAL) ;
 
-void wxDialog::Centre(int direction)
-{
-  int x_offset,y_offset ;
-  int display_width, display_height;
-  int  width, height, x, y;
-  wxWindow *parent = GetParent();
-  if ((direction & wxCENTER_FRAME) && parent)
-  {
-      parent->GetPosition(&x_offset,&y_offset) ;
-      parent->GetSize(&display_width,&display_height) ;
-  }
-  else
-  {
-    wxDisplaySize(&display_width, &display_height);
-    x_offset = 0 ;
-    y_offset = 0 ;
-  }
+	if ( modal )
+	{
+		s_macIsInModalLoop = true ;
+	  if (show)
+	  {
+      // if we don't do it, some window might be deleted while we have pointers
+      // to them in our disabledWindows list and the program will crash when it
+      // will try to reenable them after the modal dialog end
+      wxTheApp->DeletePendingObjects();
 
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
+    	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+    	UMASelectWindow( m_macWindowData->m_macWindow ) ;
 
-  if (direction & wxHORIZONTAL)
-    x = (int)((display_width - width)/2);
-  if (direction & wxVERTICAL)
-    y = (int)((display_height - height)/2);
+      if (!wxModalDialogs.Member(this))
+        wxModalDialogs.Append(this);
 
-  SetSize(x+x_offset, y+y_offset, width, height);
+      while (wxModalDialogs.Member(this) )
+      {
+      	wxTheApp->MacDoOneEvent() ;
+      }
+	  }
+	  else
+	  {
+      wxModalDialogs.DeleteObject(this);
+    	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	  s_macIsInModalLoop = false ;
+	}
+	else // !modal
+	{
+	  if (show)
+	  {
+    	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+    	UMASelectWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	  else
+	  {
+    	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	}
+	return TRUE ;
 }
 
+
 // Replacement for Show(TRUE) for modal dialogs - returns return code
 int wxDialog::ShowModal()
 {
-    m_windowStyle |= wxDIALOG_MODAL;
-    // TODO: modal showing
+  m_windowStyle |= wxDIALOG_MODAL;
 	Show(TRUE);
 	return GetReturnCode();
 }
@@ -275,6 +313,16 @@ bool wxDialog::Destroy()
   return TRUE;
 }
 
+void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+  // if we're using constraints - do use them
+  #if wxUSE_CONSTRAINTS
+    if ( GetAutoLayout() ) {
+      Layout();
+    }
+  #endif
+}
+
 void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
 {
   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE));
@@ -283,4 +331,128 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& event)
 
 void wxDialog::Fit()
 {
+  wxWindow::Fit();
 }
+
+wxSizer *wxDialog::CreateTextSizer( const wxString &message )
+{
+    wxBoxSizer *box = new wxBoxSizer( wxVERTICAL );
+    
+    // get line height for empty lines
+    int y = 0;
+    wxFont new_font( GetFont() );
+    if (!new_font.Ok()) new_font = *wxSWISS_FONT;
+    GetTextExtent( "H", (int*)NULL, &y, (int*)NULL, (int*)NULL, &new_font );
+    
+    wxString line;
+    for (size_t pos = 0; pos < message.Len(); pos++)
+    {
+        if (message[pos] == _T('\n'))
+        {
+            if (!line.IsEmpty())
+            {
+                wxStaticText *s1 = new wxStaticText( this, -1, line );
+		box->Add( s1 );
+                line = _T("");
+            }
+	    else
+	    {
+	        box->Add( 5, y );
+	    }
+        }
+        else
+        {
+            line += message[pos];
+        }
+    }
+    
+    // remaining text behind last '\n'
+    if (!line.IsEmpty())
+    {
+        wxStaticText *s2 = new wxStaticText( this, -1, line );
+	box->Add( s2 );
+    }
+    
+    return box;
+}
+    
+wxSizer *wxDialog::CreateButtonSizer( long flags )
+{
+    wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL );
+
+#if defined(__WXMSW__) || defined(__WXMAC__)
+    int margin = 6;
+#else
+    int margin = 10;
+#endif
+
+    wxButton *ok = (wxButton *) NULL;
+    wxButton *cancel = (wxButton *) NULL;
+    wxButton *yes = (wxButton *) NULL;
+    wxButton *no = (wxButton *) NULL;
+
+    // always show an OK button, unless only YES_NO is given
+    if ((flags & wxYES_NO) == 0) flags = flags | wxOK;
+    
+    if (flags & wxYES_NO) 
+    {
+        yes = new wxButton( this, wxID_YES, _("Yes") );
+        box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
+        no = new wxButton( this, wxID_NO, _("No") );
+        box->Add( no, 0, wxLEFT|wxRIGHT, margin );
+    } else 
+    if (flags & wxYES) 
+    {
+        yes = new wxButton( this, wxID_YES, _("Yes") );
+        box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
+    } else 
+    if (flags & wxNO) 
+    {
+        no = new wxButton( this, wxID_NO, _("No") );
+        box->Add( no, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if (flags & wxOK) 
+    {
+        ok = new wxButton( this, wxID_OK, _("OK") );
+        box->Add( ok, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if (flags & wxFORWARD) 
+        box->Add( new wxButton( this, wxID_FORWARD, _("Forward")  ), 0, wxLEFT|wxRIGHT, margin ); 
+
+    if (flags & wxBACKWARD) 
+        box->Add( new wxButton( this, wxID_BACKWARD, _("Backward")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxSETUP) 
+        box->Add( new wxButton( this, wxID_SETUP, _("Setup")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxMORE) 
+        box->Add( new wxButton( this, wxID_MORE, _("More...")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxHELP)
+        box->Add( new wxButton( this, wxID_HELP, _("Help")  ), 0, wxLEFT|wxRIGHT, margin );
+
+    if (flags & wxCANCEL) 
+    {
+        cancel = new wxButton( this, wxID_CANCEL, _("Cancel") );
+        box->Add( cancel, 0, wxLEFT|wxRIGHT, margin );
+    }
+
+    if ((flags & wxNO_DEFAULT) == 0)
+    {
+        if (ok)
+        {
+            ok->SetDefault();
+            ok->SetFocus();
+        }
+        else if (yes)
+        {
+            yes->SetDefault();
+            yes->SetFocus();
+        }
+    }
+    
+    return box;
+}
+
diff --git a/src/mac/dirdlg.cpp b/src/mac/dirdlg.cpp
index 095621b978..edfc211caa 100644
--- a/src/mac/dirdlg.cpp
+++ b/src/mac/dirdlg.cpp
@@ -24,6 +24,407 @@
 IMPLEMENT_CLASS(wxDirDialog, wxDialog)
 #endif
 
+enum {
+	kSelectItem = 10, 			// select button item number
+	kSFGetFolderDlgID = 250,	// dialog resource number
+	kStrListID = 250,			// our strings
+	kSelectStrNum = 1,			// word 'Select: ' for button
+	kDesktopStrNum = 2,			// word 'Desktop' for button
+	kSelectNoQuoteStrNum = 3,	// word 'Select: ' for button
+	
+	kUseQuotes = true,			// parameter for SetButtonName
+	kDontUseQuotes = false
+};
+
+// the data we need to pass to our standard file hook routine
+// includes a pointer to the dialog, a pointer to the standard
+// file reply record (so we can inspect the current selection)
+// and a copy of the "previous" file spec of the reply record
+// so we can see if the selection has changed
+
+struct UserDataRec {
+	StandardFileReply	*sfrPtr;
+	FSSpec				oldSelectionFSSpec;
+	DialogPtr			theDlgPtr;
+};
+typedef struct UserDataRec
+	UserDataRec, *UserDataRecPtr;
+
+static void GetLabelString(StringPtr theStr, short stringNum)
+{
+	GetIndString(theStr, kStrListID, stringNum);
+}
+
+static void CopyPStr(StringPtr src, StringPtr dest)
+{
+	BlockMoveData(src, dest, 1 + src[0]);
+}
+
+static char GetSelectKey(void)
+{
+	// this is the key used to trigger the select button
+	
+	// NOT INTERNATIONAL SAVVY; should at least grab it from resources
+	
+	return 's';
+}
+
+
+// SetButtonName sets the name of the Select button in the dialog
+//
+// To do this, we need to call the Script Manager to truncate the
+// label in the middle to fit the button and to merge the button
+// name with the word Select (possibly followed by quotes).  Using
+// the Script Manager avoids all sorts of problems internationally.
+//
+// buttonName is the name to appear following the word Select
+// quoteFlag should be true if the name is to appear in quotes
+
+static void SetButtonName(DialogPtr theDlgPtr, short buttonID, StringPtr buttonName,
+					Boolean quoteFlag)
+{
+	short 	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	short	textWidth;
+	Handle	labelHandle;
+	Handle	nameHandle;
+	Str15	keyStr;
+	Str255	labelStr;
+	OSErr	err;
+	
+	nameHandle = nil;
+	labelHandle = nil;
+	
+	// get the details of the button from the dialog
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	
+	// get the string for the select button label, "Select ^0" or "Select Ò^0Ó"
+	
+	GetLabelString(labelStr, (quoteFlag == kUseQuotes) ? kSelectStrNum : kSelectNoQuoteStrNum);
+	
+	// make string handles containing the select button label and the
+	// file name to be stuffed into the button
+	
+	err = PtrToHand(&labelStr[1], &labelHandle, labelStr[0]);
+	if (err != noErr) goto Bail;
+	
+	// cut out the middle of the file name to fit the button
+	//
+	// we'll temporarily use labelStr here to hold the modified button name
+	// since we don't own the buttonName string storage space
+	
+	textWidth = (buttonRect.right - buttonRect.left) - StringWidth(labelStr);
+
+	CopyPStr(buttonName, labelStr);
+	(void) TruncString(textWidth, labelStr, smTruncMiddle);
+	
+	err = PtrToHand(&labelStr[1], &nameHandle, labelStr[0]);
+	if (err != noErr) goto Bail;
+	
+	// replace the ^0 in the Select string with the file name
+	
+	CopyPStr("\p^0", keyStr);
+	
+	(void) ReplaceText(labelHandle, nameHandle, keyStr);
+	
+	labelStr[0] = (unsigned char) GetHandleSize(labelHandle);
+	BlockMoveData(*labelHandle, &labelStr[1], labelStr[0]);
+	
+	// now set the control title, and re-validate the area
+	// above the control to avoid a needless redraw
+	
+	SetControlTitle((ControlHandle) buttonHandle, labelStr);
+	
+	ValidRect(&buttonRect);
+
+Bail:
+	if (nameHandle)		DisposeHandle(nameHandle);
+	if (labelHandle)	DisposeHandle(labelHandle);
+	
+}
+
+// FlashButton briefly highlights the dialog button 
+// as feedback for key equivalents
+
+static void FlashButton(DialogPtr theDlgPtr, short buttonID)
+{
+	short	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	unsigned long	finalTicks;
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	HiliteControl((ControlHandle) buttonHandle, kControlButtonPart);
+	Delay(10, &finalTicks);
+	HiliteControl((ControlHandle) buttonHandle, 0);
+}
+
+static Boolean SameFSSpec(FSSpecPtr spec1, FSSpecPtr spec2)
+{
+	return (spec1->vRefNum == spec2->vRefNum
+			&& spec1->parID == spec2->parID
+			&& EqualString(spec1->name, spec2->name, false, false));
+}
+// MyModalDialogFilter maps a key to the Select button, and handles
+// flashing of the button when the key is hit
+
+static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRecord *eventRec,
+											short *item, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// make certain the proper dialog is showing, 'cause standard file
+	// can nest dialogs but calls the same filter for each
+	
+	if (((WindowPeek) theDlgPtr)->refCon == sfMainDialogRefCon)
+	{
+		// check if the select button was hit
+		
+		if ((eventRec->what == keyDown)
+			&& (eventRec->modifiers & cmdKey) 
+			&& ((eventRec->message & charCodeMask) == GetSelectKey()))
+		{
+			*item = kSelectItem;
+			FlashButton(theDlgPtr, kSelectItem);
+			return true;
+		}
+	}
+		
+	return false;
+}
+
+
+// MyDlgHook is a hook routine that maps the select button to Open
+// and sets the Select button name
+
+static pascal short SFGetFolderDialogHook(short item, DialogPtr theDlgPtr, Ptr dataPtr)
+{
+	UserDataRecPtr	theUserDataRecPtr;
+	long			desktopDirID;
+	short			desktopVRefNum;
+	FSSpec			tempSpec;
+	Str63			desktopName;
+	OSErr			err;
+	
+	// be sure Std File is really showing us the intended dialog,
+	// not a nested modal dialog
+	
+	if (((WindowPeek) theDlgPtr)->refCon != sfMainDialogRefCon)
+	{
+		return item;
+	}
+	
+	theUserDataRecPtr = (UserDataRecPtr) dataPtr;
+	
+	// map the Select button to Open
+	
+	if (item == kSelectItem)
+	{
+		item = sfItemOpenButton;
+	}
+	
+	// find the desktop folder
+	
+	err = FindFolder(theUserDataRecPtr->sfrPtr->sfFile.vRefNum,
+					kDesktopFolderType, kDontCreateFolder,
+					&desktopVRefNum, &desktopDirID);
+	
+	if (err != noErr)
+	{
+		// for errors, get value that won't match any real vRefNum/dirID
+		desktopVRefNum = 0;
+		desktopDirID = 0;
+	}
+	
+	// change the Select button label if the selection has changed or
+	// if this is the first call to the hook
+	
+	if (item == sfHookFirstCall
+		|| item == sfHookChangeSelection
+		|| item == sfHookRebuildList
+		|| ! SameFSSpec(&theUserDataRecPtr->sfrPtr->sfFile,
+					&theUserDataRecPtr->oldSelectionFSSpec))
+	{
+		// be sure there is a file name selected
+		
+		if (theUserDataRecPtr->sfrPtr->sfFile.name[0] != '\0')
+		{
+			SetButtonName(theDlgPtr, kSelectItem, 
+							theUserDataRecPtr->sfrPtr->sfFile.name, 
+							kUseQuotes);	// true -> use quotes
+		}
+		else
+		{
+			// is the desktop selected?
+			
+			if (theUserDataRecPtr->sfrPtr->sfFile.vRefNum == desktopVRefNum
+				&& theUserDataRecPtr->sfrPtr->sfFile.parID == desktopDirID)
+			{
+				// set button to "Select Desktop"
+				
+				GetLabelString(desktopName, kDesktopStrNum);
+				SetButtonName(theDlgPtr, kSelectItem, 
+								desktopName, kDontUseQuotes);	// false -> no quotes
+			}
+			else
+			{
+				// get parent directory's name for the Select button
+				//
+				// passing an empty name string to FSMakeFSSpec gets the
+				// name of the folder specified by the parID parameter
+				
+				(void) FSMakeFSSpec(theUserDataRecPtr->sfrPtr->sfFile.vRefNum,
+					theUserDataRecPtr->sfrPtr->sfFile.parID, "\p",
+					&tempSpec);
+				SetButtonName(theDlgPtr, kSelectItem, 
+							tempSpec.name, kUseQuotes); // true -> use quotes
+			}
+		}
+	}
+	
+	// save the current selection as the old selection for comparison next time
+	//
+	// it's not valid on the first call, though, or if we don't have a 
+	// name available from standard file
+	
+	if (item != sfHookFirstCall || theUserDataRecPtr->sfrPtr->sfFile.name[0] != '\0')
+	{
+		theUserDataRecPtr->oldSelectionFSSpec = theUserDataRecPtr->sfrPtr->sfFile;
+	}
+	else
+	{
+		// on first call, empty string won't set the button correctly, 
+		// so invalidate oldSelection
+		
+		theUserDataRecPtr->oldSelectionFSSpec.vRefNum = 999;
+		theUserDataRecPtr->oldSelectionFSSpec.parID = 0;
+	}
+	
+	return item;
+}
+
+void StandardGetFolder( ConstStr255Param message , ConstStr255Param path , FileFilterYDUPP fileFilter, StandardFileReply *theSFR)
+{
+	Point 				thePt;
+	SFTypeList			mySFTypeList;
+	UserDataRec			myData;
+	FSSpec				tempSpec;
+	Boolean				folderFlag;
+	Boolean				wasAliasedFlag;
+	DlgHookYDUPP		dlgHookUPP;
+	ModalFilterYDUPP	myModalFilterUPP;
+	OSErr				err;
+	
+	
+	// presumably we're running System 7 or later so CustomGetFile is
+	// available
+	
+	// set initial contents of Select button to a space
+	
+	CopyPStr("\p ", theSFR->sfFile.name);
+	
+	// point the user data parameter at the reply record so we can get to it later
+	
+	myData.sfrPtr = theSFR;
+	
+	// display the dialog
+	
+	dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
+	myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
+	
+	thePt.h = thePt.v = -1;	// center dialog
+	
+	ParamText( message , NULL , NULL , NULL ) ;
+	
+	CustomGetFile(	fileFilter, 
+					-1,					// show all types
+					mySFTypeList,
+					theSFR,
+					kSFGetFolderDlgID,
+					thePt,				// top left point
+					dlgHookUPP,
+					myModalFilterUPP,
+					nil,				// activate list
+					nil,				// activate proc
+					&myData);
+					
+	DisposeRoutineDescriptor(dlgHookUPP);
+	DisposeRoutineDescriptor(myModalFilterUPP);
+	
+	// if cancel wasn't pressed and no fatal error occurred...
+	
+	if (theSFR->sfGood)
+	{
+		// if no name is in the reply record file spec,
+		// use the file spec of the parent folder
+		
+		if (theSFR->sfFile.name[0] == '\0')
+		{
+			err = FSMakeFSSpec(theSFR->sfFile.vRefNum, theSFR->sfFile.parID,
+								"\p", &tempSpec);
+			if (err == noErr)
+			{
+				theSFR->sfFile = tempSpec;
+			}
+			else
+			{
+				// no name to return, forget it
+				
+				theSFR->sfGood = false;
+			}
+		}
+		
+		// if there is now a name in the file spec, check if it's
+		// for a folder or a volume
+		
+		if (theSFR->sfFile.name[0] != '\0')
+		{
+			// the parID of the root of a disk is always fsRtParID == 1
+			
+			if (theSFR->sfFile.parID == fsRtParID)
+			{
+				theSFR->sfIsVolume = true;
+				theSFR->sfIsFolder = false;	// it would be reasonable for this to be true, too
+			}
+			
+			// we have a valid FSSpec, now let's make sure it's not for an alias file
+			
+			err = ResolveAliasFile(&theSFR->sfFile, true, &folderFlag, &wasAliasedFlag);
+			if (err != noErr)
+			{
+				theSFR->sfGood = false;
+			}
+			
+			// did the alias resolve to a folder?
+			
+			if (folderFlag  && ! theSFR->sfIsVolume)
+			{
+				theSFR->sfIsFolder = true;
+			}
+		}
+	}
+}
+
+static pascal Boolean OnlyVisibleFoldersCustomFileFilter(CInfoPBPtr myCInfoPBPtr, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// return true if this item is invisible or a file
+
+	Boolean visibleFlag;
+	Boolean folderFlag;
+	
+	visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);
+	folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);
+	
+	// because the semantics of the filter proc are "true means don't show
+	// it" we need to invert the result that we return
+	
+	return !(visibleFlag && folderFlag);
+}
+
 wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
         const wxString& defaultPath,
         long style, const wxPoint& pos)
@@ -36,7 +437,35 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
 
 int wxDirDialog::ShowModal()
 {
-    // TODO
+	{
+		Str255				prompt ;
+		Str255				path ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)path, m_path ) ;
+		c2pstr((char *)path ) ;
+
+		FileFilterYDUPP 	invisiblesExcludedCustomFilterUPP;
+		StandardFileReply	reply ;
+		invisiblesExcludedCustomFilterUPP = 
+			NewFileFilterYDProc(OnlyVisibleFoldersCustomFileFilter);
+
+		StandardGetFolder( prompt , path , invisiblesExcludedCustomFilterUPP, &reply);
+	
+		DisposeRoutineDescriptor(invisiblesExcludedCustomFilterUPP);
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
 	return wxID_CANCEL;
 }
 
diff --git a/src/mac/filedlg.cpp b/src/mac/filedlg.cpp
index b6f5b1912d..66de687b80 100644
--- a/src/mac/filedlg.cpp
+++ b/src/mac/filedlg.cpp
@@ -23,7 +23,352 @@
 IMPLEMENT_CLASS(wxFileDialog, wxDialog)
 #endif
 
-WXDLLEXPORT wxString wxFileSelector(const char *title,
+// begin wxmac
+
+#include "morefile.h"
+#include "moreextr.h"
+#include "fullpath.h"
+#include "fspcompa.h"
+#include "PLStringFuncs.h"
+
+char * gfilters[] =
+{
+	"*.TXT" ,
+	
+	NULL 
+} ;
+
+OSType gfiltersmac[] =
+{
+	'TEXT' ,
+	
+	'****'
+} ;
+
+static void wxMacSetupStandardFile(short newVRefNum, long newDirID) 
+{ 
+	enum 
+	{ SFSaveDisk = 0x214, CurDirStore = 0x398 };
+	*(short *) SFSaveDisk = -1 * newVRefNum; 
+	*(long *) CurDirStore = newDirID; 
+}
+
+static void wxMacSetupStandardFileFromPath( const char* s )
+{
+	Str255	volume ;
+	Str255	path ;
+	short	vRefNum ;
+	long dirRef ;
+	short	i,j ;
+	Boolean isDirectory ;
+	
+	for (i=0 ; (s[i]!=0) && (s[i]!=':') ;i++)
+		{
+		volume[i]=s[i] ;
+		}
+	volume[i]=':' ;
+	volume[i+1]=0 ;
+	
+	// then copy the rest of the filename
+	
+	for (j=0;(s[i]!=0);i++,j++)
+		{
+		path[j]=s[i] ;		
+		}
+	path[j]=0 ;
+	
+	c2pstr((Ptr) volume) ;
+	c2pstr((Ptr) path) ;
+	
+	SetVol(volume, 0) ;
+	GetVol( NULL, &vRefNum ) ;
+		
+	GetDirectoryID( vRefNum , fsRtDirID , path , &dirRef , &isDirectory ) ;
+	wxMacSetupStandardFile(vRefNum, dirRef) 	;
+}
+
+enum {
+	kSelectItem = 10, 			// select button item number
+	kSFGetFileDlgID = 251,	// dialog resource number
+	kStrListID = 251,			// our strings
+	kSelectStrNum = 1,			// word 'Select: ' for button
+	kDesktopStrNum = 2,			// word 'Desktop' for button
+	kSelectNoQuoteStrNum = 3,	// word 'Select: ' for button
+	
+	kUseQuotes = true,			// parameter for SetButtonName
+	kDontUseQuotes = false
+};
+
+// the data we need to pass to our standard file hook routine
+// includes a pointer to the dialog, a pointer to the standard
+// file reply record (so we can inspect the current selection)
+// and a copy of the "previous" file spec of the reply record
+// so we can see if the selection has changed
+
+const int kwxMacFileTypes = 10 ;
+
+struct OpenUserDataRec {
+	StandardFileReply	*sfrPtr;
+	FSSpec				oldSelectionFSSpec;
+	char				filter[kwxMacFileTypes][10] ;
+	OSType				filtermactypes[kwxMacFileTypes] ;
+	int					numfilters ;
+	DialogPtr			theDlgPtr;
+};
+typedef struct OpenUserDataRec
+	OpenUserDataRec, *OpenUserDataRecPtr;
+
+static void GetLabelString(StringPtr theStr, short stringNum)
+{
+	GetIndString(theStr, kStrListID, stringNum);
+}
+
+static void CopyPStr(StringPtr src, StringPtr dest)
+{
+	BlockMoveData(src, dest, 1 + src[0]);
+}
+
+static char GetSelectKey(void)
+{
+	// this is the key used to trigger the select button
+	
+	// NOT INTERNATIONAL SAVVY; should at least grab it from resources
+	
+	return 's';
+}
+
+// FlashButton briefly highlights the dialog button 
+// as feedback for key equivalents
+
+static void FlashButton(DialogPtr theDlgPtr, short buttonID)
+{
+	short	buttonType;
+	Handle	buttonHandle;
+	Rect	buttonRect;
+	unsigned long	finalTicks;
+	
+	GetDialogItem(theDlgPtr, buttonID, &buttonType, &buttonHandle, &buttonRect);
+	HiliteControl((ControlHandle) buttonHandle, kControlButtonPart);
+	Delay(10, &finalTicks);
+	HiliteControl((ControlHandle) buttonHandle, 0);
+}
+
+static Boolean SameFSSpec(FSSpecPtr spec1, FSSpecPtr spec2)
+{
+	return (spec1->vRefNum == spec2->vRefNum
+			&& spec1->parID == spec2->parID
+			&& EqualString(spec1->name, spec2->name, false, false));
+}
+// MyModalDialogFilter maps a key to the Select button, and handles
+// flashing of the button when the key is hit
+
+static pascal Boolean SFGetFolderModalDialogFilter(DialogPtr theDlgPtr, EventRecord *eventRec,
+											short *item, Ptr dataPtr)
+{
+#pragma unused (dataPtr)
+
+	// make certain the proper dialog is showing, 'cause standard file
+	// can nest dialogs but calls the same filter for each
+	
+	if (((WindowPeek) theDlgPtr)->refCon == sfMainDialogRefCon)
+	{
+		// check if the select button was hit
+		/*
+		if ((eventRec->what == keyDown)
+			&& (eventRec->modifiers & cmdKey) 
+			&& ((eventRec->message & charCodeMask) == GetSelectKey()))
+		{
+			*item = kSelectItem;
+			FlashButton(theDlgPtr, kSelectItem);
+			return true;
+		}
+		*/
+	}
+		
+	return false;
+}
+
+void ExtendedOpenFile( ConstStr255Param message , ConstStr255Param path , const char *filter , FileFilterYDUPP fileFilter, StandardFileReply *theSFR)
+{
+	Point 				thePt;
+	OpenUserDataRec			myData;
+	FSSpec				tempSpec;
+	Boolean				folderFlag;
+	Boolean				wasAliasedFlag;
+	DlgHookYDUPP		dlgHookUPP;
+	ModalFilterYDUPP	myModalFilterUPP;
+	OSErr				err;
+	SFTypeList			types ;
+	
+	
+	// presumably we're running System 7 or later so CustomGetFile is
+	// available
+	
+	// set initial contents of Select button to a space
+	
+	CopyPStr("\p ", theSFR->sfFile.name);
+	
+	// point the user data parameter at the reply record so we can get to it later
+	
+	myData.sfrPtr = theSFR;
+	if ( filter && filter[0] )
+	{
+		myData.numfilters = 1 ;
+		for ( int i = 0 ; i < myData.numfilters ; i++ )
+		{
+			int j ;
+			
+			strcpy( myData.filter[i] , filter ) ;
+			for( j = 0 ; myData.filter[i][j] ; j++ )
+			{
+				myData.filter[i][j] = toupper( myData.filter[i][j] ) ;
+			}
+			for ( j = 0 ; gfilters[j] ; j++ )
+			{
+				if ( strcmp( myData.filter[i] , gfilters[j] ) == 0 )
+				{
+					myData.filtermactypes[i] = gfiltersmac[j] ;
+					break ;
+				}
+			}
+			if( gfilters[j] == NULL )
+			{
+				myData.filtermactypes[i] = '****' ;
+			}
+		}
+	}
+	else
+	{
+		myData.numfilters = 0 ;
+	}
+	// display the dialog
+	
+	dlgHookUPP = NULL ;
+//	dlgHookUPP = NewDlgHookYDProc(SFGetFolderDialogHook);
+	myModalFilterUPP = NewModalFilterYDProc(SFGetFolderModalDialogFilter);
+	
+	thePt.h = thePt.v = -1;	// center dialog
+	
+	ParamText( message , NULL , NULL , NULL ) ;
+	
+	CustomGetFile(	fileFilter, 
+					-1,					// show all types
+					NULL,
+					theSFR,
+					kSFGetFileDlgID,
+					thePt,				// top left point
+					dlgHookUPP,
+					myModalFilterUPP,
+					nil,				// activate list
+					nil,				// activate proc
+					&myData);
+					
+	DisposeRoutineDescriptor(dlgHookUPP);
+	DisposeRoutineDescriptor(myModalFilterUPP);
+	
+	// if cancel wasn't pressed and no fatal error occurred...
+	
+	if (theSFR->sfGood)
+	{
+		// if no name is in the reply record file spec,
+		// use the file spec of the parent folder
+		
+		if (theSFR->sfFile.name[0] == '\0')
+		{
+			err = FSMakeFSSpec(theSFR->sfFile.vRefNum, theSFR->sfFile.parID,
+								"\p", &tempSpec);
+			if (err == noErr)
+			{
+				theSFR->sfFile = tempSpec;
+			}
+			else
+			{
+				// no name to return, forget it
+				
+				theSFR->sfGood = false;
+			}
+		}
+		
+		// if there is now a name in the file spec, check if it's
+		// for a folder or a volume
+		
+		if (theSFR->sfFile.name[0] != '\0')
+		{
+			// the parID of the root of a disk is always fsRtParID == 1
+			
+			if (theSFR->sfFile.parID == fsRtParID)
+			{
+				theSFR->sfIsVolume = true;
+				theSFR->sfIsFolder = false;	// it would be reasonable for this to be true, too
+			}
+			
+			// we have a valid FSSpec, now let's make sure it's not for an alias file
+			
+			err = ResolveAliasFile(&theSFR->sfFile, true, &folderFlag, &wasAliasedFlag);
+			if (err != noErr)
+			{
+				theSFR->sfGood = false;
+			}
+			
+			// did the alias resolve to a folder?
+			
+			if (folderFlag  && ! theSFR->sfIsVolume)
+			{
+				theSFR->sfIsFolder = true;
+			}
+		}
+	}
+}
+
+static pascal Boolean CrossPlatformFileFilter(CInfoPBPtr myCInfoPBPtr, Ptr dataPtr)
+{	
+	Str255 			filename ;
+	OpenUserDataRecPtr data = (OpenUserDataRecPtr) dataPtr ;
+	// return true if this item is invisible or a file
+
+	Boolean visibleFlag;
+	Boolean folderFlag;
+	
+	visibleFlag = ! (myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdFlags & kIsInvisible);
+	folderFlag = (myCInfoPBPtr->hFileInfo.ioFlAttrib & 0x10);
+	
+	// because the semantics of the filter proc are "true means don't show
+	// it" we need to invert the result that we return
+	
+	if ( !visibleFlag )
+		return true ;
+		
+	if ( !folderFlag )
+	{
+		if ( data->numfilters > 0 )
+		{
+			PLstrcpy( filename ,myCInfoPBPtr->hFileInfo.ioNamePtr ) ;
+			if ( filename[0] >= 4 )
+			{
+				for( int j = 1 ; j <= filename[0] ; j++ )
+				{
+					filename[j] = toupper( filename[j] ) ;
+				}
+				for ( int i = 0 ; i < data->numfilters ; ++i )
+				{
+					if ( myCInfoPBPtr->hFileInfo.ioFlFndrInfo.fdType == data->filtermactypes[i] )
+						return false ;
+
+					if ( strncmp( (char*) filename + 1 + filename[0] - 4 , 
+							& data->filter[i][ strlen(data->filter[i]) - 4 ] , 4 ) == 0 )
+							return false ;
+				}
+			}
+			return true ;				
+		}
+	}	
+		
+	return false ;
+}
+
+// end wxmac
+
+wxString wxFileSelector(const char *title,
                      const char *defaultDir, const char *defaultFileName,
                      const char *defaultExtension, const char *filter, int flags,
                      wxWindow *parent, int x, int y)
@@ -100,7 +445,61 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
 
 int wxFileDialog::ShowModal()
 {
-    // TODO
+	if ( m_dialogStyle & wxSAVE )
+	{
+		StandardFileReply	reply ;
+		Str255				prompt ;
+		Str255				filename ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)filename, m_fileName) ;
+		c2pstr((char *)filename ) ;
+		
+		StandardPutFile( prompt , filename , &reply ) ;
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
+	else
+	{
+		OSType types = '????' ;
+		Str255				prompt ;
+		Str255				path ;
+
+		strcpy((char *)prompt, m_message) ;
+		c2pstr((char *)prompt ) ;
+	
+		strcpy((char *)path, m_path ) ;
+		c2pstr((char *)path ) ;
+
+		FileFilterYDUPP 	crossPlatformFileFilterUPP;
+		StandardFileReply	reply ;
+		crossPlatformFileFilterUPP = 
+			NewFileFilterYDProc(CrossPlatformFileFilter);
+
+		ExtendedOpenFile( prompt , path , m_wildCard , crossPlatformFileFilterUPP, &reply);
+	
+		DisposeRoutineDescriptor(crossPlatformFileFilterUPP);
+		if ( reply.sfGood == false )
+		{
+			m_path = "" ;
+			return wxID_CANCEL ;
+		}
+		else
+		{
+			m_path = wxMacFSSpec2UnixFilename( &reply.sfFile ) ;
+			return wxID_OK ;
+		}
+	}
     return wxID_CANCEL;
 }
 
diff --git a/src/mac/font.cpp b/src/mac/font.cpp
index 493a6a25ba..2409e1a38b 100644
--- a/src/mac/font.cpp
+++ b/src/mac/font.cpp
@@ -31,9 +31,10 @@ wxFontRefData::wxFontRefData()
   	m_weight = 0;
   	m_underlined = 0;
   	m_faceName = "";
-/* TODO
-  	m_hFont = 0;
-*/
+
+  	m_macFontSize = m_pointSize ; 
+  	m_macFontNum = systemFont ;
+  	m_macFontStyle = normal ;
 }
 
 wxFontRefData::wxFontRefData(const wxFontRefData& data)
@@ -45,9 +46,10 @@ wxFontRefData::wxFontRefData(const wxFontRefData& data)
   	m_weight = data.m_weight;
   	m_underlined = data.m_underlined;
   	m_faceName = data.m_faceName;
-/* TODO
-  	m_hFont = 0;
-*/
+
+  	m_macFontSize = m_pointSize ; 
+  	m_macFontNum = systemFont ;
+  	m_macFontStyle = normal ;
 }
 
 wxFontRefData::~wxFontRefData()
@@ -55,6 +57,56 @@ wxFontRefData::~wxFontRefData()
     // TODO: delete font data
 }
 
+void wxFontRefData::MacFindFont()
+{
+	if( m_faceName == "" )
+	{
+		switch( m_family )
+		{
+			case wxDEFAULT :
+				m_macFontNum = ::GetAppFont() ;
+				break ;
+			case wxDECORATIVE :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxROMAN :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxSCRIPT :
+				::GetFNum( "\pTimes" , &m_macFontNum) ;
+				break ;
+			case wxSWISS :
+				::GetFNum( "\pHelvetica" , &m_macFontNum) ;
+				break ;
+			case wxMODERN :
+				::GetFNum( "\pMonaco" , &m_macFontNum) ;
+				break ;
+		}
+	}
+	else
+	{
+		if ( m_faceName == "systemfont" )
+			m_macFontNum = ::GetSysFont() ;
+		else if ( m_faceName == "applicationfont" )
+			m_macFontNum = ::GetAppFont() ;
+		else
+		{
+			strcpy(wxBuffer, m_faceName);
+			C2PStr(wxBuffer);
+			::GetFNum( (unsigned char*) wxBuffer, &m_macFontNum);
+		}
+	}
+
+	m_macFontStyle = 0;
+	if (m_weight == wxBOLD)
+		 m_macFontStyle |= bold;
+	if (m_style == wxITALIC || m_style == wxSLANT) 
+		m_macFontStyle |= italic;
+	if (m_underlined) 
+		m_macFontStyle |= underline;
+	m_macFontSize = m_pointSize ;
+}
+
 wxFont::wxFont()
 {
     if ( wxTheFontList )
@@ -94,8 +146,8 @@ wxFont::~wxFont()
 
 bool wxFont::RealizeResource()
 {
-    // TODO: create the font (if there is a native font object)
-    return FALSE;
+	M_FONTDATA->MacFindFont() ;
+    return TRUE;
 }
 
 void wxFont::Unshare()
diff --git a/src/mac/fontdlg.cpp b/src/mac/fontdlg.cpp
index 60e8e9b987..d775c24c16 100644
--- a/src/mac/fontdlg.cpp
+++ b/src/mac/fontdlg.cpp
@@ -14,7 +14,7 @@
 #pragma implementation "fontdlg.h"
 #endif
 
-#include "wx/stubs/fontdlg.h"
+#include "wx/mac/fontdlg.h"
 #include "wx/cmndata.h"
 
 #if !USE_SHARED_LIBRARY
diff --git a/src/mac/frame.cpp b/src/mac/frame.cpp
index 55f1e3b72c..5a95ac9097 100644
--- a/src/mac/frame.cpp
+++ b/src/mac/frame.cpp
@@ -23,6 +23,8 @@
 #include "wx/settings.h"
 #include "wx/app.h"
 
+#include <wx/mac/uma.h>
+
 extern wxList wxModelessWindows;
 extern wxList wxPendingDelete;
 
@@ -47,7 +49,11 @@ bool wxFrame::m_useNativeStatusBar = FALSE;
 
 wxFrame::wxFrame()
 {
+#if wxUSE_TOOLBAR
   m_frameToolBar = NULL ;
+#endif
+	m_macShown = false ;
+	// in order to be able to give size events on show
   m_frameMenuBar = NULL;
   m_frameStatusBar = NULL;
 
@@ -69,7 +75,10 @@ bool wxFrame::Create(wxWindow *parent,
   SetName(name);
   m_windowStyle = style;
   m_frameMenuBar = NULL;
+
+#if wxUSE_TOOLBAR
   m_frameToolBar = NULL ;
+#endif
   m_frameStatusBar = NULL;
 
   SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE));
@@ -83,9 +92,63 @@ bool wxFrame::Create(wxWindow *parent,
 
   wxModelessWindows.Append(this);
 
-  // TODO: create frame.
-
-  return FALSE;
+  // create frame.
+
+	Rect theBoundsRect;
+
+  m_x = (int)pos.x;
+  m_y = (int)pos.y;
+  if ( m_y < 50 )
+  	m_y = 50 ;
+  if ( m_x < 20 )
+  	m_x = 20 ;
+  	
+  m_width = size.x;
+	if (m_width == -1) 
+		m_width = 20;
+  m_height = size.y;
+	if (m_height == -1) 
+		m_height = 20;
+
+	m_macWindowData = new MacWindowData() ;
+
+	::SetRect(&theBoundsRect, m_x, m_y, m_x + m_width, m_y + m_height);
+
+	WindowClass wclass = kDocumentWindowClass ;
+	WindowAttributes attr = kWindowNoAttributes ;
+	
+	if ( ( m_windowStyle & wxMINIMIZE_BOX ) || ( m_windowStyle & wxMAXIMIZE_BOX ) )
+	{
+		attr |= kWindowFullZoomAttribute ;
+		attr |= kWindowResizableAttribute ;
+	}
+	if ( m_windowStyle & wxSTAY_ON_TOP )
+	{
+		wclass = kFloatingWindowClass ;
+		
+//			if ( m_windowStyle & wxCAPTION )
+//				attr |= kHasPaletteTitlebarMask ;
+	}
+	else
+	{
+	}
+	if ( m_windowStyle & wxSYSTEM_MENU )
+	{
+		attr |= kWindowCloseBoxAttribute ;
+	}
+	UMACreateNewWindow( wclass , attr , &theBoundsRect , &m_macWindowData->m_macWindow ) ;
+	wxAssociateWinWithMacWindow( m_macWindowData->m_macWindow , this ) ;
+	wxString label ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+	UMACreateRootControl( m_macWindowData->m_macWindow , &m_macWindowData->m_macRootControl ) ;
+	m_macWindowData->m_macWindowBackgroundTheme = kThemeBrushDocumentWindowBackground ;
+	m_macWindowData->m_macFocus = NULL ;
+	m_macShown = false ;
+  return TRUE;
 }
 
 wxFrame::~wxFrame()
@@ -105,46 +168,13 @@ wxFrame::~wxFrame()
 
     if (wxTheApp->GetExitOnFrameDelete())
     {
-       // TODO signal to the app that we're going to close
+       wxTheApp->ExitMainLoop() ;
     }
   }
 
   wxModelessWindows.DeleteObject(this);
 }
 
-// Get size *available for subwindows* i.e. excluding menu bar, toolbar etc.
-void wxFrame::GetClientSize(int *x, int *y) const
-{
-    // TODO
-}
-
-// Set the client size (i.e. leave the calculation of borders etc.
-// to wxWindows)
-void wxFrame::SetClientSize(int width, int height)
-{
-    // TODO
-}
-
-void wxFrame::GetSize(int *width, int *height) const
-{
-    // TODO
-}
-
-void wxFrame::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
-
-void wxFrame::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
-
-bool wxFrame::Show(bool show)
-{
-    // TODO
-    return FALSE;
-}
 
 void wxFrame::Iconize(bool iconize)
 {
@@ -170,17 +200,6 @@ bool wxFrame::IsMaximized(void) const
     return FALSE;
 }
 
-void wxFrame::SetTitle(const wxString& title)
-{
-    // TODO
-}
-
-wxString wxFrame::GetTitle() const
-{
-    // TODO
-    return wxString("");
-}
-
 void wxFrame::SetIcon(const wxIcon& icon)
 {
   m_icon = icon;
@@ -192,10 +211,12 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
 {
     wxStatusBar *statusBar = NULL;
 
-    statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 20),
+    statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 17),
         style, name);
 
     // Set the height according to the font and the border size
+    // we shouldn't do this on the mac, because we have to fit the grow box
+    /*
     wxClientDC dc(statusBar);
     dc.SetFont(statusBar->GetFont());
 
@@ -206,6 +227,8 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
 
     statusBar->SetSize(-1, -1, 100, height);
 
+		*/
+
     statusBar->SetFieldsCount(number);
     return statusBar;
 }
@@ -245,6 +268,8 @@ void wxFrame::SetStatusWidths(int n, const int widths_field[])
 
 void wxFrame::PositionStatusBar()
 {
+  if (m_frameStatusBar )
+  {
     int w, h;
     GetClientSize(&w, &h);
     int sw, sh;
@@ -253,6 +278,7 @@ void wxFrame::PositionStatusBar()
     // Since we wish the status bar to be directly under the client area,
     // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS.
     m_frameStatusBar->SetSize(0, h, w, sh);
+   }
 }
 
 void wxFrame::SetMenuBar(wxMenuBar *menuBar)
@@ -264,8 +290,8 @@ void wxFrame::SetMenuBar(wxMenuBar *menuBar)
     }
   
     m_frameMenuBar = menuBar;
-
-    // TODO
+		// TODO : we move this into the app code
+    m_frameMenuBar->MacInstallMenuBar() ;
 }
 
 void wxFrame::Fit()
@@ -333,8 +359,12 @@ void wxFrame::OnSize(wxSizeEvent& event)
     wxWindow *win = (wxWindow *)node->Data();
     if ( !win->IsKindOf(CLASSINFO(wxFrame))  &&
          !win->IsKindOf(CLASSINFO(wxDialog)) && 
-         (win != GetStatusBar()) &&
-         (win != GetToolBar()) )
+         (win != GetStatusBar()) 
+#if wxUSE_TOOLBAR
+         &&
+         (win != GetToolBar()) 
+#endif
+         )
     {
       if ( child )
         return;     // it's our second subwindow - nothing to do
@@ -410,21 +440,6 @@ wxMenuBar *wxFrame::GetMenuBar() const
   return m_frameMenuBar;
 }
 
-void wxFrame::Centre(int direction)
-{
-  int display_width, display_height, width, height, x, y;
-  wxDisplaySize(&display_width, &display_height);
-
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
-
-  if (direction & wxHORIZONTAL)
-    x = (int)((display_width - width)/2);
-  if (direction & wxVERTICAL)
-    y = (int)((display_height - height)/2);
-
-  SetSize(x, y, width, height);
-}
 
 // Call this to simulate a menu command
 void wxFrame::Command(int id)
@@ -434,7 +449,7 @@ void wxFrame::Command(int id)
 
 void wxFrame::ProcessCommand(int id)
 {
-  wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, id);
+  wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id);
   commandEvent.SetInt( id );
   commandEvent.SetEventObject( this );
 
@@ -450,18 +465,14 @@ void wxFrame::ProcessCommand(int id)
   }
 */
 
-  // Process events starting with the window with the focus, if any.
-  wxWindow* focusWin = wxFindFocusDescendant(this);
-
-  wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
-
-  evtHandler->ProcessEvent(commandEvent);
+  GetEventHandler()->ProcessEvent(commandEvent);
 }
 
 // Checks if there is a toolbar, and returns the first free client position
 wxPoint wxFrame::GetClientAreaOrigin() const
 {
     wxPoint pt(0, 0);
+#if wxUSE_TOOLBAR
     if (GetToolBar())
     {
         int w, h;
@@ -476,33 +487,46 @@ wxPoint wxFrame::GetClientAreaOrigin() const
             pt.y += h;
         }
     }
+#endif
     return pt;
 }
 
-void wxFrame::ScreenToClient(int *x, int *y) const
+void wxFrame::GetClientSize(int *x, int *y) const
 {
-    wxWindow::ScreenToClient(x, y);
-
-    // We may be faking the client origin.
-    // So a window that's really at (0, 30) may appear
-    // (to wxWin apps) to be at (0, 0).
-    wxPoint pt(GetClientAreaOrigin());
-    *x -= pt.x;
-    *y -= pt.y;
+	wxWindow::GetClientSize( x , y ) ;
+
+  if ( GetStatusBar() )
+  {
+    int statusX, statusY;
+    GetStatusBar()->GetClientSize(&statusX, &statusY);
+    *y -= statusY;
+  }
+
+  wxPoint pt(GetClientAreaOrigin());
+  *y -= pt.y;
+  *x -= pt.x;
 }
 
-void wxFrame::ClientToScreen(int *x, int *y) const
+void wxFrame::DoSetClientSize(int clientwidth, int clientheight)
 {
-    // We may be faking the client origin.
-    // So a window that's really at (0, 30) may appear
-    // (to wxWin apps) to be at (0, 0).
-    wxPoint pt1(GetClientAreaOrigin());
-    *x += pt1.x;
-    *y += pt1.y;
-
-    wxWindow::ClientToScreen(x, y);
+	int currentclientwidth , currentclientheight ;
+	int currentwidth , currentheight ;
+	
+	GetClientSize( &currentclientwidth , &currentclientheight ) ;
+	GetSize( &currentwidth , &currentheight ) ;
+	
+	// find the current client size
+
+  // Find the difference between the entire window (title bar and all)
+  // and the client area; add this to the new client size to move the
+  // window
+
+	DoSetSize( -1 , -1 , currentwidth + clientwidth - currentclientwidth ,
+		currentheight + clientheight - currentclientheight , wxSIZE_USE_EXISTING ) ;
 }
 
+
+#if wxUSE_TOOLBAR
 wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
 {
     wxCHECK_MSG( m_frameToolBar == NULL, FALSE,
@@ -534,7 +558,10 @@ void wxFrame::PositionToolBar()
     // the toolbar/status bar were added.
     // So DEFINITELY replace the line below with something appropriate.
 
-    GetClientSize(& cw, &ch);
+   //  GetClientSize(& cw, &ch);
+
+		cw = m_width ;
+		ch = m_height ;
 
     if ( GetStatusBar() )
     {
@@ -562,4 +589,4 @@ void wxFrame::PositionToolBar()
         }
     }
 }
-
+#endif
diff --git a/src/mac/gauge.cpp b/src/mac/gauge.cpp
index a85fbc498f..7dc3b5e813 100644
--- a/src/mac/gauge.cpp
+++ b/src/mac/gauge.cpp
@@ -19,67 +19,65 @@
 IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
+
 bool wxGauge::Create(wxWindow *parent, wxWindowID id,
            int range,
            const wxPoint& pos,
-           const wxSize& size,
+           const wxSize& s,
            long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-    m_rangeMax = range;
-    m_windowStyle = style;
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-
-    // TODO
-    return FALSE;
-}
-
-void wxGauge::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	wxSize size = s ;
+	Rect bounds ;
+	Str255 title ;
+	m_rangeMax = range ;
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
+	
+	if ( size.x == wxDefaultSize.x && size.y == wxDefaultSize.y)
+	{
+		size = wxSize( 200 , 16 ) ;
+	}
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , range, 
+	  	kControlProgressBarProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
 void wxGauge::SetShadowWidth(int w)
 {
-    // TODO optional
 }
 
 void wxGauge::SetBezelFace(int w)
 {
-    // TODO optional
 }
 
 void wxGauge::SetRange(int r)
 {
     m_rangeMax = r;
-    // TODO
+    ::SetControlMaximum( m_macControl , m_rangeMax ) ;
 }
 
 void wxGauge::SetValue(int pos)
 {
     m_gaugePos = pos;
-    // TODO
+   ::SetControlValue( m_macControl , m_gaugePos ) ;
 }
 
 int wxGauge::GetShadowWidth() const
 {
-    // TODO optional
     return 0;
 }
 
 int wxGauge::GetBezelFace() const
 {
-    // TODO optional
     return 0;
 }
 
diff --git a/src/mac/icon.cpp b/src/mac/icon.cpp
index 6deee7dbdc..537165343e 100644
--- a/src/mac/icon.cpp
+++ b/src/mac/icon.cpp
@@ -26,12 +26,30 @@ IMPLEMENT_DYNAMIC_CLASS(wxIcon, wxBitmap)
 
 wxIconRefData::wxIconRefData()
 {
-    // TODO: init icon handle
+    m_ok = FALSE;
+    m_width = 0;
+    m_height = 0;
+    m_depth = 0;
+    m_quality = 0;
+    m_numColors = 0;
+    m_bitmapMask = NULL;
+		m_hBitmap = NULL ;
+		m_hIcon = NULL ;
 }
 
 wxIconRefData::~wxIconRefData()
 {
-    // TODO: destroy icon handle
+	if ( m_hIcon )
+	{
+		DisposeCIcon( m_hIcon ) ;
+		m_hIcon = NULL ;
+	}
+		
+  if (m_bitmapMask)
+  {
+    delete m_bitmapMask;
+    m_bitmapMask = NULL;
+  }
 }
 
 wxIcon::wxIcon()
@@ -68,3 +86,32 @@ bool wxIcon::LoadFile(const wxString& filename, long type,
 	return FALSE;
 }
 
+IMPLEMENT_DYNAMIC_CLASS(wxICONResourceHandler, wxBitmapHandler)
+
+bool  wxICONResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags,
+          int desiredWidth, int desiredHeight)
+{
+	Str255 theName ;
+	short theId ;
+	OSType theType ;
+	strcpy( (char*) theName , name ) ;
+	c2pstr( (char*) theName ) ;
+	
+	Handle resHandle = GetNamedResource( 'cicn' , theName ) ;
+	GetResInfo( resHandle , &theId , &theType , theName ) ;
+	ReleaseResource( resHandle ) ;
+	
+	CIconHandle theIcon = (CIconHandle ) GetCIcon( theId ) ;
+	if ( theIcon )
+	{
+		M_ICONHANDLERDATA->m_hIcon = theIcon ;
+		M_ICONHANDLERDATA->m_width =  32 ;
+		M_ICONHANDLERDATA->m_height = 32 ;
+		
+		M_ICONHANDLERDATA->m_depth = 8 ;
+		M_ICONHANDLERDATA->m_ok = true ;
+		M_ICONHANDLERDATA->m_numColors = 256 ;
+		return TRUE ;
+	}
+	return FALSE ;
+}
\ No newline at end of file
diff --git a/src/mac/listbox.cpp b/src/mac/listbox.cpp
index 1dad21e12c..e17f1b8213 100644
--- a/src/mac/listbox.cpp
+++ b/src/mac/listbox.cpp
@@ -18,10 +18,22 @@
 #include "wx/dynarray.h"
 #include "wx/log.h"
 
+#include "wx/utils.h"
+#include "extldef.h"
+
 #if !USE_SHARED_LIBRARY
   IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+
+BEGIN_EVENT_TABLE(wxListBox, wxControl)
+	EVT_SIZE( wxListBox::OnSize ) 
+END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
+extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
+const short kwxMacListWithVerticalScrollbar = 128 ;
+
 // ============================================================================
 // list box control implementation
 // ============================================================================
@@ -41,111 +53,197 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                        const wxValidator& validator,
                        const wxString& name)
 {
-  m_noItems = n;
+  m_noItems = 0 ; // this will be increased by our append command
   m_selected = 0;
 
-  SetName(name);
-  SetValidator(validator);
-
-  if (parent) parent->AddChild(this);
-
-  wxSystemSettings settings;
-  SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW));
-
-  m_windowId = ( id == -1 ) ? (int)NewControlId() : id;
-
-  // TODO create listbox
-
-  return FALSE;
+	Rect bounds ;
+	Str255 title ;
+	m_macHorizontalBorder = 5 ; // additional pixels around the real control
+	m_macVerticalBorder = 5 ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , kwxMacListWithVerticalScrollbar , 0 , 0, 
+	  	kControlListBoxProc , (long) this ) ;
+	
+	long	result ;
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &m_macList  , &result ) ;
+
+	NewExtLDEFInfo( m_macList , MacDrawStringCell , (long) this ) ;
+	(**m_macList).selFlags = lOnlyOne ;
+	if ( style  & wxLB_MULTIPLE )
+	{
+		(**m_macList).selFlags += lNoExtend ;
+	}
+	else if ( style & wxLB_EXTENDED )
+	{
+		(**m_macList).selFlags += lExtendDrag ;
+	}
+	Point pt = (**m_macList).cellSize ;
+	pt.v = 14 ;
+	LCellSize( pt , m_macList ) ;
+
+	LAddColumn( 1 , 0 , m_macList ) ;
+
+	MacPostControlCreate() ;
+
+	ControlFontStyleRec		controlstyle ;
+	controlstyle.flags = kControlUseFontMask + kControlUseSizeMask ;
+	//controlstyle.font = kControlFontSmallSystemFont ;
+	controlstyle.font = kFontIDMonaco ;
+	controlstyle.size = 9 ;
+	::UMASetControlFontStyle( m_macControl , &controlstyle ) ;
+
+	for ( int i = 0 ; i < n ; i++ )
+	{
+		Append( choices[i] ) ;
+	}
+
+	LSetDrawingMode( true , m_macList ) ;
+
+  return TRUE;
 }
 
 wxListBox::~wxListBox()
 {
+//	DisposeExtLDEFInfo( m_macList ) ;
 }
 
 void wxListBox::SetFirstItem(int N)
 {
-    // TODO
+	MacScrollTo( N ) ;
 }
 
 void wxListBox::SetFirstItem(const wxString& s)
 {
-    // TODO
+	MacScrollTo( FindString( s ) ) ;
 }
 
 void wxListBox::Delete(int N)
 {
-  m_noItems --;
-    // TODO
+	m_dataArray.Remove( N ) ;
+	m_stringArray.Remove( N ) ;
+  	m_noItems --;
+	
+	MacDelete( N ) ;
 }
 
 void wxListBox::Append(const wxString& item)
 {
-  m_noItems ++;
-
-  // TODO
+	Append( item , NULL ) ;
 }
 
 void wxListBox::Append(const wxString& item, char *Client_data)
 {
-  m_noItems ++;
-
-  // TODO
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		m_stringArray.Add( wxMacMakeMacStringFromPC( item ) ) ;
+	}
+	else
+		m_stringArray.Add( item ) ;
+	m_dataArray.Add( Client_data ) ;
+  	m_noItems ++;
+  	
+	MacAppend( item ) ;
 }
 
 void wxListBox::Set(int n, const wxString *choices, char** clientData)
 {
-  m_noItems = n;
-
-  // TODO
+  Clear() ;  
+  for( int i = 0 ; i < n ; ++i )
+  {
+  	if ( clientData )
+  		Append( choices[i] , clientData[0] ) ;
+  	else
+  		Append( choices[i] ) ;
+  }
 }
 
-int wxListBox::FindString(const wxString& s) const
+int wxListBox::FindString(const wxString& st) const
 {
-    // TODO
-    return -1;
+	wxString s ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		s = wxMacMakeMacStringFromPC( st ) ;
+	}
+	else
+		s = st ;
+		
+	if ( s.Right(1) == "*" )
+	{
+		wxString search = s.Left( s.Length() - 1 ) ;
+		int len = search.Length() ;
+    for ( int i = 0 ; i < m_noItems ; ++ i )
+    {
+    	if ( equalstring( m_stringArray[i].Left( len ) , search , false , false ) )
+    		return i ;
+    }
+	}
+	else
+	{
+    for ( int i = 0 ; i < m_noItems ; ++ i )
+    {
+    	if ( equalstring( m_stringArray[i] , s , false , false ) )
+    		return i ;
+    }
+   }
+   return -1;
 }
 
 void wxListBox::Clear()
 {
   m_noItems = 0;
-  // TODO
+  m_stringArray.Empty() ;
+  m_dataArray.Empty() ;
+  MacClear() ;
 }
 
 void wxListBox::SetSelection(int N, bool select)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::SetSelection" );
+	MacSetSelection( N , select ) ;
 }
 
 bool wxListBox::Selected(int N) const
 {
-    // TODO
-    return FALSE;
+    wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE,
+                 "invalid index in wxListBox::Selected" );
+
+	return MacIsSelected( N ) ;
 }
 
 void wxListBox::Deselect(int N)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::Deselect" );
+
+    SetSelection( N , false ) ;
 }
 
 char *wxListBox::GetClientData(int N) const
 {
-    // TODO
-    return (char *)NULL;
+    wxCHECK_MSG( N >= 0 && N < m_noItems, NULL,
+                 "invalid index in wxListBox::GetClientData" );
+
+    return m_dataArray[N];
 }
 
 void wxListBox::SetClientData(int N, char *Client_data)
 {
-    // TODO
+    wxCHECK_RET( N >= 0 && N < m_noItems,
+                 "invalid index in wxListBox::SetClientData" );
+
+    m_dataArray[N] = Client_data ;
 }
 
 // Return number of selections and an array of selected integers
 int wxListBox::GetSelections(wxArrayInt& aSelections) const
 {
-    aSelections.Empty();
+	return MacGetSelections( aSelections ) ;
 
 /* TODO
-    if ((m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED))
+    if ((m_windowStyle & wxLB_MULTIMacE) || (m_windowStyle & wxLB_EXTENDED))
     {
         int no_sel = ??
         for ( int n = 0; n < no_sel; n++ )
@@ -160,38 +258,41 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const
         return 1;
     }
 */
-    return 0;
 }
 
 // Get single selection, for single choice list items
 int wxListBox::GetSelection() const
 {
-    // TODO
-    return -1;
+	return MacGetSelection() ;
 }
 
 // Find string for position
 wxString wxListBox::GetString(int N) const
 {
-    // TODO
-    return wxString("");
-}
-
-void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	if( wxApp::s_macDefaultEncodingIsPC )
+	{
+		return 		wxMacMakePCStringFromMac( m_stringArray[N] ) ;
+	}
+	else
+		return m_stringArray[N]  ;
 }
 
 void wxListBox::InsertItems(int nItems, const wxString items[], int pos)
 {
-    m_noItems += nItems;
+	for ( int i = 0 ; i < nItems ; i++ )
+	{
+		m_stringArray.Insert( items[i] , pos + i ) ;
+		m_dataArray.Insert( NULL , pos + i ) ;
+		MacInsert( pos + i , items[i] ) ;
+	}
 
-    // TODO
+    m_noItems += nItems;
 }
 
 void wxListBox::SetString(int N, const wxString& s)
 {
-    // TODO
+	m_stringArray[N] = s ;
+	MacSet( N , s ) ;
 }
 
 int wxListBox::Number () const
@@ -204,7 +305,9 @@ wxString wxListBox::GetStringSelection () const
 {
   int sel = GetSelection ();
   if (sel > -1)
-    return this->GetString (sel);
+  {
+			return GetString (sel);
+  }
   else
     return wxString("");
 }
@@ -233,3 +336,182 @@ void wxListBox::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
+// ============================================================================
+// list box control implementation
+// ============================================================================
+
+void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon)
+{
+	wxListBox*			list;
+	// typecast our refCon
+	list = (wxListBox*)refCon;
+		
+	MoveTo(cellRect->left + 4 , cellRect->top + 10 );
+	const wxString text = list->m_stringArray[lCell.v] ;
+	::TextFont( kFontIDMonaco ) ;
+	::TextSize( 9  );
+	::TextFace( 0 ) ;
+	DrawText(text, 0 , text.Length());
+		
+}
+
+void wxListBox::MacDelete( int N )
+{
+	ListHandle list ;
+	long	result ;
+	Cell cell = { 0 , 0 } ;
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxListHandleTag , sizeof( ListHandle ) , (char*) &list  , &result ) ;
+	LDelRow( 1 , N , list ) ;
+}
+
+void wxListBox::MacInsert( int n , const char * text) 
+{
+	Cell	cell ;
+
+	cell.h = 0 ;
+	cell.v = n ;
+
+	LAddRow( 1 , cell.v , m_macList ) ;
+}
+
+void wxListBox::MacAppend( const char * text) 
+{
+	Cell cell = { 0 , 0 } ;
+	cell.v = (**m_macList).dataBounds.bottom ;
+	LAddRow( 1 , cell.v , m_macList ) ;
+}
+
+void wxListBox::MacClear() 
+{
+	LDelRow( (**m_macList).dataBounds.bottom , 0 , m_macList ) ;
+}
+
+void wxListBox::MacSetSelection( int n , bool select )
+{
+	Cell cell = { 0 , 0 } ;
+	if ( LGetSelect( TRUE , &cell , m_macList ) )
+	{
+		LSetSelect( false , cell , m_macList ) ;
+	}
+	
+	cell.v = n ;
+	LSetSelect( select , cell , m_macList ) ;
+	LAutoScroll( m_macList ) ;
+}
+
+bool wxListBox::MacIsSelected( int n ) const
+{
+	Cell cell = { 0 , 0 } ;
+	cell.v = n ;
+	return LGetSelect( false , &cell , m_macList ) ;
+}
+
+void wxListBox::MacDestroy()
+{
+//	DisposeExtLDEFInfo( m_macList ) ;
+}
+
+int wxListBox::MacGetSelection() const
+{
+	Cell cell = { 0 , 0 } ;
+	if ( LGetSelect( true , &cell , m_macList ) )
+		return cell.v ;
+	else
+		return -1 ;
+}
+
+int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const
+{
+	int no_sel = 0 ;
+	
+    aSelections.Empty();
+
+	Cell cell = { 0 , 0 } ;
+	cell.v = 0 ;
+	
+	while ( LGetSelect( true , &cell , m_macList ) )
+	{
+		aSelections.Add( cell.v ) ;
+		no_sel++ ;
+		cell.v++ ;
+	}
+	return no_sel ;
+}
+
+void wxListBox::MacSet( int n , const char * text )
+{
+	// our implementation does not store anything in the list
+	// so we just have to redraw
+	Cell cell = { 0 , 0 } ;
+	cell.v = n ;
+	LDraw( cell , m_macList ) ;
+}
+
+void wxListBox::MacScrollTo( int n )
+{
+	// TODO implement scrolling
+}
+
+void wxListBox::OnSize( const wxSizeEvent &event)
+{
+	Point pt = (**m_macList).cellSize ;
+	pt.h =  m_width - 15 /* scrollbar */ - m_macHorizontalBorder * 2 ;
+	LCellSize( pt , m_macList ) ;
+}
+
+void wxListBox::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	Boolean wasDoubleClick = false ;
+	long	result ;
+
+	UMAGetControlData( m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick  , &result ) ;
+	if ( !wasDoubleClick )
+	{
+		MacDoClick() ;
+	}
+	else
+	{
+		MacDoDoubleClick() ;
+	}
+}
+
+void wxListBox::MacSetRedraw( bool doDraw ) 
+{
+	LSetDrawingMode( doDraw , m_macList ) ;
+	
+}
+
+void wxListBox::MacDoClick()
+{
+	wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
+	wxArrayInt aSelections;
+	int count = GetSelections(aSelections);
+	if ( count > 0 )
+	{
+		  event.m_commandInt = aSelections[0] ;
+		  event.m_clientData = GetClientData(event.m_commandInt);
+		  wxString str(GetString(event.m_commandInt));
+		  if (str != "")
+		    event.m_commandString = copystring((char *)(const char *)str);
+	}
+	else
+	{
+		return ;
+		/*
+		  event.m_commandInt = -1 ;
+		  event.m_commandString = copystring("") ;
+		 */
+	}
+	
+	event.SetEventObject( this );
+	ProcessCommand(event);
+	if (event.m_commandString)
+	  delete[] event.m_commandString ;
+}
+
+void wxListBox::MacDoDoubleClick()
+{
+    wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
+    event.SetEventObject( this );
+	GetEventHandler()->ProcessEvent(event) ; 
+}
diff --git a/src/mac/makefile.unx b/src/mac/makefile.unx
index d5d55d86d4..5bd62163fd 100644
--- a/src/mac/makefile.unx
+++ b/src/mac/makefile.unx
@@ -62,7 +62,6 @@ LIB_CPP_SRC=\
  ../common/variant.cpp \
  ../common/wxexpr.cpp \
  ../common/socket.cpp \
- ../common/sckint.cpp \
  ../common/sckaddr.cpp \
  ../common/sckipc.cpp \
  ../common/protocol.cpp \
diff --git a/src/mac/menu.cpp b/src/mac/menu.cpp
index 1fc7c4a229..b22001b870 100644
--- a/src/mac/menu.cpp
+++ b/src/mac/menu.cpp
@@ -27,6 +27,8 @@
 #include "wx/log.h"
 #include "wx/utils.h"
 
+#include "wx/mac/uma.h"
+
 // other standard headers
 // ----------------------
 #include <string.h>
@@ -36,13 +38,146 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler)
 #endif
 
+// the (popup) menu title has this special id
+static const int idMenuTitle = -2;
+static int formerHelpMenuItems = 0 ;
+
+const short kwxMacMenuBarResource = 1 ;
+const short kwxMacAppleMenuId = 1 ;
+
 // ============================================================================
 // implementation
 // ============================================================================
 
+//
+// Helper Functions to get Mac Menus the way they should be ;-)
+//
+
+void wxMacCtoPString(const char* theCString, Str255 thePString);
+
+// remove inappropriate characters, if useShortcuts is false, the ampersand will not auto-generate a mac menu-shortcut
+
+static void wxMacBuildMenuString(StringPtr outMacItemText, char *outMacShortcutChar , short *outMacModifiers , const char *inItemName , bool useShortcuts )
+{
+	char *p = (char *) &outMacItemText[1] ;
+	short macModifiers = 0 ;
+	char macShortCut = 0 ;
+	
+	if ( useShortcuts && !wxApp::s_macSupportPCMenuShortcuts )
+		useShortcuts = false ;
+	
+	// we have problems with a leading hypen - it will be taken as a separator
+	
+	while ( *inItemName == '-' )
+		inItemName++ ;
+		
+	while( *inItemName )
+	{
+		switch ( *inItemName )
+		{
+			// special characters for macintosh menus -> use some replacement
+			case ';' :
+				*p++ = ',' ;
+				break ;
+			case '^' :
+				*p++ = ' ' ;
+				break ;
+			case '!' :
+				*p++ = ' ' ;
+				break ;
+			case '<' :
+				*p++ = ' ' ;
+				break ;
+			case '/' :
+				*p++ = '|' ;
+				break ;
+			case '(' :
+				*p++ = '[' ;
+				break ;
+			case ')' :	
+				*p++ = ']' ;
+				break ;
+			// shortcuts
+			case '&' :
+				{
+					++inItemName ;
+					if ( *inItemName )
+					{
+						*p++ = *inItemName ;
+						if ( useShortcuts )
+							macShortCut = *inItemName ;
+					}
+					else
+						--inItemName ;
+				}
+				break ;
+			// win-like accelerators
+			case '\t' :
+				{
+					++inItemName ;
+					while( *inItemName )
+					{
+						if (strncmp("Ctrl+", inItemName, 5) == 0) 
+						{
+							inItemName = inItemName + 5;
+							macShortCut = *inItemName;
+						}
+						else if (strncmp("Alt+", inItemName, 4) == 0) 
+						{
+							inItemName = inItemName + 4;
+							macModifiers |= kMenuOptionModifier ;
+							macShortCut = *inItemName ;
+						}
+						else if (strncmp("Shift+", inItemName, 6) == 0) 
+						{
+							inItemName = inItemName + 6;
+							macModifiers |= kMenuShiftModifier ;
+							macShortCut = *inItemName ;
+						}
+						else if (strncmp("F", inItemName, 1) == 0) 
+						{
+							inItemName += strlen( inItemName ) ;
+							// no function keys at the moment
+							// macModifiers |= kMenuShiftModifier ;
+							// macShortCut = *inItemName ;
+						}
+						else
+						{
+							break ;
+						}
+					}
+
+					if ( *inItemName == 0 )
+						--inItemName ;
+						
+				}
+				break ;
+			default :
+				*p++ = *inItemName ;
+		}
+		++inItemName ;
+	}
+
+	outMacItemText[0] = (p - (char *)outMacItemText) - 1;
+	if ( outMacShortcutChar )
+		*outMacShortcutChar = macShortCut ;
+	if ( outMacModifiers )
+		*outMacModifiers = macModifiers ;
+	if ( macShortCut )
+	{
+			int pos = outMacItemText[0] ;
+			outMacItemText[++pos] = '/';
+			outMacItemText[++pos] = toupper( macShortCut );
+			outMacItemText[0] = pos ;
+	}
+}
+
 // Menus
 
 // Construct a menu with optional title (then use append)
+
+short wxMenu::s_macNextMenuId = 2 ;
+
 wxMenu::wxMenu(const wxString& title, const wxFunction func)
 {
     m_title = title;
@@ -50,23 +185,27 @@ wxMenu::wxMenu(const wxString& title, const wxFunction func)
     m_eventHandler = this;
     m_noItems = 0;
     m_menuBar = NULL;
+    m_pInvokingWindow = NULL ;
     m_clientData = (void*) NULL;
     if (m_title != "")
     {
-        Append(-2, m_title) ;
+        Append(idMenuTitle, m_title) ;
         AppendSeparator() ;
     }
 
     Callback(func);
 
-    // TODO create menu
+	Str255 	label;
+	wxMacBuildMenuString( label, NULL , NULL , title , false );
+	m_macMenuId = s_macNextMenuId++; 
+    wxCHECK_RET( s_macNextMenuId < 236 , "menu ids > 235 cannot be used for submenus on mac" );
+	m_macMenuHandle = ::NewMenu(m_macMenuId, label);
+	m_macMenuEnabled = true ;
 }
 
 // The wxWindow destructor will take care of deleting the submenus.
 wxMenu::~wxMenu()
 {
-    // TODO destroy menu and children
-
     wxNode *node = m_menuItems.First();
     while (node)
     {
@@ -83,28 +222,78 @@ wxMenu::~wxMenu()
         delete node;
         node = next;
     }
+	if (m_macMenuHandle)
+		::DisposeMenu(m_macMenuHandle);
 }
 
 void wxMenu::Break()
 {
-    // TODO
+	// not available on the mac platform
 }
 
 // function appends a new item or submenu to the menu
 void wxMenu::Append(wxMenuItem *pItem)
 {
-    // TODO
-
     wxCHECK_RET( pItem != NULL, "can't append NULL item to the menu" );
 
     m_menuItems.Append(pItem);
 
+	if ( pItem->IsSeparator() )
+	{
+		MacAppendMenu(m_macMenuHandle, "\p-");
+	}
+	else 
+	{
+		wxMenu *pSubMenu = pItem->GetSubMenu() ;
+		if ( pSubMenu != NULL )
+		{
+ 			Str255 label;
+   			wxCHECK_RET( pSubMenu->m_macMenuHandle != NULL , "invalid submenu added");
+		    pSubMenu->m_parent = this ;
+			wxMacBuildMenuString( label , NULL , NULL , pItem->GetName() ,false);
+		
+			// hardcoded adding of the submenu combination for mac
+		
+			int theEnd = label[0] + 1; 
+			if (theEnd > 251) 
+				theEnd = 251; // mac allows only 255 characters
+			label[theEnd++] = '/';
+			label[theEnd++] = hMenuCmd; 
+			label[theEnd++] = '!';
+			label[theEnd++] = pSubMenu->m_macMenuId; 
+			label[theEnd] = 0x00;
+			label[0] = theEnd;
+
+			if (wxMenuBar::s_macInstalledMenuBar == m_menuBar) 
+			{
+				::InsertMenu( pSubMenu->m_macMenuHandle , -1 ) ;
+			}
+			
+			::AppendMenu(m_macMenuHandle, label);
+		}
+		else
+		{
+			Str255 label ;
+			wxMacBuildMenuString( label , NULL , NULL , pItem->GetName(), pItem->GetId() == wxApp::s_macAboutMenuItemId);
+			if ( label[0] == 0 )
+			{
+				// we cannot add empty menus on mac
+				label[0] = 1 ;
+				label[1] = ' ' ;
+			}
+			::AppendMenu(m_macMenuHandle, label );
+  			if ( pItem->GetId() == idMenuTitle ) 
+  			{
+					UMADisableMenuItem( m_macMenuHandle , CountMItems( m_macMenuHandle ) ) ;
+  			}
+		}
+	}
+
     m_noItems++;
 }
 
 void wxMenu::AppendSeparator()
 {
-    // TODO
     Append(new wxMenuItem(this, ID_SEPARATOR));
 }
 
@@ -136,12 +325,31 @@ void wxMenu::Delete(int id)
     }
 
     if (!node)
-	return;
+		return;
+
+    int index = pos + 1 ;
+
+    if (index < 1)
+		return;
+
+	wxMenu *pSubMenu = item->GetSubMenu();
+	if ( pSubMenu != NULL ) 
+	{
+		::DeleteMenuItem( m_macMenuHandle , index);
+		pSubMenu->m_parent = NULL;
+		// TODO: Why isn't subMenu deleted here???
+		// Will put this in for now. Assuming this is supposed
+		// to delete the menu, not just remove it.
+		item->DeleteSubMenu();
+	}
+	else 
+	{
+		::DeleteMenuItem( m_macMenuHandle , index);
+	}
 
     m_menuItems.DeleteNode(node);
+   	// TODO shouldn't we do this ? Ž_m_noItems--; 
     delete item;
-
-    // TODO
 }
 
 void wxMenu::Enable(int Id, bool Flag)
@@ -178,8 +386,16 @@ bool wxMenu::Checked(int Id) const
 
 void wxMenu::SetTitle(const wxString& label)
 {
+	Str255 title ;
     m_title = label ;
-    // TODO
+	wxMacBuildMenuString( title, NULL , NULL , label , false );
+	UMASetMenuTitle( m_macMenuHandle , title ) ;
+	if (wxMenuBar::s_macInstalledMenuBar == m_menuBar) // are we currently installed ?
+	{
+		::SetMenuBar( GetMenuBar() ) ;
+		::InvalMenuBar() ;
+	}
+	// TODO:for submenus -> their parent item text must be corrected
 }
 
 const wxString wxMenu::GetTitle() const
@@ -189,25 +405,33 @@ const wxString wxMenu::GetTitle() const
 
 void wxMenu::SetLabel(int id, const wxString& label)
 {
+    Str255 maclabel ;
+   int index ;
     wxMenuItem *item = FindItemForId(id) ;
     if (item==NULL)
         return;
 
+    index = MacGetIndexFromItem( item ) ;
+    if (index < 1)
+		return;
+
     if (item->GetSubMenu()==NULL)
     {
-        // TODO
+		wxMacBuildMenuString( maclabel , NULL , NULL , label , false );
+		::SetMenuItemText( m_macMenuHandle , index , maclabel ) ;
     }
     else
     {
-        // TODO
+		wxMacBuildMenuString( maclabel , NULL , NULL , label , false );
+		::SetMenuItemText( m_macMenuHandle , index , maclabel ) ;
     }
     item->SetName(label);
 }
 
 wxString wxMenu::GetLabel(int Id) const
 {
-    // TODO
-    return wxString("") ;
+    wxMenuItem *pItem = FindItemForId(Id) ;
+    return pItem->GetName() ;
 }
 
 // Finds the item id matching the given string, -1 if not found.
@@ -295,21 +519,204 @@ void wxMenu::ProcessCommand(wxCommandEvent & event)
     {
             processed = GetEventHandler()->ProcessEvent(event);
     }
-/* TODO
-    // Try the window the menu was popped up from (and up
-    // through the hierarchy)
-    if ( !processed && GetInvokingWindow())
-        processed = GetInvokingWindow()->ProcessEvent(event);
-*/
+
+  // Try the window the menu was popped up from (and up
+  // through the hierarchy)
+  if ( !processed && GetInvokingWindow())
+    processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
 }
 
 bool wxWindow::PopupMenu(wxMenu *menu, int x, int y)
 {
-    // TODO
-    return FALSE;
+	menu->SetInvokingWindow(this);
+	ClientToScreen( &x , &y ) ;
+
+	::InsertMenu( menu->m_macMenuHandle , -1 ) ;
+  long menuResult = ::PopUpMenuSelect(menu->m_macMenuHandle ,y,x, 0) ;
+  menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ;
+	::DeleteMenu( menu->m_macMenuId ) ;
+  menu->SetInvokingWindow(NULL);
+
+  return TRUE;
+}
+
+// helper functions returning the mac menu position for a certain item, note that this is 
+// mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
+
+int wxMenu::MacGetIndexFromId( int id ) 
+{
+    wxNode *node;
+    wxMenuItem *item;
+    int pos;
+	
+    for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+    {
+	 	item = (wxMenuItem *)node->Data();
+	 	if (item->GetId() == id)
+			break;
+    }
+
+    if (!node)
+		return 0;
+		
+	return pos + 1 ;
+}
+
+int wxMenu::MacGetIndexFromItem( wxMenuItem *pItem ) 
+{
+    wxNode *node;
+    int pos;
+
+    for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+    {
+	 	if ((wxMenuItem *)node->Data() == pItem)
+			break;
+    }
+
+    if (!node)
+		return 0;
+		
+	return pos + 1 ;
+}
+
+void wxMenu::MacEnableMenu( bool bDoEnable ) 
+{
+	m_macMenuEnabled = bDoEnable ;
+	if ( bDoEnable )
+		UMAEnableMenuItem( m_macMenuHandle , 0 ) ;
+	else
+		UMADisableMenuItem( m_macMenuHandle , 0 ) ;
+		
+	::DrawMenuBar() ;
+}
+
+bool wxMenu::MacMenuSelect( wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum )
+{
+  int pos;
+  wxNode *node;
+
+	if ( m_macMenuId == macMenuId )
+	{
+		node = m_menuItems.Nth(macMenuItemNum-1);
+		if (node) 
+		{
+			wxMenuItem *pItem = (wxMenuItem*)node->Data();
+	
+			wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId());
+			event.m_timeStamp = when;
+			event.SetEventObject(handler);
+      event.SetInt( pItem->GetId() );
+
+			{
+				bool processed = false ;
+
+		    // Try a callback
+		    if (m_callback)
+		    {
+		            (void) (*(m_callback)) (*this, event);
+		            processed = TRUE;
+		    }
+		
+		    // Try the menu's event handler
+		    if ( !processed && handler)
+		    {
+		            processed = handler->ProcessEvent(event);
+		    }
+		
+		  	// Try the window the menu was popped up from (and up
+		  	// through the hierarchy)
+		  	if ( !processed && GetInvokingWindow())
+		    	processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
+		  }
+			return true ;
+		}
+	}
+	else if ( macMenuId == kHMHelpMenuID )
+	{
+		int menuItem = formerHelpMenuItems ;
+	  for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+	  {	
+	  	wxMenuItem * pItem = (wxMenuItem *)  node->Data() ;
+	  	
+	  	wxMenu *pSubMenu = pItem->GetSubMenu() ;
+			if ( pSubMenu != NULL )
+			{
+			}
+			else
+			{
+				if ( pItem->GetId() != wxApp::s_macAboutMenuItemId )
+					++menuItem ;
+					
+				if ( menuItem == macMenuItemNum )
+				{
+					wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, pItem->GetId());
+					event.m_timeStamp = when;
+					event.SetEventObject(handler);
+       		event.SetInt( pItem->GetId() );
+					
+					{
+						bool processed = false ;
+				    // Try a callback
+				    if (m_callback)
+				    {
+				            (void) (*(m_callback)) (*this, event);
+				            processed = TRUE;
+				    }
+				
+				    // Try the menu's event handler
+				    if ( !processed && handler)
+				    {
+				            processed = handler->ProcessEvent(event);
+				    }
+				
+				  	// Try the window the menu was popped up from (and up
+				  	// through the hierarchy)
+				  	if ( !processed && GetInvokingWindow())
+				    	processed = GetInvokingWindow()->GetEventHandler()->ProcessEvent(event);
+				  }
+				  
+					return true ;
+				}
+			}
+	  }
+	}
+
+  for (pos = 0, node = m_menuItems.First(); node; node = node->Next(), pos++) 
+  {	
+  	wxMenuItem * pItem = (wxMenuItem *)  node->Data() ;
+  	
+  	wxMenu *pSubMenu = pItem->GetSubMenu() ;
+		if ( pSubMenu != NULL )
+		{
+			if ( pSubMenu->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+				return true ;
+		}
+  }
+
+	return false ;
 }
 
 // Menu Bar
+
+/* 
+
+Mac Implementation note :
+
+The Mac has only one global menubar, so we attempt to install the currently
+active menubar from a frame, we currently don't take into account mdi-frames
+which would ask for menu-merging
+
+Secondly there is no mac api for changing a menubar that is not the current 
+menubar, so we have to wait for preparing the actual menubar until the
+wxMenubar is to be used
+
+We can in subsequent versions use MacInstallMenuBar to provide some sort of 
+auto-merge for MDI in case this will be necessary
+
+*/
+
+wxMenuBar* wxMenuBar::s_macInstalledMenuBar = NULL ;
+
 wxMenuBar::wxMenuBar()
 {
     m_eventHandler = this;
@@ -317,8 +724,6 @@ wxMenuBar::wxMenuBar()
     m_menus = NULL;
     m_titles = NULL;
     m_menuBarFrame = NULL;
-
-    // TODO
 }
 
 wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
@@ -329,14 +734,18 @@ wxMenuBar::wxMenuBar(int n, wxMenu *menus[], const wxString titles[])
     m_titles = new wxString[n];
     int i;
     for ( i = 0; i < n; i++ )
-	m_titles[i] = titles[i];
+			m_titles[i] = titles[i];
     m_menuBarFrame = NULL;
-
-    // TODO
 }
 
 wxMenuBar::~wxMenuBar()
 {
+	if (s_macInstalledMenuBar == this)
+	{
+		::ClearMenuBar();
+		s_macInstalledMenuBar = NULL;
+	}
+
     int i;
     for (i = 0; i < m_menuCount; i++)
     {
@@ -345,9 +754,95 @@ wxMenuBar::~wxMenuBar()
     delete[] m_menus;
     delete[] m_titles;
 
-    // TODO
 }
 
+void wxMenuBar::MacInstallMenuBar() 
+{
+  	Handle menubar = ::GetNewMBar( kwxMacMenuBarResource ) ;
+  	wxString message ;
+  	wxCHECK_RET( menubar != NULL, "can't read MBAR resource" );
+  	::SetMenuBar( menubar ) ;
+  	::DisposeHandle( menubar ) ;
+
+		MenuHandle menu = ::GetMenuHandle( kwxMacAppleMenuId ) ;
+		::AppendResMenu(menu, 'DRVR');
+ 
+   	for (int i = 0; i < m_menuCount; i++)
+  	{
+			Str255 	label;
+    	wxNode *node;
+    	wxMenuItem *item;
+    	int pos ;
+			wxMenu* menu = m_menus[i] , *subMenu = NULL ;
+		
+			
+			if( m_titles[i] == "?" || m_titles[i] == wxApp::s_macHelpMenuTitleName )
+			{
+				MenuHandle mh = NULL ;
+				if ( HMGetHelpMenuHandle( &mh ) != noErr )
+				{
+					continue ;
+				}
+				if ( formerHelpMenuItems == 0 )
+				{
+					if( mh )
+						formerHelpMenuItems = CountMenuItems( mh ) ;
+				}
+					
+		  	for (pos = 0 , node = menu->m_menuItems.First(); node; node = node->Next(), pos++) 
+	  		{
+		 			item = (wxMenuItem *)node->Data();
+		 			subMenu = item->GetSubMenu() ;
+					if (subMenu)	 		
+					{
+						// we don't support hierarchical menus in the help menu yet
+					}
+					else		
+					{
+						Str255 label ;
+						wxMacBuildMenuString( label , NULL , NULL , item->GetName(), item->GetId() != wxApp::s_macAboutMenuItemId); // no shortcut in about menu
+						if ( label[0] == 0 )
+						{
+							// we cannot add empty menus on mac
+							label[0] = 1 ;
+							label[1] = ' ' ;
+						}
+						if ( item->GetId() == wxApp::s_macAboutMenuItemId )
+						{ 
+								::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId ) , 1 , label );
+		//					::EnableMenuItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 );
+								::EnableItem( GetMenuHandle( kwxMacAppleMenuId ) , 1 );
+ 						}
+						else
+						{
+							if ( mh )
+								::AppendMenu(mh, label );
+						}
+					}
+				}
+			}
+			else
+			{
+				wxMacBuildMenuString( label, NULL , NULL , m_titles[i] , false );
+				UMASetMenuTitle( menu->m_macMenuHandle , label ) ;
+		  	for (pos = 0, node = menu->m_menuItems.First(); node; node = node->Next(), pos++) 
+	  		{
+		 			item = (wxMenuItem *)node->Data();
+		 			subMenu = item->GetSubMenu() ;
+					if (subMenu)	 		
+					{
+						::InsertMenu( subMenu->m_macMenuHandle , -1 ) ;
+					}
+				}
+				::InsertMenu(m_menus[i]->m_macMenuHandle, 0);
+			}
+		}
+		::DrawMenuBar() ;
+
+	s_macInstalledMenuBar = this;
+}
+
+
 // Must only be used AFTER menu has been attached to frame,
 // otherwise use individual menus to enable/disable items
 void wxMenuBar::Enable(int id, bool flag)
@@ -357,12 +852,12 @@ void wxMenuBar::Enable(int id, bool flag)
     if (!item)
         return;
 
-    // TODO
+	item->Enable( flag ) ;
 }
 
 void wxMenuBar::EnableTop(int pos, bool flag)
 {
-    // TODO
+	m_menus[pos]->MacEnableMenu( flag ) ;
 }
 
 // Must only be used AFTER menu has been attached to frame,
@@ -377,7 +872,7 @@ void wxMenuBar::Check(int id, bool flag)
     if (!item->IsCheckable())
         return ;
 
-    // TODO
+	item->Check( flag ) ;
 }
 
 bool wxMenuBar::Checked(int id) const
@@ -387,8 +882,10 @@ bool wxMenuBar::Checked(int id) const
     if (!item)
         return FALSE;
 
-    // TODO
-    return FALSE;
+    if (!item->IsCheckable())
+        return FALSE ;
+
+    return item->IsChecked() ;
 }
 
 bool wxMenuBar::Enabled(int id) const
@@ -398,8 +895,23 @@ bool wxMenuBar::Enabled(int id) const
     if (!item)
         return FALSE;
 
-    // TODO
-    return FALSE ;
+	if ( !item->IsEnabled() )
+		return FALSE ;
+	
+	if ( itemMenu->m_macMenuEnabled == false )
+		return FALSE ;
+		
+	while( itemMenu->m_parent )
+	{
+		itemMenu = (wxMenu*) itemMenu->m_parent ;
+		if ( itemMenu->IsKindOf( CLASSINFO( wxMenu ) ) )
+		{
+			if ( itemMenu->m_macMenuEnabled == false )
+				return FALSE ;
+		}
+	}
+	
+    return TRUE ;
 }
 
 
@@ -411,7 +923,7 @@ void wxMenuBar::SetLabel(int id, const wxString& label)
     if (!item)
         return;
 
-    // TODO
+    itemMenu->SetLabel( id , label ) ;
 }
 
 wxString wxMenuBar::GetLabel(int id) const
@@ -422,31 +934,51 @@ wxString wxMenuBar::GetLabel(int id) const
     if (!item)
         return wxString("");
 
-    // TODO
-    return wxString("") ;
+    return itemMenu->GetLabel( id ) ;
 }
 
 void wxMenuBar::SetLabelTop(int pos, const wxString& label)
 {
-    // TODO
+    m_menus[pos]->SetTitle( label ) ;
 }
 
 wxString wxMenuBar::GetLabelTop(int pos) const
 {
-    // TODO
-    return wxString("");
+   return m_menus[pos]->GetTitle() ;
 }
 
 bool wxMenuBar::OnDelete(wxMenu *a_menu, int pos)
 {
-    // TODO
-    return FALSE;
+	if (s_macInstalledMenuBar == this)
+	{
+		::DeleteMenu( a_menu->m_macMenuId /* m_menus[pos]->m_macMenuId */ ) ;
+		::InvalMenuBar() ;
+		return TRUE ;
+	}
+	else
+	{
+		return TRUE ;
+	}
 }
 
 bool wxMenuBar::OnAppend(wxMenu *a_menu, const char *title)
 {
-    // TODO
-    return FALSE;
+	if (!a_menu->m_macMenuHandle)
+	 	return FALSE;
+
+	if (s_macInstalledMenuBar == this)
+	{
+		Str255 	label;
+		wxMacBuildMenuString( label, NULL , NULL , title , false );
+		UMASetMenuTitle( a_menu->m_macMenuHandle , label ) ;
+		::InsertMenu( a_menu->m_macMenuHandle , 0 ) ;
+		::InvalMenuBar() ;
+		return TRUE ;
+	}
+	else
+	{
+		return TRUE ;
+	}
 }
 
 void wxMenuBar::Append (wxMenu * menu, const wxString& title)
@@ -477,7 +1009,8 @@ void wxMenuBar::Append (wxMenu * menu, const wxString& title)
     m_menus[m_menuCount - 1] = (wxMenu *)menu;
     m_titles[m_menuCount - 1] = title;
 
-    // TODO
+  ((wxMenu *)menu)->m_menuBar = (wxMenuBar *) this;
+  ((wxMenu *)menu)->SetParent(this);
 }
 
 void wxMenuBar::Delete(wxMenu * menu, int i)
@@ -568,4 +1101,43 @@ wxString wxMenuBar::GetHelpString (int Id) const
     return wxString("");
 }
 
+void wxMenuBar::MacMenuSelect(wxEvtHandler* handler, long when , int macMenuId, int macMenuItemNum)
+{
+	// first scan fast for direct commands, i.e. menus which have these commands directly in their own list
+
+	if ( macMenuId == kwxMacAppleMenuId && macMenuItemNum == 1 )
+	{
+			wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macAboutMenuItemId );
+			event.m_timeStamp = when;
+			event.SetEventObject(handler);
+     	event.SetInt( wxApp::s_macAboutMenuItemId );
+			handler->ProcessEvent(event);
+	}
+	else
+	{		
+	  for (int i = 0; i < m_menuCount; i++)
+	  {
+	  	if ( m_menus[i]->m_macMenuId == macMenuId || 
+	  		( macMenuId == kHMHelpMenuID && ( m_titles[i] == "?" || m_titles[i] == wxApp::s_macHelpMenuTitleName ) )
+	  		)
+	  	{
+	  		if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+	  			return ;
+	  		else
+	  		{
+	  			//TODO flag this as an error since it must contain the item
+	  			return ;
+	  		}
+	  	}
+		}
+	
+	  for (int i = 0; i < m_menuCount; i++)
+	  {
+	  	if ( m_menus[i]->MacMenuSelect( handler , when , macMenuId , macMenuItemNum ) )
+	  	{
+	  		break ;
+	  	}
+		}
+	}
+}
 
diff --git a/src/mac/menuitem.cpp b/src/mac/menuitem.cpp
index 38d31737e7..9195fdc50a 100644
--- a/src/mac/menuitem.cpp
+++ b/src/mac/menuitem.cpp
@@ -16,6 +16,7 @@
 #include "wx/menu.h"
 #include "wx/menuitem.h"
 
+#include <wx/mac/uma.h>
 // ============================================================================
 // implementation
 // ============================================================================
@@ -49,6 +50,11 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
   m_pSubMenu    = pSubMenu;
   m_idItem      = id;
   m_bEnabled    = TRUE;
+
+  if ( m_strName ==  "E&xit"  ||m_strName == "Exit" )
+  {
+  	m_strName = "Quit\tCtrl+Q" ;
+  }
 }
 
 wxMenuItem::~wxMenuItem() 
@@ -73,12 +79,35 @@ void wxMenuItem::DeleteSubMenu()
 void wxMenuItem::Enable(bool bDoEnable)
 {
   if ( m_bEnabled != bDoEnable ) {
-    if ( m_pSubMenu == NULL ) {     // normal menu item
-        // TODO
+    if ( m_pSubMenu == NULL ) 
+    {     
+    	// normal menu item
+	    if ( m_pParentMenu->m_macMenuHandle )
+	    {
+	   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+	   	 	if ( index >= 1 )
+	   	 	{
+	   	 		if ( bDoEnable )
+	   	 			UMAEnableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 		else
+	   	 			UMADisableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 	}
+	    }
     }
-    else                            // submenu
+    else                            
     {
-        // TODO
+  		// submenu
+	    if ( m_pParentMenu->m_macMenuHandle )
+	    {
+	   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+	   	 	if ( index >= 1 )
+	   	 	{
+	   	 		if ( bDoEnable )
+	   	 			UMAEnableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 		else
+	   	 			UMADisableMenuItem( m_pParentMenu->m_macMenuHandle , index ) ;
+	   	 	}
+	    }
     }
 
     m_bEnabled = bDoEnable;
@@ -89,7 +118,19 @@ void wxMenuItem::Check(bool bDoCheck)
 {
   wxCHECK_RET( IsCheckable(), "only checkable items may be checked" );
 
-  if ( m_bChecked != bDoCheck ) {
-    // TODO
+  if ( m_bChecked != bDoCheck ) 
+  {
     m_bChecked = bDoCheck;
+   	if ( m_pParentMenu->m_macMenuHandle )
+    {
+   	 	int index = m_pParentMenu->MacGetIndexFromItem( this ) ;
+   	 	if ( index >= 1 )
+   	 	{
+   	 		if ( bDoCheck )
+					::SetItemMark( m_pParentMenu->m_macMenuHandle , index , 0x12 ) ; // checkmark
+				else
+ 					::SetItemMark( m_pParentMenu->m_macMenuHandle , index , 0 ) ; // no mark
+  	 	}
+  	}
   }
+}
\ No newline at end of file
diff --git a/src/mac/metafile.cpp b/src/mac/metafile.cpp
index ddbfb8402f..97e31948bf 100644
--- a/src/mac/metafile.cpp
+++ b/src/mac/metafile.cpp
@@ -13,46 +13,118 @@
 #pragma implementation "metafile.h"
 #endif
 
-#include "wx/object.h"
-#include "wx/string.h"
-#include "wx/dc.h"
-#include "wx/stubs/metafile.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/setup.h"
+#endif
+
+#if wxUSE_METAFILE
+
+#ifndef WX_PRECOMP
+#include "wx/utils.h"
+#include "wx/app.h"
+#endif
+
+#include "wx/metafile.h"
 #include "wx/clipbrd.h"
 
+#include <stdio.h>
+#include <string.h>
+
 extern bool wxClipboardIsOpen;
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxMetaFile, wxObject)
-IMPLEMENT_ABSTRACT_CLASS(wxMetaFileDC, wxDC)
+IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
 #endif
 
+/*
+ * Metafiles
+ * Currently, the only purpose for making a metafile is to put
+ * it on the clipboard.
+ */
+
+wxMetafileRefData::wxMetafileRefData(void)
+{
+    m_metafile = 0;
+}
+
+wxMetafileRefData::~wxMetafileRefData(void)
+{
+    if (m_metafile)
+    {
+				KillPicture( m_metafile ) ;
+        m_metafile = 0;
+    }
+}
+
 wxMetaFile::wxMetaFile(const wxString& file)
 {
-    // TODO
+    m_refData = new wxMetafileRefData;
+
+
+    M_METAFILEDATA->m_metafile = 0;
+    wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
+/*
+    if (!file.IsNull() && (file.Cmp("") == 0))
+        M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile(file);
+*/
 }
 
 wxMetaFile::~wxMetaFile()
 {
-    // TODO
 }
 
 bool wxMetaFile::SetClipboard(int width, int height)
 {
+    if (!m_refData)
+        return FALSE;
+/*
     bool alreadyOpen=wxClipboardOpen();
     if (!alreadyOpen)
     {
         wxOpenClipboard();
         if (!wxEmptyClipboard()) return FALSE;
     }
-    bool success = wxSetClipboardData(wxDF_METAFILE,this, width,height);
+    bool success = wxSetClipboardData(wxDF_METAFILE, this, width,height);
     if (!alreadyOpen) wxCloseClipboard();
     return (bool) success;
+    */
+    return TRUE ;
 }
 
 bool wxMetaFile::Play(wxDC *dc)
 {
-    // TODO
+  if (!m_refData)
     return FALSE;
+
+	if (!dc->Ok() )
+		return FALSE;
+		
+	dc->MacVerifySetup() ;
+	
+	{
+		PicHandle pict = GetHMETAFILE() ;
+		DrawPicture( pict , &(**pict).picFrame ) ;
+	}
+/*
+    if (!m_refData)
+        return FALSE;
+
+    dc->BeginDrawing();
+
+    if (dc->GetHDC() && M_METAFILEDATA->m_metafile)
+        PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile);
+
+    dc->EndDrawing();
+*/
+    return TRUE;
 }
 
 /*
@@ -64,176 +136,55 @@ bool wxMetaFile::Play(wxDC *dc)
 // *DO* give origin/extent arguments to wxMakeMetaFilePlaceable.
 wxMetaFileDC::wxMetaFileDC(const wxString& file)
 {
-    // TODO
+  m_metaFile = NULL;
+  m_minX = 10000;
+  m_minY = 10000;
+  m_maxX = -10000;
+  m_maxY = -10000;
+
+  wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
+
+	m_metaFile = new wxMetaFile("") ;
+	Rect r={0,0,100,100} ;
+	
+	m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ;
+	::GetPort( &m_macPort ) ;	
+  m_ok = TRUE ;
+
+  SetMapMode(wxMM_TEXT); 
 }
 
 // New constructor that takes origin and extent. If you use this, don't
 // give origin/extent arguments to wxMakeMetaFilePlaceable.
+
 wxMetaFileDC::wxMetaFileDC(const wxString& file, int xext, int yext, int xorg, int yorg)
 {
-    // TODO
-}
+  m_minX = 10000;
+  m_minY = 10000;
+  m_maxX = -10000;
+  m_maxY = -10000;
 
-wxMetaFileDC::~wxMetaFileDC()
-{
-}
+  wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ;
 
-void wxMetaFileDC::GetTextExtent(const wxString& string, float *x, float *y,
-                                 float *descent, float *externalLeading, wxFont *theFont, bool use16bit)
-{
-    // TODO
-}
+	m_metaFile = new wxMetaFile("") ;
+	Rect r={yorg,xorg,yorg+yext,xorg+xext} ;
+	
+	m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ;
+	::GetPort( &m_macPort ) ;	
+  m_ok = TRUE ;
 
-wxMetaFile *wxMetaFileDC::Close()
-{
-    // TODO
-    return NULL;
+  SetMapMode(wxMM_TEXT); 
 }
 
-void wxMetaFileDC::SetMapMode(int mode)
+wxMetaFileDC::~wxMetaFileDC()
 {
-    // TODO
 }
 
-#if 0
-
-#ifdef __WIN32__
-struct RECT32
-{
-  short left;
-  short top;
-  short right;
-  short bottom;
-};
-
-struct mfPLACEABLEHEADER {
-	DWORD	key;
-	short	hmf;
-	RECT32	bbox;
-	WORD	inch;
-	DWORD	reserved;
-	WORD	checksum;
-};
-#else
-struct mfPLACEABLEHEADER {
-	DWORD	key;
-	HANDLE	hmf;
-	RECT	bbox;
-	WORD	inch;
-	DWORD	reserved;
-	WORD	checksum;
-};
-#endif
-
-/*
- * Pass filename of existing non-placeable metafile, and bounding box.
- * Adds a placeable metafile header, sets the mapping mode to anisotropic,
- * and sets the window origin and extent to mimic the wxMM_TEXT mapping mode.
- *
- */
- 
-bool wxMakeMetaFilePlaceable(const wxString& filename, float scale)
+wxMetaFile *wxMetaFileDC::Close()
 {
-  return wxMakeMetaFilePlaceable(filename, 0, 0, 0, 0, scale, FALSE);
+	ClosePicture() ;
+	return m_metaFile;
 }
 
-bool wxMakeMetaFilePlaceable(const wxString& filename, int x1, int y1, int x2, int y2, float scale, bool useOriginAndExtent)
-{
-  // I'm not sure if this is the correct way of suggesting a scale
-  // to the client application, but it's the only way I can find.
-  int unitsPerInch = (int)(576/scale);
-  
-  mfPLACEABLEHEADER header;
-  header.key = 0x9AC6CDD7L;
-  header.hmf = 0;
-  header.bbox.left = (int)(x1);
-  header.bbox.top = (int)(y1);
-  header.bbox.right = (int)(x2);
-  header.bbox.bottom = (int)(y2);
-  header.inch = unitsPerInch;
-  header.reserved = 0;
-
-  // Calculate checksum  
-  WORD *p;
-  mfPLACEABLEHEADER *pMFHead = &header;
-  for (p =(WORD *)pMFHead,pMFHead -> checksum = 0;
-	p < (WORD *)&pMFHead ->checksum; ++p)
-       pMFHead ->checksum ^= *p;
-
-  FILE *fd = fopen((char *)(const char *)filename, "rb");
-  if (!fd) return FALSE;
-  
-  char tempFileBuf[256];
-  wxGetTempFileName("mf", tempFileBuf);
-  FILE *fHandle = fopen(tempFileBuf, "wb");
-  if (!fHandle)
-    return FALSE;
-  fwrite((void *)&header, sizeof(unsigned char), sizeof(mfPLACEABLEHEADER), fHandle);
-
-  // Calculate origin and extent
-  int originX = x1;
-  int originY = y1;
-  int extentX = x2 - x1;
-  int extentY = (y2 - y1);
-
-  // Read metafile header and write
-  METAHEADER metaHeader;
-  fread((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fd);
-  
-  if (useOriginAndExtent)
-    metaHeader.mtSize += 15;
-  else
-    metaHeader.mtSize += 5;
-    
-  fwrite((void *)&metaHeader, sizeof(unsigned char), sizeof(metaHeader), fHandle);
-
-  // Write SetMapMode, SetWindowOrigin and SetWindowExt records
-  char modeBuffer[8];
-  char originBuffer[10];
-  char extentBuffer[10];
-  METARECORD *modeRecord = (METARECORD *)&modeBuffer;
-
-  METARECORD *originRecord = (METARECORD *)&originBuffer;
-  METARECORD *extentRecord = (METARECORD *)&extentBuffer;
-
-  modeRecord->rdSize = 4;
-  modeRecord->rdFunction = META_SETMAPMODE;
-  modeRecord->rdParm[0] = wxMM_ANISOTROPIC;
-
-  originRecord->rdSize = 5;
-  originRecord->rdFunction = META_SETWINDOWORG;
-  originRecord->rdParm[0] = originY;
-  originRecord->rdParm[1] = originX;
-
-  extentRecord->rdSize = 5;
-  extentRecord->rdFunction = META_SETWINDOWEXT;
-  extentRecord->rdParm[0] = extentY;
-  extentRecord->rdParm[1] = extentX;
-
-  fwrite((void *)modeBuffer, sizeof(char), 8, fHandle);
-  
-  if (useOriginAndExtent)
-  {
-    fwrite((void *)originBuffer, sizeof(char), 10, fHandle);
-    fwrite((void *)extentBuffer, sizeof(char), 10, fHandle);
-  }
-
-  int ch = -2;
-  while (ch != EOF)
-  {
-    ch = getc(fd);
-    if (ch != EOF)
-    {
-      putc(ch, fHandle);
-    }
-  }
-  fclose(fHandle);
-  fclose(fd);
-  wxRemoveFile(filename);
-  wxCopyFile(tempFileBuf, filename);
-  wxRemoveFile(tempFileBuf);
-  return TRUE;
-}
 
 #endif
-
diff --git a/src/mac/msgdlg.cpp b/src/mac/msgdlg.cpp
index 775ac8f064..5aa8554038 100644
--- a/src/mac/msgdlg.cpp
+++ b/src/mac/msgdlg.cpp
@@ -14,11 +14,47 @@
 #endif
 
 #include "wx/msgdlg.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
 #endif
 
+#define kMacOKAlertResourceID 128
+#define kMacYesNoAlertResourceID 129
+#define kMacYesNoCancelAlertResourceID 130
+#define kMacNoYesAlertResourceID 131
+#define kMacNoYesCancelAlertResourceID 132
+
+short language = 0 ;
+
+void wxMacConvertNewlines( const char *source , char * destination )
+{
+	const char *s = source ;
+	char *d = destination ;
+	
+	while( *s  )
+	{
+		switch( *s )
+		{
+			case 0x0a :
+				*d++ = 0x0d ;
+				++s ;
+				break ;
+			case 0x0d :
+				*d++ = 0x0d ;
+				++s ;
+				if ( *s == 0x0a )
+					++s ;
+				break ;
+			default :
+				*d++ = *s++ ;
+				break ;
+		}
+	}
+	*d = 0 ;
+}
+
 wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
         long style, const wxPoint& pos)
 {
@@ -30,7 +66,226 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, cons
 
 int wxMessageDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+	int resultbutton = wxID_CANCEL ;
+
+	short result ;
+	Str255 pascalTitle ;
+	Str255 pascalText ;
+	
+	strcpy( (char*) pascalTitle , m_caption ) ;
+	c2pstr( (char*) pascalTitle ) ;
+	strcpy( (char*) pascalText , m_message ) ;
+	wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ;
+	c2pstr( (char*) pascalText ) ;
+
+	if ( !UMAHasAppearance() )
+	{
+		int resourceID ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	      resourceID = kMacYesNoCancelAlertResourceID;
+	    else
+	      resourceID = kMacYesNoAlertResourceID + language * 10 ;
+	  }
+	  else if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	      resourceID = kMacOKAlertResourceID; // wrong
+	    else
+	      resourceID = kMacOKAlertResourceID;
+	  }
+		else
+		{
+			return resultbutton ;
+		}
+	/*
+	  if (hWnd)
+	    msStyle |= MB_APPLMODAL;
+	  else
+	    msStyle |= MB_TASKMODAL;
+	*/
+
+		ParamText( pascalTitle , pascalText , NULL , NULL ) ;
+
+	  if (m_dialogStyle & wxICON_EXCLAMATION)
+				result = Alert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_HAND)
+			result = StopAlert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_INFORMATION)
+				result = NoteAlert( resourceID , NULL ) ;
+	  else if (m_dialogStyle & wxICON_QUESTION)
+				result = CautionAlert( resourceID , NULL ) ;
+		else
+				result = Alert( resourceID , NULL ) ;
+
+		resultbutton = result ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_NO ;
+						break ;
+					case 3 :
+						resultbutton = wxID_CANCEL ;
+						break ;
+				}
+	    }
+	    else
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_NO ;
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+		}
+	}
+	else
+	{
+		AlertStdAlertParamRec	param;
+
+		param.movable 		= true;
+		param.filterProc 	= NULL ;
+		
+	  if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				param.defaultText 	= "\pYes" ;
+				param.cancelText 	= (StringPtr) kAlertDefaultCancelText;
+				param.otherText 	= "\pNo";
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= kAlertStdAlertCancelButton;
+	    }
+	    else
+	    {
+				param.defaultText 	= "\pYes" ;
+				param.cancelText 	= NULL;
+				param.otherText 	= "\pNo";
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	  }
+	  else if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+	    	// thats a cancel missing
+				param.defaultText 	= (StringPtr) kAlertDefaultOKText ;
+				param.cancelText 	= NULL;
+				param.otherText 	= NULL;
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	    else
+	    {
+				param.defaultText 	= (StringPtr) kAlertDefaultOKText ;
+				param.cancelText 	= NULL;
+				param.otherText 	= NULL;
+				param.helpButton 	= false ;
+				param.defaultButton = kAlertStdAlertOKButton;
+				param.cancelButton 	= 0;
+	    }
+	  }
+		else
+		{
+			return resultbutton ;
+		}
+
+		param.position 		= 0;
+
+	  if (m_dialogStyle & wxICON_EXCLAMATION)
+				StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_HAND)
+				StandardAlert( kAlertStopAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_INFORMATION)
+			StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, &param, &result );
+	  else if (m_dialogStyle & wxICON_QUESTION)
+				StandardAlert( kAlertCautionAlert, pascalTitle, pascalText, &param, &result );
+		else
+				StandardAlert( kAlertPlainAlert, pascalTitle, pascalText, &param, &result );
+
+		if (m_dialogStyle & wxOK)
+	  {
+	    if (m_dialogStyle & wxCANCEL)				
+	    {
+	    	//TODO add Cancelbutton
+	    	switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_OK ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+			else
+			{
+	    	switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_OK ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						break ;
+				}
+			}
+		}
+	  else if (m_dialogStyle & wxYES_NO)
+	  {
+	    if (m_dialogStyle & wxCANCEL)
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						resultbutton = wxID_CANCEL ;
+						break ;
+					case 3 :
+						resultbutton = wxID_NO ;
+						break ;
+				}
+	    }
+	    else
+	    {
+				switch( result )
+				{
+					case 1 :
+						resultbutton = wxID_YES ;
+						break ;
+					case 2 :
+						break ;
+					case 3 :
+						resultbutton = wxID_NO ;
+						break ;
+				}
+			}
+		} 
+	}
+	return resultbutton ;
 }
 
diff --git a/src/mac/notebook.cpp b/src/mac/notebook.cpp
index 312dd0f3d3..a4f93917eb 100644
--- a/src/mac/notebook.cpp
+++ b/src/mac/notebook.cpp
@@ -24,7 +24,7 @@
 #include  <wx/log.h>
 #include  <wx/imaglist.h>
 #include  <wx/notebook.h>
-
+#include <wx/mac/uma.h>
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -32,6 +32,11 @@
 // check that the page index is valid
 #define IS_VALID_PAGE(nPage) (((nPage) >= 0) && ((nPage) < GetPageCount()))
 
+const short kwxMacTabLeftMargin = 16 ;
+const short kwxMacTabTopMargin = 30 ;
+const short kwxMacTabRightMargin = 16 ;
+const short kwxMacTabBottomMargin = 16 ;
+
 // ----------------------------------------------------------------------------
 // event table
 // ----------------------------------------------------------------------------
@@ -91,21 +96,16 @@ bool wxNotebook::Create(wxWindow *parent,
                         long style,
                         const wxString& name)
 {
-    // base init
-    SetName(name);
-    SetParent(parent);
-
-    m_windowId = id == -1 ? NewControlId() : id;
-
-    // style
-    m_windowStyle = style;
-
-    if ( parent != NULL )
-        parent->AddChild(this);
-
-    // TODO
-
-    return FALSE;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlTabSmallProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+	return TRUE ;
 }
 
 // dtor
@@ -123,8 +123,7 @@ int wxNotebook::GetPageCount() const
 
 int wxNotebook::GetRowCount() const
 {
-    // TODO
-    return 0;
+    return 1;
 }
 
 int wxNotebook::SetSelection(int nPage)
@@ -132,9 +131,11 @@ int wxNotebook::SetSelection(int nPage)
     wxASSERT( IS_VALID_PAGE(nPage) );
 
     ChangePage(m_nSelection, nPage);
-
-    // TODO
-    return 0;
+		SetControlValue( m_macControl , m_nSelection + 1 ) ;
+//	Boolean enabled = true ;
+	
+//	SetControlData( m_macControl, m_nSelection + 1, kControlTabEnabledFlagTag, sizeof( Boolean ), (Ptr)&enabled );
+    return m_nSelection;
 }
 
 void wxNotebook::AdvanceSelection(bool bForward)
@@ -246,7 +247,19 @@ bool wxNotebook::InsertPage(int nPage,
     wxASSERT( pPage != NULL );
     wxCHECK( IS_VALID_PAGE(nPage) || nPage == GetPageCount(), FALSE );
 
-    // TODO: insert native widget page
+		ControlTabInfoRec tie ;
+		Boolean enabled = true ;
+		if ( nPage + 1 > GetControlMaximum( m_macControl ) )
+		{
+			SetControlMaximum( m_macControl , nPage + 1 ) ;
+		}
+		
+		tie.version = 0 ;
+		tie.iconSuiteID = 0 ;
+		strcpy( (char*) tie.name , strText ) ;
+		c2pstr( (char*) tie.name ) ;	
+		SetControlData( m_macControl, nPage + 1, kControlTabInfoTag , sizeof( ControlTabInfoRec) , (char*) &tie ) ;
+		SetControlData( m_macControl, m_nSelection + 1, kControlTabEnabledFlagTag, sizeof( Boolean ), (Ptr)&enabled );
 
     // save the pointer to the page
     m_aPages.Insert(pPage, nPage);
@@ -258,6 +271,9 @@ bool wxNotebook::InsertPage(int nPage,
     else if ( m_nSelection == -1 )
         m_nSelection = 0;
 
+  	// don't show pages by default (we'll need to adjust their size first)
+	 	pPage->Show( FALSE ) ;
+
     return TRUE;
 }
 
@@ -290,7 +306,9 @@ void wxNotebook::OnSize(wxSizeEvent& event)
     unsigned int nCount = m_aPages.Count();
     for ( unsigned int nPage = 0; nPage < nCount; nPage++ ) {
         wxNotebookPage *pPage = m_aPages[nPage];
-        pPage->SetSize(0, 0, w, h);
+        pPage->SetSize(kwxMacTabLeftMargin, kwxMacTabTopMargin, w - kwxMacTabLeftMargin - kwxMacTabRightMargin,
+        	h - kwxMacTabTopMargin - kwxMacTabBottomMargin );
+//        pPage->SetSize(0, 0, w, h);
         if ( pPage->GetAutoLayout() )
             pPage->Layout();
     }
@@ -362,7 +380,16 @@ void wxNotebook::Command(wxCommandEvent& event)
 // hide the currently active panel and show the new one
 void wxNotebook::ChangePage(int nOldSel, int nSel)
 {
-    wxASSERT( nOldSel != nSel ); // impossible
+  // it's not an error (the message may be generated by the tab control itself)
+  // and it may happen - just do nothing
+  if ( nSel == nOldSel )
+  {
+    wxNotebookPage *pPage = m_aPages[nSel];
+   	pPage->Show(FALSE);
+   	pPage->Show(TRUE);
+ 	pPage->SetFocus();
+    return;
+  }
 
     if ( nOldSel != -1 ) {
         m_aPages[nOldSel]->Show(FALSE);
@@ -375,3 +402,11 @@ void wxNotebook::ChangePage(int nOldSel, int nSel)
     m_nSelection = nSel;
 }
 
+void wxNotebook::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+  wxNotebookEvent event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, m_windowId , ::GetControlValue(m_macControl) - 1, m_nSelection);
+  event.SetEventObject(this);
+
+  ProcessEvent(event);
+}
+
diff --git a/src/mac/palette.cpp b/src/mac/palette.cpp
index f8db96f8d0..85a9fd16d8 100644
--- a/src/mac/palette.cpp
+++ b/src/mac/palette.cpp
@@ -26,12 +26,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxPalette, wxGDIObject)
 
 wxPaletteRefData::wxPaletteRefData()
 {
-    // TODO
+	m_palette = NULL ;
+	m_count = 0 ;
 }
 
 wxPaletteRefData::~wxPaletteRefData()
 {
-    // TODO
+	delete[] m_palette ;
 }
 
 wxPalette::wxPalette()
@@ -53,7 +54,13 @@ bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *gre
 
   m_refData = new wxPaletteRefData;
 
-  // TODO
+  M_PALETTEDATA->m_count = n ;
+  M_PALETTEDATA->m_palette = new wxColour[n] ;
+  
+  for ( int i = 0 ; i < n ; ++i)
+  {
+  	M_PALETTEDATA->m_palette[i].Set( red[i] , green[i] , blue[i] ) ;
+	}
 
   return FALSE;
 }
@@ -61,10 +68,26 @@ bool wxPalette::Create(int n, const unsigned char *red, const unsigned char *gre
 int wxPalette::GetPixel(const unsigned char red, const unsigned char green, const unsigned char blue) const
 {
     if ( !m_refData )
-  	return FALSE;
-
-    // TODO
-    return FALSE;
+  	return -1;
+
+    long bestdiff = 3 * 256 ;
+    long bestpos = 0 ;
+    long currentdiff ;
+    
+    for ( int i = 0  ; i < M_PALETTEDATA->m_count ; ++i )
+    {
+    	const wxColour& col = &M_PALETTEDATA->m_palette[i] ;
+    	currentdiff = abs ( col.Red() - red ) + abs( col.Green() - green ) + abs ( col.Blue() - blue )  ;
+    	if ( currentdiff < bestdiff )
+    	{
+    		bestdiff = currentdiff ;
+    		bestpos = i ;
+    		if ( bestdiff == 0 )
+    			break ; 
+    	}
+    }
+    
+    return bestpos;
 }
 
 bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsigned char *blue) const
@@ -72,11 +95,15 @@ bool wxPalette::GetRGB(int index, unsigned char *red, unsigned char *green, unsi
     if ( !m_refData )
 	    return FALSE;
 
-    if (index < 0 || index > 255)
+    if (index < 0 || index >= M_PALETTEDATA->m_count)
         return FALSE;
 
-    // TODO
-    return FALSE;
+    const wxColour& col = &M_PALETTEDATA->m_palette[index] ;
+    *red = col.Red() ;
+    *green = col.Green() ;
+    *blue = col.Blue() ;
+    
+    return TRUE;
 }
 
 
diff --git a/src/mac/print.cpp b/src/mac/print.cpp
index 61fd6e7e99..1064058925 100644
--- a/src/mac/print.cpp
+++ b/src/mac/print.cpp
@@ -13,8 +13,8 @@
 #pragma implementation "print.h"
 #endif
 
-#include "wx/stubs/print.h"
-#include "wx/stubs/printdlg.h"
+#include "wx/mac/print.h"
+#include "wx/mac/printdlg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPrinter, wxPrinterBase)
diff --git a/src/mac/printdlg.cpp b/src/mac/printdlg.cpp
index eae3b95568..18c7a8427e 100644
--- a/src/mac/printdlg.cpp
+++ b/src/mac/printdlg.cpp
@@ -14,11 +14,10 @@
 #endif
 
 #include "wx/object.h"
-#include "wx/stubs/printdlg.h"
+#include "wx/mac/printdlg.h"
 #include "wx/dcprint.h"
 
 // Use generic page setup dialog: use your own native one if one exists.
-#include "wx/generic/prntdlgg.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPrintDialog, wxDialog)
@@ -29,7 +28,6 @@ wxPrintDialog::wxPrintDialog():
  wxDialog()
 {
     m_dialogParent = NULL;
-    m_printerDC = NULL;
 }
 
 wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data):
@@ -41,7 +39,6 @@ wxPrintDialog::wxPrintDialog(wxWindow *p, wxPrintData* data):
 bool wxPrintDialog::Create(wxWindow *p, wxPrintData* data)
 {
     m_dialogParent = p;
-    m_printerDC = NULL;
 
     if ( data )
         m_printData = *data;
@@ -51,26 +48,39 @@ bool wxPrintDialog::Create(wxWindow *p, wxPrintData* data)
 
 wxPrintDialog::~wxPrintDialog()
 {
-    if (m_printerDC)
-        delete m_printerDC;
 }
 
 int wxPrintDialog::ShowModal()
 {
-    // TODO
-    return wxID_CANCEL;
+	int result = wxID_CANCEL ;
+	OSErr err ;
+	wxString message ;
+	::PrOpen() ;
+	err = PrError() ;
+	
+	if ( !err )
+	{
+		m_printData.ConvertToNative() ;
+		if  ( m_printData.macPrintInfo && ::PrJobDialog( m_printData.macPrintInfo ) )
+		{
+			m_printData.ConvertFromNative() ;
+			result = wxID_OK ;
+		}
+
+	}
+	else
+	{
+		message.Printf( "Print Error %d", err ) ;
+		wxMessageDialog dialog( NULL , message  , "", wxICON_HAND | wxOK) ;
+	}
+	::PrClose() ;
+
+	return result ;
 }
 
 wxDC *wxPrintDialog::GetPrintDC()
 {
-  if (m_printerDC)
-  {
-    wxDC* dc = m_printerDC;
-    m_printerDC = NULL;
-    return dc;
-  }
-  else
-    return NULL;
+    return new wxPrinterDC( m_printData ) ;
 }
 
 /*
@@ -105,11 +115,29 @@ wxPageSetupDialog::~wxPageSetupDialog()
 
 int wxPageSetupDialog::ShowModal()
 {
-    // Uses generic page setup dialog
-    wxGenericPageSetupDialog *genericPageSetupDialog = new wxGenericPageSetupDialog(GetParent(), & m_pageSetupData);
-    int ret = genericPageSetupDialog->ShowModal();
-    m_pageSetupData = genericPageSetupDialog->GetPageSetupData();
-    genericPageSetupDialog->Close(TRUE);
-    return ret;
+	int result = wxID_CANCEL ;
+	OSErr err ;
+	wxString message ;
+	::PrOpen() ;
+	err = PrError() ;
+	
+	if ( !err )
+	{
+		m_pageSetupData.ConvertToNative() ;
+		if  ( m_pageSetupData.m_macPageSetupInfo && ::PrStlDialog( m_pageSetupData.m_macPageSetupInfo ) )
+		{
+			m_pageSetupData.ConvertFromNative() ;
+			result = wxID_OK ;
+		}
+
+	}
+	else
+	{
+		message.Printf( "Print Error %d", err ) ;
+		wxMessageDialog dialog( NULL , message , "", wxICON_HAND | wxOK) ;
+	}
+	::PrClose() ;
+
+	return result ;
 }
 
diff --git a/src/mac/radiobox.cpp b/src/mac/radiobox.cpp
index da582d0e52..3393009f47 100644
--- a/src/mac/radiobox.cpp
+++ b/src/mac/radiobox.cpp
@@ -108,7 +108,7 @@ wxString wxRadioBox::GetString(int n) const
 
 void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxRadioBox::GetSize(int *width, int *height) const
@@ -140,12 +140,13 @@ void wxRadioBox::SetFocus()
 bool wxRadioBox::Show(bool show)
 {
     // TODO
-    return FALSE;
+	return wxWindow::Show( show ) ;
 }
 
 // Enable a specific button
 void wxRadioBox::Enable(int item, bool enable)
 {
+    wxControl::Enable(enable);
     // TODO
 }
 
diff --git a/src/mac/region.cpp b/src/mac/region.cpp
index c71d4c605a..c5c6332e06 100644
--- a/src/mac/region.cpp
+++ b/src/mac/region.cpp
@@ -28,19 +28,24 @@ class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
 public:
 	wxRegionRefData()
 	{
+		m_macRgn = NewRgn() ;
 	}
 
 	wxRegionRefData(const wxRegionRefData& data)
 	{
-        // TODO
+		m_macRgn = NewRgn() ;
+        CopyRgn( data.m_macRgn , m_macRgn ) ;
 	}
 
 	~wxRegionRefData()
 	{
-        // TODO
+        DisposeRgn( m_macRgn ) ;
 	}
+	RgnHandle	m_macRgn ;
 };
 
+#define M_REGION (((wxRegionRefData*)m_refData)->m_macRgn)
+#define OTHER_M_REGION(a) (((wxRegionRefData*)(a.m_refData))->m_macRgn)
 
 //-----------------------------------------------------------------------------
 // wxRegion
@@ -52,25 +57,30 @@ public:
 wxRegion::wxRegion()
 {
     m_refData = new wxRegionRefData;
-    // TODO create empty region
+}
+
+wxRegion::wxRegion(WXHRGN hRegion )
+{
+    m_refData = new wxRegionRefData;
+    CopyRgn( hRegion , M_REGION ) ;
 }
 
 wxRegion::wxRegion(long x, long y, long w, long h)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , x , y , x+w , y+h ) ;
 }
 
 wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , topLeft.x , topLeft.y , bottomRight.x , bottomRight.y ) ;
 }
 
 wxRegion::wxRegion(const wxRect& rect)
 {
     m_refData = new wxRegionRefData;
-    // TODO create rect region
+    SetRectRgn( M_REGION , rect.x , rect.y , rect.x+rect.width , rect.y+rect.height ) ;
 }
 
 /*!
@@ -95,41 +105,42 @@ void wxRegion::Clear()
 bool wxRegion::Combine(long x, long y, long width, long height, wxRegionOp op)
 {
 	// Don't change shared data
-	if (!m_refData) {
+	if (!m_refData) 
+	{
 		m_refData = new wxRegionRefData();
-	} else if (m_refData->GetRefCount() > 1) {
+	} 
+	else if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
-    // If ref count is 1, that means it's 'ours' anyway so no action.
-
-    // TODO create rect region
-
-    int mode = 0; // TODO platform-specific code
+    RgnHandle rgn = NewRgn() ;
+		SetRectRgn( rgn , x , y, x+width,y + height ) ;
+		
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , rgn , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( rgn ,M_REGION ) ;
             break ;
     }
 
-    // TODO do combine region
+		DisposeRgn( rgn ) ;
 
-    return FALSE;
+    return TRUE;
 }
 
 //! Union /e region with this.
@@ -141,36 +152,35 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
 	// Don't change shared data
 	if (!m_refData) {
 		m_refData = new wxRegionRefData();
-	} else	if (m_refData->GetRefCount() > 1) {
+	} 
+	else	if (m_refData->GetRefCount() > 1) 
+	{
 		wxRegionRefData* ref = (wxRegionRefData*)m_refData;
 		UnRef();
 		m_refData = new wxRegionRefData(*ref);
 	}
 
-    int mode = 0; // TODO platform-specific code
     switch (op)
     {
         case wxRGN_AND:
-            // TODO
+            SectRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_OR:
-            // TODO
+            UnionRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_XOR:
-            // TODO
+             XorRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_DIFF:
-            // TODO
+            DiffRgn( M_REGION , OTHER_M_REGION(region) , M_REGION ) ;
             break ;
         case wxRGN_COPY:
         default:
-            // TODO
+       			CopyRgn( OTHER_M_REGION(region) ,M_REGION ) ;
             break ;
     }
 
-    // TODO combine region
-
-	return FALSE;
+	return TRUE;
 }
 
 bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
@@ -185,9 +195,16 @@ bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
 // Outer bounds of region
 void wxRegion::GetBox(long& x, long& y, long&w, long &h) const
 {
-	if (m_refData) {
-        // TODO get box
-	} else {
+	if (m_refData) 
+	{
+		Rect box = (**M_REGION).rgnBBox ;
+        x = box.left ;
+        y = box.top ;
+        w = box.right - box.left ;
+        h = box.bottom - box.top ;
+	} 
+	else 
+	{
 		x = y = w = h = 0;
 	}
 }
@@ -202,8 +219,12 @@ wxRect wxRegion::GetBox() const
 // Is region empty?
 bool wxRegion::Empty() const
 {
-    // TODO
-    return FALSE;
+    return EmptyRgn( M_REGION ) ;
+}
+
+const WXHRGN wxRegion::GetWXHRGN() const
+{
+	return M_REGION ;
 }
 
 //-----------------------------------------------------------------------------
@@ -228,11 +249,11 @@ wxRegionContain wxRegion::Contains(const wxPoint& pt) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Point p = { pt.y , pt.x } ;
+    if (PtInRgn( p , M_REGION ) )
         return wxInRegion;
-    else
-        return wxOutRegion;
+        
+    return wxOutRegion;
 }
 
 // Does the region contain the rectangle (x, y, w, h)?
@@ -241,8 +262,8 @@ wxRegionContain wxRegion::Contains(long x, long y, long w, long h) const
 	if (!m_refData)
 		return wxOutRegion;
 
-    // TODO. Return wxInRegion if within region.
-    if (0)
+    Rect rect = { y , x , y + h , x + w } ;
+    if (RectInRgn( &rect , M_REGION ) )
         return wxInRegion;
     else
         return wxOutRegion;
@@ -308,8 +329,14 @@ void wxRegionIterator::Reset(const wxRegion& region)
 		m_numRects = 0;
 	else
     {
-        // TODO create m_rects and fill with rectangles for this region
-        m_numRects = 0;
+    	// we cannot dissolve it into rects on mac
+        m_rects = new wxRect[1];
+        Rect rect = (**OTHER_M_REGION( region )).rgnBBox ;
+        m_rects[0].x = rect.left;
+        m_rects[0].y = rect.top;
+        m_rects[0].width = rect.right - rect.left;
+        m_rects[0].height = rect.bottom - rect.top;
+        m_numRects = 1;
     }
 }
 
diff --git a/src/mac/scrolbar.cpp b/src/mac/scrolbar.cpp
index a92154acfb..a432b3e9b1 100644
--- a/src/mac/scrolbar.cpp
+++ b/src/mac/scrolbar.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/scrolbar.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxScrollBar, wxControl)
@@ -23,6 +24,8 @@ END_EVENT_TABLE()
 
 #endif
 
+extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
+
 // Scrollbar
 bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos,
@@ -30,21 +33,24 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    if (!parent)
-        return FALSE;
-    parent->AddChild(this);
-    SetName(name);
-	SetValidator(validator);
+  if (!parent)
+      return FALSE;
     
-    m_windowStyle = style;
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 100, 
+		kControlScrollBarLiveProc , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
+	MacPostControlCreate() ;
 
-    // TODO create scrollbar
-    return TRUE;
+  return TRUE;
 }
 
 wxScrollBar::~wxScrollBar()
@@ -53,13 +59,12 @@ wxScrollBar::~wxScrollBar()
 
 void wxScrollBar::SetThumbPosition(int viewStart)
 {
-    // TODO
+    ::SetControlValue( m_macControl , viewStart ) ;
 }
 
 int wxScrollBar::GetThumbPosition() const
 {
-    // TODO
-    return 0;
+    return ::GetControlValue( m_macControl ) ;
 }
 
 void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,
@@ -69,7 +74,19 @@ void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageS
     m_pageSize = thumbSize;
     m_objectSize = range;
 
-    // TODO
+  	int range1 = wxMax((m_objectSize - m_pageSize), 0) ;
+
+    SetControlMaximum( m_macControl , range1 ) ;
+    SetControlMinimum(  m_macControl , 0 ) ;
+    SetControlValue(  m_macControl , position ) ;
+
+    if ( UMAGetAppearanceVersion() >= 0x0110  )
+    {
+#if UMA_USE_8_6    	
+			SetControlViewSize( m_macControl , m_pageSize ) ;
+#endif
+    }
+    Refresh() ;
 }
 
 
@@ -79,3 +96,62 @@ void wxScrollBar::Command(wxCommandEvent& event)
     ProcessCommand(event);
 }
 
+void wxScrollBar::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+  int position = GetControlValue( m_macControl) ;
+  int minPos = GetControlMinimum( m_macControl) ;
+  int maxPos = GetControlMaximum( m_macControl) ;
+
+  wxEventType scrollEvent = wxEVT_NULL;
+  int nScrollInc;
+
+	switch( controlpart )
+	{
+		case kControlUpButtonPart :
+        nScrollInc = -1;
+        scrollEvent = wxEVT_SCROLL_LINEUP;
+			break ;
+		case kControlDownButtonPart :
+        nScrollInc = 1;
+        scrollEvent = wxEVT_SCROLL_LINEDOWN;
+			break ;
+		case kControlPageUpPart :
+        nScrollInc = -m_pageSize;
+        scrollEvent = wxEVT_SCROLL_PAGEUP;
+			break ;
+		case kControlPageDownPart :
+        nScrollInc = m_pageSize;
+        scrollEvent = wxEVT_SCROLL_PAGEDOWN;
+			break ;
+		case kControlIndicatorPart :
+        nScrollInc = 0 ;
+        scrollEvent = wxEVT_SCROLL_THUMBTRACK;
+			break ;
+	}
+
+  int new_pos = position + nScrollInc;
+
+  if (new_pos < 0)
+      new_pos = 0;
+  if (new_pos > maxPos)
+      new_pos = maxPos;
+	if ( nScrollInc )
+  	SetThumbPosition(new_pos);
+  	
+  wxScrollEvent event(scrollEvent, m_windowId);
+	if ( m_windowStyle & wxHORIZONTAL )
+	{
+		event.SetOrientation( wxHORIZONTAL ) ;
+	}
+	else
+	{
+		event.SetOrientation( wxVERTICAL ) ;
+	}
+  event.SetPosition(new_pos);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
+}
+
diff --git a/src/mac/settings.cpp b/src/mac/settings.cpp
index 2beda5c2a6..b13b5733cc 100644
--- a/src/mac/settings.cpp
+++ b/src/mac/settings.cpp
@@ -17,39 +17,92 @@
 
 wxColour wxSystemSettings::GetSystemColour(int index)
 {
-    // TODO
-	return wxColour();
+	switch( index )
+	{
+		case wxSYS_COLOUR_SCROLLBAR :
+		case wxSYS_COLOUR_BACKGROUND:
+		case wxSYS_COLOUR_ACTIVECAPTION:
+		case wxSYS_COLOUR_INACTIVECAPTION:
+		case wxSYS_COLOUR_MENU:
+		case wxSYS_COLOUR_WINDOW:
+		case wxSYS_COLOUR_WINDOWFRAME:
+		case wxSYS_COLOUR_ACTIVEBORDER:
+		case wxSYS_COLOUR_INACTIVEBORDER:
+		case wxSYS_COLOUR_BTNFACE:
+			return wxColor( 0xDD , 0xDD , 0xDD ) ;
+			break ;
+
+		case wxSYS_COLOUR_BTNSHADOW:
+			return wxColor( 0x44 , 0x44 , 0x44 ) ;
+			break ;
+
+		case wxSYS_COLOUR_BTNTEXT:
+		case wxSYS_COLOUR_MENUTEXT:
+		case wxSYS_COLOUR_WINDOWTEXT:
+		case wxSYS_COLOUR_CAPTIONTEXT:
+		case wxSYS_COLOUR_INFOTEXT:
+		case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
+     		return *wxBLACK;
+			break ;
+		case wxSYS_COLOUR_HIGHLIGHT:
+			{
+				RGBColor hilite ;
+				LMGetHiliteRGB(&hilite) ;
+				return wxColor( hilite.red >> 8 , hilite.green >> 8  , hilite.blue >> 8  ) ;
+			}
+			break ;
+		case wxSYS_COLOUR_BTNHIGHLIGHT:
+		case wxSYS_COLOUR_GRAYTEXT:
+			return wxColor( 0xCC , 0xCC , 0xCC ) ;
+			break ;
+	
+		case wxSYS_COLOUR_3DDKSHADOW:
+			return wxColor( 0x44 , 0x44 , 0x44 ) ;
+			break ;
+		case wxSYS_COLOUR_3DLIGHT:
+			return wxColor( 0xCC , 0xCC , 0xCC ) ;
+			break ;
+		case wxSYS_COLOUR_HIGHLIGHTTEXT :
+			{
+				RGBColor hilite ;
+				LMGetHiliteRGB(&hilite) ;
+				if ( ( hilite.red + hilite.green + hilite.blue ) == 0 )
+						return *wxWHITE ;
+				else
+						return *wxBLACK ;
+			}
+			break ;
+		case wxSYS_COLOUR_INFOBK :
+		case wxSYS_COLOUR_APPWORKSPACE:	
+			return *wxWHITE ;
+			break ;
+	}
+	return *wxWHITE;
 }
 
 wxFont wxSystemSettings::GetSystemFont(int index)
 {
-    // TODO
     switch (index)
     {
-        case wxSYS_DEVICE_DEFAULT_FONT:
-        {
-            break;
-        }
-        case wxSYS_DEFAULT_PALETTE:
-        {
-            break;
-        }
-        case wxSYS_SYSTEM_FIXED_FONT:
-        {
-            break;
-        }
-        case wxSYS_SYSTEM_FONT:
-        {
-            break;
-        }
-        default:
-        case wxSYS_DEFAULT_GUI_FONT:
-        {
-            break;
-        }
+        case wxSYS_ANSI_VAR_FONT :
+        case wxSYS_SYSTEM_FONT :
+        case wxSYS_DEVICE_DEFAULT_FONT :
+        case wxSYS_DEFAULT_GUI_FONT :
+	        {
+	        	return *wxSMALL_FONT ;
+					} ;
+        	break ;
+        case wxSYS_OEM_FIXED_FONT :
+        case wxSYS_ANSI_FIXED_FONT :
+        case wxSYS_SYSTEM_FIXED_FONT :
+        default :
+	        {
+	        	return *wxNORMAL_FONT ;
+	 				} ;
+	       	break ;
+				
     }
-
-    return wxFont();
+    return *wxNORMAL_FONT;
 }
 
 // Get a system metric, e.g. scrollbar size
@@ -58,11 +111,10 @@ int wxSystemSettings::GetSystemMetric(int index)
 	switch ( index)
 	{
         case wxSYS_MOUSE_BUTTONS:
-            // TODO
-			return 0;
+					return 2; // we emulate a two button mouse (ctrl + click = right button )
         case wxSYS_BORDER_X:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_BORDER_Y:
             // TODO
 			return 0;
@@ -91,14 +143,11 @@ int wxSystemSettings::GetSystemMetric(int index)
             // TODO
 			return 0;
         case wxSYS_HSCROLL_ARROW_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_HSCROLL_ARROW_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_HTHUMB_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_ICON_X:
             // TODO
 			return 0;
@@ -136,40 +185,33 @@ int wxSystemSettings::GetSystemMetric(int index)
             // TODO
 			return 0;
         case wxSYS_HSCROLL_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_ARROW_X:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VSCROLL_ARROW_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_VTHUMB_Y:
-            // TODO
-			return 0;
+					return 16;
         case wxSYS_CAPTION_Y:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_MENU_Y:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_NETWORK_PRESENT:
             // TODO
-			return 0;
+					return 0;
         case wxSYS_PENWINDOWS_PRESENT:
-            // TODO
-			return 0;
+					return 0;
         case wxSYS_SHOW_SOUNDS:
             // TODO
 			return 0;
         case wxSYS_SWAP_BUTTONS:
-            // TODO
-			return 0;
-		default:
-			return 0;
+				return 0;
+			default:
+				return 0;
 	}
 	return 0;
 }
diff --git a/src/mac/slider.cpp b/src/mac/slider.cpp
index c9952342a9..936ccddb47 100644
--- a/src/mac/slider.cpp
+++ b/src/mac/slider.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/slider.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
@@ -34,6 +35,8 @@ wxSlider::wxSlider()
   m_tickFreq = 0;
 }
 
+extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
+
 bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            int value, int minValue, int maxValue,
            const wxPoint& pos,
@@ -41,28 +44,92 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id,
            const wxValidator& validator,
            const wxString& name)
 {
-    SetName(name);
-    SetValidator(validator);
-
-    if (parent) parent->AddChild(this);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, validator , name , &bounds , title ) ;
 
-    m_lineSize = 1;
-    m_windowStyle = style;
-    m_tickFreq = 0;
+	m_macMinimumStatic = NULL ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-    m_rangeMax = maxValue;
-    m_rangeMin = minValue;
-
-    m_pageSize = (int)((maxValue-minValue)/10);
+  m_lineSize = 1;
+  m_tickFreq = 0;
 
-    // TODO create slider
+  m_rangeMax = maxValue;
+  m_rangeMin = minValue;
+
+  m_pageSize = (int)((maxValue-minValue)/10);
+	if ( m_width == -1 )
+	{
+		m_width = 20 ;
+		if ( style & wxSL_LABELS && style & wxSL_VERTICAL )
+			m_width += 24 ;
+		bounds.right = bounds.left + m_width ;
+	}
+	if ( m_height == -1 )
+	{
+		m_height = 20 ;
+		if ( style & wxSL_LABELS && style & wxSL_HORIZONTAL )
+			m_height += 24 ;
+		bounds.bottom = bounds.top + m_height ;
+	}
+	
+	if ( style & wxSL_LABELS && style & wxSL_HORIZONTAL )
+	{
+		bounds.top += 12 ; 
+		bounds.right -= 24 ;
+	}
+			
+	if ( style & wxSL_LABELS && style & wxSL_VERTICAL )
+	{
+		bounds.left += 24 ;
+		bounds.top += 12 ;
+	}
+			
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true ,  value , minValue , maxValue, 
+  			kControlSliderProc +  kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
+
+	MacPostControlCreate() ;
+
+	if ( style & wxSL_LABELS )
+	{
+		if ( style & wxSL_HORIZONTAL )
+		{
+			wxSize size( 24 , 12 ) ;
+			wxPoint leftpos( 0 , 0 ) ;
+			wxPoint	rightpos( m_width - 2 * 12 , 0 ) ;
+			wxPoint valuepos( m_width - 12 , 20 ) ;
+			wxString valuestring ;
+			
+			valuestring.Printf( "%d" , minValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos , size ) ;
+			valuestring.Printf( "%d" , maxValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos , size ) ;
+			valuestring.Printf( "%d" , value ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos , size ) ;
+		}
+		else
+		{
+			wxSize size( 24 , 12 ) ;
+			wxPoint toppos( 0 , 12 ) ;
+			wxPoint	bottompos( 0 , m_height - 12 ) ;
+			wxPoint valuepos( 20 , 0 ) ;
+			wxString valuestring ;
+			
+			valuestring.Printf( "%d" , minValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos , size ) ;
+			valuestring.Printf( "%d" , maxValue ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos , size ) ;
+			valuestring.Printf( "%d" , value ) ;				
+			m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos , size ) ;
+		}
+	}
+
+  return TRUE;
 
-    return FALSE;
 }
 
 wxSlider::~wxSlider()
@@ -71,28 +138,16 @@ wxSlider::~wxSlider()
 
 int wxSlider::GetValue() const
 {
-    // TODO
-    return 0;
+ 	return GetControlValue( m_macControl) ;
 }
 
 void wxSlider::SetValue(int value)
 {
-    // TODO
-}
-
-void wxSlider::GetSize(int *width, int *height) const
-{
-    // TODO
-}
-
-void wxSlider::GetPosition(int *x, int *y) const
-{
-    // TODO
-}
-
-void wxSlider::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	wxString valuestring ;
+	valuestring.Printf( "%d" , value ) ;	
+	if ( m_macMinimumStatic )			
+		m_macMinimumStatic->SetLabel( valuestring ) ;
+ 	SetControlValue( m_macControl , value ) ;
 }
 
 void wxSlider::SetRange(int minValue, int maxValue)
@@ -182,9 +237,32 @@ void wxSlider::Command (wxCommandEvent & event)
   ProcessCommand (event);
 }
 
-bool wxSlider::Show(bool show)
+bool wxSlider::Show( bool show ) 
 {
-    // TODO
-    return TRUE;
+	return wxWindow::Show( show ) ;
 }
 
+void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	SInt16 value = ::GetControlValue( m_macControl ) ;
+	
+	SetValue( value ) ;		
+	
+	wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+	event.SetPosition(GetControlValue( m_macControl) );
+	event.SetEventObject( this );
+
+#if WXWIN_COMPATIBILITY
+
+    wxEventType oldEvent = event.GetEventType();
+    event.SetEventType( wxEVT_COMMAND_SLIDER_UPDATED );
+    if ( !GetEventHandler()->ProcessEvent(event) )
+    {
+        event.SetEventType( oldEvent );
+        if (!GetParent()->GetEventHandler()->ProcessEvent(event))
+            event.Skip();
+    }
+#else
+	GetEventHandler()->ProcessEvent(event);
+#endif
+}
diff --git a/src/mac/spinbutt.cpp b/src/mac/spinbutt.cpp
index cbea725592..8f3e1533b8 100644
--- a/src/mac/spinbutt.cpp
+++ b/src/mac/spinbutt.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/spinbutt.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
@@ -28,19 +29,25 @@ wxSpinButton::wxSpinButton()
 bool wxSpinButton::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    SetName(name);
-
-    m_windowStyle = style;
-
-    SetParent(parent);
-
     m_min = 0;
     m_max = 100;
 
-    m_windowId = (id == -1) ? NewControlId() : id;
+  if (!parent)
+      return FALSE;
+    
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style,*( (wxValidator*) NULL ) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 100, 
+		kControlLittleArrowsProc , (long) this ) ;
+	
+	wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
+
+	MacPostControlCreate() ;
 
-    // TODO create spin button
-    return FALSE;
+  return TRUE;
 }
 
 wxSpinButton::~wxSpinButton()
@@ -52,20 +59,23 @@ wxSpinButton::~wxSpinButton()
 
 int wxSpinButton::GetValue() const
 {
-	// TODO
-    return 0;
+    return m_value;
 }
 
 void wxSpinButton::SetValue(int val)
 {
-	// TODO
+	m_value = val ;
+  wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
+
+  event.SetPosition(m_value);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
 }
 
 void wxSpinButton::SetRange(int minVal, int maxVal)
 {
 	m_min = minVal;
 	m_max = maxVal;
-	// TODO
 }
 
 // Spin event
@@ -76,3 +86,49 @@ wxSpinEvent::wxSpinEvent(wxEventType commandType, int id):
 {
 }
 
+void wxSpinButton::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	if ( m_macControl == NULL )
+		return ;
+	
+  wxEventType scrollEvent = wxEVT_NULL;
+  int nScrollInc;
+
+	switch( controlpart )
+	{
+		case kControlUpButtonPart :
+        nScrollInc = 1;
+        scrollEvent = wxEVT_SCROLL_LINEUP;
+			break ;
+		case kControlDownButtonPart :
+        nScrollInc = -1;
+        scrollEvent = wxEVT_SCROLL_LINEDOWN;
+			break ;
+	}
+
+  m_value = m_value + nScrollInc;
+
+  if (m_value < m_min)
+  {
+  	if ( m_windowStyle & wxSP_WRAP )
+      m_value = m_max;
+  	else
+      m_value = m_min;
+  }
+  
+  if (m_value > m_max)
+  {
+  	if ( m_windowStyle & wxSP_WRAP )
+      m_value = m_min;
+    else
+      m_value = m_max;
+  }
+  	
+  wxScrollEvent event(scrollEvent, m_windowId);
+
+  event.SetPosition(m_value);
+  event.SetEventObject( this );
+  GetEventHandler()->ProcessEvent(event);
+}
+
+
diff --git a/src/mac/statbmp.cpp b/src/mac/statbmp.cpp
index a67c558465..721c254234 100644
--- a/src/mac/statbmp.cpp
+++ b/src/mac/statbmp.cpp
@@ -23,6 +23,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
  * wxStaticBitmap
  */
 
+BEGIN_EVENT_TABLE(wxStaticBitmap, wxControl)
+    EVT_PAINT(wxStaticBitmap::OnPaint)
+END_EVENT_TABLE()
+
 bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
            const wxBitmap& bitmap,
            const wxPoint& pos,
@@ -41,19 +45,27 @@ bool wxStaticBitmap::Create(wxWindow *parent, wxWindowID id,
 
     m_windowStyle = style;
 
-    // TODO: create static bitmap control
-    return FALSE;
+    bool ret = wxControl::Create( parent, id, pos, size, style , name );
+
+    return ret;
 }
 
 void wxStaticBitmap::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 void wxStaticBitmap::SetBitmap(const wxBitmap& bitmap)
 {
     m_messageBitmap = bitmap;
 
-    // TODO: redraw bitmap
+    Refresh() ;
+}
+void wxStaticBitmap::OnPaint( wxPaintEvent &event ) 
+{
+    wxPaintDC dc(this);
+    PrepareDC(dc);
+		dc.SetPalette( *m_messageBitmap.GetPalette() ) ;
+		dc.DrawBitmap( m_messageBitmap , 0 , 0 ) ;
 }
 
diff --git a/src/mac/statbox.cpp b/src/mac/statbox.cpp
index b239dc738c..abae14d07e 100644
--- a/src/mac/statbox.cpp
+++ b/src/mac/statbox.cpp
@@ -14,6 +14,7 @@
 #endif
 
 #include "wx/statbox.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl)
@@ -35,28 +36,15 @@ bool wxStaticBox::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-    SetName(name);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    if (parent) parent->AddChild(this);
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlGroupBoxTextTitleProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
-
-    m_windowStyle = style;
-
-    // TODO: create static box
-    return FALSE;
-}
-
-void wxStaticBox::SetLabel(const wxString& label)
-{
-    // TODO
+  return TRUE;
 }
-
-void wxStaticBox::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
-
diff --git a/src/mac/stattext.cpp b/src/mac/stattext.cpp
index 3b19c7184d..14c69f1d96 100644
--- a/src/mac/stattext.cpp
+++ b/src/mac/stattext.cpp
@@ -22,6 +22,8 @@
 IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl)
 #endif
 
+#include <wx/mac/uma.h>
+
 bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
            const wxString& label,
            const wxPoint& pos,
@@ -29,32 +31,31 @@ bool wxStaticText::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-  SetName(name);
-  if (parent) parent->AddChild(this);
-
-  SetBackgroundColour(parent->GetBackgroundColour()) ;
-  SetForegroundColour(parent->GetForegroundColour()) ;
-
-  if ( id == -1 )
-  	m_windowId = (int)NewControlId();
-  else
-	m_windowId = id;
-
-  m_windowStyle = style;
-
-  SetFont(parent->GetFont());
-
-  // TODO
-  return FALSE;
-}
-
-void wxStaticText::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  label , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
+
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlStaticTextProc , (long) this ) ;
+	::UMASetControlData( m_macControl, kControlLabelPart, kControlStaticTextTextTag , (long) title[0] , (char*) &title[1] ) ;
+	
+	MacPostControlCreate() ;
+
+  return TRUE;
 }
 
-void wxStaticText::SetLabel(const wxString& label)
+void wxStaticText::SetLabel(const wxString& st , bool resize )
 {
-    // TODO
+	m_label = st ;
+	wxString label ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( st ) ;
+	else
+		label = st ;
+		
+	::UMASetControlData( m_macControl, kControlLabelPart, kControlStaticTextTextTag , (long) label.Length() , (char*)(const char*) label ) ;
+	Refresh() ;
 }
 
diff --git a/src/mac/statusbr.cpp b/src/mac/statusbr.cpp
index dff1ddec34..15ab99d5ac 100644
--- a/src/mac/statusbr.cpp
+++ b/src/mac/statusbr.cpp
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#include "wx/stubs/statusbr.h"
+#include "wx/mac/statusbr.h"
 
 #if     !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxStatusBarXX, wxStatusBar);
diff --git a/src/mac/tabctrl.cpp b/src/mac/tabctrl.cpp
index b3b45a72d1..ea057aae52 100644
--- a/src/mac/tabctrl.cpp
+++ b/src/mac/tabctrl.cpp
@@ -15,6 +15,7 @@
 
 #include "wx/control.h"
 #include "wx/tabctrl.h"
+#include "wx/mac/uma.h"
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTabCtrl, wxControl)
@@ -31,20 +32,18 @@ wxTabCtrl::wxTabCtrl()
 bool wxTabCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    m_imageList = NULL;
-
-    SetName(name);
-
-    m_windowStyle = style;
+	Rect bounds ;
+	Str255 title ;
 
-    SetParent(parent);
+  m_imageList = NULL;
+	
+	MacPreControlCreate( parent , id ,  "" , pos , size ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    m_windowId = (id < 0 ? NewControlId() : id);
-
-    if (parent) parent->AddChild(this);
-
-    // TODO: create tab control
-    return FALSE;
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , true , 0 , 0 , 1, 
+	  	kControlTabSmallProc , (long) this ) ;
+	
+	MacPostControlCreate() ;
+	return TRUE ;
 }
 
 wxTabCtrl::~wxTabCtrl()
diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp
index a2b5e7d38e..d553477f93 100644
--- a/src/mac/textctrl.cpp
+++ b/src/mac/textctrl.cpp
@@ -36,11 +36,14 @@
 #endif
 #endif
 
+#include "wx/mac/uma.h"
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
 
 BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
 	EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
+	EVT_CHAR(wxTextCtrl::OnChar)
 END_EVENT_TABLE()
 #endif
 
@@ -54,67 +57,114 @@ wxTextCtrl::wxTextCtrl()
 }
 
 bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
-		   const wxString& value,
+		   const wxString& st,
            const wxPoint& pos,
            const wxSize& size, long style,
            const wxValidator& validator,
            const wxString& name)
 {
-    m_fileName = "";
-    SetName(name);
-    SetValidator(validator);
-    if (parent) parent->AddChild(this);
+	m_macHorizontalBorder = 2 ; // additional pixels around the real control
+	m_macVerticalBorder = 2 ;
 
-    m_windowStyle = style;
+	wxSize mySize = size ;
 
-    if ( id == -1 )
-  	    m_windowId = (int)NewControlId();
-    else
-	    m_windowId = id;
+	Rect bounds ;
+	Str255 title ;
+	
+	if ( mySize.y == -1 )
+	{
+		if ( UMAHasAppearance() )
+			mySize.y = 16 ;
+		else
+			mySize.y = 24 ;
+	}
+	MacPreControlCreate( parent , id ,  "" , pos , mySize ,style, validator , name , &bounds , title ) ;
 
-    return TRUE;
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlEditTextProc , (long) this ) ;
+	MacPostControlCreate() ;
+
+	wxString value ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		value = wxMacMakeMacStringFromPC( st ) ;
+	else
+		value = st ;
+	UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+
+  return TRUE;
 }
 
 wxString wxTextCtrl::GetValue() const
 {
-    // TODO
-    return wxString("");
+	Size actualsize;
+	UMAGetControlData( m_macControl, 0, kControlEditTextTextTag , 32767 , wxBuffer , &actualsize) ;
+	wxBuffer[actualsize] = 0 ;
+	if( wxApp::s_macDefaultEncodingIsPC )
+		return wxMacMakePCStringFromMac( wxBuffer ) ;
+	else
+    	return wxString(wxBuffer);
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::SetValue(const wxString& st)
 {
-    // TODO
+	wxString value ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		value = wxMacMakeMacStringFromPC( st ) ;
+	else
+		value = st ;
+	UMASetControlData( m_macControl, 0, kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ;
+	Refresh() ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    // TODO
+    wxControl::SetSize( x , y , width , height , sizeFlags ) ;
 }
 
 // Clipboard operations
 void wxTextCtrl::Copy()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TECopy( teH ) ;
 }
 
 void wxTextCtrl::Cut()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TECut( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Paste()
 {
-    // TODO
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+	TEPaste( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetEditable(bool editable)
 {
-    // TODO
+    if ( editable )
+    	UMAActivateControl( m_macControl ) ;
+    else
+    	UMADeactivateControl( m_macControl ) ;
 }
 
 void wxTextCtrl::SetInsertionPoint(long pos)
 {
-    // TODO
+	SetSelection( pos , pos ) ;
 }
 
 void wxTextCtrl::SetInsertionPointEnd()
@@ -125,29 +175,72 @@ void wxTextCtrl::SetInsertionPointEnd()
 
 long wxTextCtrl::GetInsertionPoint() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).selStart ;
 }
 
 long wxTextCtrl::GetLastPosition() const
 {
-    // TODO
-    return 0;
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+//   UMAGetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection , &size ) ;
+    return (**teH).teLength ;
 }
 
 void wxTextCtrl::Replace(long from, long to, const wxString& value)
 {
-    // TODO
+   	TEHandle teH ;
+   	long size ;
+   
+   	ControlEditTextSelectionRec selection ;
+   
+   	selection.selStart = from ;
+   	selection.selEnd = to ;
+   	UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+		UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   	TESetSelect( from , to  , teH ) ;
+   	TEDelete( teH ) ;
+		TEInsert( value , value.Length() , teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::Remove(long from, long to)
 {
-    // TODO
+   	TEHandle teH ;
+   	long size ;
+   
+   	ControlEditTextSelectionRec selection ;
+   
+   	selection.selStart = from ;
+   	selection.selEnd = to ;
+   	UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+	UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   	TEDelete( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 void wxTextCtrl::SetSelection(long from, long to)
 {
-    // TODO
+   ControlEditTextSelectionRec selection ;
+   TEHandle teH ;
+   long size ;
+   
+   UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+   selection.selStart = from ;
+   selection.selEnd = to ;
+   
+   UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   TESetSelect( selection.selStart , selection.selEnd , teH ) ;
 }
 
 bool wxTextCtrl::LoadFile(const wxString& file)
@@ -217,23 +310,44 @@ bool wxTextCtrl::SaveFile(const wxString& file)
 
 void wxTextCtrl::WriteText(const wxString& text)
 {
-    // TODO write text to control
+    TEHandle teH ;
+    long size ;
+   
+   	memcpy( wxBuffer, text , text.Length() ) ;
+   	wxBuffer[text.Length() ] = 0 ;
+//    wxMacConvertNewlines( wxBuffer , wxBuffer ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+   
+		TEInsert( wxBuffer , strlen( wxBuffer) , teH ) ;
+		Refresh() ;
 }
 
 void wxTextCtrl::AppendText(const wxString& text)
 {
-    // TODO append text to control
+    SetInsertionPointEnd();
+    WriteText(text);
 }
 
 void wxTextCtrl::Clear()
 {
-    // TODO
+    TEHandle teH ;
+    long size ;
+   	ControlEditTextSelectionRec selection ;
+   
+  	selection.selStart = 0 ;
+   	selection.selEnd = 32767 ;
+   
+    UMASetControlData( m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
+   
+    UMAGetControlData( m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &teH , &size ) ;
+		TECut( teH ) ;
+//	MacInvalidateControl() ;
 }
 
 bool wxTextCtrl::IsModified() const
 {
-    // TODO
-    return FALSE;
+    return TRUE;
 }
 
 // Makes 'unmodified'
@@ -266,14 +380,12 @@ void wxTextCtrl::ShowPosition(long pos)
 
 int wxTextCtrl::GetLineLength(long lineNo) const
 {
-    // TODO
-    return 0;
+    return GetValue().Length();
 }
 
 wxString wxTextCtrl::GetLineText(long lineNo) const
 {
-    // TODO
-    return wxString("");
+    return GetValue();
 }
 
 /*
@@ -295,6 +407,76 @@ void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
     }
 }
 
+void wxTextCtrl::OnChar(wxKeyEvent& event)
+{
+	bool handleIt = true ;
+    switch( event.KeyCode() )
+    {
+        case WXK_RETURN:
+        {
+/* Oh yes it will, because we also specify DLGC_WANTCHARS
+            wxASSERT_MSG( m_windowStyle & wxTE_PROCESS_ENTER,
+                          "this text ctrl should never receive return" );
+*/
+
+            if ( (m_windowStyle & wxTE_MULTILINE) == 0 )
+            {
+            	wxWindow* parent = GetParent() ;
+            	while( parent )
+            	{
+            		if ( parent->GetDefaultItem() )
+            		{
+            			wxButton *defaultBtn = parent->GetDefaultItem() ;
+							    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, defaultBtn->GetId() );
+							    event.SetEventObject(defaultBtn);
+							    defaultBtn->Command(event);
+            			return ;
+					}
+            		parent = parent->GetParent() ;
+				} ;
+            }
+            break;
+        }
+        case WXK_TAB:
+            // only produce navigation event if we don't process TAB ourself or
+            // if it's a Shift-Tab keypress (we assume nobody will ever need
+            // this key combo for himself)
+            //
+            // NB: Notice that Ctrl-Tab is handled elsewhere and Alt-Tab is
+            //     handled by Windows
+            if ( event.ShiftDown() || !(m_windowStyle & wxTE_PROCESS_TAB) )
+            {
+                wxNavigationKeyEvent eventNav;
+                eventNav.SetDirection(!event.ShiftDown());
+                eventNav.SetWindowChange(FALSE);
+                eventNav.SetEventObject(this);
+    
+                if ( GetEventHandler()->ProcessEvent(eventNav) )
+                    return;
+            }
+            break;
+    }
+    if ( handleIt )
+    {
+			EventRecord *ev = wxTheApp->MacGetCurrentEvent() ;
+			short keycode ;
+			short keychar ;
+			keychar = short(ev->message & charCodeMask);
+			keycode = short(ev->message & keyCodeMask) >> 8 ;
+			UMAHandleControlKey( m_macControl , keycode , keychar , ev->modifiers ) ;
+			if ( keychar >= 0x20 )
+			{
+      {
+        wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
+        wxString val(GetValue());
+        if ( !val.IsNull() )
+          event.m_commandString = WXSTRINGCAST val;
+        event.SetEventObject( this );
+        ProcessCommand(event);
+      }
+			}
+		}
+}
 // The streambuf code was partly taken from chapter 3 by Jerry Schwarz of
 // AT&T's "C++ Lanuage System Release 3.0 Library Manual" - Stein Somers
 
diff --git a/src/mac/toolbar.cpp b/src/mac/toolbar.cpp
index 3cb859e366..0620c12afb 100644
--- a/src/mac/toolbar.cpp
+++ b/src/mac/toolbar.cpp
@@ -14,6 +14,9 @@
 #endif
 
 #include "wx/wx.h"
+
+#if wxUSE_TOOLBAR
+
 #include "wx/toolbar.h"
 
 #if !USE_SHARED_LIBRARY
@@ -23,6 +26,8 @@ BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
 END_EVENT_TABLE()
 #endif
 
+#include <wx/mac/uma.h>
+
 wxToolBar::wxToolBar()
 {
   m_maxWidth = -1;
@@ -35,22 +40,36 @@ wxToolBar::wxToolBar()
 bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
             long style, const wxString& name)
 {
-    m_maxWidth = -1;
-    m_maxHeight = -1;
+  m_maxWidth = -1;
+  m_maxHeight = -1;
+
+  m_defaultWidth = 24;
+  m_defaultHeight = 22;
   
-    m_defaultWidth = 24;
-    m_defaultHeight = 22;
-    SetName(name);
+  int x = pos.x;
+  int y = pos.y;
+  int width = size.x;
+  int height = size.y;
 
-    m_windowStyle = style;
+  if (width <= 0)
+    width = 100;
+  if (height <= 0)
+    height = 30;
+  if (x < 0)
+    x = 0;
+  if (y < 0)
+    y = 0;
 
-    SetParent(parent);
+	Rect bounds ;
+	Str255 title ;
+	
+	MacPreControlCreate( parent , id ,  "" , wxPoint( x , y ) , wxSize( width , height ) ,style, *((wxValidator*)NULL) , name , &bounds , title ) ;
 
-    if (parent) parent->AddChild(this);
+	m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , "\p" , true , 0 , 0 , 1, 
+	  	kControlPlacardProc , (long) this ) ;
+	MacPostControlCreate() ;
 
-    // TODO create toolbar
-  
-    return FALSE;
+  return TRUE;
 }
 
 wxToolBar::~wxToolBar()
@@ -58,19 +77,143 @@ wxToolBar::~wxToolBar()
     // TODO
 }
 
+PicHandle MakePict(GWorldPtr wp)
+{
+	CGrafPtr		origPort ;
+	GDHandle		origDev ;
+	
+	PicHandle		pict;				// this is the Picture we give back
+
+	RGBColor		gray = { 0xCCCC ,0xCCCC , 0xCCCC } ;
+	
+	GetGWorld( &origPort , &origDev ) ;
+	SetGWorld( wp , NULL ) ;
+	
+	pict = OpenPicture(&wp->portRect);	// open a picture, this disables drawing
+	if(!pict)	
+		return NULL;
+	
+	RGBBackColor( &gray ) ;
+	EraseRect(&wp->portRect) ;
+	CopyBits((BitMap*)*wp->portPixMap,			// src PixMap	- we copy image over itself -
+				(BitMap*)*wp->portPixMap,		// dst PixMap	- no drawing occurs -
+				&wp->portRect,			// srcRect		- it will be recorded and compressed -
+				&wp->portRect,			// dstRect		- into the picture that is open -
+				srcCopy,NULL);			// copyMode and no clip region
+
+	ClosePicture();						// We are done recording the picture
+	SetGWorld( origPort , origDev ) ;
+	return pict;						// return our groovy pict handle
+}
+
+PicHandle MakePictWhite(GWorldPtr wp)
+{
+	CGrafPtr		origPort ;
+	GDHandle		origDev ;
+	
+	PicHandle		pict;				// this is the Picture we give back
+
+	RGBColor		white = { 0xFFFF ,0xFFFF  , 0xFFFF  } ;
+	
+	GetGWorld( &origPort , &origDev ) ;
+	SetGWorld( wp , NULL ) ;
+	
+	pict = OpenPicture(&wp->portRect);	// open a picture, this disables drawing
+	if(!pict)	
+		return NULL;
+	
+	RGBBackColor( &white ) ;
+	EraseRect(&wp->portRect) ;
+	CopyBits((BitMap*)*wp->portPixMap,			// src PixMap	- we copy image over itself -
+				(BitMap*)*wp->portPixMap,		// dst PixMap	- no drawing occurs -
+				&wp->portRect,			// srcRect		- it will be recorded and compressed -
+				&wp->portRect,			// dstRect		- into the picture that is open -
+				srcCopy,NULL);			// copyMode and no clip region
+
+	ClosePicture();						// We are done recording the picture
+	SetGWorld( origPort , origDev ) ;
+	return pict;						// return our groovy pict handle
+}
+
+const short kwxMacToolBarTopMargin = 2 ;
+const short kwxMacToolBarLeftMargin = 2 ;
+
 bool wxToolBar::CreateTools()
 {
-    if (m_tools.Number() == 0)
-        return FALSE;
+  if (m_tools.Number() == 0)
+      return FALSE;
 
-    // TODO
-    return FALSE;
+	Rect toolbarrect = { m_y , m_x , m_y + m_height , m_x + m_width } ;
+	ControlFontStyleRec		controlstyle ;
+	WindowPtr				window = GetMacRootWindow() ;
+	controlstyle.flags = kControlUseFontMask ;
+	controlstyle.font = kControlFontSmallSystemFont ;
+	
+	wxNode *node = m_tools.First();
+	int noButtons = 0;
+	int x = 0 ;
+	
+	while (node)
+	{
+		wxToolBarTool *tool = (wxToolBarTool *)node->Data();
+		wxBitmapRefData * bmap = (wxBitmapRefData*) ( tool->m_bitmap1.GetRefData()) ;
+		
+		if( tool->m_toolStyle != wxTOOL_STYLE_SEPARATOR )
+		{
+			Rect toolrect = { toolbarrect.top + kwxMacToolBarTopMargin , toolbarrect.left + x + kwxMacToolBarLeftMargin , 0 , 0 } ;
+			toolrect.right = toolrect.left + m_defaultWidth ;
+			toolrect.bottom = toolrect.top + m_defaultHeight ;
+			
+			PicHandle	icon = NULL ;
+			if ( bmap )
+			{
+				if ( bmap->m_bitmapType == kMacBitmapTypePict )
+					icon = bmap->m_hPict ;
+				else if ( bmap->m_bitmapType == kMacBitmapTypeGrafWorld )
+				{
+					icon = MakePict( bmap->m_hBitmap ) ;
+				}
+			}
+			
+			ControlHandle m_macToolHandle ;
+				
+			if ( icon )
+			{
+				m_macToolHandle = UMANewControl( window , &toolrect , "\p" , true , 0 , 
+					kControlBehaviorOffsetContents + kControlContentPictHandle , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
+				ControlButtonContentInfo info ;
+				
+				info.contentType = kControlContentPictHandle ;
+				info.u.picture = icon ;
+				
+				UMASetControlData( m_macToolHandle , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
+			}
+			else
+			{
+						m_macToolHandle = UMANewControl( window , &toolrect , "\p" , true , 0 , 
+						kControlBehaviorOffsetContents  , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
+			}
+			m_macToolHandles.Add( m_macToolHandle ) ;
+			UMASetControlFontStyle( m_macToolHandle , &controlstyle ) ;
+			UMAEmbedControl( m_macToolHandle , m_macControl ) ;
+			
+			x += (int)m_defaultWidth;
+			noButtons ++;
+		}
+		else
+		{
+			m_macToolHandles.Add( NULL ) ;
+			x += (int)m_defaultWidth / 4;
+		}
+		node = node->Next();
+	}
+
+  return TRUE;
 }
 
 void wxToolBar::SetToolBitmapSize(const wxSize& size)
 {
     m_defaultWidth = size.x; m_defaultHeight = size.y;
-    // TODO
 }
 
 wxSize wxToolBar::GetMaxSize() const
@@ -82,10 +225,21 @@ wxSize wxToolBar::GetMaxSize() const
 // The button size is bigger than the bitmap size
 wxSize wxToolBar::GetToolSize() const
 {
-    // TODO
     return wxSize(m_defaultWidth + 8, m_defaultHeight + 7);
 }
 
+void wxToolBar::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) 
+{
+	int index = 0 ;
+	for ( index = 0 ; index < m_macToolHandles.Count() ; ++index )
+	{
+		if ( m_macToolHandles[index] == (void*) control )
+		{
+			OnLeftClick( ( (wxToolBarTool*) (m_tools.Nth( index )->Data() ) ) ->m_index , ( (wxToolBarTool*) (m_tools.Nth( index )->Data() ) ) ->m_toggleState ) ;
+		}
+	}
+}
+
 void wxToolBar::EnableTool(int toolIndex, bool enable)
 {
     wxNode *node = m_tools.Find((long)toolIndex);
@@ -137,9 +291,11 @@ wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBit
   else
     tool->m_y = m_yMargin;
 
-  tool->SetSize(GetDefaultButtonWidth(), GetDefaultButtonHeight());
+  tool->SetSize(m_defaultWidth, m_defaultHeight);
 
   m_tools.Append((long)index, tool);
   return tool;
 }
 
+#endif // wxUSE_TOOLBAR
+
diff --git a/src/mac/utils.cpp b/src/mac/utils.cpp
index 940bdc21bc..817138cb63 100644
--- a/src/mac/utils.cpp
+++ b/src/mac/utils.cpp
@@ -196,7 +196,9 @@ bool wxGetResource(const wxString& section, const wxString& entry, int *value, c
 }
 #endif // wxUSE_RESOURCES
 
-static int wxBusyCursorCount = 0;
+int wxBusyCursorCount = 0;
+extern CursHandle	gMacCurrentCursor ;
+CursHandle			gMacStoredActiveCursor = NULL ;
 
 // Set the cursor to the busy cursor for all windows
 void wxBeginBusyCursor(wxCursor *cursor)
@@ -204,7 +206,8 @@ void wxBeginBusyCursor(wxCursor *cursor)
   wxBusyCursorCount ++;
   if (wxBusyCursorCount == 1)
   {
-        // TODO
+  	gMacStoredActiveCursor = gMacCurrentCursor ;
+		::SetCursor( *::GetCursor( watchCursor ) ) ;
   }
   else
   {
@@ -221,7 +224,11 @@ void wxEndBusyCursor()
   wxBusyCursorCount --;
   if (wxBusyCursorCount == 0)
   {
-    // TODO
+    if ( gMacStoredActiveCursor )
+    	::SetCursor( *gMacStoredActiveCursor ) ;
+    else
+    	::SetCursor( &qd.arrow ) ;
+   	gMacStoredActiveCursor = NULL ;
   }
 }
 
@@ -247,26 +254,40 @@ bool wxCheckForInterrupt(wxWindow *wnd)
 
 void wxGetMousePosition( int* x, int* y )
 {
-    // TODO
+    Point pt ;
+    
+    GetMouse( &pt ) ;
+    LocalToGlobal( &pt ) ;
+    *x = pt.h ;
+    *y = pt.v ;
 };
 
 // Return TRUE if we have a colour display
 bool wxColourDisplay()
 {
-    // TODO
     return TRUE;
 }
 
 // Returns depth of screen
 int wxDisplayDepth()
 {
-    // TODO
-    return 0;
+		// get max pixel depth
+		CGrafPtr port ;
+		GetCWMgrPort( &port ) ; 
+		GDHandle maxDevice ;
+		
+		maxDevice = GetMaxDevice( &port->portRect ) ;
+		if ( maxDevice )
+			return (**((**maxDevice).gdPMap)).pixelSize ;
+		else
+			return 8 ; 
 }
 
 // Get size of display
 void wxDisplaySize(int *width, int *height)
 {
-    // TODO
+    *width = qd.screenBits.bounds.right - qd.screenBits.bounds.left  ;
+    *height = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top ; 
+    *height -= LMGetMBarHeight() ;
 }
 
diff --git a/src/mac/wave.cpp b/src/mac/wave.cpp
index c25681858c..804d07a097 100644
--- a/src/mac/wave.cpp
+++ b/src/mac/wave.cpp
@@ -15,7 +15,7 @@
 
 #include "wx/object.h"
 #include "wx/string.h"
-#include "wx/stubs/wave.h"
+#include "wx/mac/wave.h"
 
 wxWave::wxWave()
   : m_waveData(NULL), m_waveLength(0), m_isResource(FALSE)
diff --git a/src/mac/window.cpp b/src/mac/window.cpp
index a54fd3331d..e8015acc3b 100644
--- a/src/mac/window.cpp
+++ b/src/mac/window.cpp
@@ -17,7 +17,7 @@
 #include "wx/menu.h"
 #include "wx/dc.h"
 #include "wx/dcclient.h"
-#include "wx/utils.h"
+#include "wx/utils.h" 
 #include "wx/app.h"
 #include "wx/panel.h"
 #include "wx/layout.h"
@@ -27,10 +27,20 @@
 #include "wx/settings.h"
 #include "wx/msgdlg.h"
 #include "wx/frame.h"
+#include "wx/notebook.h"
+#include "wx/tabctrl.h"
+// TODO remove the line below, just for lookup-up convenience CS
+#include "wx/mac/window.h"
 
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
+#define wxWINDOW_HSCROLL 5998
+#define wxWINDOW_VSCROLL 5997
+#define MAC_SCROLLBAR_SIZE 16
+
+#include <wx/mac/uma.h>
+
 #if  wxUSE_DRAG_AND_DROP
 #include "wx/dnd.h"
 #endif
@@ -38,6 +48,7 @@
 #include <string.h>
 
 extern wxList wxPendingDelete;
+wxWindow* gFocusWindow = NULL ;
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
@@ -48,6 +59,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
   EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
   EVT_INIT_DIALOG(wxWindow::OnInitDialog)
   EVT_IDLE(wxWindow::OnIdle)
+  EVT_PAINT(wxWindow::OnPaint)
 END_EVENT_TABLE()
 
 #endif
@@ -56,37 +68,58 @@ END_EVENT_TABLE()
 // Constructor
 wxWindow::wxWindow()
 {
-    // Generic
-    m_windowId = 0;
-    m_windowStyle = 0;
-    m_windowParent = NULL;
-    m_windowEventHandler = this;
-    m_windowName = "";
-    m_windowCursor = *wxSTANDARD_CURSOR;
-    m_children = new wxList;
-    m_constraints = NULL;
-    m_constraintsInvolvedIn = NULL;
-    m_windowSizer = NULL;
-    m_sizerParent = NULL;
-    m_autoLayout = FALSE;
-    m_windowValidator = NULL;
-    m_defaultItem = NULL;
-    m_returnCode = 0;
-    m_caretWidth = 0; m_caretHeight = 0;
-    m_caretEnabled = FALSE;
-    m_caretShown = FALSE;
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
-    // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
-    m_foregroundColour = *wxBLACK;
+	Init() ;
+}
+
+void wxWindow::Init()
+{
+	m_macWindowData = NULL ;
+  m_isWindow = TRUE;
+	m_x = 0;
+	m_y = 0 ;	
+	m_width = 0 ;
+	m_height = 0 ;
+	// these are the defaults for MSW
+	m_macShown = true ;
+	m_macEnabled = true ;
+  // Generic
+  m_windowId = 0;
+  m_windowStyle = 0;
+  m_windowParent = NULL;
+  m_windowEventHandler = this;
+  m_windowName = "";
+  m_windowCursor = *wxSTANDARD_CURSOR;
+  m_children = new wxWindowList;
+  m_constraints = NULL;
+  m_constraintsInvolvedIn = NULL;
+  m_windowSizer = NULL;
+  m_sizerParent = NULL;
+  m_autoLayout = FALSE;
+  m_windowValidator = NULL;
+  m_defaultItem = NULL;
+  m_returnCode = 0;
+  m_caretWidth = 0; m_caretHeight = 0;
+  m_caretEnabled = FALSE;
+  m_caretShown = FALSE;
+  m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
+  // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
+  m_foregroundColour = *wxBLACK;
+	m_hScrollBar = NULL ;
+	m_vScrollBar = NULL ;
+  m_mouseInWindow = FALSE;
 
 #if  wxUSE_DRAG_AND_DROP
-    m_pDropTarget = NULL;
+  m_pDropTarget = NULL;
 #endif
 }
 
 // Destructor
 wxWindow::~wxWindow()
 {
+	if ( s_lastMouseWindow == this )
+	{
+		s_lastMouseWindow = NULL ;
+	}
 	// Have to delete constraints/sizer FIRST otherwise
 	// sizers may try to look at deleted windows as they
 	// delete themselves.
@@ -110,12 +143,24 @@ wxWindow::~wxWindow()
         m_sizerParent->RemoveChild((wxWindow *)this);
 #endif
 
+		if ( FindFocus() == this )
+		{
+			// really a bad thing - maybe an error ?
+			// we cannot even send it a kill focus message at this stage
+			gFocusWindow = NULL ;
+		}
+
     if (m_windowParent)
         m_windowParent->RemoveChild(this);
 
     DestroyChildren();
 
-    // TODO: destroy the window
+		if ( m_macWindowData )
+		{
+    	UMADisposeWindow( m_macWindowData->m_macWindow ) ;
+    	delete m_macWindowData ;
+    	wxRemoveMacWindowAssociation( this ) ;
+    }
 
     delete m_children;
     m_children = NULL;
@@ -143,7 +188,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
            long style,
            const wxString& name)
 {
-    // Generic
+   m_isWindow = TRUE;
+     // Generic
     m_windowId = 0;
     m_windowStyle = 0;
     m_windowParent = NULL;
@@ -182,7 +228,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     if ( id == -1 )
     	m_windowId = (int)NewControlId();
     else
-	m_windowId = id;
+			m_windowId = id;
 
     // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
     m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
@@ -193,31 +239,68 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     if ( id == -1 )
     	m_windowId = (int)NewControlId();
     else
-	m_windowId = id;
+			m_windowId = id;
 
-    // TODO: create the window
+  	m_x = (int)pos.x;
+  	m_y = (int)pos.y;
+		AdjustForParentClientOrigin(m_x, m_y, wxSIZE_USE_EXISTING);
+  	m_width = size.x;
+	  m_height = size.y;
+
+    MacCreateScrollBars( style ) ;
 
     return TRUE;
 }
 
 void wxWindow::SetFocus()
 {
-    // TODO
+	if ( AcceptsFocus() )
+	{
+		if (gFocusWindow )
+		{
+			wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
+			if ( control && control->GetMacControl() )
+			{
+				UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlFocusNoPart ) ;
+			}
+	    wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
+	    event.SetEventObject(gFocusWindow);
+			gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
+		}
+		gFocusWindow = this ;
+		{
+			wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
+			if ( control && control->GetMacControl() )
+			{
+				UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl()  , kControlEditTextPart ) ;
+			}
+
+	    wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
+	    event.SetEventObject(this);
+			GetEventHandler()->ProcessEvent(event) ;
+		}
+	}
 }
 
 void wxWindow::Enable(bool enable)
 {
-    // TODO
+	if ( m_macEnabled == enable )
+		return ;
+		
+  m_macEnabled = enable ;
+		
+	MacSuperEnabled( enable ) ;
+  return;
 }
 
 void wxWindow::CaptureMouse()
 {
-    // TODO
+    wxTheApp->s_captureWindow = this ;
 }
 
 void wxWindow::ReleaseMouse()
 {
-    // TODO
+    wxTheApp->s_captureWindow = NULL ;
 }
 
 // Push/pop event handler (i.e. allow a chain of event handlers
@@ -274,22 +357,85 @@ void wxWindow::DragAcceptFiles(bool accept)
 // Get total size
 void wxWindow::GetSize(int *x, int *y) const
 {
-    // TODO
+    *x = m_width ;
+    *y = m_height ;
 }
 
 void wxWindow::GetPosition(int *x, int *y) const
 {
-    // TODO
+    *x = m_x ;
+    *y = m_y ;
+    if (GetParent())
+    {
+        wxPoint pt(GetParent()->GetClientAreaOrigin());
+        *x -= pt.x;
+        *y -= pt.y;
+    }
 }
 
 void wxWindow::ScreenToClient(int *x, int *y) const
 {
-    // TODO
+	WindowRef window = GetMacRootWindow() ;
+
+	Point		localwhere ;
+	localwhere.h = * x ;
+	localwhere.v = * y ;
+
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( window ) ) ;
+	::GlobalToLocal( &localwhere ) ;
+	::SetPort( port ) ;
+
+	*x = localwhere.h ;
+	*y = localwhere.v ;
+	
+	MacRootWindowToClient( x , y ) ;
 }
 
 void wxWindow::ClientToScreen(int *x, int *y) const
 {
-    // TODO
+	WindowRef window = GetMacRootWindow() ;
+	
+	MacClientToRootWindow( x , y ) ;
+	
+	Point		localwhere ;
+	localwhere.h = * x ;
+	localwhere.v = * y ;
+	
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( window ) ) ;
+	::LocalToGlobal( &localwhere ) ;
+	::SetPort( port ) ;
+	*x = localwhere.h ;
+	*y = localwhere.v ;
+}
+
+void wxWindow::MacClientToRootWindow( int *x , int *y ) const
+{
+	if ( m_macWindowData )
+	{
+	}
+	else
+	{
+		*x += m_x ;
+		*y += m_y ;
+		GetParent()->MacClientToRootWindow( x , y ) ;
+	}
+}
+
+void wxWindow::MacRootWindowToClient( int *x , int *y ) const
+{
+	if ( m_macWindowData )
+	{
+	}
+	else
+	{
+		*x -= m_x ;
+		*y -= m_y ;
+		GetParent()->MacRootWindowToClient( x , y ) ;
+	}
 }
 
 void wxWindow::SetCursor(const wxCursor& cursor)
@@ -297,7 +443,9 @@ void wxWindow::SetCursor(const wxCursor& cursor)
   m_windowCursor = cursor;
   if (m_windowCursor.Ok())
   {
-    // TODO
+		// since this only affects the window-cursor, we adopt the same
+		// behaviour as windows -> it will only change on mouse moved events
+		// otherwise the ::WxSetCursor routine will have to be used
   }
 }
 
@@ -305,21 +453,132 @@ void wxWindow::SetCursor(const wxCursor& cursor)
 // Get size *available for subwindows* i.e. excluding menu bar etc.
 void wxWindow::GetClientSize(int *x, int *y) const
 {
-    // TODO
-}
+    *x = m_width ;
+    *y = m_height ;
+
+  if (m_vScrollBar && m_vScrollBar->IsShown() )
+  	(*x) -= MAC_SCROLLBAR_SIZE;
+  if (m_hScrollBar  && m_hScrollBar->IsShown() )
+  	(*y) -= MAC_SCROLLBAR_SIZE;
+}
+
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+	int former_x = m_x ;
+	int former_y = m_y ;
+	int former_w = m_width ;
+	int former_h = m_height ;
+	
+  int currentX, currentY;
+  GetPosition(&currentX, &currentY);
+  int currentW,currentH;
+  GetSize(&currentW, &currentH);
+
+  int actualWidth = width;
+  int actualHeight = height;
+  int actualX = x;
+  int actualY = y;
+  if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualX = currentX;
+  if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+      actualY = currentY;
+  if (width == -1)
+      actualWidth = currentW ;
+  if (height == -1)
+      actualHeight = currentH ;
+
+	if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH)
+	{
+		MacRepositionScrollBars() ; // we might have a real position shift
+		return ;
+	}
 
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
-{
-    // TODO
-}
+	AdjustForParentClientOrigin(actualX, actualY, sizeFlags);
+	
+	
+	bool doMove = false ;
+	bool doResize = false ;
+	
+	if ( actualX != former_x || actualY != former_y )
+	{
+		doMove = true ;
+	}
+	if ( actualWidth != former_w || actualHeight != former_h )
+	{
+		doResize = true ;
+	}
 
-void wxWindow::SetClientSize(int width, int height)
-{
-    // TODO
+	if ( doMove || doResize )
+	{
+		if ( m_macWindowData )
+		{
+		}
+		else
+		{
+			// erase former position
+			{
+				wxMacDrawingClientHelper focus( this ) ;
+				if ( focus.Ok() )
+				{
+			  	Rect clientrect = { 0 , 0 , m_height , m_width } ;
+			    InvalRect( &clientrect ) ;
+				}
+			}
+		}
+		m_x = actualX ;
+		m_y = actualY ;
+		m_width = actualWidth ;
+		m_height = actualHeight ;
+		if ( m_macWindowData )
+		{
+			if ( doMove )
+				::MoveWindow(m_macWindowData->m_macWindow, m_x, m_y, false); // don't make frontmost
+			
+			if ( doResize )
+				::SizeWindow(m_macWindowData->m_macWindow, m_width, m_height, true); 
+			
+			// the OS takes care of invalidating and erasing	
+			
+			if ( IsKindOf( CLASSINFO( wxFrame ) ) )
+			{
+				wxFrame* frame = (wxFrame*) this ;
+			  frame->PositionStatusBar();
+  			frame->PositionToolBar();
+			}
+		}
+		else
+		{
+			// erase new position
+			{
+				wxMacDrawingClientHelper focus( this ) ;
+				if ( focus.Ok() )
+				{
+			  	Rect clientrect = { 0 , 0 , m_height , m_width } ;
+			    InvalRect( &clientrect ) ;
+				}
+			}
+			if ( doMove )
+				wxWindow::MacSuperChangedPosition() ; // like this only children will be notified
+		}
+		MacRepositionScrollBars() ;
+		if ( doMove )
+		{
+    	wxMoveEvent event(wxPoint(m_x, m_y), m_windowId);
+    	event.SetEventObject(this);
+    	GetEventHandler()->ProcessEvent(event) ;
+    }
+    if ( doResize )
+    {
+			MacRepositionScrollBars() ;
+	    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+	    event.SetEventObject(this);
+	    GetEventHandler()->ProcessEvent(event);
+    }
+	}
 }
-
 // For implementation purposes - sometimes decorations make the client area
 // smaller
+
 wxPoint wxWindow::GetClientAreaOrigin() const
 {
     return wxPoint(0, 0);
@@ -329,35 +588,118 @@ wxPoint wxWindow::GetClientAreaOrigin() const
 // a toolbar that it manages itself).
 void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
 {
+	if( !m_macWindowData )
+	{
     if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
     {
         wxPoint pt(GetParent()->GetClientAreaOrigin());
         x += pt.x; y += pt.y;
     }
+   }
+}
+
+void wxWindow::SetTitle(const wxString& title)
+{
+	wxString label ;
+	
+	if( wxApp::s_macDefaultEncodingIsPC )
+		label = wxMacMakeMacStringFromPC( title ) ;
+	else
+		label = title ;
+
+	if ( m_macWindowData )
+    	UMASetWTitleC( m_macWindowData->m_macWindow , label ) ;
+}
+
+wxString wxWindow::GetTitle() const
+{
+	if ( m_macWindowData )
+	{
+    	char title[256] ;
+		wxString label ;
+    	UMAGetWTitleC( m_macWindowData->m_macWindow , title ) ;
+		if( wxApp::s_macDefaultEncodingIsPC )
+			label = wxMacMakePCStringFromMac( title ) ;
+		else
+			label = title ;
+    	return label;
+  	}
+  
+  return wxEmptyString ;
+}
+
+void wxWindow::Centre(int direction)
+{
+  int x_offset,y_offset ;
+  int display_width, display_height;
+  int  width, height, x, y;
+  wxWindow *parent = GetParent();
+  if ((direction & wxCENTER_FRAME) && parent)
+  {
+      parent->GetPosition(&x_offset,&y_offset) ;
+      parent->GetSize(&display_width,&display_height) ;
+  }
+  else
+  {
+    wxDisplaySize(&display_width, &display_height);
+    x_offset = 0 ;
+    y_offset = LMGetMBarHeight() + LMGetMBarHeight() / 2 ; // approx. the window title height
+  }
+
+  GetSize(&width, &height);
+  GetPosition(&x, &y);
+
+  if (direction & wxHORIZONTAL)
+    x = (int)((display_width - width)/2);
+  if (direction & wxVERTICAL)
+    y = (int)((display_height - height)/2);
+
+  SetSize(x+x_offset, y+y_offset, width, height);
 }
 
+
 bool wxWindow::Show(bool show)
 {
-    // TODO
-    return FALSE;
+	if ( m_macShown == show )
+		return TRUE ;
+		
+	m_macShown = show ;
+	if ( m_macWindowData )
+	{
+	  if (show)
+	  {
+	  	UMAShowWindow( m_macWindowData->m_macWindow ) ;
+	  	UMASelectWindow( m_macWindowData->m_macWindow ) ;
+			// no need to generate events here, they will get them triggered by macos
+	    wxSizeEvent event(wxSize(m_width, m_height), m_windowId);
+	    event.SetEventObject(this);
+	    GetEventHandler()->ProcessEvent(event);
+	  }
+	  else
+	  {
+	  	UMAHideWindow( m_macWindowData->m_macWindow ) ;
+	  }
+	}
+	Refresh() ;
+	MacSuperShown( show ) ;
+  return TRUE;
 }
 
 bool wxWindow::IsShown() const
 {
-    // TODO
-    return FALSE;
+    return m_macShown;
 }
 
 int wxWindow::GetCharHeight() const
 {
-    // TODO
-    return 0;
+	wxClientDC dc ( (wxWindow*)this ) ;
+	return dc.GetCharHeight() ;
 }
 
 int wxWindow::GetCharWidth() const
 {
-    // TODO
-    return 0;
+	wxClientDC dc ( (wxWindow*)this ) ;
+	return dc.GetCharWidth() ;
 }
 
 void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
@@ -370,9 +712,104 @@ void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
     // TODO
 }
 
+void wxWindow::MacEraseBackground( Rect *rect )
+{
+	WindowRef window = GetMacRootWindow() ;
+	if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
+	{
+			UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
+	}
+	else if (  m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+	{
+		// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
+		// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
+		// either a non gray background color or a non control window
+		
+			wxWindow* parent = GetParent() ;
+			while( parent )
+			{
+				if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+				{
+					// if we have any other colours in the hierarchy
+  				RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+  				break ;
+				}
+				if( parent->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)parent)->GetMacControl() )
+				{
+					// if we have the normal colours in the hierarchy but another control etc. -> use it's background
+					if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+					{
+						ApplyThemeBackground			(kThemeBackgroundTabPane, rect, kThemeStateActive,8,true);
+						break ;
+					}
+				}
+				else
+				{
+					// we have arrived at a non control item
+					parent = NULL ;
+					break ;
+				}
+				parent = parent->GetParent() ;
+			}
+			if ( !parent )
+			{
+				// if there is nothing special -> use default
+				UMASetThemeWindowBackground( window , kThemeBrushDialogBackgroundActive , false ) ;
+			}
+	}
+	else
+	{
+  		RGBBackColor( &m_backgroundColour.GetPixel()) ;
+	}
+
+	EraseRect( rect ) ;	
+	
+	for (wxNode *node = m_children->First(); node; node = node->Next())
+	{
+		wxWindow *child = (wxWindow*)node->Data();
+//			int width ;
+//			int height ;
+		
+//			child->GetClientSize( &width , &height ) ;
+		
+		Rect clientrect = { child->m_x , child->m_y , child->m_x +child->m_width , child->m_y + child->m_height } ;
+		SectRect( &clientrect , rect , &clientrect ) ;    	
+
+		OffsetRect( &clientrect , -child->m_x , -child->m_y ) ;
+		if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+		{
+			wxMacDrawingClientHelper focus( this ) ;
+			if ( focus.Ok() )
+			{
+				child->MacEraseBackground( &clientrect ) ;
+			}
+		}
+	}
+}
+
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
-    // TODO
+	wxMacDrawingClientHelper focus( this ) ;
+	if ( focus.Ok() )
+	{
+  	int width , height ;
+  	GetClientSize( &width , &height ) ;
+  	Rect clientrect = { 0 , 0 , height , width } ;
+  	ClipRect( &clientrect ) ;
+
+    if ( rect )
+    {
+    	Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+			SectRect( &clientrect , &r , &clientrect ) ;    	
+    }
+    InvalRect( &clientrect ) ;
+    /*
+    if ( eraseBack )
+    {
+    	MacEraseBackground( &clientrect ) ;
+   	}
+   	*/
+	}
 }
 
 // Responds to colour changes: passes event on to children.
@@ -451,7 +888,7 @@ void wxWindow::GetCaretPos(int *x, int *y) const
 
 wxWindow *wxGetActiveWindow()
 {
-    // TODO
+    // actually this is a windows-only concept
     return NULL;
 }
 
@@ -463,46 +900,31 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int WXUNUSED
   m_maxSizeY = maxH;
 }
 
-void wxWindow::Centre(int direction)
-{
-  int x, y, width, height, panel_width, panel_height, new_x, new_y;
-
-  wxWindow *father = (wxWindow *)GetParent();
-  if (!father)
-    return;
-
-  father->GetClientSize(&panel_width, &panel_height);
-  GetSize(&width, &height);
-  GetPosition(&x, &y);
-
-  new_x = -1;
-  new_y = -1;
-
-  if (direction & wxHORIZONTAL)
-    new_x = (int)((panel_width - width)/2);
-
-  if (direction & wxVERTICAL)
-    new_y = (int)((panel_height - height)/2);
-
-  SetSize(new_x, new_y, -1, -1);
-
-}
 
 // Coordinates relative to the window
 void wxWindow::WarpPointer (int x_pos, int y_pos)
 {
-    // TODO
+    // We really dont move the mouse programmatically under mac
 }
 
 void wxWindow::OnEraseBackground(wxEraseEvent& event)
 {
-    // TODO
+    // TODO : probably we would adopt the EraseEvent structure
     Default();
 }
 
 int wxWindow::GetScrollPos(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetThumbPosition() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetThumbPosition() ;
+		}
     return 0;
 }
 
@@ -510,34 +932,110 @@ int wxWindow::GetScrollPos(int orient) const
 // of positions that we can scroll.
 int wxWindow::GetScrollRange(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetRange() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetRange() ;
+		}
     return 0;
 }
 
 int wxWindow::GetScrollThumb(int orient) const
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				return m_hScrollBar->GetThumbSize() ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				return m_vScrollBar->GetThumbSize() ;
+		}
     return 0;
 }
 
 void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
 {
-    // TODO
-    return;
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+				m_hScrollBar->SetThumbPosition( pos ) ;
+		}
+		else
+		{
+			if ( m_vScrollBar )
+				m_vScrollBar->SetThumbPosition( pos ) ;
+		}
 }
 
 // New function that will replace some of the above.
 void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
     int range, bool refresh)
 {
-    // TODO
+		if ( orient == wxHORIZONTAL )
+		{
+			if ( m_hScrollBar )
+			{
+				if ( range == 0 || thumbVisible >= range )
+				{
+					if ( m_hScrollBar->IsShown() )
+						m_hScrollBar->Show(false) ;
+				}
+				else
+				{
+					if ( !m_hScrollBar->IsShown() )
+						m_hScrollBar->Show(true) ;
+					m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+				}
+			}
+		}
+		else
+		{
+			if ( m_vScrollBar )
+			{
+				if ( range == 0 || thumbVisible >= range )
+				{
+					if ( m_vScrollBar->IsShown() )
+						m_vScrollBar->Show(false) ;
+				}
+				else
+				{
+					if ( !m_vScrollBar->IsShown() )
+						m_vScrollBar->Show(true) ;
+					m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+				}
+			}
+		}
+		MacRepositionScrollBars() ;
 }
 
 // Does a physical scroll
 void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
-    // TODO
-    return;
+	wxMacDrawingClientHelper focus( this ) ;
+	if ( focus.Ok() )
+	{
+  	int width , height ;
+  	GetClientSize( &width , &height ) ;
+  	Rect scrollrect = { 0 , 0 , height , width } ;
+  	
+  	RgnHandle updateRgn = NewRgn() ;
+  	ClipRect( &scrollrect ) ;
+    if ( rect )
+    {
+    	Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+			SectRect( &scrollrect , &r , &scrollrect ) ;    	
+    }
+   	ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
+    InvalRgn( updateRgn ) ;
+    DisposeRgn( updateRgn ) ;
+	}
 }
 
 void wxWindow::SetFont(const wxFont& font)
@@ -563,13 +1061,31 @@ void wxWindow::OnChar(wxKeyEvent& event)
 
 void wxWindow::OnPaint(wxPaintEvent& event)
 {
-	Default();
+/*
+	if ( m_macWindowData )
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		long x ,y ,w ,h ;
+		GetUpdateRegion().GetBox( x , y , w , h ) ;
+		UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+		Rect r = { y , x, y+h , x+w } ;
+		EraseRect( &r ) ;
+	}
+	else
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		long x ,y ,w ,h ;
+		GetUpdateRegion().GetBox( x , y , w , h ) ;
+		RGBBackColor( &m_backgroundColour.GetPixel() ) ;
+		Rect r = { y , x, y+h , x+w } ;
+		EraseRect( &r ) ;
+	}
+*/
 }
 
 bool wxWindow::IsEnabled() const
 {
-    // TODO
-    return FALSE;
+	return m_macEnabled ;
 }
 
 // Dialog support: override these and call
@@ -636,8 +1152,16 @@ bool wxWindow::Validate()
 // Get the window with the focus
 wxWindow *wxWindow::FindFocus()
 {
-    // TODO
-    return NULL;
+	return gFocusWindow ;
+}
+
+// ----------------------------------------------------------------------------
+// RTTI
+// ----------------------------------------------------------------------------
+
+bool wxWindow::IsTopLevel() const
+{
+    return wxDynamicCast(this, wxFrame) || wxDynamicCast(this, wxDialog);
 }
 
 void wxWindow::AddChild(wxWindow *child)
@@ -659,7 +1183,7 @@ void wxWindow::DestroyChildren()
       wxWindow *child;
       if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) {
         delete child;
-		if ( GetChildren().Member(child) )
+		if ( GetChildren().Find(child) )
 			delete node;
       }
     } /* while */
@@ -693,419 +1217,384 @@ void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
     m_windowParent->GetEventHandler()->OnCommand(win, event);
 }
 
-void wxWindow::SetConstraints(wxLayoutConstraints *c)
+// ----------------------------------------------------------------------------
+// constraints and sizers
+// ----------------------------------------------------------------------------
+
+#if wxUSE_CONSTRAINTS
+
+void wxWindow::SetConstraints( wxLayoutConstraints *constraints )
 {
-  if (m_constraints)
-  {
-    UnsetConstraints(m_constraints);
-    delete m_constraints;
-  }
-  m_constraints = c;
-  if (m_constraints)
-  {
-    // Make sure other windows know they're part of a 'meaningful relationship'
-    if (m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this))
-      m_constraints->left.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this))
-      m_constraints->top.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this))
-      m_constraints->right.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this))
-      m_constraints->bottom.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this))
-      m_constraints->width.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this))
-      m_constraints->height.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this))
-      m_constraints->centreX.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-    if (m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this))
-      m_constraints->centreY.GetOtherWindow()->AddConstraintReference((wxWindow *)this);
-  }
+    if ( m_constraints )
+    {
+        UnsetConstraints(m_constraints);
+        delete m_constraints;
+    }
+    m_constraints = constraints;
+    if ( m_constraints )
+    {
+        // Make sure other windows know they're part of a 'meaningful relationship'
+        if ( m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this) )
+            m_constraints->left.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this) )
+            m_constraints->top.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this) )
+            m_constraints->right.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this) )
+            m_constraints->bottom.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this) )
+            m_constraints->width.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this) )
+            m_constraints->height.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this) )
+            m_constraints->centreX.GetOtherWindow()->AddConstraintReference(this);
+        if ( m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this) )
+            m_constraints->centreY.GetOtherWindow()->AddConstraintReference(this);
+    }
 }
 
-// This removes any dangling pointers to this window
-// in other windows' constraintsInvolvedIn lists.
+// This removes any dangling pointers to this window in other windows'
+// constraintsInvolvedIn lists.
 void wxWindow::UnsetConstraints(wxLayoutConstraints *c)
 {
-  if (c)
-  {
-    if (c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this))
-      c->left.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this))
-      c->top.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this))
-      c->right.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this))
-      c->bottom.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this))
-      c->width.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this))
-      c->height.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this))
-      c->centreX.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-    if (c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this))
-      c->centreY.GetOtherWindow()->RemoveConstraintReference((wxWindow *)this);
-  }
+    if ( c )
+    {
+        if ( c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
+            c->left.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
+            c->top.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this) )
+            c->right.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this) )
+            c->bottom.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this) )
+            c->width.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this) )
+            c->height.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this) )
+            c->centreX.GetOtherWindow()->RemoveConstraintReference(this);
+        if ( c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this) )
+            c->centreY.GetOtherWindow()->RemoveConstraintReference(this);
+    }
 }
 
-// Back-pointer to other windows we're involved with, so if we delete
-// this window, we must delete any constraints we're involved with.
+// Back-pointer to other windows we're involved with, so if we delete this
+// window, we must delete any constraints we're involved with.
 void wxWindow::AddConstraintReference(wxWindow *otherWin)
 {
-  if (!m_constraintsInvolvedIn)
-    m_constraintsInvolvedIn = new wxList;
-  if (!m_constraintsInvolvedIn->Member(otherWin))
-    m_constraintsInvolvedIn->Append(otherWin);
+    if ( !m_constraintsInvolvedIn )
+        m_constraintsInvolvedIn = new wxWindowList;
+    if ( !m_constraintsInvolvedIn->Find(otherWin) )
+        m_constraintsInvolvedIn->Append(otherWin);
 }
 
 // REMOVE back-pointer to other windows we're involved with.
 void wxWindow::RemoveConstraintReference(wxWindow *otherWin)
 {
-  if (m_constraintsInvolvedIn)
-    m_constraintsInvolvedIn->DeleteObject(otherWin);
+    if ( m_constraintsInvolvedIn )
+        m_constraintsInvolvedIn->DeleteObject(otherWin);
 }
 
 // Reset any constraints that mention this window
 void wxWindow::DeleteRelatedConstraints()
 {
-  if (m_constraintsInvolvedIn)
-  {
-    wxNode *node = m_constraintsInvolvedIn->First();
-    while (node)
+    if ( m_constraintsInvolvedIn )
     {
-      wxWindow *win = (wxWindow *)node->Data();
-      wxNode *next = node->Next();
-      wxLayoutConstraints *constr = win->GetConstraints();
-
-      // Reset any constraints involving this window
-      if (constr)
-      {
-        constr->left.ResetIfWin((wxWindow *)this);
-        constr->top.ResetIfWin((wxWindow *)this);
-        constr->right.ResetIfWin((wxWindow *)this);
-        constr->bottom.ResetIfWin((wxWindow *)this);
-        constr->width.ResetIfWin((wxWindow *)this);
-        constr->height.ResetIfWin((wxWindow *)this);
-        constr->centreX.ResetIfWin((wxWindow *)this);
-        constr->centreY.ResetIfWin((wxWindow *)this);
-      }
-      delete node;
-      node = next;
+        wxWindowList::Node *node = m_constraintsInvolvedIn->GetFirst();
+        while (node)
+        {
+            wxWindow *win = node->GetData();
+            wxLayoutConstraints *constr = win->GetConstraints();
+
+            // Reset any constraints involving this window
+            if ( constr )
+            {
+                constr->left.ResetIfWin(this);
+                constr->top.ResetIfWin(this);
+                constr->right.ResetIfWin(this);
+                constr->bottom.ResetIfWin(this);
+                constr->width.ResetIfWin(this);
+                constr->height.ResetIfWin(this);
+                constr->centreX.ResetIfWin(this);
+                constr->centreY.ResetIfWin(this);
+            }
+
+            wxWindowList::Node *next = node->GetNext();
+            delete node;
+            node = next;
+        }
+
+        delete m_constraintsInvolvedIn;
+        m_constraintsInvolvedIn = (wxWindowList *) NULL;
     }
-    delete m_constraintsInvolvedIn;
-    m_constraintsInvolvedIn = NULL;
-  }
 }
 
 void wxWindow::SetSizer(wxSizer *sizer)
 {
-  m_windowSizer = sizer;
-  if (sizer)
-    sizer->SetSizerParent((wxWindow *)this);
+    if (m_windowSizer) delete m_windowSizer;
+
+    m_windowSizer = sizer;
 }
 
-/*
- * New version
- */
-
 bool wxWindow::Layout()
 {
-  if (GetConstraints())
-  {
     int w, h;
     GetClientSize(&w, &h);
-    GetConstraints()->width.SetValue(w);
-    GetConstraints()->height.SetValue(h);
-  }
-  
-  // If top level (one sizer), evaluate the sizer's constraints.
-  if (GetSizer())
-  {
-    int noChanges;
-    GetSizer()->ResetConstraints();   // Mark all constraints as unevaluated
-    GetSizer()->LayoutPhase1(&noChanges);
-    GetSizer()->LayoutPhase2(&noChanges);
-    GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
-    return TRUE;
-  }
-  else
-  {
-    // Otherwise, evaluate child constraints
+    
+    // If there is a sizer, use it instead of the constraints
+    if ( GetSizer() )
+    {
+        GetSizer()->SetDimension( 0, 0, w, h );
+        return TRUE;
+    }
+    
+    if ( GetConstraints() )
+    {
+        GetConstraints()->width.SetValue(w);
+        GetConstraints()->height.SetValue(h);
+    }
+	
+    // Evaluate child constraints
     ResetConstraints();   // Mark all constraints as unevaluated
     DoPhase(1);           // Just one phase need if no sizers involved
     DoPhase(2);
     SetConstraintSizes(); // Recursively set the real window sizes
-  }
-  return TRUE;
+    
+    return TRUE;
 }
 
 
-// Do a phase of evaluating constraints:
-// the default behaviour. wxSizers may do a similar
-// thing, but also impose their own 'constraints'
-// and order the evaluation differently.
+// Do a phase of evaluating constraints: the default behaviour. wxSizers may
+// do a similar thing, but also impose their own 'constraints' and order the
+// evaluation differently.
 bool wxWindow::LayoutPhase1(int *noChanges)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    return constr->SatisfyConstraints((wxWindow *)this, noChanges);
-  }
-  else
-    return TRUE;
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        return constr->SatisfyConstraints(this, noChanges);
+    }
+    else
+        return TRUE;
 }
 
 bool wxWindow::LayoutPhase2(int *noChanges)
 {
-  *noChanges = 0;
-  
-  // Layout children
-  DoPhase(1);
-  DoPhase(2);
-  return TRUE;
+    *noChanges = 0;
+
+    // Layout children
+    DoPhase(1);
+    DoPhase(2);
+    return TRUE;
 }
 
 // Do a phase of evaluating child constraints
 bool wxWindow::DoPhase(int phase)
 {
-  int noIterations = 0;
-  int maxIterations = 500;
-  int noChanges = 1;
-  int noFailures = 0;
-  wxList succeeded;
-  while ((noChanges > 0) && (noIterations < maxIterations))
-  {
-    noChanges = 0;
-    noFailures = 0;
-    wxNode *node = GetChildren().First();
-    while (node)
+    int noIterations = 0;
+    int maxIterations = 500;
+    int noChanges = 1;
+    int noFailures = 0;
+    wxWindowList succeeded;
+    while ((noChanges > 0) && (noIterations < maxIterations))
     {
-      wxWindow *child = (wxWindow *)node->Data();
-      if (!child->IsKindOf(CLASSINFO(wxFrame)) && !child->IsKindOf(CLASSINFO(wxDialog)))
-      {
-        wxLayoutConstraints *constr = child->GetConstraints();
-        if (constr)
+        noChanges = 0;
+        noFailures = 0;
+        wxWindowList::Node *node = GetChildren().GetFirst();
+        while (node)
         {
-          if (succeeded.Member(child))
-          {
-          }
-          else
-          {
-            int tempNoChanges = 0;
-            bool success = ( (phase == 1) ? child->LayoutPhase1(&tempNoChanges) : child->LayoutPhase2(&tempNoChanges) ) ;
-            noChanges += tempNoChanges;
-            if (success)
+            wxWindow *child = node->GetData();
+            if ( !child->IsTopLevel() )
             {
-              succeeded.Append(child);
+                wxLayoutConstraints *constr = child->GetConstraints();
+                if ( constr )
+                {
+                    if ( !succeeded.Find(child) )
+                    {
+                        int tempNoChanges = 0;
+                        bool success = ( (phase == 1) ? child->LayoutPhase1(&tempNoChanges) : child->LayoutPhase2(&tempNoChanges) ) ;
+                        noChanges += tempNoChanges;
+                        if ( success )
+                        {
+                            succeeded.Append(child);
+                        }
+                    }
+                }
             }
-          }
+            node = node->GetNext();
         }
-      }
-      node = node->Next();
+
+        noIterations++;
     }
-    noIterations ++;
-  }
-  return TRUE;
+
+    return TRUE;
 }
 
 void wxWindow::ResetConstraints()
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    constr->left.SetDone(FALSE);
-    constr->top.SetDone(FALSE);
-    constr->right.SetDone(FALSE);
-    constr->bottom.SetDone(FALSE);
-    constr->width.SetDone(FALSE);
-    constr->height.SetDone(FALSE);
-    constr->centreX.SetDone(FALSE);
-    constr->centreY.SetDone(FALSE);
-  }
-  wxNode *node = GetChildren().First();
-  while (node)
-  {
-    wxWindow *win = (wxWindow *)node->Data();
-    if (!win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)))
-      win->ResetConstraints();
-    node = node->Next();
-  }
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        constr->left.SetDone(FALSE);
+        constr->top.SetDone(FALSE);
+        constr->right.SetDone(FALSE);
+        constr->bottom.SetDone(FALSE);
+        constr->width.SetDone(FALSE);
+        constr->height.SetDone(FALSE);
+        constr->centreX.SetDone(FALSE);
+        constr->centreY.SetDone(FALSE);
+    }
+    wxWindowList::Node *node = GetChildren().GetFirst();
+    while (node)
+    {
+        wxWindow *win = node->GetData();
+        if ( !win->IsTopLevel() )
+            win->ResetConstraints();
+        node = node->GetNext();
+    }
 }
 
-// Need to distinguish between setting the 'fake' size for
-// windows and sizers, and setting the real values.
+// Need to distinguish between setting the 'fake' size for windows and sizers,
+// and setting the real values.
 void wxWindow::SetConstraintSizes(bool recurse)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr && constr->left.GetDone() && constr->right.GetDone() &&
-                constr->width.GetDone() && constr->height.GetDone())
-  {
-    int x = constr->left.GetValue();
-    int y = constr->top.GetValue();
-    int w = constr->width.GetValue();
-    int h = constr->height.GetValue();
-
-    // If we don't want to resize this window, just move it...
-    if ((constr->width.GetRelationship() != wxAsIs) ||
-        (constr->height.GetRelationship() != wxAsIs))
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr && constr->left.GetDone() && constr->right.GetDone( ) &&
+            constr->width.GetDone() && constr->height.GetDone())
     {
-      // Calls Layout() recursively. AAAGH. How can we stop that.
-      // Simply take Layout() out of non-top level OnSizes.
-      SizerSetSize(x, y, w, h);
+        int x = constr->left.GetValue();
+        int y = constr->top.GetValue();
+        int w = constr->width.GetValue();
+        int h = constr->height.GetValue();
+
+        if ( (constr->width.GetRelationship() != wxAsIs ) ||
+             (constr->height.GetRelationship() != wxAsIs) )
+        {
+            SetSize(x, y, w, h);
+        }
+        else
+        {
+            // If we don't want to resize this window, just move it...
+            Move(x, y);
+        }
     }
-    else
+    else if ( constr )
     {
-      SizerMove(x, y);
+        char *windowClass = GetClassInfo()->GetClassName();
+
+        wxString winName;
+        if ( GetName() == _T("") )
+            winName = _T("unnamed");
+        else
+            winName = GetName();
+        wxLogDebug( _T("Constraint(s) not satisfied for window of type %s, name %s:\n"),
+                (const char *)windowClass,
+                (const char *)winName);
+        if ( !constr->left.GetDone()) wxLogDebug( _T("  unsatisfied 'left' constraint.\n")  );
+        if ( !constr->right.GetDone()) wxLogDebug( _T("  unsatisfied 'right' constraint.\n")  );
+        if ( !constr->width.GetDone()) wxLogDebug( _T("  unsatisfied 'width' constraint.\n")  );
+        if ( !constr->height.GetDone())  wxLogDebug( _T("  unsatisfied 'height' constraint.\n")  );
+        wxLogDebug( _T("Please check constraints: try adding AsIs() constraints.\n") );
     }
-  }
-  else if (constr)
-  {
-    char *windowClass = this->GetClassInfo()->GetClassName();
 
-    wxString winName;
-	if (GetName() == "")
-		winName = "unnamed";
-	else
-		winName = GetName();
-    wxDebugMsg("Constraint(s) not satisfied for window of type %s, name %s:\n", (const char *)windowClass, (const char *)winName);
-    if (!constr->left.GetDone())
-      wxDebugMsg("  unsatisfied 'left' constraint.\n");
-    if (!constr->right.GetDone())
-      wxDebugMsg("  unsatisfied 'right' constraint.\n");
-    if (!constr->width.GetDone())
-      wxDebugMsg("  unsatisfied 'width' constraint.\n");
-    if (!constr->height.GetDone())
-      wxDebugMsg("  unsatisfied 'height' constraint.\n");
-    wxDebugMsg("Please check constraints: try adding AsIs() constraints.\n");
-  }
-
-  if (recurse)
-  {
-    wxNode *node = GetChildren().First();
-    while (node)
+    if ( recurse )
     {
-      wxWindow *win = (wxWindow *)node->Data();
-      if (!win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)))
-        win->SetConstraintSizes();
-      node = node->Next();
+        wxWindowList::Node *node = GetChildren().GetFirst();
+        while (node)
+        {
+            wxWindow *win = node->GetData();
+            if ( !win->IsTopLevel() )
+                win->SetConstraintSizes();
+            node = node->GetNext();
+        }
     }
-  }
-}
-
-// This assumes that all sizers are 'on' the same
-// window, i.e. the parent of this window.
-void wxWindow::TransformSizerToActual(int *x, int *y) const
-{
-  if (!m_sizerParent || m_sizerParent->IsKindOf(CLASSINFO(wxDialog)) ||
-  			 m_sizerParent->IsKindOf(CLASSINFO(wxFrame)) )
-    return;
-    
-  int xp, yp;
-  m_sizerParent->GetPosition(&xp, &yp);
-  m_sizerParent->TransformSizerToActual(&xp, &yp);
-  *x += xp;
-  *y += yp;
-}
-
-void wxWindow::SizerSetSize(int x, int y, int w, int h)
-{
-	int xx = x;
-	int yy = y;
-  TransformSizerToActual(&xx, &yy);
-  SetSize(xx, yy, w, h);
-}
-
-void wxWindow::SizerMove(int x, int y)
-{
-	int xx = x;
-	int yy = y;
-  TransformSizerToActual(&xx, &yy);
-  Move(xx, yy);
 }
 
 // Only set the size/position of the constraint (if any)
 void wxWindow::SetSizeConstraint(int x, int y, int w, int h)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    if (x != -1)
-    {
-      constr->left.SetValue(x);
-      constr->left.SetDone(TRUE);
-    }
-    if (y != -1)
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
     {
-      constr->top.SetValue(y);
-      constr->top.SetDone(TRUE);
-    }
-    if (w != -1)
-    {
-      constr->width.SetValue(w);
-      constr->width.SetDone(TRUE);
-    }
-    if (h != -1)
-    {
-      constr->height.SetValue(h);
-      constr->height.SetDone(TRUE);
+        if ( x != -1 )
+        {
+            constr->left.SetValue(x);
+            constr->left.SetDone(TRUE);
+        }
+        if ( y != -1 )
+        {
+            constr->top.SetValue(y);
+            constr->top.SetDone(TRUE);
+        }
+        if ( w != -1 )
+        {
+            constr->width.SetValue(w);
+            constr->width.SetDone(TRUE);
+        }
+        if ( h != -1 )
+        {
+            constr->height.SetValue(h);
+            constr->height.SetDone(TRUE);
+        }
     }
-  }
 }
 
 void wxWindow::MoveConstraint(int x, int y)
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    if (x != -1)
-    {
-      constr->left.SetValue(x);
-      constr->left.SetDone(TRUE);
-    }
-    if (y != -1)
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
     {
-      constr->top.SetValue(y);
-      constr->top.SetDone(TRUE);
+        if ( x != -1 )
+        {
+            constr->left.SetValue(x);
+            constr->left.SetDone(TRUE);
+        }
+        if ( y != -1 )
+        {
+            constr->top.SetValue(y);
+            constr->top.SetDone(TRUE);
+        }
     }
-  }
 }
 
 void wxWindow::GetSizeConstraint(int *w, int *h) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *w = constr->width.GetValue();
-    *h = constr->height.GetValue();
-  }
-  else
-    GetSize(w, h);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *w = constr->width.GetValue();
+        *h = constr->height.GetValue();
+    }
+    else
+        GetSize(w, h);
 }
 
 void wxWindow::GetClientSizeConstraint(int *w, int *h) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *w = constr->width.GetValue();
-    *h = constr->height.GetValue();
-  }
-  else
-    GetClientSize(w, h);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *w = constr->width.GetValue();
+        *h = constr->height.GetValue();
+    }
+    else
+        GetClientSize(w, h);
 }
 
 void wxWindow::GetPositionConstraint(int *x, int *y) const
 {
-  wxLayoutConstraints *constr = GetConstraints();
-  if (constr)
-  {
-    *x = constr->left.GetValue();
-    *y = constr->top.GetValue();
-  }
-  else
-    GetPosition(x, y);
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *x = constr->left.GetValue();
+        *y = constr->top.GetValue();
+    }
+    else
+        GetPosition(x, y);
 }
 
+#endif // wxUSE_CONSTRAINTS
+
 bool wxWindow::Close(bool force)
 {
   wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId);
@@ -1141,10 +1630,23 @@ void wxWindow::OnDefaultAction(wxControl *initiatingItem)
 
 void wxWindow::Clear()
 {
-	wxClientDC dc(this);
+	if ( m_macWindowData )
+	{
+		wxMacDrawingClientHelper helper ( this ) ;
+		int w ,h ;
+		wxPoint origin = GetClientAreaOrigin() ;
+		GetClientSize( &w , &h ) ;
+		UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+		Rect r = { origin.y , origin.x, origin.y+h , origin.x+w } ;
+		EraseRect( &r ) ;
+	}
+	else
+	{
+		wxClientDC dc(this);
     wxBrush brush(GetBackgroundColour(), wxSOLID);
     dc.SetBackground(brush);
     dc.Clear();
+	}
 }
 
 // Fits the panel around the items
@@ -1221,20 +1723,18 @@ wxWindow *wxWindow::FindWindow(const wxString& name)
 
 void wxWindow::OnIdle(wxIdleEvent& event)
 {
-/* TODO: you may need to do something like this
- * if your GUI doesn't generate enter/leave events
-
-    // Check if we need to send a LEAVE event
-    if (m_mouseInWindow)
-    {
-        POINT pt;
-        ::GetCursorPos(&pt);
-        if (::WindowFromPoint(pt) != (HWND) GetHWND())
-        {
-            // Generate a LEAVE event
-            m_mouseInWindow = FALSE;
-            MSWOnMouseLeave(pt.x, pt.y, 0);
-        }
+/*
+   // Check if we need to send a LEAVE event
+   if (m_mouseInWindow)
+   {
+       POINT pt;
+       ::GetCursorPos(&pt);
+       if (::WindowFromPoint(pt) != (HWND) GetHWND())
+       {
+           // Generate a LEAVE event
+           m_mouseInWindow = FALSE;
+           MSWOnMouseLeave(pt.x, pt.y, 0);
+       }
     }
 */
 
@@ -1257,7 +1757,7 @@ void wxWindow::Lower()
 
 bool wxWindow::AcceptsFocus() const
 {
-  return IsShown() && IsEnabled();
+  return IsShown() && IsEnabled() && MacCanFocus() ;
 }
 
 // Update region access
@@ -1292,4 +1792,818 @@ int wxWindow::NewControlId()
     return s_controlId;
 }
 
+void wxWindow::DoSetClientSize(int width, int height)
+{
+	if ( width != -1 || height != -1 )
+	{
+		
+		if ( width != -1 && m_vScrollBar )
+			width += MAC_SCROLLBAR_SIZE ;
+		if ( height != -1 && m_vScrollBar )
+			height += MAC_SCROLLBAR_SIZE ;
+
+		DoSetSize( -1 , -1 , width , height ) ;
+	}
+}
+
+// ------------------------
+wxList *wxWinMacWindowList = NULL;
+wxWindow *wxFindWinFromMacWindow(WindowRef inWindowRef)
+{
+    wxNode *node = wxWinMacWindowList->Find((long)inWindowRef);
+    if (!node)
+        return NULL;
+    return (wxWindow *)node->Data();
+}
+
+void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxWindow *win)
+{
+    // adding NULL WindowRef is (first) surely a result of an error and
+    // (secondly) breaks menu command processing
+    wxCHECK_RET( inWindowRef != (WindowRef) NULL, "attempt to add a NULL WindowRef to window list" );
+
+    if ( !wxWinMacWindowList->Find((long)inWindowRef) )
+        wxWinMacWindowList->Append((long)inWindowRef, win);
+}
+
+void wxRemoveMacWindowAssociation(wxWindow *win)
+{
+    wxWinMacWindowList->DeleteObject(win);
+}
+
+wxWindow* wxWindow::s_lastMouseWindow = NULL ;
+
+bool wxWindow::MacGetWindowFromPointSub( const wxPoint &point , wxWindow** outWin ) 
+{
+	if ((point.x < m_x) || (point.y < m_y) ||
+		(point.x > (m_x + m_width)) || (point.y > (m_y + m_height)))
+		return FALSE;
+	
+	WindowRef window = GetMacRootWindow() ;
+
+	wxPoint newPoint( point ) ;
+
+	newPoint.x -= m_x;
+	newPoint.y -= m_y;
+	
+	if ( m_children )
+	{
+		for (wxNode *node = m_children->First(); node; node = node->Next())
+		{
+			wxWindow *child = (wxWindow*)node->Data();
+			if ( child->GetMacRootWindow() == window )
+			{
+				if (child->MacGetWindowFromPointSub(newPoint , outWin ))
+					return TRUE;
+			}
+		}
+	}
+
+	*outWin = this ;
+	return TRUE;
+}
+
+bool wxWindow::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindow** outWin ) 
+{
+	WindowRef window ;
+	Point pt = { screenpoint.y , screenpoint.x } ;
+	if ( ::FindWindow( pt , &window ) == 3 )
+	{
+			wxPoint point( screenpoint ) ;
+			wxWindow* win = wxFindWinFromMacWindow( window ) ;
+			win->ScreenToClient( point ) ;
+			return win->MacGetWindowFromPointSub( point , outWin ) ;
+	}
+	return FALSE ;
+}
+
+extern int wxBusyCursorCount ;
+
+bool wxWindow::MacDispatchMouseEvent(wxMouseEvent& event)
+{
+	if ((event.m_x < m_x) || (event.m_y < m_y) ||
+		(event.m_x > (m_x + m_width)) || (event.m_y > (m_y + m_height)))
+		return FALSE;
+	
+	if ( IsKindOf( CLASSINFO ( wxStaticBox ) ) )
+		return FALSE ; 
+	
+	WindowRef window = GetMacRootWindow() ;
+
+	event.m_x -= m_x;
+	event.m_y -= m_y;
+	
+	int x = event.m_x ;
+	int y = event.m_y ;
+
+	if ( m_children )
+	{
+		for (wxNode *node = m_children->First(); node; node = node->Next())
+		{
+			wxWindow *child = (wxWindow*)node->Data();
+			if ( child->GetMacRootWindow() == window && child->IsReallyShown() && child->IsReallyEnabled() )
+			{
+				if (child->MacDispatchMouseEvent(event))
+					return TRUE;
+			}
+		}
+	}
+
+	event.m_x = x ;
+	event.m_y = y ;
+	
+	if ( wxBusyCursorCount == 0 )
+	{
+		m_windowCursor.MacInstall() ;
+	}
+	GetEventHandler()->ProcessEvent( event ) ;
+	return TRUE;
+}
+
+void wxWindow::MacFireMouseEvent( EventRecord *ev )
+{
+	wxMouseEvent event(wxEVT_LEFT_DOWN);
+	bool isDown = !(ev->modifiers & btnState) ; // 1 is for up
+	bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse
+	
+	event.m_leftDown = isDown && !controlDown;
+	event.m_middleDown = FALSE;
+	event.m_rightDown = isDown && controlDown;
+
+	if ( ev->what == mouseDown )
+	{
+		if ( controlDown )
+			event.SetEventType(wxEVT_RIGHT_DOWN ) ;
+		else
+			event.SetEventType(wxEVT_LEFT_DOWN ) ;
+	}
+	else if ( ev->what == mouseUp )
+	{
+		if ( controlDown )
+			event.SetEventType(wxEVT_RIGHT_UP ) ;
+		else
+			event.SetEventType(wxEVT_LEFT_UP ) ;
+	}
+	else
+	{
+		event.SetEventType(wxEVT_MOTION ) ;
+	}
+
+	event.m_shiftDown = ev->modifiers & shiftKey;
+	event.m_controlDown = ev->modifiers & controlKey;
+	event.m_altDown = ev->modifiers & optionKey;
+	event.m_metaDown = ev->modifiers & cmdKey;
+
+	Point		localwhere = ev->where ;
+		
+	GrafPtr		port ;	
+	::GetPort( &port ) ;
+	::SetPort( UMAGetWindowPort( m_macWindowData->m_macWindow ) ) ;
+	::GlobalToLocal( &localwhere ) ;
+	::SetPort( port ) ;
+
+	event.m_x = localwhere.h;
+	event.m_y = localwhere.v;
+	event.m_x += m_x;
+	event.m_y += m_y;
+
+/*
+	wxPoint origin = GetClientAreaOrigin() ;
+
+	event.m_x += origin.x ;
+	event.m_y += origin.y ;
+*/
+	
+	event.m_timeStamp = ev->when;
+	event.SetEventObject(this);
+	if ( wxTheApp->s_captureWindow )
+	{
+		int x = event.m_x ;
+		int y = event.m_y ;
+		wxTheApp->s_captureWindow->ScreenToClient( &x , &y ) ;
+		event.m_x = x ;
+		event.m_y = y ;
+		wxTheApp->s_captureWindow->GetEventHandler()->ProcessEvent( event ) ;
+		if ( ev->what == mouseUp )
+		{
+			wxTheApp->s_captureWindow = NULL ;
+			if ( wxBusyCursorCount == 0 )
+			{
+				m_windowCursor.MacInstall() ;
+			}
+		}
+	}
+	else
+	{
+		MacDispatchMouseEvent( event ) ;
+	}
+}
+
+void wxWindow::MacMouseDown( EventRecord *ev , short part)
+{
+	MacFireMouseEvent( ev ) ;
+}
+
+void wxWindow::MacMouseUp( EventRecord *ev , short part)
+{
+	WindowPtr frontWindow ;
+	switch (part)
+	{
+		case inContent:		
+			{
+				MacFireMouseEvent( ev ) ;
+			}
+			break ;
+	}
+}
+
+void wxWindow::MacMouseMoved( EventRecord *ev , short part)
+{
+	WindowPtr frontWindow ;
+	switch (part)
+	{
+		case inContent:		
+			{
+				MacFireMouseEvent( ev ) ;
+			}
+			break ;
+	}
+}
+void wxWindow::MacActivate( EventRecord *ev , bool inIsActivating )
+{
+	wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating);
+	event.m_timeStamp = ev->when ;
+	event.SetEventObject(this);
+	
+	GetEventHandler()->ProcessEvent(event);
+	
+	UMAHighlightAndActivateWindow( m_macWindowData->m_macWindow , inIsActivating ) ;
+}
+
+void wxWindow::MacRedraw( RgnHandle updatergn , long time)
+{
+	// updatergn is always already clipped to our boundaries
+	WindowRef window = GetMacRootWindow() ;
+	wxWindow* win = wxFindWinFromMacWindow( window ) ;
+	{
+		wxMacDrawingClientHelper focus( this ) ;
+		if ( focus.Ok() )
+		{
+			WindowRef window = GetMacRootWindow() ;
+			if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
+			{
+					UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
+			}
+			else if (  m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+			{
+					// on mac we have the difficult situation, that 3dface gray can be different colours, depending whether
+					// it is on a notebook panel or not, in order to take care of that we walk up the hierarchy until we have
+					// either a non gray background color or a non control window
+		
+
+					wxWindow* parent = GetParent() ;
+					while( parent )
+					{
+						if ( parent->GetMacRootWindow() != window )
+						{
+							// we are in a different window on the mac system
+							parent = NULL ;
+							break ;
+						}
+						
+						if( parent->IsKindOf( CLASSINFO( wxControl ) ) && ((wxControl*)parent)->GetMacControl() )
+						{
+							if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
+							{
+								// if we have any other colours in the hierarchy
+			  				RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+			  				break ;
+							}
+							// if we have the normal colours in the hierarchy but another control etc. -> use it's background
+							if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
+							{
+								ApplyThemeBackground			(kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
+								break ;
+							}
+						}
+						else
+						{
+							parent = NULL ;
+							break ;
+						}
+						parent = parent->GetParent() ;
+					}
+					if ( !parent )
+					{
+						// if there is nothing special -> use default
+						UMASetThemeWindowBackground( window , kThemeBrushDialogBackgroundActive , false ) ;
+					}
+			}
+			else
+			{
+		  		RGBBackColor( &m_backgroundColour.GetPixel()) ;
+			}
+			SetClip( updatergn ) ;
+			EraseRgn( updatergn ) ;	
+		}
+	}
+
+	
+	m_updateRegion = updatergn ;
+	wxPaintEvent event;
+	event.m_timeStamp = time ;
+	event.SetEventObject(this);
+	
+	GetEventHandler()->ProcessEvent(event);
+	
+	RgnHandle childupdate = NewRgn() ;
+
+	for (wxNode *node = m_children->First(); node; node = node->Next())
+	{
+		wxWindow *child = (wxWindow*)node->Data();
+		int width ;
+		int height ;
+		
+		child->GetClientSize( &width , &height ) ;
+		
+		SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x +width ,  child->m_y + height ) ;
+		SectRgn( childupdate , m_updateRegion.GetWXHRGN() , childupdate ) ;
+		OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
+		if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+		{
+			// because dialogs may also be children
+			child->MacRedraw( childupdate , time ) ;
+		}
+	}
+	DisposeRgn( childupdate ) ;
+	// eventually a draw grow box here
+}
+
+void wxWindow::MacUpdateImmediately()
+{
+	WindowRef window = GetMacRootWindow() ;
+	if ( window )
+	{
+		wxWindow* win = wxFindWinFromMacWindow( window ) ;
+		BeginUpdate( window ) ;
+		if ( win )
+		{
+		#if ! TARGET_CARBON
+			if ( !EmptyRgn( window->visRgn ) )
+		#endif
+			{
+				win->MacRedraw( window->visRgn , wxTheApp->sm_lastMessageTime ) ;
+/*
+				{
+					wxMacDrawingHelper help( win ) ;
+					SetOrigin( 0 , 0 ) ;
+					UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+					UMAUpdateControls( window , window->visRgn ) ;
+					UMASetThemeWindowBackground( win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+				}
+*/
+			}
+		}
+		EndUpdate( window ) ;
+	}
+}
+
+void wxWindow::MacUpdate( EventRecord *ev )
+{
+	WindowRef window = (WindowRef) ev->message ;
+	wxWindow * win = wxFindWinFromMacWindow( window ) ;
+	
+	BeginUpdate( window ) ;
+	if ( win )
+	{
+		// if windowshade gives incompatibility , take the follwing out
+		#if ! TARGET_CARBON
+		if ( !EmptyRgn( window->visRgn ) )
+		#endif
+		{
+			MacRedraw( window->visRgn , ev->when ) ;
+			/*
+			{
+				wxMacDrawingHelper help( this ) ;
+				SetOrigin( 0 , 0 ) ;
+				UMASetThemeWindowBackground( m_macWindowData->m_macWindow , kThemeBrushDialogBackgroundActive , false ) ;
+				UMAUpdateControls( window , window->visRgn ) ;
+				UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
+			}
+			*/
+		}
+	}
+	EndUpdate( window ) ;
+}
+
+WindowRef wxWindow::GetMacRootWindow() const
+{
+	WindowRef window = NULL ;
+	wxWindow *iter = (wxWindow*)this ;
+	
+	while( iter )
+	{
+		if ( iter->m_macWindowData )
+			return iter->m_macWindowData->m_macWindow ;
+
+		iter = iter->GetParent() ;
+	} 
+	wxASSERT_MSG( 1 , "No valid mac root window" ) ;
+	return NULL ;
+}
+
+void wxWindow::MacCreateScrollBars( long style ) 
+{
+	wxASSERT_MSG( m_vScrollBar == NULL && m_hScrollBar == NULL , "attempt to create window twice" ) ;
+	bool hasBoth = ( style & wxVSCROLL ) && ( style & wxHSCROLL ) ;
+	int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1: 0 ;
+	
+	if ( style & wxVSCROLL )
+	{
+		m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, wxPoint(m_width-MAC_SCROLLBAR_SIZE, 0), 
+			wxSize(MAC_SCROLLBAR_SIZE, m_height - adjust), wxVERTICAL);
+	}
+	if ( style  & wxHSCROLL )
+	{
+		m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, wxPoint(0 , m_height-MAC_SCROLLBAR_SIZE ), 
+			wxSize( m_width - adjust, MAC_SCROLLBAR_SIZE), wxHORIZONTAL);
+	}
+	// because the create does not take into account the client area origin
+	MacRepositionScrollBars() ; // we might have a real position shift
+}
+
+void wxWindow::MacRepositionScrollBars()
+{
+	bool hasBoth = ( m_hScrollBar && m_hScrollBar->IsShown()) && ( m_vScrollBar && m_vScrollBar->IsShown()) ;
+	int adjust = hasBoth ? MAC_SCROLLBAR_SIZE - 1 : 0 ;
+	
+	if ( m_vScrollBar )
+	{
+		m_vScrollBar->SetSize( m_width-MAC_SCROLLBAR_SIZE, 0, MAC_SCROLLBAR_SIZE, m_height - adjust , wxSIZE_USE_EXISTING);
+	}
+	if ( m_hScrollBar )
+	{
+		m_hScrollBar->SetSize( 0 , m_height-MAC_SCROLLBAR_SIZE ,m_width - adjust, MAC_SCROLLBAR_SIZE, wxSIZE_USE_EXISTING);
+	}
+}
+
+void wxWindow::MacKeyDown( EventRecord *ev ) 
+{
+}
+
+
+
+
+ControlHandle wxWindow::MacGetContainerForEmbedding() 
+{
+	if ( m_macWindowData )
+		return m_macWindowData->m_macRootControl ;
+	else
+		return GetParent()->MacGetContainerForEmbedding() ;
+}
+
+void wxWindow::MacSuperChangedPosition() 
+{
+	// only window-absolute structures have to be moved i.e. controls
+
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		child->MacSuperChangedPosition() ;
+		node = node->Next();
+	}
+}
+
+bool wxWindow::IsReallyShown() const
+{
+	if ( m_macWindowData )
+		return m_macShown ;
+	else
+		return m_macShown && GetParent()->IsReallyShown() ;
+}
+
+bool wxWindow::IsReallyEnabled() const
+{
+	if ( m_macWindowData )
+		return m_macEnabled ;
+	else
+		return m_macEnabled && GetParent()->IsReallyEnabled() ;
+}
+
+void wxWindow::MacSuperEnabled( bool enabled ) 
+{
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		if ( child->m_macEnabled )
+			child->MacSuperEnabled( enabled ) ;
+		node = node->Next();
+	}
+}
+void wxWindow::MacSuperShown( bool show ) 
+{
+	wxNode *node = GetChildren().First();
+	while ( node )
+	{
+		wxWindow *child = (wxWindow *)node->Data();
+		if ( child->m_macShown )
+			child->MacSuperShown( show ) ;
+		node = node->Next();
+	}
+}
+	
+bool wxWindow::MacSetupFocusPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupFocusClientPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupDrawingPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+bool wxWindow::MacSetupDrawingClientPort(  ) 
+{
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	GrafPtr port ;
+	
+	MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+	return 	MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+}
+
+
+bool wxWindow::MacSetPortFocusParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win ) 
+{
+	if ( window == NULL )
+		return false ;
+		
+	GrafPtr currPort;
+	GrafPtr port ;
+
+	::GetPort(&currPort);
+	port = UMAGetWindowPort( window) ;
+	if (currPort != port )
+			::SetPort(port);
+				
+	::SetOrigin(-localOrigin.h, -localOrigin.v);
+	return true;			
+}
+
+bool wxWindow::MacSetPortDrawingParams( const Point & localOrigin, const Rect & clipRect, WindowRef window , wxWindow* win ) 
+{
+	if ( window == NULL )
+		return false ;
+		
+	GrafPtr currPort;
+	GrafPtr port ;
+	::GetPort(&currPort);
+	port = UMAGetWindowPort( window) ;
+	if (currPort != port )
+			::SetPort(port);
+				
+	::SetOrigin(-localOrigin.h, -localOrigin.v);
+	::ClipRect(&clipRect);
+
+	::PenNormal() ;
+	::RGBBackColor(& win->GetBackgroundColour().GetPixel() ) ;
+	::RGBForeColor(& win->GetForegroundColour().GetPixel() ) ;
+	::BackPat( &qd.white ) ;
+	::UMASetThemeWindowBackground(  win->m_macWindowData->m_macWindow , win->m_macWindowData->m_macWindowBackgroundTheme ,  false ) ;
+	return true;			
+}
+
+void wxWindow::MacGetPortParams(Point* localOrigin, Rect* clipRect, WindowRef *window  , wxWindow** rootwin) 
+{
+	if ( m_macWindowData )
+	{
+		localOrigin->h = 0;
+		localOrigin->v = 0;
+		clipRect->left = 0;
+		clipRect->top = 0;
+		clipRect->right = m_width;
+		clipRect->bottom = m_height;
+		*window = m_macWindowData->m_macWindow ;
+		*rootwin = this ;
+	}
+	else
+	{
+		wxASSERT( GetParent() != NULL ) ;
+		GetParent()->MacGetPortParams( localOrigin , clipRect , window, rootwin) ;
+		localOrigin->h += m_x;
+		localOrigin->v += m_y;
+		OffsetRect(clipRect, -m_x, -m_y);
+	
+		Rect myClip;
+		myClip.left = 0;
+		myClip.top = 0;
+		myClip.right = m_width;
+		myClip.bottom = m_height;
+		SectRect(clipRect, &myClip, clipRect);
+	}
+}
+
+void wxWindow::MacGetPortClientParams(Point* localOrigin, Rect* clipRect, WindowRef *window , wxWindow** rootwin ) 
+{
+	int width , height ;
+	GetClientSize( &width , &height ) ;
+	
+	if ( m_macWindowData )
+	{
+		localOrigin->h = 0;
+		localOrigin->v = 0;
+		clipRect->left = 0;
+		clipRect->top = 0;
+		clipRect->right = m_width ;//width;
+		clipRect->bottom = m_height ;// height;
+		*window = m_macWindowData->m_macWindow ;
+		*rootwin = this ;
+	}
+	else
+	{
+		wxASSERT( GetParent() != NULL ) ;
+		
+		GetParent()->MacGetPortClientParams( localOrigin , clipRect , window, rootwin) ;
+
+		localOrigin->h += m_x;
+		localOrigin->v += m_y;
+		OffsetRect(clipRect, -m_x, -m_y);
+	
+		Rect myClip;
+		myClip.left = 0;
+		myClip.top = 0;
+		myClip.right = width;
+		myClip.bottom = height;
+		SectRect(clipRect, &myClip, clipRect);
+	}
+}
+
+wxMacFocusHelper::wxMacFocusHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	GetPort( &m_formerPort ) ;
+	if ( theWindow )
+	{
+	
+		theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacFocusHelper::~wxMacFocusHelper() 
+{
+	if ( m_ok )
+	{
+		SetOrigin( 0 , 0 ) ;
+	}
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacDrawingHelper::wxMacDrawingHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+	if ( theWindow )
+	{
+		theWindow->MacGetPortParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		if ( m_formerPort != m_currentPort )
+			SetPort( m_currentPort ) ;
+		GetPenState( &m_savedPenState ) ;
+		theWindow->MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacDrawingHelper::~wxMacDrawingHelper() 
+{
+	if ( m_ok )
+	{
+		SetPenState( &m_savedPenState ) ;
+		SetOrigin( 0 , 0 ) ;
+		ClipRect( &m_currentPort->portRect ) ;
+	}
+		
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacFocusClientHelper::wxMacFocusClientHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+
+	if ( theWindow )
+	{
+		theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		theWindow->MacSetPortFocusParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacFocusClientHelper::~wxMacFocusClientHelper() 
+{
+	if ( m_ok )
+	{
+		SetOrigin( 0 , 0 ) ;
+	}
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+wxMacDrawingClientHelper::wxMacDrawingClientHelper( wxWindow * theWindow ) 
+{
+	m_ok = false ;
+	Point localOrigin ;
+	Rect clipRect ;
+	WindowRef window ;
+	wxWindow *rootwin ;
+	m_currentPort = NULL ;
+	
+	GetPort( &m_formerPort ) ;
+
+	if ( theWindow )
+	{
+		theWindow->MacGetPortClientParams( &localOrigin , &clipRect , &window , &rootwin) ;
+		m_currentPort = UMAGetWindowPort( window ) ;
+		if ( m_formerPort != m_currentPort )
+			SetPort( m_currentPort ) ;
+		GetPenState( &m_savedPenState ) ;
+		theWindow->MacSetPortDrawingParams( localOrigin, clipRect, window , rootwin ) ; 
+		m_ok = true ;
+	}
+}
+	
+wxMacDrawingClientHelper::~wxMacDrawingClientHelper() 
+{
+	if ( m_ok )
+	{
+		SetPenState( &m_savedPenState ) ;
+		SetOrigin( 0 , 0 ) ;
+		ClipRect( &m_currentPort->portRect ) ;
+	}
+		
+	if ( m_formerPort != m_currentPort )
+		SetPort( m_formerPort ) ;
+}
+
+// ----------------------------------------------------------------------------
+// list classes implementation
+// ----------------------------------------------------------------------------
+
+void wxWindowListNode::DeleteData()
+{
+    delete (wxWindow *)GetData();
+}
 
diff --git a/src/msw/iniconf.cpp b/src/msw/iniconf.cpp
index f3d0a6727b..e65785791d 100644
--- a/src/msw/iniconf.cpp
+++ b/src/msw/iniconf.cpp
@@ -344,16 +344,22 @@ bool wxIniConfig::Read(const wxString& szKey, long *pl) const
 
   // is it really nMagic?
   lVal = GetPrivateProfileInt(m_strGroup, strKey, nMagic2, m_strLocalFilename);
-  if ( lVal == nMagic2 ) {
+  if ( lVal != nMagic2 ) {
     // the nMagic it returned was indeed read from the file
     *pl = lVal;
     return TRUE;
   }
 
+  // CS : I have no idea why they should look up in win.ini
+  // and if at all they have to do the same procedure using the two magic numbers
+  // otherwise it always returns true, even if the key was not there at all
+#if 0
   // no, it was just returning the default value, so now look in win.ini
-  *pl = GetProfileInt(GetVendorName(), GetKeyName(szKey), *pl);
+ *pl = GetProfileInt(GetVendorName(), GetKeyName(szKey), *pl);
 
   return TRUE;
+#endif
+  return FALSE ;
 }
 
 bool wxIniConfig::Write(const wxString& szKey, const wxString& szValue)
diff --git a/user/wxTest/horse.png b/user/wxTest/horse.png
index 326b7c786787f25de36e3ac26f20ae09817e1437..f1ad7558e4917c38d1dafc49f7bccac10219adee 100644
GIT binary patch
literal 5
McmeAS@N?$^00ndbc>n+a

literal 68850
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

diff --git a/utils/dialoged/docs/books.gif b/utils/dialoged/docs/books.gif
index a9a1e46844cb79b3a787ae9bb3e6e2d508bf03df..83f0742f96d4621cd489b4183742ddbdb2bed2c0 100644
GIT binary patch
delta 6
NcmdnS{F!mWX8;O212F&q

delta 203
zcmV;+05t#e0k#8>^M4x01_V-p&WX*9#ZQrpS44_{LkEvM-Ob=zxSNqTL1Um_>+$sU
z_L-eT_Za!7`z5M?l{$i^jwUvvhzLaWCdI)XaykgaW9w2x70F70kme(Z1TbvI@Fd$~
z3dOP;j^ITTnNgsPVdFq<;5hPyuqxhSQd`5az)75ktg%Qrb411tnAd;`6{NC)G-}m^
z0#bTysLT<#vMJ4pQiqqUQnyaxQU+|*sYA$OGAr)SyiI0@y!!`s?mr5ZcHZ5~mqY{r
F06UqyWJ>@5

diff --git a/utils/dialoged/docs/dialog.gif b/utils/dialoged/docs/dialog.gif
index ae430e334576ccc77c788a042dccda4ff62bae84..656e658287839b27a9fb3bc90cc3b2f589503bc3 100644
GIT binary patch
delta 6
NcmaFKIEit>BmfD10-yi@

delta 94
zcmV-k0HObq0qFsdl2;o2j>4NU(lth>w_P?iOMzRLQxw^Y&ztsgekXuZ7)}>oafK|5
zM*xgaiFZzr5|ogRYlVo0gkOSoWptyOpiGLUDyXR_ah0#IuoJPgw2z~>84&;gJJ@0=
A{Qv*}

diff --git a/utils/dialoged/docs/forward.gif b/utils/dialoged/docs/forward.gif
index 9c81e8c92fed7fe851ce02e7854dc26a58eae9b2..9c8421838a9822c3bcc3d5b9a40732a72647b558 100644
GIT binary patch
delta 5
McmZ3&m^&dC00t2P5C8xG

delta 61
zcmV-D0K)%mqydm^HyX5<&4|xlpYoDsn}K3#l-r!ce^~9fOp>GGBv?XN2y%$1p}06>
Tz!51qNm*$bV410zSpWb#w2&Mp

diff --git a/utils/dialoged/docs/gauge.gif b/utils/dialoged/docs/gauge.gif
index af79fe1aef58a40ea131f9d7c82201cf74ba1d0d..237d885fbef1495844c149c4216437fb0a8a0670 100644
GIT binary patch
delta 6
Ncmcb@xPWoO0ssj{0;d1~

delta 59
zcmV-B0L1^G0n`DIpfnn8&$H(EU43Bd-*snuaDP8#LU93uQ8p8RFpy7lk&r+vmzbHF
RnG>6ypE4qiqZttZ06Q&{7~uc_

diff --git a/utils/dialoged/docs/tofront.gif b/utils/dialoged/docs/tofront.gif
index ff09220da3e1912f64891777c0cef2e7c16e8bfa..6b9ca4f6409818cbae26ff21267c4ca2b3af30cc 100644
GIT binary patch
delta 5
McmeBV%$|@900n{p@c;k-

delta 36
scmd1qWSo#KCl$1n*Q-+W+r0R*rOLidyTjOLij<}(D4WdeWMHrc0QmO|t^fc4

diff --git a/utils/dialoged/docs/up.gif b/utils/dialoged/docs/up.gif
index 316d0d2a14b571bea2eb874efd04bfe509f53b34..f9e7031e64cf9bd17eac8190eefce2526d90a052 100644
GIT binary patch
literal 6
NcmZ?wbh9u|1ONrB0jB@}

literal 137
zcmV;40CxXJNk%v~VHyA!0Pz3-zrVld=jU&4Z(9HWEC2ui02%-o0007FjE||ytzv+j
zv|1owxcuhWh0?c)Avq0}dTQw^q7qBdoDA6WKJ*l>%gtCeAWZlgxpoy|ZDMRPr_m>p
rx}08pS4?)u<%PW<QBYY9oyjHh?Q62&;&M&qj?e4yfxZ7PPyhfsDH=Ws

-- 
2.47.2