1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Stefan Csomor
5 // Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "textctrl.h"
22 #include <sys/types.h>
28 #include "wx/msgdlg.h"
30 #if wxUSE_STD_IOSTREAM
40 #include "wx/button.h"
41 #include "wx/toplevel.h"
42 #include "wx/textctrl.h"
43 #include "wx/notebook.h"
44 #include "wx/tabctrl.h"
45 #include "wx/settings.h"
46 #include "wx/filefn.h"
49 #if defined(__BORLANDC__) && !defined(__WIN32__)
51 #elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__)
59 // if this is set to 1 then under OSX 10.2 the 'classic' MLTE implementation will be used
60 // if set to 0 then the unicode textctrl will be used
61 #ifndef wxMAC_AWAYS_USE_MLTE
62 #define wxMAC_AWAYS_USE_MLTE 1
65 #include <MacTextEditor.h>
66 #include <ATSUnicode.h>
67 #include <TextCommon.h>
68 #include <TextEncodingConverter.h>
69 #include "wx/mac/uma.h"
75 virtual ~wxMacFunctor() {}
76 virtual void* operator()() = 0 ;
77 static void* CallBackProc(void *param
)
79 wxMacFunctor
* f
= (wxMacFunctor
*) param
;
80 void *result
= (*f
)() ;
85 template<typename classtype
,typename param1type
>
86 class wxMacObjectFunctor1
: public wxMacFunctor
88 typedef void (classtype::*function
)( param1type p1
) ;
89 typedef void (classtype::*ref_function
)( const param1type
& p1
) ;
91 wxMacObjectFunctor1( classtype
*obj
, function f
, param1type p1
) :
99 wxMacObjectFunctor1( classtype
*obj
, ref_function f
, param1type p1
) :
107 ~wxMacObjectFunctor1() {}
109 virtual void* operator()()
111 (m_object
->*m_function
)(m_param1
) ;
115 classtype
* m_object
;
116 param1type m_param1
;
119 function m_function
;
120 ref_function m_refFunction
;
124 template<typename classtype
, typename param1type
>
125 void* wxMacMPRemoteCall( classtype
*object
, void (classtype::*function
)( param1type p1
) , param1type p1
)
127 wxMacObjectFunctor1
<classtype
,param1type
> params(object
,function
,p1
) ;
129 MPRemoteCall( wxMacFunctor::CallBackProc
, ¶ms
, kMPOwningProcessRemoteContext
) ;
133 template<typename classtype
, typename param1type
>
134 void* wxMacMPRemoteCall( classtype
*object
, void (classtype::*function
)( const param1type
& p1
) , param1type p1
)
136 wxMacObjectFunctor1
<classtype
,param1type
> params(object
,function
,p1
) ;
138 MPRemoteCall( wxMacFunctor::CallBackProc
, ¶ms
, kMPOwningProcessRemoteContext
) ;
142 template<typename classtype
, typename param1type
>
143 void* wxMacMPRemoteGUICall( classtype
*object
, void (classtype::*function
)( param1type p1
) , param1type p1
)
146 void *result
= wxMacMPRemoteCall( object
, function
, p1
) ;
151 template<typename classtype
, typename param1type
>
152 void* wxMacMPRemoteGUICall( classtype
*object
, void (classtype::*function
)( const param1type
& p1
) , param1type p1
)
155 void *result
= wxMacMPRemoteCall( object
, function
, p1
) ;
159 // common interface for all implementations
160 class wxMacTextControl
: public wxMacControl
164 ~wxMacTextControl() ;
166 virtual wxString
GetStringValue() const = 0 ;
167 virtual void SetStringValue( const wxString
&val
) = 0 ;
168 virtual void SetStyle(long start
, long end
, const wxTextAttr
& style
) ;
169 virtual void Copy() ;
171 virtual void Paste() ;
172 virtual bool CanPaste() const ;
173 virtual void SetEditable(bool editable
) ;
174 virtual long GetLastPosition() const ;
175 virtual void Replace( long from
, long to
, const wxString str
) ;
176 virtual void Remove( long from
, long to
) = 0 ;
177 virtual void SetSelection( long from
, long to
) = 0 ;
178 virtual void GetSelection( long* from
, long* to
) const = 0 ;
179 virtual void WriteText(const wxString
& str
) = 0 ;
181 virtual void Clear() ;
182 virtual bool CanUndo() const;
183 virtual void Undo() ;
184 virtual bool CanRedo() const;
185 virtual void Redo() ;
186 virtual int GetNumberOfLines() const ;
187 virtual long XYToPosition(long x
, long y
) const;
188 virtual bool PositionToXY(long pos
, long *x
, long *y
) const ;
189 virtual void ShowPosition( long WXUNUSED(pos
) ) ;
190 virtual int GetLineLength(long lineNo
) const ;
191 virtual wxString
GetLineText(long lineNo
) const ;
194 // common parts for implementations based on MLTE
196 class wxMacMLTEControl
: public wxMacTextControl
199 virtual wxString
GetStringValue() const ;
200 virtual void SetStringValue( const wxString
&str
) ;
202 static TXNFrameOptions
FrameOptionsFromWXStyle( long wxStyle
) ;
203 void AdjustCreationAttributes( const wxColour
& background
, bool visible
) ;
205 virtual void SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
) ;
206 virtual void SetBackground( const wxBrush
&brush
) ;
207 virtual void SetStyle(long start
, long end
, const wxTextAttr
& style
) ;
208 virtual void Copy() ;
210 virtual void Paste() ;
211 virtual bool CanPaste() const ;
212 virtual void SetEditable(bool editable
) ;
213 virtual long GetLastPosition() const ;
214 virtual void Replace( long from
, long to
, const wxString str
) ;
215 virtual void Remove( long from
, long to
) ;
216 virtual void GetSelection( long* from
, long* to
) const ;
217 virtual void SetSelection( long from
, long to
) ;
219 virtual void WriteText(const wxString
& str
) ;
220 virtual void Clear() ;
222 virtual bool CanUndo() const ;
223 virtual void Undo() ;
224 virtual bool CanRedo() const;
225 virtual void Redo() ;
226 virtual int GetNumberOfLines() const ;
227 virtual long XYToPosition(long x
, long y
) const ;
228 virtual bool PositionToXY(long pos
, long *x
, long *y
) const ;
229 virtual void ShowPosition( long pos
) ;
230 virtual int GetLineLength(long lineNo
) const ;
231 virtual wxString
GetLineText(long lineNo
) const ;
233 void SetTXNData( const wxString
& st
, TXNOffset start
, TXNOffset end
) ;
236 void TXNSetAttribute( const wxTextAttr
& style
, long from
, long to
) ;
240 #if TARGET_API_MAC_OSX
242 // implementation available under OSX
244 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
246 class wxMacMLTEHIViewControl
: public wxMacMLTEControl
249 wxMacMLTEHIViewControl( wxWindow
*wxPeer
,
252 const wxSize
& size
, long style
) ;
253 virtual OSStatus
SetFocus( ControlFocusPart focusPart
) ;
254 virtual bool HasFocus() const ;
255 virtual bool NeedsFocusRect() const;
257 HIViewRef m_scrollView
;
258 HIViewRef m_textView
;
263 class wxMacUnicodeTextControl
: public wxMacTextControl
266 wxMacUnicodeTextControl( wxWindow
*wxPeer
,
269 const wxSize
& size
, long style
) ;
270 ~wxMacUnicodeTextControl();
271 virtual void VisibilityChanged(bool shown
);
272 virtual wxString
GetStringValue() const ;
273 virtual void SetStringValue( const wxString
&str
) ;
276 virtual void Paste();
277 virtual bool CanPaste() const;
278 virtual void SetEditable(bool editable
) ;
279 virtual void Remove( long from
, long to
) ;
280 virtual void GetSelection( long* from
, long* to
) const ;
281 virtual void SetSelection( long from
, long to
) ;
282 virtual void WriteText(const wxString
& str
) ;
284 // contains the tag for the content (is different for password and non-password controls)
290 // implementation available under classic
292 class STPTextPaneVars
;
294 class wxMacMLTEClassicControl
: public wxMacMLTEControl
297 wxMacMLTEClassicControl( wxWindow
*wxPeer
,
300 const wxSize
& size
, long style
) ;
301 ~wxMacMLTEClassicControl() ;
302 virtual void VisibilityChanged(bool shown
) ;
303 virtual bool NeedsFocusRect() const;
307 // hack to make public until we have migrated all procs
308 STPTextPaneVars
* m_macTXNvars
;
311 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
313 #if !USE_SHARED_LIBRARY
314 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl
, wxControl
)
316 BEGIN_EVENT_TABLE(wxTextCtrl
, wxControl
)
317 EVT_ERASE_BACKGROUND( wxTextCtrl::OnEraseBackground
)
318 EVT_DROP_FILES(wxTextCtrl::OnDropFiles
)
319 EVT_CHAR(wxTextCtrl::OnChar
)
320 EVT_MENU(wxID_CUT
, wxTextCtrl::OnCut
)
321 EVT_MENU(wxID_COPY
, wxTextCtrl::OnCopy
)
322 EVT_MENU(wxID_PASTE
, wxTextCtrl::OnPaste
)
323 EVT_MENU(wxID_UNDO
, wxTextCtrl::OnUndo
)
324 EVT_MENU(wxID_REDO
, wxTextCtrl::OnRedo
)
326 EVT_UPDATE_UI(wxID_CUT
, wxTextCtrl::OnUpdateCut
)
327 EVT_UPDATE_UI(wxID_COPY
, wxTextCtrl::OnUpdateCopy
)
328 EVT_UPDATE_UI(wxID_PASTE
, wxTextCtrl::OnUpdatePaste
)
329 EVT_UPDATE_UI(wxID_UNDO
, wxTextCtrl::OnUpdateUndo
)
330 EVT_UPDATE_UI(wxID_REDO
, wxTextCtrl::OnUpdateRedo
)
335 void wxTextCtrl::Init()
340 m_maxLength
= TE_UNLIMITED_LENGTH
;
343 wxTextCtrl::~wxTextCtrl()
348 bool wxTextCtrl::Create(wxWindow
*parent
, wxWindowID id
,
351 const wxSize
& size
, long style
,
352 const wxValidator
& validator
,
353 const wxString
& name
)
355 m_macIsUserPane
= FALSE
;
358 if ( ! ( style
& wxNO_BORDER
) )
359 style
= ( style
& ~wxBORDER_MASK
) | wxSUNKEN_BORDER
;
361 if ( !wxTextCtrlBase::Create(parent
, id
, pos
, size
, style
& ~(wxHSCROLL
|wxVSCROLL
), validator
, name
) )
364 Rect bounds
= wxMacGetBoundsForControl( this , pos
, size
) ;
366 if ( m_windowStyle
& wxTE_MULTILINE
)
368 wxASSERT_MSG( !(m_windowStyle
& wxTE_PROCESS_ENTER
),
369 wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );
371 m_windowStyle
|= wxTE_PROCESS_ENTER
;
372 style
|= wxTE_PROCESS_ENTER
;
375 #if TARGET_API_MAC_OSX
376 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
377 if ( UMAGetSystemVersion() >= 0x1030 )
379 m_peer
= new wxMacMLTEHIViewControl( this , str
, pos
, size
, style
) ;
382 #if !wxMAC_AWAYS_USE_MLTE
385 m_peer
= new wxMacUnicodeTextControl( this , str
, pos
, size
, style
) ;
391 // this control draws the border itself
392 if ( !HasFlag(wxNO_BORDER
) )
394 m_windowStyle
&= ~wxSUNKEN_BORDER
;
395 bounds
= wxMacGetBoundsForControl( this , pos
, size
) ;
397 m_peer
= new wxMacMLTEClassicControl( this , str
, pos
, size
, style
) ;
400 MacPostControlCreate(pos
,size
) ;
402 if ( m_windowStyle
& wxTE_READONLY
)
404 SetEditable( false ) ;
411 void wxTextCtrl::MacVisibilityChanged()
413 GetPeer()->VisibilityChanged( MacIsReallyShown() ) ;
416 void wxTextCtrl::MacEnabledStateChanged()
420 wxString
wxTextCtrl::GetValue() const
422 return GetPeer()->GetStringValue() ;
425 void wxTextCtrl::GetSelection(long* from
, long* to
) const
427 GetPeer()->GetSelection( from
, to
) ;
430 void wxTextCtrl::SetValue(const wxString
& str
)
433 if ( GetValue() == str
)
436 GetPeer()->SetStringValue(str
) ;
438 wxCommandEvent
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
439 event
.SetString( GetValue() ) ;
440 event
.SetEventObject( this );
441 GetEventHandler()->ProcessEvent(event
);
444 void wxTextCtrl::SetMaxLength(unsigned long len
)
449 bool wxTextCtrl::SetFont( const wxFont
& font
)
451 if ( !wxTextCtrlBase::SetFont( font
) )
454 GetPeer()->SetFont( font
, GetForegroundColour() , GetWindowStyle() ) ;
458 bool wxTextCtrl::SetStyle(long start
, long end
, const wxTextAttr
& style
)
460 GetPeer()->SetStyle( start
, end
, style
) ;
464 bool wxTextCtrl::SetDefaultStyle(const wxTextAttr
& style
)
466 wxTextCtrlBase::SetDefaultStyle( style
) ;
467 SetStyle( kTXNUseCurrentSelection
, kTXNUseCurrentSelection
, GetDefaultStyle() ) ;
471 // Clipboard operations
472 void wxTextCtrl::Copy()
480 void wxTextCtrl::Cut()
486 wxCommandEvent
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
487 event
.SetEventObject( this );
488 GetEventHandler()->ProcessEvent(event
);
492 void wxTextCtrl::Paste()
497 // eventually we should add setting the default style again
499 wxCommandEvent
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
500 event
.SetEventObject( this );
501 GetEventHandler()->ProcessEvent(event
);
505 bool wxTextCtrl::CanCopy() const
507 // Can copy if there's a selection
509 GetSelection(& from
, & to
);
513 bool wxTextCtrl::CanCut() const
519 // Can cut if there's a selection
521 GetSelection(& from
, & to
);
525 bool wxTextCtrl::CanPaste() const
530 return GetPeer()->CanPaste() ;
533 void wxTextCtrl::SetEditable(bool editable
)
535 if ( editable
!= m_editable
)
537 m_editable
= editable
;
538 GetPeer()->SetEditable( editable
) ;
542 void wxTextCtrl::SetInsertionPoint(long pos
)
544 SetSelection( pos
, pos
) ;
547 void wxTextCtrl::SetInsertionPointEnd()
549 long pos
= GetLastPosition();
550 SetInsertionPoint(pos
);
553 long wxTextCtrl::GetInsertionPoint() const
556 GetSelection( &begin
, &end
) ;
560 long wxTextCtrl::GetLastPosition() const
562 return GetPeer()->GetLastPosition( ) ;
565 void wxTextCtrl::Replace(long from
, long to
, const wxString
& str
)
567 GetPeer()->Replace( from
, to
, str
) ;
570 void wxTextCtrl::Remove(long from
, long to
)
572 GetPeer()->Remove( from
, to
) ;
575 void wxTextCtrl::SetSelection(long from
, long to
)
577 GetPeer()->SetSelection( from
, to
) ;
580 bool wxTextCtrl::LoadFile(const wxString
& file
)
582 if ( wxTextCtrlBase::LoadFile(file
) )
590 void wxTextCtrl::WriteText(const wxString
& str
)
592 // TODO this MPRemoting will be moved into a remoting peer proxy for any command
593 if ( !wxIsMainThread() )
595 // unfortunately CW 8 is not able to correctly deduce the template types, so we have
596 // to instantiate explicitely
597 wxMacMPRemoteGUICall
<wxTextCtrl
,wxString
>( this , &wxTextCtrl::WriteText
, str
) ;
602 GetPeer()->WriteText( str
) ;
606 void wxTextCtrl::AppendText(const wxString
& text
)
608 SetInsertionPointEnd();
612 void wxTextCtrl::Clear()
617 bool wxTextCtrl::IsModified() const
622 bool wxTextCtrl::IsEditable() const
624 return IsEnabled() && m_editable
;
627 bool wxTextCtrl::AcceptsFocus() const
629 // we don't want focus if we can't be edited
630 return /*IsEditable() && */ wxControl::AcceptsFocus();
633 wxSize
wxTextCtrl::DoGetBestSize() const
639 // these are the numbers from the HIG, we reduce them by the borders
642 switch( m_windowVariant
)
644 case wxWINDOW_VARIANT_NORMAL
:
647 case wxWINDOW_VARIANT_SMALL
:
650 case wxWINDOW_VARIANT_MINI
:
658 // as the above numbers have some free space around the text
659 // we get 5 lines like this anyway
660 if ( m_windowStyle
& wxTE_MULTILINE
)
665 if ( !HasFlag(wxNO_BORDER
) )
668 return wxSize(wText
, hText
);
671 // ----------------------------------------------------------------------------
673 // ----------------------------------------------------------------------------
675 void wxTextCtrl::Undo()
683 void wxTextCtrl::Redo()
691 bool wxTextCtrl::CanUndo() const
697 return GetPeer()->CanUndo() ;
700 bool wxTextCtrl::CanRedo() const
706 return GetPeer()->CanRedo() ;
709 void wxTextCtrl::MarkDirty()
714 void wxTextCtrl::DiscardEdits()
719 int wxTextCtrl::GetNumberOfLines() const
721 return GetPeer()->GetNumberOfLines() ;
724 long wxTextCtrl::XYToPosition(long x
, long y
) const
726 return GetPeer()->XYToPosition( x
, y
) ;
729 bool wxTextCtrl::PositionToXY(long pos
, long *x
, long *y
) const
731 return GetPeer()->PositionToXY(pos
, x
, y
) ;
734 void wxTextCtrl::ShowPosition(long pos
)
736 return GetPeer()->ShowPosition(pos
) ;
739 int wxTextCtrl::GetLineLength(long lineNo
) const
741 return GetPeer()->GetLineLength(lineNo
) ;
744 wxString
wxTextCtrl::GetLineText(long lineNo
) const
746 return GetPeer()->GetLineText(lineNo
) ;
753 void wxTextCtrl::Command(wxCommandEvent
& event
)
755 SetValue (event
.GetString());
756 ProcessCommand (event
);
759 void wxTextCtrl::OnDropFiles(wxDropFilesEvent
& event
)
761 // By default, load the first file into the text window.
762 if (event
.GetNumberOfFiles() > 0)
764 LoadFile(event
.GetFiles()[0]);
768 void wxTextCtrl::OnEraseBackground(wxEraseEvent
& event
)
770 // all erasing should be done by the real mac control implementation
771 // while this is true for MLTE under classic, the HITextView is somehow
772 // transparent but background erase is not working correctly, so intercept
773 // things while we can...
777 void wxTextCtrl::OnChar(wxKeyEvent
& event
)
779 int key
= event
.GetKeyCode() ;
780 bool eat_key
= false ;
782 if ( key
== 'c' && event
.MetaDown() )
789 if ( !IsEditable() && key
!= WXK_LEFT
&& key
!= WXK_RIGHT
&& key
!= WXK_DOWN
&& key
!= WXK_UP
&& key
!= WXK_TAB
&&
790 !( key
== WXK_RETURN
&& ( (m_windowStyle
& wxPROCESS_ENTER
) || (m_windowStyle
& wxTE_MULTILINE
) ) )
791 /* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
798 // Check if we have reached the max # of chars, but still allow navigation and deletion
799 if ( !IsMultiLine() && GetValue().Length() >= m_maxLength
&&
800 key
!= WXK_LEFT
&& key
!= WXK_RIGHT
&& key
!= WXK_TAB
&&
801 key
!= WXK_BACK
&& !( key
== WXK_RETURN
&& (m_windowStyle
& wxPROCESS_ENTER
) )
804 // eat it, we don't want to add more than allowed # of characters
808 // assume that any key not processed yet is going to modify the control
811 if ( key
== 'v' && event
.MetaDown() )
817 if ( key
== 'x' && event
.MetaDown() )
826 if (m_windowStyle
& wxPROCESS_ENTER
)
828 wxCommandEvent
event(wxEVT_COMMAND_TEXT_ENTER
, m_windowId
);
829 event
.SetEventObject( this );
830 event
.SetString( GetValue() );
831 if ( GetEventHandler()->ProcessEvent(event
) )
834 if ( !(m_windowStyle
& wxTE_MULTILINE
) )
836 wxWindow
*parent
= GetParent();
837 while( parent
&& !parent
->IsTopLevel() && parent
->GetDefaultItem() == NULL
) {
838 parent
= parent
->GetParent() ;
840 if ( parent
&& parent
->GetDefaultItem() )
842 wxButton
*def
= wxDynamicCast(parent
->GetDefaultItem(),
844 if ( def
&& def
->IsEnabled() )
846 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, def
->GetId() );
847 event
.SetEventObject(def
);
853 // this will make wxWidgets eat the ENTER key so that
854 // we actually prevent line wrapping in a single line
862 if ( !(m_windowStyle
& wxTE_PROCESS_TAB
))
865 if (!event
.ShiftDown())
866 flags
|= wxNavigationKeyEvent::IsForward
;
867 if (event
.ControlDown())
868 flags
|= wxNavigationKeyEvent::WinChange
;
874 // This is necessary (don't know why) or the tab will not
876 WriteText(wxT("\t"));
884 // perform keystroke handling
885 if ( wxTheApp
->MacGetCurrentEvent() != NULL
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL
)
886 CallNextEventHandler((EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ;
890 if ( wxMacConvertEventToRecord( (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec
) )
892 EventRecord
*ev
= &rec
;
895 keychar
= short(ev
->message
& charCodeMask
);
896 keycode
= short(ev
->message
& keyCodeMask
) >> 8 ;
898 m_peer
->HandleKey( keycode
, keychar
, ev
->modifiers
) ;
902 if ( ( key
>= 0x20 && key
< WXK_START
) ||
907 wxCommandEvent
event1(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
908 event1
.SetEventObject( this );
909 wxPostEvent(GetEventHandler(),event1
);
913 // ----------------------------------------------------------------------------
914 // standard handlers for standard edit menu events
915 // ----------------------------------------------------------------------------
917 void wxTextCtrl::OnCut(wxCommandEvent
& WXUNUSED(event
))
922 void wxTextCtrl::OnCopy(wxCommandEvent
& WXUNUSED(event
))
927 void wxTextCtrl::OnPaste(wxCommandEvent
& WXUNUSED(event
))
932 void wxTextCtrl::OnUndo(wxCommandEvent
& WXUNUSED(event
))
937 void wxTextCtrl::OnRedo(wxCommandEvent
& WXUNUSED(event
))
942 void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent
& event
)
944 event
.Enable( CanCut() );
947 void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent
& event
)
949 event
.Enable( CanCopy() );
952 void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent
& event
)
954 event
.Enable( CanPaste() );
957 void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent
& event
)
959 event
.Enable( CanUndo() );
962 void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent
& event
)
964 event
.Enable( CanRedo() );
967 bool wxTextCtrl::MacSetupCursor( const wxPoint
& pt
)
972 // user pane implementation
974 void wxTextCtrl::MacControlUserPaneDrawProc(wxInt16 part
)
978 wxInt16
wxTextCtrl::MacControlUserPaneHitTestProc(wxInt16 x
, wxInt16 y
)
980 return kControlNoPart
;
983 wxInt16
wxTextCtrl::MacControlUserPaneTrackingProc(wxInt16 x
, wxInt16 y
, void* actionProc
)
985 return kControlNoPart
;
988 void wxTextCtrl::MacControlUserPaneIdleProc()
992 wxInt16
wxTextCtrl::MacControlUserPaneKeyDownProc(wxInt16 keyCode
, wxInt16 charCode
, wxInt16 modifiers
)
994 return kControlNoPart
;
997 void wxTextCtrl::MacControlUserPaneActivateProc(bool activating
)
1001 wxInt16
wxTextCtrl::MacControlUserPaneFocusProc(wxInt16 action
)
1003 return kControlNoPart
;
1006 void wxTextCtrl::MacControlUserPaneBackgroundProc(void* info
)
1010 // ----------------------------------------------------------------------------
1011 // implementation base class
1012 // ----------------------------------------------------------------------------
1014 wxMacTextControl::wxMacTextControl()
1018 wxMacTextControl::~wxMacTextControl()
1022 void wxMacTextControl::SetStyle(long start
, long end
, const wxTextAttr
& style
)
1026 void wxMacTextControl::Copy()
1030 void wxMacTextControl::Cut()
1034 void wxMacTextControl::Paste()
1038 bool wxMacTextControl::CanPaste() const
1043 void wxMacTextControl::SetEditable(bool editable
)
1047 long wxMacTextControl::GetLastPosition() const
1049 return GetStringValue().Length() ;
1052 void wxMacTextControl::Replace( long from
, long to
, const wxString str
)
1056 void wxMacTextControl::Clear()
1058 SetStringValue( wxEmptyString
) ;
1061 bool wxMacTextControl::CanUndo() const
1066 void wxMacTextControl::Undo() { }
1068 bool wxMacTextControl::CanRedo() const
1073 void wxMacTextControl::Redo()
1077 long wxMacTextControl::XYToPosition(long x
, long y
) const
1082 bool wxMacTextControl::PositionToXY(long pos
, long *x
, long *y
) const
1087 void wxMacTextControl::ShowPosition( long WXUNUSED(pos
) )
1091 int wxMacTextControl::GetNumberOfLines() const
1093 ItemCount lines
= 0 ;
1094 wxString content
= GetStringValue() ;
1096 for (size_t i
= 0; i
< content
.Length() ; i
++)
1098 if (content
[i
] == '\r') lines
++;
1103 wxString
wxMacTextControl::GetLineText(long lineNo
) const
1105 // TODO change this if possible to reflect real lines
1106 wxString content
= GetStringValue() ;
1110 for (size_t i
= 0; i
< content
.Length() ; i
++)
1112 if (count
== lineNo
)
1114 // Add chars in line then
1117 for (size_t j
= i
; j
< content
.Length(); j
++)
1119 if (content
[j
] == '\n')
1127 if (content
[i
] == '\n') count
++;
1129 return wxEmptyString
;
1132 int wxMacTextControl::GetLineLength(long lineNo
) const
1134 // TODO change this if possible to reflect real lines
1135 wxString content
= GetStringValue() ;
1139 for (size_t i
= 0; i
< content
.Length() ; i
++)
1141 if (count
== lineNo
)
1143 // Count chars in line then
1145 for (size_t j
= i
; j
< content
.Length(); j
++)
1148 if (content
[j
] == '\n') return count
;
1153 if (content
[i
] == '\n') count
++;
1158 // ----------------------------------------------------------------------------
1159 // standard unicode control implementation
1160 // ----------------------------------------------------------------------------
1162 #if TARGET_API_MAC_OSX
1164 wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxWindow
*wxPeer
,
1165 const wxString
& str
,
1167 const wxSize
& size
, long style
)
1169 m_font
= wxPeer
->GetFont() ;
1170 m_windowStyle
= style
;
1171 Rect bounds
= wxMacGetBoundsForControl( wxPeer
, pos
, size
) ;
1173 wxMacConvertNewlines10To13( &st
) ;
1174 wxMacCFStringHolder
cf(st
, m_font
.GetEncoding()) ;
1175 CFStringRef cfr
= cf
;
1176 Boolean isPassword
= ( m_windowStyle
& wxTE_PASSWORD
) != 0 ;
1177 m_valueTag
= isPassword
? kControlEditTextPasswordCFStringTag
: kControlEditTextCFStringTag
;
1178 CreateEditUnicodeTextControl( MAC_WXHWND(wxPeer
->MacGetTopLevelWindowRef()), &bounds
, cfr
, isPassword
, NULL
, &m_controlRef
) ;
1180 if ( !(m_windowStyle
& wxTE_MULTILINE
) )
1182 SetData
<Boolean
>( kControlEditTextPart
, kControlEditTextSingleLineTag
, true ) ;
1186 wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
1190 void wxMacUnicodeTextControl::VisibilityChanged(bool shown
)
1192 if ( !(m_windowStyle
& wxTE_MULTILINE
) && shown
)
1194 // work around a refresh issue insofar as not always the entire content is shown even if this would be possible
1195 ControlEditTextSelectionRec sel
;
1196 CFStringRef value
= NULL
;
1198 verify_noerr( GetData
<ControlEditTextSelectionRec
>( 0, kControlEditTextSelectionTag
, &sel
) );
1199 verify_noerr( GetData
<CFStringRef
>( 0, m_valueTag
, &value
) );
1200 verify_noerr( SetData
<CFStringRef
>( 0, m_valueTag
, &value
) );
1201 verify_noerr( SetData
<ControlEditTextSelectionRec
>( 0, kControlEditTextSelectionTag
, &sel
) );
1203 CFRelease( value
) ;
1206 wxString
wxMacUnicodeTextControl::GetStringValue() const
1209 CFStringRef value
= GetData
<CFStringRef
>(0,m_valueTag
) ;
1212 wxMacCFStringHolder
cf(value
) ;
1213 result
= cf
.AsString() ;
1216 wxMacConvertNewlines13To10( &result
) ;
1218 wxMacConvertNewlines10To13( &result
) ;
1222 void wxMacUnicodeTextControl::SetStringValue( const wxString
&str
)
1225 wxMacConvertNewlines10To13( &st
) ;
1226 wxMacCFStringHolder
cf(st
, m_font
.GetEncoding() ) ;
1227 verify_noerr( SetData
<CFStringRef
>( 0, m_valueTag
, cf
) ) ;
1229 void wxMacUnicodeTextControl::Copy()
1231 SendHICommand( kHICommandCopy
) ;
1233 void wxMacUnicodeTextControl::Cut()
1235 SendHICommand( kHICommandCut
) ;
1237 void wxMacUnicodeTextControl::Paste()
1239 SendHICommand( kHICommandPaste
) ;
1241 bool wxMacUnicodeTextControl::CanPaste() const
1245 void wxMacUnicodeTextControl::SetEditable(bool editable
)
1247 SetData
<Boolean
>( 0 , kControlEditTextLockedTag
, (Boolean
) !editable
) ;
1249 void wxMacUnicodeTextControl::Remove( long from
, long to
)
1253 void wxMacUnicodeTextControl::GetSelection( long* from
, long* to
) const
1255 ControlEditTextSelectionRec sel
;
1256 verify_noerr(GetData
<ControlEditTextSelectionRec
>( 0, kControlEditTextSelectionTag
, &sel
) ) ;
1257 if ( from
) *from
= sel
.selStart
;
1258 if ( to
) *to
= sel
.selEnd
;
1261 void wxMacUnicodeTextControl::SetSelection( long from
, long to
)
1263 ControlEditTextSelectionRec sel
;
1264 sel
.selStart
= from
;
1266 SetData
<ControlEditTextSelectionRec
>( 0 , kControlEditTextSelectionTag
, &sel
) ;
1269 void wxMacUnicodeTextControl::WriteText(const wxString
& str
)
1272 wxMacConvertNewlines10To13( &st
) ;
1273 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1274 wxMacCFStringHolder
cf(st
, m_font
.GetEncoding() ) ;
1275 CFStringRef value
= cf
;
1276 SetData
<CFStringRef
>( 0, kControlEditTextInsertCFStringRefTag
, &value
);
1278 wxString val
= GetStringValue() ;
1280 GetSelection( &start
, &end
) ;
1281 val
.Remove( start
, end
- start
) ;
1282 val
.insert( start
, str
) ;
1283 SetStringValue( val
) ;
1284 SetSelection( start
+ str
.Length() , start
+ str
.Length() ) ;
1290 // ----------------------------------------------------------------------------
1291 // MLTE control implementation (common part)
1292 // ----------------------------------------------------------------------------
1294 #if TARGET_API_MAC_OSX == 0
1295 // declaration needed because of one line in the code...
1296 static void TPUpdateVisibility(ControlRef theControl
) ;
1299 // if mlte is on read only , no changes at all are allowed, not even from
1300 // procedural API, in order to allow changes via API all the same we must undo
1301 // the readonly status while we are executing, this class helps to do so
1306 EditHelper( TXNObject txn
)
1308 TXNControlTag tag
[] = { kTXNIOPrivilegesTag
} ;
1310 TXNGetTXNObjectControls( m_txn
, 1 , tag
, m_data
) ;
1311 if ( m_data
[0].uValue
== kTXNReadOnly
)
1313 TXNControlData data
[] = { { kTXNReadWrite
} } ;
1314 TXNSetTXNObjectControls( m_txn
, false , 1 , tag
, data
) ;
1319 TXNControlTag tag
[] = { kTXNIOPrivilegesTag
} ;
1320 if ( m_data
[0].uValue
== kTXNReadOnly
)
1322 TXNSetTXNObjectControls( m_txn
, false , 1 , tag
, m_data
) ;
1327 TXNControlData m_data
[1] ;
1330 wxString
wxMacMLTEControl::GetStringValue() const
1334 Size actualSize
= 0;
1338 err
= TXNGetDataEncoded( m_txn
, kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNUnicodeTextData
);
1346 actualSize
= GetHandleSize( theText
) / sizeof( UniChar
) ;
1347 if ( actualSize
> 0 )
1349 wxChar
*ptr
= NULL
;
1350 #if SIZEOF_WCHAR_T == 2
1351 ptr
= new wxChar
[actualSize
+ 1 ] ;
1352 wxStrncpy( ptr
, (wxChar
*) *theText
, actualSize
) ;
1355 SetHandleSize( theText
, ( actualSize
+ 1 ) * sizeof( UniChar
) ) ;
1357 (((UniChar
*)*theText
)[actualSize
]) = 0 ;
1358 wxMBConvUTF16BE converter
;
1359 size_t noChars
= converter
.MB2WC( NULL
, (const char*)*theText
, 0 ) ;
1360 ptr
= new wxChar
[noChars
+ 1] ;
1362 noChars
= converter
.MB2WC( ptr
, (const char*)*theText
, noChars
) ;
1364 HUnlock( theText
) ;
1366 ptr
[actualSize
] = 0 ;
1367 result
= wxString( ptr
) ;
1370 DisposeHandle( theText
) ;
1374 err
= TXNGetDataEncoded( m_txn
, kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNTextData
);
1382 actualSize
= GetHandleSize( theText
) ;
1383 if ( actualSize
> 0 )
1386 result
= wxString( *theText
, wxConvLocal
, actualSize
) ;
1387 HUnlock( theText
) ;
1389 DisposeHandle( theText
) ;
1394 wxMacConvertNewlines13To10( &result
) ;
1396 wxMacConvertNewlines10To13( &result
) ;
1401 void wxMacMLTEControl::SetStringValue( const wxString
&str
)
1405 wxMacConvertNewlines10To13( &st
) ;
1406 EditHelper
help(m_txn
) ;
1408 // wxMacWindowClipper c( this ) ;
1409 #if !TARGET_API_MAC_OSX
1410 // otherwise scrolling might have problems ?
1411 TPUpdateVisibility( m_controlRef
) ;
1413 SetTXNData( st
, kTXNStartOffset
, kTXNEndOffset
) ;
1414 TXNSetSelection( m_txn
, 0, 0);
1415 TXNShowSelection( m_txn
, kTXNShowStart
);
1418 TXNFrameOptions
wxMacMLTEControl::FrameOptionsFromWXStyle( long wxStyle
)
1420 TXNFrameOptions frameOptions
=
1421 kTXNDontDrawCaretWhenInactiveMask
;
1422 if ( ! ( wxStyle
& wxTE_NOHIDESEL
) )
1423 frameOptions
|= kTXNDontDrawSelectionWhenInactiveMask
;
1425 if ( wxStyle
& wxTE_MULTILINE
)
1427 if ( ! ( wxStyle
& wxTE_DONTWRAP
) )
1428 frameOptions
|= kTXNAlwaysWrapAtViewEdgeMask
;
1431 frameOptions
|= kTXNAlwaysWrapAtViewEdgeMask
;
1432 frameOptions
|= kTXNWantHScrollBarMask
;
1435 if ( !(wxStyle
& wxTE_NO_VSCROLL
) )
1436 frameOptions
|= kTXNWantVScrollBarMask
;
1439 frameOptions
|= kTXNSingleLineOnlyMask
;
1441 if ( wxStyle
& wxHSCROLL
)
1442 frameOptions
|= kTXNWantHScrollBarMask
;
1444 return frameOptions
;
1447 void wxMacMLTEControl::AdjustCreationAttributes( const wxColour
&background
, bool visible
)
1449 TXNControlTag iControlTags
[3] = { kTXNDoFontSubstitution
, kTXNWordWrapStateTag
};
1450 TXNControlData iControlData
[3] = { {false}, {kTXNNoAutoWrap
} };
1452 #if TARGET_API_MAC_OSX
1453 iControlTags
[2] = kTXNVisibilityTag
;
1454 iControlData
[2].uValue
= visible
;
1458 if ( m_windowStyle
& wxTE_MULTILINE
)
1460 if (m_windowStyle
& wxTE_DONTWRAP
)
1461 iControlData
[1].uValue
= kTXNNoAutoWrap
;
1463 iControlData
[1].uValue
= kTXNAutoWrap
;
1466 verify_noerr( TXNSetTXNObjectControls( m_txn
, false, toptag
,
1467 iControlTags
, iControlData
)) ;
1469 // setting the default font
1475 GetThemeFont(kThemeSystemFont
, GetApplicationScript() , fontName
, &fontSize
, &fontStyle
) ;
1477 TXNTypeAttributes typeAttr
[] =
1479 { kTXNQDFontNameAttribute
, kTXNQDFontNameAttributeSize
, { (void*) fontName
} } ,
1480 { kTXNQDFontSizeAttribute
, kTXNFontSizeAttributeSize
, { (void*) (fontSize
<< 16) } } ,
1481 { kTXNQDFontStyleAttribute
, kTXNQDFontStyleAttributeSize
, { (void*) normal
} } ,
1484 verify_noerr( TXNSetTypeAttributes (m_txn
, sizeof( typeAttr
) / sizeof(TXNTypeAttributes
) , typeAttr
,
1488 if ( m_windowStyle
& wxTE_PASSWORD
)
1491 verify_noerr(TXNEchoMode( m_txn
, c
, 0 , true )) ;
1494 TXNBackground tback
;
1495 tback
.bgType
= kTXNBackgroundTypeRGB
;
1496 tback
.bg
.color
= MAC_WXCOLORREF( background
.GetPixel() );
1497 TXNSetBackground( m_txn
, &tback
);
1500 void wxMacMLTEControl::SetBackground( const wxBrush
&brush
)
1502 // currently only solid background are supported
1503 TXNBackground tback
;
1504 tback
.bgType
= kTXNBackgroundTypeRGB
;
1505 tback
.bg
.color
= MAC_WXCOLORREF( brush
.GetColour().GetPixel() );
1506 TXNSetBackground( m_txn
, &tback
);
1509 void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr
& style
, long from
, long to
)
1511 TXNTypeAttributes typeAttr
[4] ;
1512 Str255 fontName
= "\pMonaco" ;
1513 SInt16 fontSize
= 12 ;
1514 Style fontStyle
= normal
;
1516 int attrCounter
= 0 ;
1517 if ( style
.HasFont() )
1519 const wxFont
&font
= style
.GetFont() ;
1520 wxMacStringToPascal( font
.GetFaceName() , fontName
) ;
1521 fontSize
= font
.GetPointSize() ;
1522 if ( font
.GetUnderlined() )
1523 fontStyle
|= underline
;
1524 if ( font
.GetWeight() == wxBOLD
)
1526 if ( font
.GetStyle() == wxITALIC
)
1527 fontStyle
|= italic
;
1529 typeAttr
[attrCounter
].tag
= kTXNQDFontNameAttribute
;
1530 typeAttr
[attrCounter
].size
= kTXNQDFontNameAttributeSize
;
1531 typeAttr
[attrCounter
].data
.dataPtr
= (void*) fontName
;
1532 typeAttr
[attrCounter
+1].tag
= kTXNQDFontSizeAttribute
;
1533 typeAttr
[attrCounter
+1].size
= kTXNFontSizeAttributeSize
;
1534 typeAttr
[attrCounter
+1].data
.dataValue
= (fontSize
<< 16) ;
1535 typeAttr
[attrCounter
+2].tag
= kTXNQDFontStyleAttribute
;
1536 typeAttr
[attrCounter
+2].size
= kTXNQDFontStyleAttributeSize
;
1537 typeAttr
[attrCounter
+2].data
.dataValue
= fontStyle
;
1540 if ( style
.HasTextColour() )
1542 typeAttr
[attrCounter
].tag
= kTXNQDFontColorAttribute
;
1543 typeAttr
[attrCounter
].size
= kTXNQDFontColorAttributeSize
;
1544 typeAttr
[attrCounter
].data
.dataPtr
= (void*) &color
;
1545 color
= MAC_WXCOLORREF(style
.GetTextColour().GetPixel()) ;
1548 if ( attrCounter
> 0 )
1550 verify_noerr( TXNSetTypeAttributes ( m_txn
, attrCounter
, typeAttr
, from
, to
) );
1554 void wxMacMLTEControl::SetFont( const wxFont
& font
, const wxColour
& foreground
, long windowStyle
)
1556 EditHelper
help(m_txn
) ;
1557 TXNSetAttribute( wxTextAttr(foreground
,wxNullColour
,font
) , kTXNStartOffset
,kTXNEndOffset
) ;
1559 void wxMacMLTEControl::SetStyle(long start
, long end
, const wxTextAttr
& style
)
1561 EditHelper
help(m_txn
) ;
1562 TXNSetAttribute( style
, start
,end
) ;
1565 void wxMacMLTEControl::Copy()
1567 ClearCurrentScrap();
1569 TXNConvertToPublicScrap();
1572 void wxMacMLTEControl::Cut()
1574 ClearCurrentScrap();
1576 TXNConvertToPublicScrap();
1579 void wxMacMLTEControl::Paste()
1581 TXNConvertFromPublicScrap();
1585 bool wxMacMLTEControl::CanPaste() const
1587 return TXNIsScrapPastable() ;
1590 void wxMacMLTEControl::SetEditable(bool editable
)
1592 TXNControlTag tag
[] = { kTXNIOPrivilegesTag
} ;
1593 TXNControlData data
[] = { { editable
? kTXNReadWrite
: kTXNReadOnly
} } ;
1594 TXNSetTXNObjectControls( m_txn
, false , sizeof(tag
) / sizeof (TXNControlTag
) , tag
, data
) ;
1597 long wxMacMLTEControl::GetLastPosition() const
1599 long actualsize
= 0 ;
1602 OSErr err
= TXNGetDataEncoded( m_txn
, kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNTextData
);
1610 actualsize
= GetHandleSize( theText
) ;
1611 DisposeHandle( theText
) ;
1617 void wxMacMLTEControl::Replace( long from
, long to
, const wxString str
)
1619 wxString value
= str
;
1620 wxMacConvertNewlines10To13( &value
) ;
1622 EditHelper
help( m_txn
) ;
1624 TXNSetSelection(m_txn
, from
, to
) ;
1626 SetTXNData( value
, kTXNUseCurrentSelection
, kTXNUseCurrentSelection
) ;
1629 void wxMacMLTEControl::Remove( long from
, long to
)
1631 EditHelper
help( m_txn
) ;
1633 TXNSetSelection(m_txn
, from
, to
) ;
1637 void wxMacMLTEControl::GetSelection( long* from
, long* to
) const
1639 TXNGetSelection( m_txn
, (TXNOffset
*) from
, (TXNOffset
*) to
) ;
1642 void wxMacMLTEControl::SetSelection( long from
, long to
)
1644 /* change the selection */
1645 if ((from
== -1) && (to
== -1))
1646 TXNSelectAll(m_txn
);
1648 TXNSetSelection( m_txn
, from
, to
);
1649 TXNShowSelection( m_txn
, kTXNShowStart
);
1652 void wxMacMLTEControl::WriteText(const wxString
& str
)
1654 EditHelper
helper( m_txn
) ;
1656 wxMacConvertNewlines10To13( &st
) ;
1658 long start
, end
, dummy
;
1659 GetSelection( &start
, &dummy
) ;
1660 SetTXNData( st
, kTXNUseCurrentSelection
, kTXNUseCurrentSelection
) ;
1661 GetSelection( &dummy
, &end
) ;
1662 // TODO SetStyle( start , end , GetDefaultStyle() ) ;
1665 void wxMacMLTEControl::Clear()
1667 EditHelper
st(m_txn
) ;
1668 TXNSetSelection( m_txn
, kTXNStartOffset
, kTXNEndOffset
) ;
1672 bool wxMacMLTEControl::CanUndo() const
1674 return TXNCanUndo( m_txn
, NULL
) ;
1677 void wxMacMLTEControl::Undo()
1682 bool wxMacMLTEControl::CanRedo() const
1684 return TXNCanRedo( m_txn
, NULL
) ;
1687 void wxMacMLTEControl::Redo()
1692 int wxMacMLTEControl::GetNumberOfLines() const
1694 ItemCount lines
= 0 ;
1695 TXNGetLineCount(m_txn
, &lines
) ;
1699 long wxMacMLTEControl::XYToPosition(long x
, long y
) const
1703 long lastpos
= GetLastPosition() ;
1705 // TODO find a better implementation : while we can get the
1706 // line metrics of a certain line, we don't get its starting
1707 // position, so it would probably be rather a binary search
1708 // for the start position
1711 int lastHeight
= 0 ;
1714 for ( n
= 0 ; n
<= (ItemCount
) lastpos
; ++n
)
1716 if ( y
== ypos
&& x
== xpos
)
1719 TXNOffsetToPoint( m_txn
, n
, &curpt
);
1721 if ( curpt
.v
> lastHeight
)
1726 lastHeight
= curpt
.v
;
1734 bool wxMacMLTEControl::PositionToXY(long pos
, long *x
, long *y
) const
1738 long lastpos
= GetLastPosition() ;
1743 if ( pos
<= lastpos
)
1745 // TODO find a better implementation : while we can get the
1746 // line metrics of a certain line, we don't get its starting
1747 // position, so it would probably be rather a binary search
1748 // for the start position
1751 int lastHeight
= 0 ;
1754 for ( n
= 0 ; n
<= (ItemCount
) pos
; ++n
)
1756 TXNOffsetToPoint(m_txn
, n
, &curpt
);
1758 if ( curpt
.v
> lastHeight
)
1763 lastHeight
= curpt
.v
;
1768 if ( y
) *y
= ypos
;
1769 if ( x
) *x
= xpos
;
1775 void wxMacMLTEControl::ShowPosition( long pos
)
1777 #if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER)
1781 TXNOffset selstart
, selend
;
1782 TXNGetSelection( m_txn
, &selstart
, &selend
) ;
1783 TXNOffsetToPoint( m_txn
, selstart
, ¤t
);
1784 TXNOffsetToPoint( m_txn
, pos
, &desired
);
1785 //TODO use HIPoints for 10.3 and above
1786 if ( (UInt32
) TXNScroll
!= (UInt32
) kUnresolvedCFragSymbolAddress
)
1788 OSErr theErr
= noErr
;
1789 SInt32 dv
= desired
.v
- current
.v
;
1790 SInt32 dh
= desired
.h
- current
.h
;
1791 TXNShowSelection( m_txn
, true ) ;
1792 theErr
= TXNScroll( m_txn
, kTXNScrollUnitsInPixels
, kTXNScrollUnitsInPixels
, &dv
, &dh
);
1793 wxASSERT_MSG( theErr
== noErr
, _T("TXNScroll returned an error!") );
1799 void wxMacMLTEControl::SetTXNData( const wxString
& st
, TXNOffset start
, TXNOffset end
)
1802 #if SIZEOF_WCHAR_T == 2
1803 size_t len
= st
.Len() ;
1804 TXNSetData( m_txn
, kTXNUnicodeTextData
, (void*)st
.wc_str(), len
* 2,
1807 wxMBConvUTF16BE converter
;
1808 ByteCount byteBufferLen
= converter
.WC2MB( NULL
, st
.wc_str() , 0 ) ;
1809 UniChar
*unibuf
= (UniChar
*) malloc(byteBufferLen
) ;
1810 converter
.WC2MB( (char*) unibuf
, st
.wc_str() , byteBufferLen
) ;
1811 TXNSetData( m_txn
, kTXNUnicodeTextData
, (void*)unibuf
, byteBufferLen
,
1816 wxCharBuffer text
= st
.mb_str(wxConvLocal
) ;
1817 TXNSetData( m_txn
, kTXNTextData
, (void*)text
.data(), strlen( text
) ,
1823 wxString
wxMacMLTEControl::GetLineText(long lineNo
) const
1827 if ( lineNo
< GetNumberOfLines() )
1835 // get the first possible position in the control
1837 TXNOffsetToPoint(m_txn
, 0, &firstPoint
);
1839 // Iterate through the lines until we reach the one we want,
1840 // adding to our current y pixel point position
1841 while (ypos
< lineNo
)
1843 TXNGetLineMetrics(m_txn
, ypos
++, &lineWidth
, &lineHeight
);
1844 currentHeight
+= lineHeight
;
1847 Point thePoint
= { firstPoint
.v
+ (currentHeight
>> 16), firstPoint
.h
+ (0) };
1848 TXNOffset theOffset
;
1849 TXNPointToOffset(m_txn
, thePoint
, &theOffset
);
1851 wxString content
= GetStringValue() ;
1852 Point currentPoint
= thePoint
;
1853 while(thePoint
.v
== currentPoint
.v
&& theOffset
< content
.length())
1855 line
+= content
[theOffset
];
1856 TXNOffsetToPoint(m_txn
, ++theOffset
, ¤tPoint
);
1862 int wxMacMLTEControl::GetLineLength(long lineNo
) const
1866 if ( lineNo
< GetNumberOfLines() )
1874 // get the first possible position in the control
1876 TXNOffsetToPoint(m_txn
, 0, &firstPoint
);
1878 // Iterate through the lines until we reach the one we want,
1879 // adding to our current y pixel point position
1880 while (ypos
< lineNo
)
1882 TXNGetLineMetrics(m_txn
, ypos
++, &lineWidth
, &lineHeight
);
1883 currentHeight
+= lineHeight
;
1886 Point thePoint
= { firstPoint
.v
+ (currentHeight
>> 16), firstPoint
.h
+ (0) };
1887 TXNOffset theOffset
;
1888 TXNPointToOffset(m_txn
, thePoint
, &theOffset
);
1890 wxString content
= GetStringValue() ;
1891 Point currentPoint
= thePoint
;
1892 while(thePoint
.v
== currentPoint
.v
&& theOffset
< content
.length())
1895 TXNOffsetToPoint(m_txn
, ++theOffset
, ¤tPoint
);
1902 // ----------------------------------------------------------------------------
1903 // MLTE control implementation (classic part)
1904 // ----------------------------------------------------------------------------
1906 // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
1907 // the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
1908 // moment is to avoid setting the true focus on the control, the proper solution at the end would be to have
1909 // an alternate path for carbon key events that routes automatically into the same wx flow of events
1913 /* kmUPTextPart is the part code we return to indicate the user has clicked
1914 in the text area of our control */
1915 #define kmUPTextPart 1
1918 /* routines for using existing user pane controls.
1919 These routines are useful for cases where you would like to use an
1920 existing user pane control in, say, a dialog window as a scrolling
1923 /* Utility Routines */
1925 /* kUserClickedToFocusPart is a part code we pass to the SetKeyboardFocus
1926 routine. In our focus switching routine this part code is understood
1927 as meaning 'the user has clicked in the control and we need to switch
1928 the current focus to ourselves before we can continue'. */
1929 #define kUserClickedToFocusPart 100
1931 /* STPTextPaneVars is a structure used for storing the the mUP Control's
1932 internal variables and state information. A handle to this record is
1933 stored in the pane control's reference value field using the
1934 SetControlReference routine. */
1936 class STPTextPaneVars
{
1938 /* OS records referenced */
1939 TXNObject fTXNRec
; /* the txn record */
1940 TXNFrameID fTXNFrame
; /* the txn frame ID */
1941 ControlRef fUserPaneRec
; /* handle to the user pane control */
1942 WindowPtr fOwner
; /* window containing control */
1943 GrafPtr fDrawingEnvironment
; /* grafport where control is drawn */
1945 Boolean fInFocus
; /* true while the focus rect is drawn around the control */
1946 Boolean fIsActive
; /* true while the control is drawn in the active state */
1947 Boolean fTXNObjectActive
; /* reflects the activation state of the text edit record */
1948 Boolean fFocusDrawState
; /* true if focus is drawn (default: true) */
1949 /* calculated locations */
1950 Rect fRBounds
; /* control bounds */
1951 Rect fRTextArea
; /* area where the text is drawn */
1952 Rect fRFocusOutline
; /* rectangle used to draw the focus box */
1953 Rect fRTextOutline
; /* rectangle used to draw the border */
1954 RgnHandle fRTextOutlineRegion
; /* background region for the text, erased before calling TEUpdate */
1955 /* our focus advance override routine */
1956 EventHandlerUPP handlerUPP
;
1957 EventHandlerRef handlerRef
;
1963 /* Univerals Procedure Pointer variables used by the
1964 mUP Control. These variables are set up
1965 the first time that mUPOpenControl is called. */
1966 ControlUserPaneDrawUPP gTPDrawProc
= NULL
;
1967 ControlUserPaneHitTestUPP gTPHitProc
= NULL
;
1968 ControlUserPaneTrackingUPP gTPTrackProc
= NULL
;
1969 ControlUserPaneIdleUPP gTPIdleProc
= NULL
;
1970 ControlUserPaneKeyDownUPP gTPKeyProc
= NULL
;
1971 ControlUserPaneActivateUPP gTPActivateProc
= NULL
;
1972 ControlUserPaneFocusUPP gTPFocusProc
= NULL
;
1974 // one place for calculating all
1975 static void TPCalculateBounds(STPTextPaneVars
*varsp
, const Rect
& bounds
)
1977 SetRect(&varsp
->fRBounds
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
1978 SetRect(&varsp
->fRFocusOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
1979 // eventually make TextOutline inset 1,1
1980 SetRect(&varsp
->fRTextOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
1981 if ( !varsp
->fNoBorders
)
1983 SetRect(&varsp
->fRTextArea
, bounds
.left
+ 2 , bounds
.top
+ (varsp
->fMultiline
? 0 : 2) ,
1984 bounds
.right
- (varsp
->fMultiline
? 0 : 2), bounds
.bottom
- (varsp
->fMultiline
? 0 : 2));
1988 SetRect(&varsp
->fRTextArea
, bounds
.left
, bounds
.top
,
1989 bounds
.right
, bounds
.bottom
);
1993 OSStatus
MLTESetObjectVisibility( STPTextPaneVars
*varsp
, Boolean vis
, long wxStyle
)
1995 OSStatus err
= noErr
;
1996 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(varsp
->fUserPaneRec
);
1999 #if TARGET_API_MAC_OSX
2000 TXNControlTag iControlTags
[1] = { kTXNVisibilityTag
};
2001 TXNControlData iControlData
[1] = {{ vis
}};
2002 err
= ::TXNSetTXNObjectControls( varsp
->fTXNRec
, false, 1, iControlTags
, iControlData
);
2005 UMAGetControlBoundsInWindowCoords( varsp
->fUserPaneRec
, &bounds
);
2006 TPCalculateBounds( varsp
, bounds
) ;
2009 wxMacWindowClipper
cl(textctrl
) ;
2010 TXNSetFrameBounds( varsp
->fTXNRec
, varsp
->fRTextArea
.top
, varsp
->fRTextArea
.left
,
2011 varsp
->fRTextArea
.bottom
, varsp
->fRTextArea
.right
, varsp
->fTXNFrame
);
2012 TXNShowSelection( varsp
->fTXNRec
, kTXNShowStart
);
2016 #if TARGET_API_MAC_OSX
2017 // in 10.2 the scrollbars are still actively redrawn when using only the code above
2018 if ( UMAGetSystemVersion() < 0x1030 )
2020 TXNSetFrameBounds( varsp
->fTXNRec
, varsp
->fRTextArea
.top
+ 20000 , varsp
->fRTextArea
.left
+ 20000 ,
2021 varsp
->fRTextArea
.bottom
+ 20000 , varsp
->fRTextArea
.right
+ 20000 , varsp
->fTXNFrame
);
2030 // make sure we don't miss changes as carbon events are not available for these under classic
2031 static void TPUpdateVisibility(ControlRef theControl
) {
2032 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2033 if ( textctrl
== NULL
)
2036 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2039 UMAGetControlBoundsInWindowCoords(theControl
, &bounds
);
2040 if ( textctrl
->MacIsReallyShown() != varsp
->fVisible
)
2042 // invalidate old position
2043 // InvalWindowRect( GetControlOwner( theControl ) , &varsp->fRBounds ) ;
2044 varsp
->fVisible
= textctrl
->MacIsReallyShown() ;
2046 if ( !EqualRect( &bounds
, &varsp
->fRBounds
) )
2049 Rect oldBounds
= varsp
->fRBounds
;
2050 TPCalculateBounds( varsp
, bounds
) ;
2051 // we only recalculate when visible, otherwise scrollbars get drawn at incorrect places
2052 if ( varsp
->fVisible
)
2054 wxMacWindowClipper
cl(textctrl
) ;
2055 TXNSetFrameBounds( varsp
->fTXNRec
, varsp
->fRTextArea
.top
, varsp
->fRTextArea
.left
,
2056 varsp
->fRTextArea
.bottom
, varsp
->fRTextArea
.right
, varsp
->fTXNFrame
);
2058 InvalWindowRect( GetControlOwner( theControl
) , &oldBounds
) ;
2059 InvalWindowRect( GetControlOwner( theControl
) , &varsp
->fRBounds
) ;
2063 // make correct activations
2064 static void TPActivatePaneText(STPTextPaneVars
*varsp
, Boolean setActive
) {
2066 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(varsp
->fUserPaneRec
);
2067 if (varsp
->fTXNObjectActive
!= setActive
&& textctrl
->MacIsReallyShown() )
2069 varsp
->fTXNObjectActive
= setActive
;
2070 TXNActivate(varsp
->fTXNRec
, varsp
->fTXNFrame
, varsp
->fTXNObjectActive
);
2071 if (varsp
->fInFocus
)
2072 TXNFocus( varsp
->fTXNRec
, varsp
->fTXNObjectActive
);
2076 // update focus outlines
2077 static void TPRedrawFocusOutline(STPTextPaneVars
*varsp
) {
2080 if (varsp
->fFocusDrawState
!= (varsp
->fIsActive
&& varsp
->fInFocus
))
2082 varsp
->fFocusDrawState
= (varsp
->fIsActive
&& varsp
->fInFocus
);
2083 // DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fFocusDrawState);
2087 // update TXN focus state
2088 static void TPFocusPaneText(STPTextPaneVars
*varsp
, Boolean setFocus
) {
2089 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(varsp
->fUserPaneRec
);
2091 if (varsp
->fInFocus
!= setFocus
&& textctrl
->MacIsReallyShown()) {
2092 varsp
->fInFocus
= setFocus
;
2093 TXNFocus( varsp
->fTXNRec
, varsp
->fInFocus
);
2098 static pascal void TPPaneDrawProc(ControlRef theControl
, ControlPartCode thePart
) {
2099 /* set up our globals */
2101 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2102 if ( textctrl
== NULL
)
2104 TPUpdateVisibility( theControl
) ;
2106 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2107 if ( textctrl
->MacIsReallyShown() )
2109 wxMacWindowClipper
clipper( textctrl
) ;
2110 TXNDraw(varsp
->fTXNRec
, NULL
);
2111 if ( !varsp
->fNoBorders
)
2112 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
2113 TPRedrawFocusOutline( varsp
) ;
2119 /* TPPaneHitTestProc is called when the control manager would
2120 like to determine what part of the control the mouse resides over.
2121 We also call this routine from our tracking proc to determine how
2122 to handle mouse clicks. */
2123 static pascal ControlPartCode
TPPaneHitTestProc(ControlRef theControl
, Point where
) {
2124 ControlPartCode result
;
2125 /* set up our locals and lock down our globals*/
2127 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2128 if ( textctrl
== NULL
)
2130 TPUpdateVisibility( theControl
) ;
2131 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2132 if (textctrl
->MacIsReallyShown() )
2134 if (PtInRect(where
, &varsp
->fRBounds
))
2135 result
= kmUPTextPart
;
2138 // sometimes we get the coords also in control local coordinates, therefore test again
2139 if ( textctrl
->MacGetTopLevelWindow()->MacUsesCompositing() )
2142 textctrl
->MacClientToRootWindow( &x
, &y
) ;
2146 if (PtInRect(where
, &varsp
->fRBounds
))
2147 result
= kmUPTextPart
;
2159 /* TPPaneTrackingProc is called when the mouse is being held down
2160 over our control. This routine handles clicks in the text area
2161 and in the scroll bar. */
2162 static pascal ControlPartCode
TPPaneTrackingProc(ControlRef theControl
, Point startPt
, ControlActionUPP actionProc
) {
2164 ControlPartCode partCodeResult
;
2165 /* make sure we have some variables... */
2167 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2168 if ( textctrl
== NULL
)
2170 TPUpdateVisibility( theControl
) ;
2171 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2172 if (textctrl
->MacIsReallyShown() )
2174 /* we don't do any of these functions unless we're in focus */
2175 if ( ! varsp
->fInFocus
) {
2177 owner
= GetControlOwner(theControl
);
2178 ClearKeyboardFocus(owner
);
2179 SetKeyboardFocus(owner
, theControl
, kUserClickedToFocusPart
);
2181 /* find the location for the click */
2182 // for compositing, we must convert these into toplevel window coordinates, because hittesting expects them
2183 if ( textctrl
->MacGetTopLevelWindow()->MacUsesCompositing() )
2186 textctrl
->MacClientToRootWindow( &x
, &y
) ;
2191 switch (TPPaneHitTestProc(theControl
, startPt
))
2194 /* handle clicks in the text part */
2197 wxMacWindowClipper
clipper( textctrl
) ;
2200 ConvertEventRefToEventRecord( (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec
) ;
2201 TXNClick( varsp
->fTXNRec
, &rec
);
2208 return partCodeResult
;
2212 /* TPPaneIdleProc is our user pane idle routine. When our text field
2213 is active and in focus, we use this routine to set the cursor. */
2214 static pascal void TPPaneIdleProc(ControlRef theControl
) {
2216 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2217 if ( textctrl
== NULL
)
2219 TPUpdateVisibility( theControl
) ;
2220 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2221 if (textctrl
->MacIsReallyShown()) {
2222 /* if we're not active, then we have nothing to say about the cursor */
2223 if (varsp
->fIsActive
) {
2227 wxMacWindowClipper
clipper( textctrl
) ;
2229 /* there's a 'focus thing' and an 'unfocused thing' */
2230 if (varsp
->fInFocus
) {
2231 /* flash the cursor */
2232 SetPort(varsp
->fDrawingEnvironment
);
2233 TXNIdle(varsp
->fTXNRec
);
2234 /* set the cursor */
2235 if (PtInRect(mousep
, &varsp
->fRTextArea
)) {
2237 RectRgn((theRgn
= NewRgn()), &varsp
->fRTextArea
);
2238 TXNAdjustCursor(varsp
->fTXNRec
, theRgn
);
2243 // SetThemeCursor(kThemeArrowCursor);
2246 /* if it's in our bounds, set the cursor */
2247 UMAGetControlBoundsInWindowCoords(theControl
, &bounds
);
2248 if (PtInRect(mousep
, &bounds
))
2250 // SetThemeCursor(kThemeArrowCursor);
2258 /* TPPaneKeyDownProc is called whenever a keydown event is directed
2259 at our control. Here, we direct the keydown event to the text
2260 edit record and redraw the scroll bar and text field as appropriate. */
2261 static pascal ControlPartCode
TPPaneKeyDownProc(ControlRef theControl
,
2262 SInt16 keyCode
, SInt16 charCode
, SInt16 modifiers
) {
2264 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2265 if ( textctrl
== NULL
)
2267 TPUpdateVisibility( theControl
) ;
2269 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2270 if (varsp
->fInFocus
)
2272 /* turn autoscrolling on and send the key event to text edit */
2273 wxMacWindowClipper
clipper( textctrl
) ;
2275 memset( &ev
, 0 , sizeof( ev
) ) ;
2277 ev
.modifiers
= modifiers
;
2278 ev
.message
= (( keyCode
<< 8 ) & keyCodeMask
) + ( charCode
& charCodeMask
) ;
2279 TXNKeyDown( varsp
->fTXNRec
, &ev
);
2281 return kControlEntireControl
;
2285 /* TPPaneActivateProc is called when the window containing
2286 the user pane control receives activate events. Here, we redraw
2287 the control and it's text as necessary for the activation state. */
2288 static pascal void TPPaneActivateProc(ControlRef theControl
, Boolean activating
) {
2290 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2292 if ( textctrl
== NULL
)
2294 TPUpdateVisibility( theControl
) ;
2296 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2298 varsp
->fIsActive
= activating
;
2299 wxMacWindowClipper
clipper( textctrl
) ;
2300 TPActivatePaneText(varsp
, varsp
->fIsActive
&& varsp
->fInFocus
);
2301 /* redraw the frame */
2302 if ( textctrl
->MacIsReallyShown() )
2304 if ( !varsp
->fNoBorders
)
2305 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
2306 TPRedrawFocusOutline( varsp
) ;
2311 /* TPPaneFocusProc is called when every the focus changes to or
2312 from our control. Herein, switch the focus appropriately
2313 according to the parameters and redraw the control as
2315 static pascal ControlPartCode
TPPaneFocusProc(ControlRef theControl
, ControlFocusPart action
) {
2316 ControlPartCode focusResult
;
2318 focusResult
= kControlFocusNoPart
;
2319 wxTextCtrl
* textctrl
= (wxTextCtrl
*) GetControlReference(theControl
);
2320 if ( textctrl
== NULL
)
2322 TPUpdateVisibility( theControl
) ;
2323 STPTextPaneVars
*varsp
= (STPTextPaneVars
*) ((wxMacMLTEClassicControl
*)textctrl
->GetPeer())->m_macTXNvars
;
2324 /* if kControlFocusPrevPart and kControlFocusNextPart are received when the user is
2325 tabbing forwards (or shift tabbing backwards) through the items in the dialog,
2326 and kControlFocusNextPart will be received. When the user clicks in our field
2327 and it is not the current focus, then the constant kUserClickedToFocusPart will
2328 be received. The constant kControlFocusNoPart will be received when our control
2329 is the current focus and the user clicks in another control. In your focus routine,
2330 you should respond to these codes as follows:
2332 kControlFocusNoPart - turn off focus and return kControlFocusNoPart. redraw
2333 the control and the focus rectangle as necessary.
2335 kControlFocusPrevPart or kControlFocusNextPart - toggle focus on or off
2336 depending on its current state. redraw the control and the focus rectangle
2337 as appropriate for the new focus state. If the focus state is 'off', return the constant
2338 kControlFocusNoPart, otherwise return a non-zero part code.
2339 kUserClickedToFocusPart - is a constant defined for this example. You should
2340 define your own value for handling click-to-focus type events. */
2341 /* calculate the next highlight state */
2344 case kControlFocusNoPart
:
2345 TPFocusPaneText(varsp
, false);
2346 focusResult
= kControlFocusNoPart
;
2348 case kUserClickedToFocusPart
:
2349 TPFocusPaneText(varsp
, true);
2352 case kControlFocusPrevPart
:
2353 case kControlFocusNextPart
:
2354 TPFocusPaneText(varsp
, ( ! varsp
->fInFocus
));
2355 focusResult
= varsp
->fInFocus
? 1 : kControlFocusNoPart
;
2358 TPActivatePaneText(varsp
, varsp
->fIsActive
&& varsp
->fInFocus
);
2359 /* redraw the text fram and focus rectangle to indicate the
2361 if ( textctrl
->MacIsReallyShown() )
2363 wxMacWindowClipper
c( textctrl
) ;
2364 if ( !varsp
->fNoBorders
)
2365 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
2366 TPRedrawFocusOutline( varsp
) ;
2371 wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxWindow
*wxPeer
,
2372 const wxString
& str
,
2374 const wxSize
& size
, long style
)
2376 m_font
= wxPeer
->GetFont() ;
2377 m_windowStyle
= style
;
2378 Rect bounds
= wxMacGetBoundsForControl( wxPeer
, pos
, size
) ;
2380 wxMacConvertNewlines10To13( &st
) ;
2384 featurSet
= kControlSupportsEmbedding
| kControlSupportsFocus
| kControlWantsIdle
2385 | kControlWantsActivate
| kControlHandlesTracking
| kControlHasSpecialBackground
2386 | kControlGetsFocusOnClick
| kControlSupportsLiveFeedback
;
2387 /* create the control */
2389 verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(wxPeer
->GetParent()->MacGetTopLevelWindowRef()), &bounds
, featurSet
, &m_controlRef
) );
2392 // wxMacWindowClipper c(wxPeer) ;
2396 if ( wxPeer
->MacIsReallyShown() )
2397 MLTESetObjectVisibility( (STPTextPaneVars
*) m_macTXNvars
, true , style
) ;
2400 // wxMacWindowClipper clipper( wxPeer ) ;
2402 TPUpdateVisibility( m_controlRef
) ;
2404 SetTXNData( st
, kTXNStartOffset
, kTXNEndOffset
) ;
2406 TXNSetSelection( m_txn
, 0, 0);
2407 TXNShowSelection( m_txn
, kTXNShowStart
);
2410 AdjustCreationAttributes( *wxWHITE
, true ) ;
2413 wxMacMLTEClassicControl::~wxMacMLTEClassicControl()
2415 // SetControlReference(m_controlRef , 0) ;
2416 TXNDeleteObject(m_txn
);
2420 void wxMacMLTEClassicControl::VisibilityChanged(bool shown
)
2422 MLTESetObjectVisibility((STPTextPaneVars
*) m_macTXNvars
, shown
, m_windowStyle
) ;
2424 InvalWindowRect( GetControlOwner( m_controlRef
) , &((STPTextPaneVars
*)m_macTXNvars
)->fRBounds
) ;
2427 bool wxMacMLTEClassicControl::NeedsFocusRect() const
2432 OSStatus
wxMacMLTEClassicControl::DoCreate()
2435 WindowRef theWindow
;
2437 OSStatus err
= noErr
;
2439 /* set up our globals */
2440 if (gTPDrawProc
== NULL
) gTPDrawProc
= NewControlUserPaneDrawUPP(TPPaneDrawProc
);
2441 if (gTPHitProc
== NULL
) gTPHitProc
= NewControlUserPaneHitTestUPP(TPPaneHitTestProc
);
2442 if (gTPTrackProc
== NULL
) gTPTrackProc
= NewControlUserPaneTrackingUPP(TPPaneTrackingProc
);
2443 if (gTPIdleProc
== NULL
) gTPIdleProc
= NewControlUserPaneIdleUPP(TPPaneIdleProc
);
2444 if (gTPKeyProc
== NULL
) gTPKeyProc
= NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc
);
2445 if (gTPActivateProc
== NULL
) gTPActivateProc
= NewControlUserPaneActivateUPP(TPPaneActivateProc
);
2446 if (gTPFocusProc
== NULL
) gTPFocusProc
= NewControlUserPaneFocusUPP(TPPaneFocusProc
);
2448 /* allocate our private storage */
2449 m_macTXNvars
= (STPTextPaneVars
*) malloc(sizeof(STPTextPaneVars
));
2451 /* set the initial settings for our private data */
2452 m_macTXNvars
->fMultiline
= m_windowStyle
& wxTE_MULTILINE
;
2453 m_macTXNvars
->fNoBorders
= m_windowStyle
& wxNO_BORDER
;
2454 m_macTXNvars
->fInFocus
= false;
2455 m_macTXNvars
->fIsActive
= true;
2456 m_macTXNvars
->fTXNObjectActive
= false;
2457 m_macTXNvars
->fFocusDrawState
= false ;
2458 m_macTXNvars
->fUserPaneRec
= m_controlRef
;
2459 m_macTXNvars
->fVisible
= true ;
2461 theWindow
= m_macTXNvars
->fOwner
= GetControlOwner(m_controlRef
);
2463 m_macTXNvars
->fDrawingEnvironment
= (GrafPtr
) GetWindowPort(theWindow
);
2465 /* set up the user pane procedures */
2466 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneDrawProcTag
, sizeof(gTPDrawProc
), &gTPDrawProc
);
2467 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneHitTestProcTag
, sizeof(gTPHitProc
), &gTPHitProc
);
2468 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneTrackingProcTag
, sizeof(gTPTrackProc
), &gTPTrackProc
);
2469 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneIdleProcTag
, sizeof(gTPIdleProc
), &gTPIdleProc
);
2470 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneKeyDownProcTag
, sizeof(gTPKeyProc
), &gTPKeyProc
);
2471 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneActivateProcTag
, sizeof(gTPActivateProc
), &gTPActivateProc
);
2472 SetControlData(m_controlRef
, kControlEntireControl
, kControlUserPaneFocusProcTag
, sizeof(gTPFocusProc
), &gTPFocusProc
);
2474 /* calculate the rectangles used by the control */
2475 UMAGetControlBoundsInWindowCoords(m_controlRef
, &bounds
);
2476 m_macTXNvars
->fRTextOutlineRegion
= NewRgn() ;
2477 TPCalculateBounds( m_macTXNvars
, bounds
) ;
2479 /* set up the drawing environment */
2480 SetPort(m_macTXNvars
->fDrawingEnvironment
);
2482 /* create the new edit field */
2484 TXNFrameOptions frameOptions
= FrameOptionsFromWXStyle( m_windowStyle
) ;
2486 verify_noerr(TXNNewObject(NULL
, m_macTXNvars
->fOwner
, &m_macTXNvars
->fRTextArea
,
2488 kTXNTextEditStyleFrameType
,
2490 kTXNSystemDefaultEncoding
,
2491 &m_macTXNvars
->fTXNRec
, &m_macTXNvars
->fTXNFrame
, (TXNObjectRefcon
) m_macTXNvars
));
2492 m_txn
= m_macTXNvars
->fTXNRec
;
2494 /* perform final activations and setup for our text field. Here,
2495 we assume that the window is going to be the 'active' window. */
2496 TPActivatePaneText(m_macTXNvars
, m_macTXNvars
->fIsActive
&& m_macTXNvars
->fInFocus
);
2501 // ----------------------------------------------------------------------------
2502 // MLTE control implementation (OSX part)
2503 // ----------------------------------------------------------------------------
2505 #if TARGET_API_MAC_OSX
2507 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
2509 wxMacMLTEHIViewControl::wxMacMLTEHIViewControl( wxWindow
*wxPeer
,
2510 const wxString
& str
,
2512 const wxSize
& size
, long style
)
2514 m_font
= wxPeer
->GetFont() ;
2515 m_windowStyle
= style
;
2516 Rect bounds
= wxMacGetBoundsForControl( wxPeer
, pos
, size
) ;
2518 wxMacConvertNewlines10To13( &st
) ;
2520 HIRect hr
= { bounds
.left
, bounds
.top
, bounds
.right
- bounds
.left
, bounds
.bottom
- bounds
.top
} ;
2522 m_scrollView
= NULL
;
2523 TXNFrameOptions frameOptions
= FrameOptionsFromWXStyle( style
) ;
2524 if ( frameOptions
& (kTXNWantVScrollBarMask
|kTXNWantHScrollBarMask
) )
2526 HIScrollViewCreate(( frameOptions
& kTXNWantHScrollBarMask
? kHIScrollViewOptionsHorizScroll
: 0) |
2527 ( frameOptions
& kTXNWantVScrollBarMask
? kHIScrollViewOptionsVertScroll
: 0 ) , &m_scrollView
) ;
2529 HIViewSetFrame( m_scrollView
, &hr
);
2530 HIViewSetVisible( m_scrollView
, true );
2534 HITextViewCreate( NULL
, 0, frameOptions
, &m_textView
) ;
2535 m_txn
= HITextViewGetTXNObject( m_textView
) ;
2536 HIViewSetVisible( m_textView
, true ) ;
2539 HIViewAddSubview( m_scrollView
, m_textView
) ;
2540 m_controlRef
= m_scrollView
;
2541 wxPeer
->MacInstallEventHandler( (WXWidget
) m_textView
) ;
2545 HIViewSetFrame( m_textView
, &hr
);
2546 m_controlRef
= m_textView
;
2550 SetTXNData( st
, kTXNStartOffset
, kTXNEndOffset
) ;
2552 TXNSetSelection( m_txn
, 0, 0);
2553 TXNShowSelection( m_txn
, kTXNShowStart
);
2555 AdjustCreationAttributes( *wxWHITE
, true ) ;
2558 OSStatus
wxMacMLTEHIViewControl::SetFocus( ControlFocusPart focusPart
)
2560 return SetKeyboardFocus( GetControlOwner( m_textView
) ,
2561 m_textView
, focusPart
) ;
2564 bool wxMacMLTEHIViewControl::HasFocus() const
2566 ControlRef control
;
2567 GetKeyboardFocus( GetUserFocusWindow() , &control
) ;
2568 return control
== m_textView
;
2571 bool wxMacMLTEHIViewControl::NeedsFocusRect() const
2573 return m_windowStyle
& wxNO_BORDER
? false : true;
2576 #endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
2581 #endif // wxUSE_TEXTCTRL