+class wxMacFunctor
+{
+public :
+ wxMacFunctor(){}
+ virtual ~wxMacFunctor() {}
+ virtual void* operator()() = 0 ;
+ static void* CallBackProc(void *param)
+ {
+ wxMacFunctor* f = (wxMacFunctor*) param ;
+ void *result = (*f)() ;
+ return result ;
+ }
+} ;
+
+template<typename classtype,typename param1type>
+class wxMacObjectFunctor1 : public wxMacFunctor
+{
+ typedef void (classtype::*function)( param1type p1 ) ;
+ typedef void (classtype::*ref_function)( const param1type& p1 ) ;
+public :
+ wxMacObjectFunctor1( classtype *obj , function f , param1type p1 ) :
+ wxMacFunctor( )
+ {
+ m_object = obj ;
+ m_function = f ;
+ m_param1 = p1 ;
+ }
+
+ wxMacObjectFunctor1( classtype *obj , ref_function f , param1type p1 ) :
+ wxMacFunctor( )
+ {
+ m_object = obj ;
+ m_refFunction = f ;
+ m_param1 = p1 ;
+ }
+
+ ~wxMacObjectFunctor1() {}
+
+ virtual void* operator()()
+ {
+ (m_object->*m_function)(m_param1) ;
+ return NULL ;
+ }
+private :
+ classtype* m_object ;
+ param1type m_param1 ;
+ union
+ {
+ function m_function ;
+ ref_function m_refFunction ;
+ } ;
+} ;
+
+template<typename classtype, typename param1type>
+void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 )
+{
+ wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;
+ void *result =
+ MPRemoteCall( wxMacFunctor::CallBackProc , ¶ms , kMPOwningProcessRemoteContext ) ;
+ return result ;
+}
+
+template<typename classtype, typename param1type>
+void* wxMacMPRemoteCall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 )
+{
+ wxMacObjectFunctor1<classtype,param1type> params(object,function,p1) ;
+ void *result =
+ MPRemoteCall( wxMacFunctor::CallBackProc , ¶ms , kMPOwningProcessRemoteContext ) ;
+ return result ;
+}
+
+template<typename classtype, typename param1type>
+void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( param1type p1 ) , param1type p1 )
+{
+ wxMutexGuiLeave() ;
+ void *result = wxMacMPRemoteCall( object , function , p1 ) ;
+ wxMutexGuiEnter() ;
+ return result ;
+}
+
+template<typename classtype, typename param1type>
+void* wxMacMPRemoteGUICall( classtype *object , void (classtype::*function)( const param1type& p1 ) , param1type p1 )
+{
+ wxMutexGuiLeave() ;
+ void *result = wxMacMPRemoteCall( object , function , p1 ) ;
+ wxMutexGuiEnter() ;
+ return result ;
+}
+// common interface for all implementations
+class wxMacTextControl : public wxMacControl
+{
+public :
+ wxMacTextControl( wxTextCtrl *peer ) ;
+ ~wxMacTextControl() ;
+
+ virtual wxString GetStringValue() const = 0 ;
+ virtual void SetStringValue( const wxString &val ) = 0 ;
+ virtual void SetStyle(long start, long end, const wxTextAttr& style) ;
+ virtual void Copy() ;
+ virtual void Cut() ;
+ virtual void Paste() ;
+ virtual bool CanPaste() const ;
+ virtual void SetEditable(bool editable) ;
+ virtual wxTextPos GetLastPosition() const ;
+ virtual void Replace( long from , long to , const wxString str ) ;
+ virtual void Remove( long from , long to ) = 0 ;
+ virtual void SetSelection( long from , long to ) = 0 ;
+ virtual void GetSelection( long* from, long* to) const = 0 ;
+ virtual void WriteText(const wxString& str) = 0 ;
+
+ virtual void Clear() ;
+ virtual bool CanUndo() const;
+ virtual void Undo() ;
+ virtual bool CanRedo() const;
+ virtual void Redo() ;
+ virtual int GetNumberOfLines() const ;
+ virtual long XYToPosition(long x, long y) const;
+ virtual bool PositionToXY(long pos, long *x, long *y) const ;
+ virtual void ShowPosition( long WXUNUSED(pos) ) ;
+ virtual int GetLineLength(long lineNo) const ;
+ virtual wxString GetLineText(long lineNo) const ;
+ virtual bool SetupCursor( const wxPoint& pt ) { return false ; }
+
+#ifndef __WXMAC_OSX__
+ virtual void MacControlUserPaneDrawProc(wxInt16 part) = 0 ;
+ virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) = 0 ;
+ virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) = 0 ;
+ virtual void MacControlUserPaneIdleProc() = 0 ;
+ virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) = 0 ;
+ virtual void MacControlUserPaneActivateProc(bool activating) = 0 ;
+ virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) = 0 ;
+ virtual void MacControlUserPaneBackgroundProc(void* info) = 0 ;
+#endif
+} ;
+
+// common parts for implementations based on MLTE
+
+class wxMacMLTEControl : public wxMacTextControl
+{
+public :
+ wxMacMLTEControl( wxTextCtrl *peer ) ;
+ virtual wxString GetStringValue() const ;
+ virtual void SetStringValue( const wxString &str) ;
+
+ static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ;
+ void AdjustCreationAttributes( const wxColour& background , bool visible ) ;
+
+ virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) ;
+ virtual void SetBackground( const wxBrush &brush) ;
+ virtual void SetStyle(long start, long end, const wxTextAttr& style) ;
+ virtual void Copy() ;
+ virtual void Cut() ;
+ virtual void Paste() ;
+ virtual bool CanPaste() const ;
+ virtual void SetEditable(bool editable) ;
+ virtual wxTextPos GetLastPosition() const ;
+ virtual void Replace( long from , long to , const wxString str ) ;
+ virtual void Remove( long from , long to ) ;
+ virtual void GetSelection( long* from, long* to) const ;
+ virtual void SetSelection( long from , long to ) ;
+
+ virtual void WriteText(const wxString& str) ;
+ virtual void Clear() ;
+
+ virtual bool CanUndo() const ;
+ virtual void Undo() ;
+ virtual bool CanRedo() const;
+ virtual void Redo() ;
+ virtual int GetNumberOfLines() const ;
+ virtual long XYToPosition(long x, long y) const ;
+ virtual bool PositionToXY(long pos, long *x, long *y) const ;
+ virtual void ShowPosition( long pos ) ;
+ virtual int GetLineLength(long lineNo) const ;
+ virtual wxString GetLineText(long lineNo) const ;
+
+ void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ;
+
+protected :
+ void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ;
+ TXNObject m_txn ;
+} ;
+
+#if TARGET_API_MAC_OSX
+
+// implementation available under OSX
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+
+class wxMacMLTEHIViewControl : public wxMacMLTEControl
+{
+public :
+ wxMacMLTEHIViewControl( wxTextCtrl *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style ) ;
+ virtual OSStatus SetFocus( ControlFocusPart focusPart ) ;
+ virtual bool HasFocus() const ;
+protected :
+ HIViewRef m_scrollView ;
+ HIViewRef m_textView ;
+} ;
+
+#endif
+
+class wxMacUnicodeTextControl : public wxMacTextControl
+{
+public :
+ wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style ) ;
+ ~wxMacUnicodeTextControl();
+ virtual void VisibilityChanged(bool shown);
+ virtual wxString GetStringValue() const ;
+ virtual void SetStringValue( const wxString &str) ;
+ virtual void Copy();
+ virtual void Cut();
+ virtual void Paste();
+ virtual bool CanPaste() const;
+ virtual void SetEditable(bool editable) ;
+ virtual void Remove( long from , long to ) ;
+ virtual void GetSelection( long* from, long* to) const ;
+ virtual void SetSelection( long from , long to ) ;
+ virtual void WriteText(const wxString& str) ;
+protected :
+ // contains the tag for the content (is different for password and non-password controls)
+ OSType m_valueTag ;
+} ;
+
+#endif
+
+// 'classic' MLTE implementation
+
+class wxMacMLTEClassicControl : public wxMacMLTEControl
+{
+public :
+ wxMacMLTEClassicControl( wxTextCtrl *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style ) ;
+ ~wxMacMLTEClassicControl() ;
+ virtual void VisibilityChanged(bool shown) ;
+ virtual void SuperChangedPosition() ;
+
+ virtual void MacControlUserPaneDrawProc(wxInt16 part) ;
+ virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) ;
+ virtual wxInt16 MacControlUserPaneTrackingProc(wxInt16 x, wxInt16 y, void* actionProc) ;
+ virtual void MacControlUserPaneIdleProc() ;
+ virtual wxInt16 MacControlUserPaneKeyDownProc(wxInt16 keyCode, wxInt16 charCode, wxInt16 modifiers) ;
+ virtual void MacControlUserPaneActivateProc(bool activating) ;
+ virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) ;
+ virtual void MacControlUserPaneBackgroundProc(void* info) ;
+
+ virtual bool SetupCursor( const wxPoint& WXUNUSED(pt) ) { MacControlUserPaneIdleProc() ; return true ;}
+
+ virtual void SetRect( Rect *r ) ;
+
+protected :
+ OSStatus DoCreate();
+
+ void MacUpdatePosition() ;
+ void MacActivatePaneText(Boolean setActive) ;
+ void MacFocusPaneText(Boolean setFocus) ;
+
+ void MacSetObjectVisibility(Boolean vis) ;
+private :
+ TXNFrameID m_txnFrameID ;
+ GrafPtr m_txnPort ;
+ WindowRef m_txnWindow ;
+ // bounds of the control as we last did set the txn frames
+ Rect m_txnControlBounds ;
+ Rect m_txnVisBounds ;
+#ifdef __WXMAC_OSX__
+ static pascal void TXNScrollInfoProc (SInt32 iValue, SInt32 iMaximumValue,
+ TXNScrollBarOrientation iScrollBarOrientation, SInt32 iRefCon) ;
+ static pascal void TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ) ;
+ ControlRef m_sbHorizontal ;
+ SInt32 m_lastHorizontalValue ;
+ ControlRef m_sbVertical ;
+ SInt32 m_lastVerticalValue ;
+#endif
+} ;