1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "textctrl.h" 
  21   #include <sys/types.h> 
  27 #include "wx/msgdlg.h" 
  29 #if wxUSE_STD_IOSTREAM 
  39 #include "wx/button.h" 
  40 #include "wx/toplevel.h" 
  41 #include "wx/textctrl.h" 
  42 #include "wx/notebook.h" 
  43 #include "wx/tabctrl.h" 
  44 #include "wx/settings.h" 
  45 #include "wx/filefn.h" 
  48 #if defined(__BORLANDC__) && !defined(__WIN32__) 
  50 #elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__) 
  57 #include <MacTextEditor.h> 
  58 #include <ATSUnicode.h> 
  59 #include <TextCommon.h> 
  60 #include <TextEncodingConverter.h> 
  61 #include "wx/mac/uma.h" 
  63 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL 
  65 extern wxControl 
*wxFindControlFromMacControl(ControlHandle inControl 
) ; 
  67 // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon 
  68 // the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the 
  69 // moment is to avoid setting the true focus on the control, the proper solution at the end would be to have 
  70 // an alternate path for carbon key events that routes automatically into the same wx flow of events 
  74 /* kmUPTextPart is the part code we return to indicate the user has clicked 
  75     in the text area of our control */ 
  76 #define kmUPTextPart 1 
  78 /* kmUPScrollPart is the part code we return to indicate the user has clicked 
  79     in the scroll bar part of the control. */ 
  80 #define kmUPScrollPart 2 
  83 /* routines for using existing user pane controls. 
  84     These routines are useful for cases where you would like to use an 
  85     existing user pane control in, say, a dialog window as a scrolling 
  88 /* mUPOpenControl initializes a user pane control so it will be drawn 
  89     and will behave as a scrolling text edit field inside of a window. 
  90     This routine performs all of the initialization steps necessary, 
  91     except it does not create the user pane control itself.  theControl 
  92     should refer to a user pane control that you have either created 
  93     yourself or extracted from a dialog's control heirarchy using 
  94     the GetDialogItemAsControl routine.  */ 
  95 OSStatus 
mUPOpenControl(ControlHandle theControl
, long wxStyle
); 
  97 /* Utility Routines */ 
 103 /* kUserClickedToFocusPart is a part code we pass to the SetKeyboardFocus 
 104     routine.  In our focus switching routine this part code is understood 
 105     as meaning 'the user has clicked in the control and we need to switch 
 106     the current focus to ourselves before we can continue'. */ 
 107 #define kUserClickedToFocusPart 100 
 110 /* kmUPClickScrollDelayTicks is a time measurement in ticks used to 
 111     slow the speed of 'auto scrolling' inside of our clickloop routine. 
 112     This value prevents the text from wizzzzzing by while the mouse 
 113     is being held down inside of the text area. */ 
 114 #define kmUPClickScrollDelayTicks 3 
 117 /* STPTextPaneVars is a structure used for storing the the mUP Control's 
 118     internal variables and state information.  A handle to this record is 
 119     stored in the pane control's reference value field using the 
 120     SetControlReference routine. */ 
 123         /* OS records referenced */ 
 124     TXNObject fTXNRec
; /* the txn record */ 
 125     TXNFrameID fTXNFrame
; /* the txn frame ID */ 
 126     ControlHandle fUserPaneRec
;  /* handle to the user pane control */ 
 127     WindowPtr fOwner
; /* window containing control */ 
 128     GrafPtr fDrawingEnvironment
; /* grafport where control is drawn */ 
 130     Boolean fInFocus
; /* true while the focus rect is drawn around the control */ 
 131     Boolean fIsActive
; /* true while the control is drawn in the active state */ 
 132     Boolean fTEActive
; /* reflects the activation state of the text edit record */ 
 133     Boolean fInDialogWindow
; /* true if displayed in a dialog window */ 
 134         /* calculated locations */ 
 135     Rect fRTextArea
; /* area where the text is drawn */ 
 136     Rect fRFocusOutline
;  /* rectangle used to draw the focus box */ 
 137     Rect fRTextOutline
; /* rectangle used to draw the border */ 
 138     RgnHandle fTextBackgroundRgn
; /* background region for the text, erased before calling TEUpdate */ 
 139         /* our focus advance override routine */ 
 140     EventHandlerUPP handlerUPP
; 
 141     EventHandlerRef handlerRef
; 
 148 /* Univerals Procedure Pointer variables used by the 
 149     mUP Control.  These variables are set up 
 150     the first time that mUPOpenControl is called. */ 
 151 ControlUserPaneDrawUPP gTPDrawProc 
= NULL
; 
 152 ControlUserPaneHitTestUPP gTPHitProc 
= NULL
; 
 153 ControlUserPaneTrackingUPP gTPTrackProc 
= NULL
; 
 154 ControlUserPaneIdleUPP gTPIdleProc 
= NULL
; 
 155 ControlUserPaneKeyDownUPP gTPKeyProc 
= NULL
; 
 156 ControlUserPaneActivateUPP gTPActivateProc 
= NULL
; 
 157 ControlUserPaneFocusUPP gTPFocusProc 
= NULL
; 
 159 /* TPActivatePaneText activates or deactivates the text edit record 
 160     according to the value of setActive.  The primary purpose of this 
 161     routine is to ensure each call is only made once. */ 
 162 static void TPActivatePaneText(STPTextPaneVars 
**tpvars
, Boolean setActive
) { 
 163     STPTextPaneVars 
*varsp
; 
 165     if (varsp
->fTEActive 
!= setActive
) { 
 167         varsp
->fTEActive 
= setActive
; 
 169         TXNActivate(varsp
->fTXNRec
, varsp
->fTXNFrame
, varsp
->fTEActive
); 
 172             TXNFocus( varsp
->fTXNRec
, varsp
->fTEActive
); 
 177 /* TPFocusPaneText set the focus state for the text record. */ 
 178 static void TPFocusPaneText(STPTextPaneVars 
**tpvars
, Boolean setFocus
) { 
 179     STPTextPaneVars 
*varsp
; 
 181     if (varsp
->fInFocus 
!= setFocus
) { 
 182         varsp
->fInFocus 
= setFocus
; 
 183         TXNFocus( varsp
->fTXNRec
, varsp
->fInFocus
); 
 188 /* TPPaneDrawProc is called to redraw the control and for update events 
 189     referring to the control.  This routine erases the text area's background, 
 190     and redraws the text.  This routine assumes the scroll bar has been 
 191     redrawn by a call to DrawControls. */ 
 192 static pascal void TPPaneDrawProc(ControlRef theControl
, ControlPartCode thePart
) { 
 193     STPTextPaneVars 
**tpvars
, *varsp
; 
 196         /* set up our globals */ 
 198     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 199     if (tpvars 
!= NULL
) { 
 200         state 
= HGetState((Handle
) tpvars
); 
 201         HLock((Handle
) tpvars
); 
 204             /* save the drawing state */ 
 205         SetPort((**tpvars
).fDrawingEnvironment
); 
 206            /* verify our boundary */ 
 207         GetControlBounds(theControl
, &bounds
); 
 209         wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 210         if ( ! EqualRect(&bounds
, &varsp
->fRFocusOutline
) ) { 
 211             // scrollbar is on the border, we add one 
 212             Rect oldbounds 
= varsp
->fRFocusOutline 
; 
 213             InsetRect( &oldbounds 
, -1 , -1 ) ; 
 215             if ( IsControlVisible( theControl 
) ) 
 216                 InvalWindowRect( GetControlOwner( theControl 
) , &oldbounds 
) ; 
 217             SetRect(&varsp
->fRFocusOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
); 
 218             SetRect(&varsp
->fRTextOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
); 
 219             SetRect(&varsp
->fRTextArea
, bounds
.left 
+ 2 , bounds
.top 
+ (varsp
->fMultiline 
? 0 : 2) , 
 220                 bounds
.right 
- (varsp
->fMultiline 
? 0 : 2), bounds
.bottom 
- (varsp
->fMultiline 
? 0 : 2)); 
 221             RectRgn(varsp
->fTextBackgroundRgn
, &varsp
->fRTextOutline
); 
 222             if ( IsControlVisible( theControl 
) ) 
 223                 TXNSetFrameBounds(  varsp
->fTXNRec
, varsp
->fRTextArea
.top
, varsp
->fRTextArea
.left
, 
 224                     varsp
->fRTextArea
.bottom
, varsp
->fRTextArea
.right
, varsp
->fTXNFrame
); 
 226                 TXNSetFrameBounds(  varsp
->fTXNRec
, varsp
->fRTextArea
.top 
+ 30000 , varsp
->fRTextArea
.left 
+ 30000 , 
 227                     varsp
->fRTextArea
.bottom 
+ 30000 , varsp
->fRTextArea
.right 
+ 30000 , varsp
->fTXNFrame
); 
 231         if ( IsControlVisible( theControl 
) ) 
 233             /* update the text region */ 
 234             RGBColor white 
= { 65535 , 65535 , 65535 } ; 
 235             RGBBackColor( &white 
) ; 
 236             EraseRgn(varsp
->fTextBackgroundRgn
); 
 237             TXNDraw(varsp
->fTXNRec
, NULL
); 
 238                 /* restore the drawing environment */ 
 239                 /* draw the text frame and focus frame (if necessary) */ 
 240             DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive 
? kThemeStateActive
: kThemeStateInactive
); 
 241             if ((**tpvars
).fIsActive 
&& varsp
->fInFocus
) 
 242                 DrawThemeFocusRect(&varsp
->fRFocusOutline
, true); 
 243                 /* release our globals */ 
 244             HSetState((Handle
) tpvars
, state
); 
 250 /* TPPaneHitTestProc is called when the control manager would 
 251     like to determine what part of the control the mouse resides over. 
 252     We also call this routine from our tracking proc to determine how 
 253     to handle mouse clicks. */ 
 254 static pascal ControlPartCode 
TPPaneHitTestProc(ControlHandle theControl
, Point where
) { 
 255     STPTextPaneVars 
**tpvars
; 
 256     ControlPartCode result
; 
 258         /* set up our locals and lock down our globals*/ 
 260     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 261     if (tpvars 
!= NULL 
&& IsControlVisible( theControl
) ) { 
 262         state 
= HGetState((Handle
) tpvars
); 
 263         HLock((Handle
) tpvars
); 
 264             /* find the region where we clicked */ 
 265         if (PtInRect(where
, &(**tpvars
).fRTextArea
)) { 
 266             result 
= kmUPTextPart
; 
 268             /* release oure globals */ 
 269         HSetState((Handle
) tpvars
, state
); 
 278 /* TPPaneTrackingProc is called when the mouse is being held down 
 279     over our control.  This routine handles clicks in the text area 
 280     and in the scroll bar. */ 
 281 static pascal ControlPartCode 
TPPaneTrackingProc(ControlHandle theControl
, Point startPt
, ControlActionUPP actionProc
) { 
 282     STPTextPaneVars 
**tpvars
, *varsp
; 
 284     ControlPartCode partCodeResult
; 
 285         /* make sure we have some variables... */ 
 287     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 288     if (tpvars 
!= NULL 
&& IsControlVisible( theControl 
) ) { 
 290         state 
= HGetState((Handle
) tpvars
); 
 291         HLock((Handle
) tpvars
); 
 293             /* we don't do any of these functions unless we're in focus */ 
 294         if ( ! varsp
->fInFocus
) { 
 296             owner 
= GetControlOwner(theControl
); 
 297             ClearKeyboardFocus(owner
); 
 298             SetKeyboardFocus(owner
, theControl
, kUserClickedToFocusPart
); 
 300             /* find the location for the click */ 
 301         switch (TPPaneHitTestProc(theControl
, startPt
)) { 
 303                 /* handle clicks in the text part */ 
 305                 {   SetPort((**tpvars
).fDrawingEnvironment
); 
 306                     wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 308                     TXNClick( varsp
->fTXNRec
, (const EventRecord
*) wxTheApp
->MacGetCurrentEvent()); 
 311                     ConvertEventRefToEventRecord( (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec 
) ; 
 312                     TXNClick( varsp
->fTXNRec
, &rec 
); 
 319         HSetState((Handle
) tpvars
, state
); 
 321     return partCodeResult
; 
 325 /* TPPaneIdleProc is our user pane idle routine.  When our text field 
 326     is active and in focus, we use this routine to set the cursor. */ 
 327 static pascal void TPPaneIdleProc(ControlHandle theControl
) { 
 328     STPTextPaneVars 
**tpvars
, *varsp
; 
 330     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 331     if (tpvars 
!= NULL 
&& IsControlVisible( theControl 
) ) { 
 332             /* if we're not active, then we have nothing to say about the cursor */ 
 333         if ((**tpvars
).fIsActive
) { 
 337                 /* lock down the globals */ 
 338             state 
= HGetState((Handle
) tpvars
); 
 339             HLock((Handle
) tpvars
); 
 341                 /* get the current mouse coordinates (in our window) */ 
 342             SetPortWindowPort(GetControlOwner(theControl
)); 
 343             wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 345                 /* there's a 'focus thing' and an 'unfocused thing' */ 
 346             if (varsp
->fInFocus
) { 
 347                     /* flash the cursor */ 
 348                 SetPort((**tpvars
).fDrawingEnvironment
); 
 349                 TXNIdle(varsp
->fTXNRec
); 
 351                 if (PtInRect(mousep
, &varsp
->fRTextArea
)) { 
 353                     RectRgn((theRgn 
= NewRgn()), &varsp
->fRTextArea
); 
 354                     TXNAdjustCursor(varsp
->fTXNRec
, theRgn
); 
 359                  // SetThemeCursor(kThemeArrowCursor); 
 362                 /* if it's in our bounds, set the cursor */ 
 363                 GetControlBounds(theControl
, &bounds
); 
 364                 if (PtInRect(mousep
, &bounds
)) 
 366                 //    SetThemeCursor(kThemeArrowCursor); 
 370             HSetState((Handle
) tpvars
, state
); 
 376 /* TPPaneKeyDownProc is called whenever a keydown event is directed 
 377     at our control.  Here, we direct the keydown event to the text 
 378     edit record and redraw the scroll bar and text field as appropriate. */ 
 379 static pascal ControlPartCode 
TPPaneKeyDownProc(ControlHandle theControl
, 
 380                             SInt16 keyCode
, SInt16 charCode
, SInt16 modifiers
) { 
 381     STPTextPaneVars 
**tpvars
; 
 382     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 383     if (tpvars 
!= NULL
) { 
 384         if ((**tpvars
).fInFocus
) { 
 385                 /* turn autoscrolling on and send the key event to text edit */ 
 386             SetPort((**tpvars
).fDrawingEnvironment
); 
 387             wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 389             memset( &ev 
, 0 , sizeof( ev 
) ) ; 
 391             ev
.modifiers 
= modifiers 
; 
 392             ev
.message 
= (( keyCode 
<< 8 ) & keyCodeMask 
) + ( charCode 
& charCodeMask 
) ; 
 393             TXNKeyDown( (**tpvars
).fTXNRec
, &ev
); 
 396     return kControlEntireControl
; 
 400 /* TPPaneActivateProc is called when the window containing 
 401     the user pane control receives activate events. Here, we redraw 
 402     the control and it's text as necessary for the activation state. */ 
 403 static pascal void TPPaneActivateProc(ControlHandle theControl
, Boolean activating
) { 
 405     STPTextPaneVars 
**tpvars
, *varsp
; 
 408     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 409     if (tpvars 
!= NULL
) { 
 410         state 
= HGetState((Handle
) tpvars
); 
 411         HLock((Handle
) tpvars
); 
 413             /* de/activate the text edit record */ 
 414         SetPort((**tpvars
).fDrawingEnvironment
); 
 415         wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 416         GetControlBounds(theControl
, &bounds
); 
 417         varsp
->fIsActive 
= activating
; 
 418         TPActivatePaneText(tpvars
, varsp
->fIsActive 
&& varsp
->fInFocus
); 
 419             /* redraw the frame */ 
 420         if ( IsControlVisible( theControl 
) ) 
 422             DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive 
? kThemeStateActive
: kThemeStateInactive
); 
 424                 DrawThemeFocusRect(&varsp
->fRFocusOutline
, varsp
->fIsActive
); 
 426         HSetState((Handle
) tpvars
, state
); 
 431 /* TPPaneFocusProc is called when every the focus changes to or 
 432     from our control.  Herein, switch the focus appropriately 
 433     according to the parameters and redraw the control as 
 435 static pascal ControlPartCode 
TPPaneFocusProc(ControlHandle theControl
, ControlFocusPart action
) { 
 436     ControlPartCode focusResult
; 
 437     STPTextPaneVars 
**tpvars
, *varsp
; 
 440     focusResult 
= kControlFocusNoPart
; 
 441     tpvars 
= (STPTextPaneVars 
**) GetControlReference(theControl
); 
 442     if (tpvars 
!= NULL 
) { 
 443         state 
= HGetState((Handle
) tpvars
); 
 444         HLock((Handle
) tpvars
); 
 446             /* if kControlFocusPrevPart and kControlFocusNextPart are received when the user is 
 447             tabbing forwards (or shift tabbing backwards) through the items in the dialog, 
 448             and kControlFocusNextPart will be received.  When the user clicks in our field 
 449             and it is not the current focus, then the constant kUserClickedToFocusPart will 
 450             be received.  The constant kControlFocusNoPart will be received when our control 
 451             is the current focus and the user clicks in another control.  In your focus routine, 
 452             you should respond to these codes as follows: 
 454             kControlFocusNoPart - turn off focus and return kControlFocusNoPart.  redraw 
 455                 the control and the focus rectangle as necessary. 
 457             kControlFocusPrevPart or kControlFocusNextPart - toggle focus on or off 
 458                 depending on its current state.  redraw the control and the focus rectangle 
 459                 as appropriate for the new focus state.  If the focus state is 'off', return the constant 
 460                 kControlFocusNoPart, otherwise return a non-zero part code. 
 461             kUserClickedToFocusPart - is a constant defined for this example.  You should 
 462                 define your own value for handling click-to-focus type events. */ 
 463              /* calculate the next highlight state */ 
 466             case kControlFocusNoPart
: 
 467                 TPFocusPaneText(tpvars
, false); 
 468                 focusResult 
= kControlFocusNoPart
; 
 470             case kUserClickedToFocusPart
: 
 471                 TPFocusPaneText(tpvars
, true); 
 474             case kControlFocusPrevPart
: 
 475             case kControlFocusNextPart
: 
 476                 TPFocusPaneText(tpvars
, ( ! varsp
->fInFocus
)); 
 477                 focusResult 
= varsp
->fInFocus 
? 1 : kControlFocusNoPart
; 
 480         TPActivatePaneText(tpvars
, varsp
->fIsActive 
&& varsp
->fInFocus
); 
 481         /* redraw the text fram and focus rectangle to indicate the 
 483         if ( IsControlVisible( theControl 
) ) 
 485            /* save the drawing state */ 
 486             SetPort((**tpvars
).fDrawingEnvironment
); 
 487             wxMacWindowClipper 
clipper( wxFindControlFromMacControl(theControl 
) ) ; 
 488             DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive 
? kThemeStateActive
: kThemeStateInactive
); 
 489             DrawThemeFocusRect(&varsp
->fRFocusOutline
, varsp
->fIsActive 
&& varsp
->fInFocus
); 
 492         HSetState((Handle
) tpvars
, state
); 
 498 /* mUPOpenControl initializes a user pane control so it will be drawn 
 499     and will behave as a scrolling text edit field inside of a window. 
 500     This routine performs all of the initialization steps necessary, 
 501     except it does not create the user pane control itself.  theControl 
 502     should refer to a user pane control that you have either created 
 503     yourself or extracted from a dialog's control heirarchy using 
 504     the GetDialogItemAsControl routine.  */ 
 505 OSStatus 
mUPOpenControl(ControlHandle theControl
, long wxStyle 
) 
 509     STPTextPaneVars 
**tpvars
, *varsp
; 
 510     OSStatus err 
= noErr 
; 
 511     RGBColor rgbWhite 
= {0xFFFF, 0xFFFF, 0xFFFF}; 
 514         /* set up our globals */ 
 515     if (gTPDrawProc 
== NULL
) gTPDrawProc 
= NewControlUserPaneDrawUPP(TPPaneDrawProc
); 
 516     if (gTPHitProc 
== NULL
) gTPHitProc 
= NewControlUserPaneHitTestUPP(TPPaneHitTestProc
); 
 517     if (gTPTrackProc 
== NULL
) gTPTrackProc 
= NewControlUserPaneTrackingUPP(TPPaneTrackingProc
); 
 518     if (gTPIdleProc 
== NULL
) gTPIdleProc 
= NewControlUserPaneIdleUPP(TPPaneIdleProc
); 
 519     if (gTPKeyProc 
== NULL
) gTPKeyProc 
= NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc
); 
 520     if (gTPActivateProc 
== NULL
) gTPActivateProc 
= NewControlUserPaneActivateUPP(TPPaneActivateProc
); 
 521     if (gTPFocusProc 
== NULL
) gTPFocusProc 
= NewControlUserPaneFocusUPP(TPPaneFocusProc
); 
 523         /* allocate our private storage */ 
 524     tpvars 
= (STPTextPaneVars 
**) NewHandleClear(sizeof(STPTextPaneVars
)); 
 525     SetControlReference(theControl
, (long) tpvars
); 
 526     HLock((Handle
) tpvars
); 
 528         /* set the initial settings for our private data */ 
 529     varsp
->fMultiline 
= wxStyle 
& wxTE_MULTILINE 
; 
 530     varsp
->fInFocus 
= false; 
 531     varsp
->fIsActive 
= true; 
 532     varsp
->fTEActive 
= true; // in order to get a deactivate 
 533     varsp
->fUserPaneRec 
= theControl
; 
 534     theWindow 
= varsp
->fOwner 
= GetControlOwner(theControl
); 
 536     varsp
->fDrawingEnvironment 
= (GrafPtr
)  GetWindowPort(theWindow
); 
 538     varsp
->fInDialogWindow 
= ( GetWindowKind(varsp
->fOwner
) == kDialogWindowKind 
); 
 539         /* set up the user pane procedures */ 
 540     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneDrawProcTag
, sizeof(gTPDrawProc
), &gTPDrawProc
); 
 541     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneHitTestProcTag
, sizeof(gTPHitProc
), &gTPHitProc
); 
 542     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneTrackingProcTag
, sizeof(gTPTrackProc
), &gTPTrackProc
); 
 543     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneIdleProcTag
, sizeof(gTPIdleProc
), &gTPIdleProc
); 
 544     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneKeyDownProcTag
, sizeof(gTPKeyProc
), &gTPKeyProc
); 
 545     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneActivateProcTag
, sizeof(gTPActivateProc
), &gTPActivateProc
); 
 546     SetControlData(theControl
, kControlEntireControl
, kControlUserPaneFocusProcTag
, sizeof(gTPFocusProc
), &gTPFocusProc
); 
 547         /* calculate the rectangles used by the control */ 
 548     GetControlBounds(theControl
, &bounds
); 
 549     SetRect(&varsp
->fRFocusOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
); 
 550     SetRect(&varsp
->fRTextOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
); 
 551     SetRect(&varsp
->fRTextArea
, bounds
.left 
+ 2 , bounds
.top 
+ (varsp
->fMultiline 
? 0 : 2) , 
 552         bounds
.right 
- (varsp
->fMultiline 
? 0 : 2), bounds
.bottom 
- (varsp
->fMultiline 
? 0 : 2)); 
 553         /* calculate the background region for the text.  In this case, it's kindof 
 554         and irregular region because we're setting the scroll bar a little ways inside 
 556     RectRgn((varsp
->fTextBackgroundRgn 
= NewRgn()), &varsp
->fRTextOutline
); 
 558         /* set up the drawing environment */ 
 559     SetPort(varsp
->fDrawingEnvironment
); 
 561         /* create the new edit field */ 
 563     TXNFrameOptions frameOptions 
= 
 564         kTXNDontDrawCaretWhenInactiveMask 
; 
 565     if ( ! ( wxStyle 
& wxTE_NOHIDESEL 
) ) 
 566         frameOptions 
|= kTXNDontDrawSelectionWhenInactiveMask 
; 
 568     if ( wxStyle 
& wxTE_MULTILINE 
) 
 570         if ( ! ( wxStyle 
& wxTE_DONTWRAP 
) ) 
 571             frameOptions 
|= kTXNAlwaysWrapAtViewEdgeMask 
; 
 574             frameOptions 
|= kTXNAlwaysWrapAtViewEdgeMask 
; 
 575             frameOptions 
|= kTXNWantHScrollBarMask 
; 
 578         if ( !(wxStyle 
& wxTE_NO_VSCROLL 
) ) 
 579             frameOptions 
|= kTXNWantVScrollBarMask 
; 
 582         frameOptions 
|= kTXNSingleLineOnlyMask 
; 
 584     if ( wxStyle 
& wxTE_READONLY 
) 
 585         frameOptions 
|= kTXNReadOnlyMask 
; 
 587     TXNNewObject(NULL
, varsp
->fOwner
, &varsp
->fRTextArea
, 
 589         kTXNTextEditStyleFrameType
, 
 591         kTXNSystemDefaultEncoding
, 
 592         &varsp
->fTXNRec
, &varsp
->fTXNFrame
, (TXNObjectRefcon
) tpvars
); 
 594     if ( !IsControlVisible( theControl 
) ) 
 595         TXNSetFrameBounds(  varsp
->fTXNRec
, varsp
->fRTextArea
.top 
+ 30000 , varsp
->fRTextArea
.left 
+ 30000 , 
 596             varsp
->fRTextArea
.bottom 
+ 30000 , varsp
->fRTextArea
.right 
+ 30000 , varsp
->fTXNFrame
); 
 599     if ( (wxStyle 
& wxTE_MULTILINE
) && (wxStyle 
& wxTE_DONTWRAP
) ) 
 601         TXNControlTag tag 
= kTXNWordWrapStateTag 
; 
 603         dat
.uValue 
= kTXNNoAutoWrap 
; 
 604         TXNSetTXNObjectControls( varsp
->fTXNRec 
, false , 1 , &tag 
, &dat 
) ; 
 610         GetThemeFont(kThemeSmallSystemFont 
, GetApplicationScript() , fontName 
, &fontSize 
, &fontStyle 
) ; 
 612         TXNTypeAttributes typeAttr
[] = 
 614             {   kTXNQDFontNameAttribute 
, kTXNQDFontNameAttributeSize 
, { (void*) fontName 
} } , 
 615             {   kTXNQDFontSizeAttribute 
, kTXNFontSizeAttributeSize 
, { (void*) (fontSize 
<< 16) } } , 
 616             {   kTXNQDFontStyleAttribute 
, kTXNQDFontStyleAttributeSize 
, {  (void*) normal 
} } , 
 619     err 
= TXNSetTypeAttributes (varsp
->fTXNRec
, sizeof( typeAttr 
) / sizeof(TXNTypeAttributes
) , typeAttr
, 
 622         /* set the field's background */ 
 624     tback
.bgType 
= kTXNBackgroundTypeRGB
; 
 625     tback
.bg
.color 
= rgbWhite
; 
 626     TXNSetBackground( varsp
->fTXNRec
, &tback
); 
 628         /* unlock our storage */ 
 629     HUnlock((Handle
) tpvars
); 
 630         /* perform final activations and setup for our text field.  Here, 
 631         we assume that the window is going to be the 'active' window. */ 
 632     TPActivatePaneText(tpvars
, varsp
->fIsActive 
&& varsp
->fInFocus
); 
 640 #if !USE_SHARED_LIBRARY 
 641 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl
, wxControl
) 
 643 BEGIN_EVENT_TABLE(wxTextCtrl
, wxControl
) 
 644     EVT_DROP_FILES(wxTextCtrl::OnDropFiles
) 
 645     EVT_CHAR(wxTextCtrl::OnChar
) 
 646     EVT_MENU(wxID_CUT
, wxTextCtrl::OnCut
) 
 647     EVT_MENU(wxID_COPY
, wxTextCtrl::OnCopy
) 
 648     EVT_MENU(wxID_PASTE
, wxTextCtrl::OnPaste
) 
 649     EVT_MENU(wxID_UNDO
, wxTextCtrl::OnUndo
) 
 650     EVT_MENU(wxID_REDO
, wxTextCtrl::OnRedo
) 
 652     EVT_UPDATE_UI(wxID_CUT
, wxTextCtrl::OnUpdateCut
) 
 653     EVT_UPDATE_UI(wxID_COPY
, wxTextCtrl::OnUpdateCopy
) 
 654     EVT_UPDATE_UI(wxID_PASTE
, wxTextCtrl::OnUpdatePaste
) 
 655     EVT_UPDATE_UI(wxID_UNDO
, wxTextCtrl::OnUpdateUndo
) 
 656     EVT_UPDATE_UI(wxID_REDO
, wxTextCtrl::OnUpdateRedo
) 
 660 static void SetTXNData( TXNObject txn 
, const wxString
& st 
, TXNOffset start 
, TXNOffset end 
) 
 663 #if SIZEOF_WCHAR_T == 2 
 664     size_t len 
= st
.Len() ; 
 665     TXNSetData( txn 
, kTXNUnicodeTextData
,  (void*)st
.wc_str(), len 
* 2, 
 668     wxMBConvUTF16BE converter 
; 
 669     ByteCount byteBufferLen 
= converter
.WC2MB( NULL 
, st
.wc_str() , 0 ) ; 
 670     UniChar 
*unibuf 
= (UniChar
*) malloc(byteBufferLen
) ; 
 671     converter
.WC2MB( (char*) unibuf 
, st
.wc_str() , byteBufferLen 
) ; 
 672     TXNSetData( txn 
, kTXNUnicodeTextData
,  (void*)unibuf
, byteBufferLen 
, 
 677     wxCharBuffer text 
=  st
.mb_str(wxConvLocal
)  ; 
 678     TXNSetData( txn 
, kTXNTextData
,  (void*)text
.data(), strlen( text 
) , 
 684 void wxTextCtrl::Init() 
 688   m_macTXNvars 
= NULL 
; 
 689   m_macUsesTXN 
= false ; 
 694   m_maxLength 
= TE_UNLIMITED_LENGTH 
; 
 697 wxTextCtrl::~wxTextCtrl() 
 701         SetControlReference((ControlHandle
)m_macControl
, 0) ; 
 702         TXNDeleteObject((TXNObject
)m_macTXN
); 
 703         /* delete our private storage */ 
 704         DisposeHandle((Handle
) m_macTXNvars
); 
 705         /* zero the control reference */ 
 709 const short kVerticalMargin 
= 2 ; 
 710 const short kHorizontalMargin 
= 2 ; 
 712 bool wxTextCtrl::Create(wxWindow 
*parent
, wxWindowID id
, 
 715            const wxSize
& size
, long style
, 
 716            const wxValidator
& validator
, 
 717            const wxString
& name
) 
 721     m_macTXNvars 
= NULL 
; 
 722     m_macUsesTXN 
= false ; 
 725     m_macUsesTXN 
= ! (style 
& wxTE_PASSWORD 
) ; 
 727     m_macUsesTXN 
&= (TXNInitTextension 
!= (void*) kUnresolvedCFragSymbolAddress
) ; 
 729     // base initialization 
 730     if ( !wxTextCtrlBase::Create(parent
, id
, pos
, size
, style 
& ~(wxHSCROLL
|wxVSCROLL
), validator
, name
) ) 
 733     wxSize mySize 
= size 
; 
 736         m_macHorizontalBorder 
= 5 ; // additional pixels around the real control 
 737         m_macVerticalBorder 
= 3 ; 
 741         m_macHorizontalBorder 
= 5 ; // additional pixels around the real control 
 742         m_macVerticalBorder 
= 5 ; 
 749     if ( mySize.y == -1 ) 
 752         if ( m_windowStyle & wxTE_MULTILINE ) 
 755         mySize.y += 2 * m_macVerticalBorder ; 
 758     MacPreControlCreate( parent 
, id 
,  wxEmptyString 
, pos 
, mySize 
,style
, validator 
, name 
, &bounds 
, title 
) ; 
 760     if ( m_windowStyle 
& wxTE_MULTILINE 
) 
 762         wxASSERT_MSG( !(m_windowStyle 
& wxTE_PROCESS_ENTER
), 
 763                       wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") ); 
 765         m_windowStyle 
|= wxTE_PROCESS_ENTER
; 
 768     if ( m_windowStyle 
& wxTE_READONLY
) 
 774     wxMacConvertNewlines13To10( &st 
) ; 
 777         m_macControl 
= (WXWidget
) ::NewControl( MAC_WXHWND(parent
->MacGetRootWindow()) , &bounds 
, "\p" , false , 0 , 0 , 1, 
 778             (style 
& wxTE_PASSWORD
) ? kControlEditTextPasswordProc 
: kControlEditTextProc 
, (long) this ) ; 
 780         ::GetControlData((ControlHandle
)  m_macControl 
, 0, kControlEditTextTEHandleTag 
, sizeof( TEHandle 
) , (char*)((TEHandle 
*)&m_macTE
) , &size 
) ; 
 787         featurSet 
= kControlSupportsEmbedding 
| kControlSupportsFocus  
| kControlWantsIdle
 
 788                 | kControlWantsActivate 
| kControlHandlesTracking 
| kControlHasSpecialBackground
 
 789                 | kControlGetsFocusOnClick 
| kControlSupportsLiveFeedback
; 
 790             /* create the control */ 
 791         m_macControl 
= (WXWidget
) ::NewControl(MAC_WXHWND(parent
->MacGetRootWindow()), &bounds
, "\p", false , featurSet
, 0, featurSet
, kControlUserPaneProc
, 0); 
 792             /* set up the mUP specific features and data */ 
 793         mUPOpenControl((ControlHandle
) m_macControl
, m_windowStyle 
); 
 795     MacPostControlCreate() ; 
 799         wxCharBuffer text 
= st
.mb_str(wxConvLocal
) ; 
 800         ::SetControlData( (ControlHandle
) m_macControl
, 0, ( m_windowStyle 
& wxTE_PASSWORD 
) ? kControlEditTextPasswordTag 
: kControlEditTextTextTag 
, strlen(text
) , text 
) ; 
 804         STPTextPaneVars 
**tpvars
; 
 806         tpvars 
= (STPTextPaneVars 
**) GetControlReference((ControlHandle
) m_macControl
); 
 807             /* set the text in the record */ 
 808         m_macTXN 
=  (**tpvars
).fTXNRec 
; 
 809         SetTXNData( (TXNObject
) m_macTXN 
, st 
, kTXNStartOffset
, kTXNEndOffset 
) ; 
 810         m_macTXNvars 
= tpvars 
; 
 811         m_macUsesTXN 
= true ; 
 812         TXNSetSelection( (TXNObject
) m_macTXN
, 0, 0); 
 813         TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
); 
 819 wxString 
wxTextCtrl::GetValue() const 
 826         err 
= ::GetControlDataSize((ControlHandle
) m_macControl
, 0, 
 827             ( m_windowStyle 
& wxTE_PASSWORD 
) ? kControlEditTextPasswordTag 
: kControlEditTextTextTag
, &actualSize 
) ; 
 830             return wxEmptyString 
; 
 832         if ( actualSize 
> 0 ) 
 834             wxCharBuffer 
buf(actualSize
) ; 
 835             ::GetControlData( (ControlHandle
) m_macControl
, 0, 
 836                 ( m_windowStyle 
& wxTE_PASSWORD 
) ? kControlEditTextPasswordTag 
: kControlEditTextTextTag
, 
 837                 actualSize 
, buf
.data() , &actualSize 
) ; 
 838             result 
= wxString( buf 
, wxConvLocal
) ; 
 845         err 
= TXNGetDataEncoded( ((TXNObject
) m_macTXN
), kTXNStartOffset
, kTXNEndOffset
, &theText 
, kTXNUnicodeTextData 
); 
 853             actualSize 
= GetHandleSize( theText 
) / sizeof( UniChar
) ; 
 854             if ( actualSize 
> 0 ) 
 856                 wxChar 
*ptr 
= result
.GetWriteBuf(actualSize
*sizeof(wxChar
)) ; 
 857 #if SIZEOF_WCHAR_T == 2 
 858                 wxStrncpy( ptr 
, (wxChar
*) *theText 
, actualSize 
) ; 
 860                 wxMBConvUTF16BE converter 
; 
 862                 converter
.MB2WC( ptr 
, (const char*)*theText 
, actualSize 
) ; 
 865                 ptr
[actualSize
] = 0 ; 
 866                 result
.UngetWriteBuf( actualSize 
*sizeof(wxChar
) ) ; 
 868             DisposeHandle( theText 
) ; 
 872         err 
= TXNGetDataEncoded( ((TXNObject
) m_macTXN
), kTXNStartOffset
, kTXNEndOffset
, &theText 
, kTXNTextData 
); 
 880             actualSize 
= GetHandleSize( theText 
) ; 
 881             if ( actualSize 
> 0 ) 
 884                 result 
= wxString( *theText 
, wxConvLocal 
, actualSize 
) ; 
 887             DisposeHandle( theText 
) ; 
 891     wxMacConvertNewlines10To13( &result 
) ; 
 895 void wxTextCtrl::GetSelection(long* from
, long* to
) const 
 899     *from 
= (**((TEHandle
) m_macTE
)).selStart
; 
 900     *to 
= (**((TEHandle
) m_macTE
)).selEnd
; 
 904         TXNGetSelection( (TXNObject
) m_macTXN 
, (TXNOffset
*) from 
, (TXNOffset
*) to 
) ; 
 908 void wxTextCtrl::SetValue(const wxString
& str
) 
 911     wxMacConvertNewlines13To10( &st 
) ; 
 914         wxCharBuffer text 
=  st
.mb_str(wxConvLocal
) ; 
 915         ::SetControlData( (ControlHandle
) m_macControl
, 0, ( m_windowStyle 
& wxTE_PASSWORD 
) ? kControlEditTextPasswordTag 
: kControlEditTextTextTag 
, strlen(text
) , text 
) ; 
 919         bool formerEditable 
= m_editable 
; 
 920         if ( !formerEditable 
) 
 922         SetTXNData( (TXNObject
) m_macTXN 
, st 
, kTXNStartOffset
, kTXNEndOffset 
) ; 
 923         TXNSetSelection( (TXNObject
) m_macTXN
, 0, 0); 
 924         TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
); 
 925         if ( !formerEditable 
) 
 926             SetEditable(formerEditable
) ; 
 931 void wxTextCtrl::SetMaxLength(unsigned long len
) 
 936 bool wxTextCtrl::SetStyle(long start
, long end
, const wxTextAttr
& style
) 
 940         bool formerEditable 
= m_editable 
; 
 941         if ( !formerEditable 
) 
 943         TXNTypeAttributes typeAttr
[4] ; 
 944         Str255 fontName 
= "\pMonaco" ; 
 945         SInt16 fontSize 
= 12 ; 
 946         Style fontStyle 
= normal 
; 
 948         int attrCounter 
= 0 ; 
 949         if ( style
.HasFont() ) 
 951             const wxFont 
&font 
= style
.GetFont() ; 
 952             wxMacStringToPascal( font
.GetFaceName() , fontName 
) ; 
 953             fontSize 
= font
.GetPointSize() ; 
 954             if ( font
.GetUnderlined() ) 
 955                 fontStyle 
|= underline 
; 
 956             if ( font
.GetWeight() == wxBOLD 
) 
 958             if ( font
.GetStyle() == wxITALIC 
) 
 959                 fontStyle 
|= italic 
; 
 961             typeAttr
[attrCounter
].tag 
= kTXNQDFontNameAttribute 
; 
 962             typeAttr
[attrCounter
].size 
= kTXNQDFontNameAttributeSize 
; 
 963             typeAttr
[attrCounter
].data
.dataPtr 
= (void*) fontName 
; 
 964             typeAttr
[attrCounter
+1].tag 
= kTXNQDFontSizeAttribute 
; 
 965             typeAttr
[attrCounter
+1].size 
= kTXNFontSizeAttributeSize 
; 
 966             typeAttr
[attrCounter
+1].data
.dataValue 
=  (fontSize 
<< 16) ; 
 967             typeAttr
[attrCounter
+2].tag 
= kTXNQDFontStyleAttribute 
; 
 968             typeAttr
[attrCounter
+2].size 
= kTXNQDFontStyleAttributeSize 
; 
 969             typeAttr
[attrCounter
+2].data
.dataValue 
= fontStyle 
; 
 973         if ( style
.HasTextColour() ) 
 975             typeAttr
[attrCounter
].tag 
= kTXNQDFontColorAttribute 
; 
 976             typeAttr
[attrCounter
].size 
= kTXNQDFontColorAttributeSize 
; 
 977             typeAttr
[attrCounter
].data
.dataPtr 
= (void*) &color 
; 
 978             color 
= MAC_WXCOLORREF(style
.GetTextColour().GetPixel()) ; 
 982         if ( attrCounter 
> 0 ) 
 986 #endif // __WXDEBUG__ 
 987                 TXNSetTypeAttributes ((TXNObject
)m_macTXN
, attrCounter 
, typeAttr
, start
,end
); 
 988             wxASSERT_MSG( status 
== noErr 
, wxT("Couldn't set text attributes") ) ; 
 990         if ( !formerEditable 
) 
 991             SetEditable(formerEditable
) ; 
 996 bool wxTextCtrl::SetDefaultStyle(const wxTextAttr
& style
) 
 998     wxTextCtrlBase::SetDefaultStyle( style 
) ; 
 999     SetStyle( kTXNUseCurrentSelection 
, kTXNUseCurrentSelection 
, GetDefaultStyle() ) ; 
1003 // Clipboard operations 
1004 void wxTextCtrl::Copy() 
1008       if ( !m_macUsesTXN 
) 
1010             TECopy( ((TEHandle
) m_macTE
) ) ; 
1011             ClearCurrentScrap(); 
1013             MacRedrawControl() ; 
1017             ClearCurrentScrap(); 
1018             TXNCopy((TXNObject
)m_macTXN
); 
1019             TXNConvertToPublicScrap(); 
1024 void wxTextCtrl::Cut() 
1028         if ( !m_macUsesTXN 
) 
1030             TECut( ((TEHandle
) m_macTE
) ) ; 
1031             ClearCurrentScrap(); 
1033             MacRedrawControl() ; 
1037             ClearCurrentScrap(); 
1038             TXNCut((TXNObject
)m_macTXN
); 
1039             TXNConvertToPublicScrap(); 
1041         wxCommandEvent 
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
); 
1042         event
.SetEventObject( this ); 
1043         GetEventHandler()->ProcessEvent(event
); 
1047 void wxTextCtrl::Paste() 
1051         if ( !m_macUsesTXN 
) 
1054             TEPaste( (TEHandle
) m_macTE 
) ; 
1055             MacRedrawControl() ; 
1059             TXNConvertFromPublicScrap(); 
1060             TXNPaste((TXNObject
)m_macTXN
); 
1061             SetStyle( kTXNUseCurrentSelection 
, kTXNUseCurrentSelection 
, GetDefaultStyle() ) ; 
1063         wxCommandEvent 
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
); 
1064         event
.SetEventObject( this ); 
1065         GetEventHandler()->ProcessEvent(event
); 
1069 bool wxTextCtrl::CanCopy() const 
1071     // Can copy if there's a selection 
1073     GetSelection(& from
, & to
); 
1074     return (from 
!= to
); 
1077 bool wxTextCtrl::CanCut() const 
1079     if ( !IsEditable() ) 
1083     // Can cut if there's a selection 
1085     GetSelection(& from
, & to
); 
1086     return (from 
!= to
); 
1089 bool wxTextCtrl::CanPaste() const 
1095     OSStatus err 
= noErr
; 
1098     err 
= GetCurrentScrap( &scrapRef 
); 
1099     if ( err 
!= noTypeErr 
&& err 
!= memFullErr 
) 
1101         ScrapFlavorFlags    flavorFlags
; 
1104         if (( err 
= GetScrapFlavorFlags( scrapRef
, 'TEXT', &flavorFlags 
)) == noErr
) 
1106             if (( err 
= GetScrapFlavorSize( scrapRef
, 'TEXT', &byteCount 
)) == noErr
) 
1116     if ( GetScrap( NULL 
, 'TEXT' , &offset 
) > 0 ) 
1124 void wxTextCtrl::SetEditable(bool editable
) 
1126     if ( editable 
!= m_editable 
) 
1128         m_editable 
= editable 
; 
1129         if ( !m_macUsesTXN 
) 
1132                 UMAActivateControl( (ControlHandle
) m_macControl 
) ; 
1134                 UMADeactivateControl((ControlHandle
)  m_macControl 
) ; 
1138             TXNControlTag tag
[] = { kTXNIOPrivilegesTag 
} ; 
1139             TXNControlData data
[] = { { editable 
? kTXNReadWrite 
: kTXNReadOnly 
} } ; 
1140             TXNSetTXNObjectControls( (TXNObject
) m_macTXN 
, false , sizeof(tag
) / sizeof (TXNControlTag
) , tag 
, data 
) ; 
1145 void wxTextCtrl::SetInsertionPoint(long pos
) 
1147     SetSelection( pos 
, pos 
) ; 
1150 void wxTextCtrl::SetInsertionPointEnd() 
1152     wxTextPos pos 
= GetLastPosition(); 
1153     SetInsertionPoint(pos
); 
1156 long wxTextCtrl::GetInsertionPoint() const 
1159     GetSelection( &begin 
, &end 
) ; 
1163 wxTextPos 
wxTextCtrl::GetLastPosition() const 
1165     if ( !m_macUsesTXN 
) 
1167         return (**((TEHandle
) m_macTE
)).teLength 
; 
1173         OSErr err 
= TXNGetDataEncoded( (TXNObject
) m_macTXN
, kTXNStartOffset
, kTXNEndOffset
, &theText 
, kTXNTextData 
); 
1181             actualsize 
= GetHandleSize( theText 
) ; 
1182             DisposeHandle( theText 
) ; 
1188 void wxTextCtrl::Replace(long from
, long to
, const wxString
& str
) 
1190     wxString value 
= str 
; 
1191     wxMacConvertNewlines13To10( &value 
) ; 
1192     if ( !m_macUsesTXN 
) 
1194         ControlEditTextSelectionRec selection 
; 
1196         selection
.selStart 
= from 
; 
1197         selection
.selEnd 
= to 
; 
1198         ::SetControlData((ControlHandle
)  m_macControl 
, 0, kControlEditTextSelectionTag 
, sizeof( selection 
) , (char*) &selection 
) ; 
1199         TESetSelect( from 
, to  
, ((TEHandle
) m_macTE
) ) ; 
1200         TEDelete( ((TEHandle
) m_macTE
) ) ; 
1201         TEInsert( value 
, value
.Length() , ((TEHandle
) m_macTE
) ) ; 
1205         bool formerEditable 
= m_editable 
; 
1206         if ( !formerEditable 
) 
1208         TXNSetSelection( ((TXNObject
) m_macTXN
) , from 
, to 
) ; 
1209         TXNClear( ((TXNObject
) m_macTXN
) ) ; 
1210         SetTXNData( (TXNObject
) m_macTXN 
, str 
, kTXNUseCurrentSelection
, kTXNUseCurrentSelection 
) ; 
1211         if ( !formerEditable 
) 
1212             SetEditable( formerEditable 
) ; 
1217 void wxTextCtrl::Remove(long from
, long to
) 
1219     if ( !m_macUsesTXN 
) 
1221         ControlEditTextSelectionRec selection 
; 
1223         selection
.selStart 
= from 
; 
1224         selection
.selEnd 
= to 
; 
1225         ::SetControlData( (ControlHandle
) m_macControl 
, 0, kControlEditTextSelectionTag 
, sizeof( selection 
) , (char*) &selection 
) ; 
1226         TEDelete( ((TEHandle
) m_macTE
) ) ; 
1230         bool formerEditable 
= m_editable 
; 
1231         if ( !formerEditable 
) 
1233         TXNSetSelection( ((TXNObject
) m_macTXN
) , from 
, to 
) ; 
1234         TXNClear( ((TXNObject
) m_macTXN
) ) ; 
1235         if ( !formerEditable 
) 
1236             SetEditable( formerEditable 
) ; 
1241 void wxTextCtrl::SetSelection(long from
, long to
) 
1243     if ( !m_macUsesTXN 
) 
1245         ControlEditTextSelectionRec selection 
; 
1246         if ((from 
== -1) && (to 
== -1)) 
1248             selection
.selStart 
= 0 ; 
1249             selection
.selEnd 
= 32767 ; 
1253             selection
.selStart 
= from 
; 
1254             selection
.selEnd 
= to 
; 
1257         TESetSelect( selection
.selStart 
, selection
.selEnd 
, ((TEHandle
) m_macTE
) ) ; 
1258         ::SetControlData((ControlHandle
)  m_macControl 
, 0, kControlEditTextSelectionTag 
, sizeof( selection 
) , (char*) &selection 
) ; 
1262         STPTextPaneVars 
**tpvars
; 
1263         /* set up our locals */ 
1264         tpvars 
= (STPTextPaneVars 
**) GetControlReference((ControlHandle
) m_macControl
); 
1265         /* and our drawing environment as the operation 
1266         may force a redraw in the text area. */ 
1267         SetPort((**tpvars
).fDrawingEnvironment
); 
1268         /* change the selection */ 
1269         if ((from 
== -1) && (to 
== -1)) 
1270             TXNSelectAll((TXNObject
) m_macTXN
); 
1272             TXNSetSelection( (**tpvars
).fTXNRec
, from
, to
); 
1273         TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
); 
1277 bool wxTextCtrl::LoadFile(const wxString
& file
) 
1279     if ( wxTextCtrlBase::LoadFile(file
) ) 
1287 void wxTextCtrl::WriteText(const wxString
& str
) 
1290     wxMacConvertNewlines13To10( &st 
) ; 
1291     if ( !m_macUsesTXN 
) 
1293         wxCharBuffer text 
=  st
.mb_str(wxConvLocal
) ; 
1294         TEInsert( text 
, strlen(text
) , ((TEHandle
) m_macTE
) ) ; 
1298         bool formerEditable 
= m_editable 
; 
1299         if ( !formerEditable 
) 
1301         long start 
, end 
, dummy 
; 
1302         GetSelection( &start 
, &dummy 
) ; 
1303         SetTXNData( (TXNObject
) m_macTXN 
, st 
, kTXNUseCurrentSelection
, kTXNUseCurrentSelection 
) ; 
1304         GetSelection( &dummy 
, &end 
) ; 
1305         SetStyle( start 
, end 
, GetDefaultStyle() ) ; 
1306         if ( !formerEditable 
) 
1307             SetEditable( formerEditable 
) ; 
1309     MacRedrawControl() ; 
1312 void wxTextCtrl::AppendText(const wxString
& text
) 
1314     SetInsertionPointEnd(); 
1318 void wxTextCtrl::Clear() 
1320     if ( !m_macUsesTXN 
) 
1322         ::SetControlData((ControlHandle
)  m_macControl
, 0, ( m_windowStyle 
& wxTE_PASSWORD 
) ? kControlEditTextPasswordTag 
: kControlEditTextTextTag 
, 0 , (char*) ((const char*)NULL
) ) ; 
1326         TXNSetSelection( (TXNObject
)m_macTXN 
, kTXNStartOffset 
, kTXNEndOffset 
) ; 
1327         TXNClear((TXNObject
)m_macTXN
); 
1332 bool wxTextCtrl::IsModified() const 
1337 bool wxTextCtrl::IsEditable() const 
1339     return IsEnabled() && m_editable 
; 
1342 bool wxTextCtrl::AcceptsFocus() const 
1344     // we don't want focus if we can't be edited 
1345     return /*IsEditable() && */ wxControl::AcceptsFocus(); 
1348 wxSize 
wxTextCtrl::DoGetBestSize() const 
1363     wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); 
1365     int wText = DEFAULT_ITEM_WIDTH; 
1367     int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); 
1369     return wxSize(wText, hText); 
1371     if ( m_windowStyle 
& wxTE_MULTILINE 
) 
1375     hText 
+= 2 * m_macVerticalBorder 
; 
1376     wText 
+= 2 * m_macHorizontalBorder 
; 
1377     //else: for single line control everything is ok 
1378     return wxSize(wText
, hText
); 
1381 // ---------------------------------------------------------------------------- 
1383 // ---------------------------------------------------------------------------- 
1385 void wxTextCtrl::Undo() 
1391             TXNUndo((TXNObject
)m_macTXN
); 
1396 void wxTextCtrl::Redo() 
1402             TXNRedo((TXNObject
)m_macTXN
); 
1407 bool wxTextCtrl::CanUndo() const 
1409     if ( !IsEditable() ) 
1415         return TXNCanUndo((TXNObject
)m_macTXN
,NULL
); 
1420 bool wxTextCtrl::CanRedo() const 
1422     if ( !IsEditable() ) 
1428         return TXNCanRedo((TXNObject
)m_macTXN
,NULL
); 
1433 // Makes modifie or unmodified 
1434 void wxTextCtrl::MarkDirty() 
1439 void wxTextCtrl::DiscardEdits() 
1444 int wxTextCtrl::GetNumberOfLines() const 
1449         TXNGetLineCount((TXNObject
)m_macTXN
, &lines 
) ; 
1454         wxString content 
= GetValue() ; 
1457         for (size_t i 
= 0; i 
< content
.Length() ; i
++) 
1459             if (content
[i
] == '\r') count
++; 
1465 long wxTextCtrl::XYToPosition(long x
, long y
) const 
1471 bool wxTextCtrl::PositionToXY(long pos
, long *x
, long *y
) const 
1476 void wxTextCtrl::ShowPosition(long pos
) 
1478 #if TARGET_RT_MAC_MACHO && defined(AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER) 
1483         TXNOffset selstart 
, selend 
; 
1484         TXNGetSelection(  (TXNObject
) m_macTXN 
, &selstart 
, &selend
) ; 
1485         TXNOffsetToPoint( (TXNObject
) m_macTXN
,  selstart 
, ¤t
); 
1486         TXNOffsetToPoint( (TXNObject
) m_macTXN
,  pos 
, &desired
); 
1487         //TODO use HIPoints for 10.3 and above 
1488         if ( (UInt32
) TXNScroll 
!= (UInt32
) kUnresolvedCFragSymbolAddress 
) 
1490             OSErr theErr 
= noErr
; 
1491             SInt32 dv 
= desired
.v 
- current
.v 
; 
1492             SInt32 dh 
= desired
.h 
- current
.h 
; 
1493             TXNShowSelection(  (TXNObject
) m_macTXN 
, true ) ; 
1494             theErr 
= TXNScroll( (TXNObject
) m_macTXN
, kTXNScrollUnitsInPixels 
, kTXNScrollUnitsInPixels 
, &dv 
, &dh 
); 
1495             wxASSERT_MSG( theErr 
== noErr
, _T("TXNScroll returned an error!") ); 
1501 int wxTextCtrl::GetLineLength(long lineNo
) const 
1503     // TODO change this if possible to reflect real lines 
1504     wxString content 
= GetValue() ; 
1508     for (size_t i 
= 0; i 
< content
.Length() ; i
++) 
1510         if (count 
== lineNo
) 
1512             // Count chars in line then 
1514             for (size_t j 
= i
; j 
< content
.Length(); j
++) 
1517                 if (content
[j
] == '\n') return count
; 
1522         if (content
[i
] == '\n') count
++; 
1527 wxString 
wxTextCtrl::GetLineText(long lineNo
) const 
1529     // TODO change this if possible to reflect real lines 
1530     wxString content 
= GetValue() ; 
1534     for (size_t i 
= 0; i 
< content
.Length() ; i
++) 
1536         if (count 
== lineNo
) 
1538             // Add chars in line then 
1541             for (size_t j 
= i
; j 
< content
.Length(); j
++) 
1543                 if (content
[j
] == '\n') 
1551         if (content
[i
] == '\n') count
++; 
1553     return wxEmptyString 
; 
1560 void wxTextCtrl::Command(wxCommandEvent 
& event
) 
1562     SetValue (event
.GetString()); 
1563     ProcessCommand (event
); 
1566 void wxTextCtrl::OnDropFiles(wxDropFilesEvent
& event
) 
1568     // By default, load the first file into the text window. 
1569     if (event
.GetNumberOfFiles() > 0) 
1571         LoadFile(event
.GetFiles()[0]); 
1575 void wxTextCtrl::OnChar(wxKeyEvent
& event
) 
1577     int key 
= event
.GetKeyCode() ; 
1578     bool eat_key 
= false ; 
1580     if ( key 
== 'c' && event
.MetaDown() ) 
1587     if ( !IsEditable() && key 
!= WXK_LEFT 
&& key 
!= WXK_RIGHT 
&& key 
!= WXK_DOWN 
&& key 
!= WXK_UP 
&& key 
!= WXK_TAB 
&& 
1588         !( key 
== WXK_RETURN 
&& ( (m_windowStyle 
& wxPROCESS_ENTER
) || (m_windowStyle 
& wxTE_MULTILINE
) ) ) 
1589 /*        && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */ 
1596     // assume that any key not processed yet is going to modify the control 
1599     if ( key 
== 'v' && event
.MetaDown() ) 
1605     if ( key 
== 'x' && event
.MetaDown() ) 
1614             if (m_windowStyle 
& wxPROCESS_ENTER
) 
1616                 wxCommandEvent 
event(wxEVT_COMMAND_TEXT_ENTER
, m_windowId
); 
1617                 event
.SetEventObject( this ); 
1618                 event
.SetString( GetValue() ); 
1619                 if ( GetEventHandler()->ProcessEvent(event
) ) 
1622             if ( !(m_windowStyle 
& wxTE_MULTILINE
) ) 
1624                 wxWindow 
*parent 
= GetParent(); 
1625                 while( parent 
&& !parent
->IsTopLevel() && parent
->GetDefaultItem() == NULL 
) { 
1626                   parent 
= parent
->GetParent() ; 
1628                 if ( parent 
&& parent
->GetDefaultItem() ) 
1630                     wxButton 
*def 
= wxDynamicCast(parent
->GetDefaultItem(), 
1632                     if ( def 
&& def
->IsEnabled() ) 
1634                         wxCommandEvent 
event(wxEVT_COMMAND_BUTTON_CLICKED
, def
->GetId() ); 
1635                         event
.SetEventObject(def
); 
1636                         def
->Command(event
); 
1641                 // this will make wxWidgets eat the ENTER key so that 
1642                 // we actually prevent line wrapping in a single line 
1650             if ( !(m_windowStyle 
& wxTE_PROCESS_TAB
)) 
1653                 if (!event
.ShiftDown()) 
1654                     flags 
|= wxNavigationKeyEvent::IsForward 
; 
1655                 if (event
.ControlDown()) 
1656                     flags 
|= wxNavigationKeyEvent::WinChange 
; 
1662                 // This is necessary (don't know why) or the tab will not 
1664                 WriteText(wxT("\t")); 
1671         // perform keystroke handling 
1673         if ( m_macUsesTXN 
&& wxTheApp
->MacGetCurrentEvent() != NULL 
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL 
) 
1674             CallNextEventHandler((EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ; 
1678             if ( wxMacConvertEventToRecord(  (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec 
) ) 
1680                 EventRecord 
*ev 
= &rec 
; 
1683                 keychar 
= short(ev
->message 
& charCodeMask
); 
1684                 keycode 
= short(ev
->message 
& keyCodeMask
) >> 8 ; 
1686                 ::HandleControlKey( (ControlHandle
) m_macControl 
, keycode 
, keychar 
, ev
->modifiers 
) ; 
1690         EventRecord 
*ev 
= (EventRecord
*) wxTheApp
->MacGetCurrentEvent() ; 
1693         keychar 
= short(ev
->message 
& charCodeMask
); 
1694         keycode 
= short(ev
->message 
& keyCodeMask
) >> 8 ; 
1696         ::HandleControlKey( (ControlHandle
) m_macControl 
, keycode 
, keychar 
, ev
->modifiers 
) ; 
1699     if ( ( key 
>= 0x20 && key 
< WXK_START 
) || 
1700          key 
== WXK_RETURN 
|| 
1701          key 
== WXK_DELETE 
|| 
1704         wxCommandEvent 
event1(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
); 
1705         event1
.SetEventObject( this ); 
1706         wxPostEvent(GetEventHandler(),event1
); 
1710 void  wxTextCtrl::MacSuperShown( bool show 
) 
1712     bool former 
= m_macControlIsShown 
; 
1713     wxControl::MacSuperShown( show 
) ; 
1714     if ( (former 
!= m_macControlIsShown
) && m_macUsesTXN 
) 
1716         if ( m_macControlIsShown 
) 
1717             TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.top
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.left
, 
1718                 (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.bottom
,(**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars 
**)m_macTXNvars
).fTXNFrame
); 
1720             TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.top 
+ 30000, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.left
, 
1721                (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.bottom 
+ 30000, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars 
**)m_macTXNvars
).fTXNFrame
); 
1725 bool  wxTextCtrl::Show(bool show
) 
1727     bool former 
= m_macControlIsShown 
; 
1729     bool retval 
= wxControl::Show( show 
) ; 
1731     if ( former 
!= m_macControlIsShown 
&& m_macUsesTXN 
) 
1733         if ( m_macControlIsShown 
) 
1734             TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.top
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.left
, 
1735                 (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.bottom
,(**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars 
**)m_macTXNvars
).fTXNFrame
); 
1737             TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.top 
+ 30000, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.left
, 
1738                (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.bottom 
+ 30000, (**(STPTextPaneVars 
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars 
**)m_macTXNvars
).fTXNFrame
); 
1744 // ---------------------------------------------------------------------------- 
1745 // standard handlers for standard edit menu events 
1746 // ---------------------------------------------------------------------------- 
1748 void wxTextCtrl::OnCut(wxCommandEvent
& WXUNUSED(event
)) 
1753 void wxTextCtrl::OnCopy(wxCommandEvent
& WXUNUSED(event
)) 
1758 void wxTextCtrl::OnPaste(wxCommandEvent
& WXUNUSED(event
)) 
1763 void wxTextCtrl::OnUndo(wxCommandEvent
& WXUNUSED(event
)) 
1768 void wxTextCtrl::OnRedo(wxCommandEvent
& WXUNUSED(event
)) 
1773 void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent
& event
) 
1775     event
.Enable( CanCut() ); 
1778 void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent
& event
) 
1780     event
.Enable( CanCopy() ); 
1783 void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent
& event
) 
1785     event
.Enable( CanPaste() ); 
1788 void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent
& event
) 
1790     event
.Enable( CanUndo() ); 
1793 void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent
& event
) 
1795     event
.Enable( CanRedo() ); 
1798 bool wxTextCtrl::MacSetupCursor( const wxPoint
& pt 
) 
1803         return wxWindow::MacSetupCursor( pt 
) ;