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 #if wxUSE_STD_IOSTREAM
37 #include "wx/button.h"
38 #include "wx/toplevel.h"
39 #include "wx/textctrl.h"
40 #include "wx/notebook.h"
41 #include "wx/tabctrl.h"
42 #include "wx/settings.h"
43 #include "wx/filefn.h"
46 #if defined(__BORLANDC__) && !defined(__WIN32__)
48 #elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__)
55 #include <MacTextEditor.h>
56 #include "ATSUnicode.h"
57 #include "TextCommon.h"
58 #include "TextEncodingConverter.h"
59 #include "wx/mac/uma.h"
61 #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
63 extern wxControl
*wxFindControlFromMacControl(ControlHandle inControl
) ;
65 // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
66 // the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
67 // moment is to avoid setting the true focus on the control, the proper solution at the end would be to have
68 // an alternate path for carbon key events that routes automatically into the same wx flow of events
70 #include "MacTextEditor.h"
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 InvalWindowRect( GetControlOwner( theControl
) , &oldbounds
) ;
216 SetRect(&varsp
->fRFocusOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
217 SetRect(&varsp
->fRTextOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
218 SetRect(&varsp
->fRTextArea
, bounds
.left
+ 2 , bounds
.top
+ (varsp
->fMultiline
? 0 : 2) ,
219 bounds
.right
- (varsp
->fMultiline
? 0 : 2), bounds
.bottom
- (varsp
->fMultiline
? 0 : 2));
220 RectRgn(varsp
->fTextBackgroundRgn
, &varsp
->fRTextOutline
);
221 TXNSetFrameBounds( varsp
->fTXNRec
, varsp
->fRTextArea
.top
, varsp
->fRTextArea
.left
,
222 varsp
->fRTextArea
.bottom
, varsp
->fRTextArea
.right
, varsp
->fTXNFrame
);
225 /* update the text region */
226 RGBColor white
= { 65535 , 65535 , 65535 } ;
227 RGBBackColor( &white
) ;
228 EraseRgn(varsp
->fTextBackgroundRgn
);
229 TXNDraw(varsp
->fTXNRec
, NULL
);
230 /* restore the drawing environment */
231 /* draw the text frame and focus frame (if necessary) */
232 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
233 if ((**tpvars
).fIsActive
&& varsp
->fInFocus
) DrawThemeFocusRect(&varsp
->fRFocusOutline
, true);
234 /* release our globals */
235 HSetState((Handle
) tpvars
, state
);
241 /* TPPaneHitTestProc is called when the control manager would
242 like to determine what part of the control the mouse resides over.
243 We also call this routine from our tracking proc to determine how
244 to handle mouse clicks. */
245 static pascal ControlPartCode
TPPaneHitTestProc(ControlHandle theControl
, Point where
) {
246 STPTextPaneVars
**tpvars
;
247 ControlPartCode result
;
249 /* set up our locals and lock down our globals*/
251 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
252 if (tpvars
!= NULL
) {
253 state
= HGetState((Handle
) tpvars
);
254 HLock((Handle
) tpvars
);
255 /* find the region where we clicked */
256 if (PtInRect(where
, &(**tpvars
).fRTextArea
)) {
257 result
= kmUPTextPart
;
259 /* release oure globals */
260 HSetState((Handle
) tpvars
, state
);
269 /* TPPaneTrackingProc is called when the mouse is being held down
270 over our control. This routine handles clicks in the text area
271 and in the scroll bar. */
272 static pascal ControlPartCode
TPPaneTrackingProc(ControlHandle theControl
, Point startPt
, ControlActionUPP actionProc
) {
273 STPTextPaneVars
**tpvars
, *varsp
;
275 ControlPartCode partCodeResult
;
276 /* make sure we have some variables... */
278 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
279 if (tpvars
!= NULL
) {
281 state
= HGetState((Handle
) tpvars
);
282 HLock((Handle
) tpvars
);
284 /* we don't do any of these functions unless we're in focus */
285 if ( ! varsp
->fInFocus
) {
287 owner
= GetControlOwner(theControl
);
288 ClearKeyboardFocus(owner
);
289 SetKeyboardFocus(owner
, theControl
, kUserClickedToFocusPart
);
291 /* find the location for the click */
292 switch (TPPaneHitTestProc(theControl
, startPt
)) {
294 /* handle clicks in the text part */
296 { SetPort((**tpvars
).fDrawingEnvironment
);
297 wxMacWindowClipper
clipper( wxFindControlFromMacControl(theControl
) ) ;
299 TXNClick( varsp
->fTXNRec
, (const EventRecord
*) wxTheApp
->MacGetCurrentEvent());
302 ConvertEventRefToEventRecord( (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec
) ;
303 TXNClick( varsp
->fTXNRec
, &rec
);
310 HSetState((Handle
) tpvars
, state
);
312 return partCodeResult
;
316 /* TPPaneIdleProc is our user pane idle routine. When our text field
317 is active and in focus, we use this routine to set the cursor. */
318 static pascal void TPPaneIdleProc(ControlHandle theControl
) {
319 STPTextPaneVars
**tpvars
, *varsp
;
321 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
322 if (tpvars
!= NULL
) {
323 /* if we're not active, then we have nothing to say about the cursor */
324 if ((**tpvars
).fIsActive
) {
328 /* lock down the globals */
329 state
= HGetState((Handle
) tpvars
);
330 HLock((Handle
) tpvars
);
332 /* get the current mouse coordinates (in our window) */
333 SetPortWindowPort(GetControlOwner(theControl
));
334 wxMacWindowClipper
clipper( wxFindControlFromMacControl(theControl
) ) ;
336 /* there's a 'focus thing' and an 'unfocused thing' */
337 if (varsp
->fInFocus
) {
338 /* flash the cursor */
339 SetPort((**tpvars
).fDrawingEnvironment
);
340 TXNIdle(varsp
->fTXNRec
);
342 if (PtInRect(mousep
, &varsp
->fRTextArea
)) {
344 RectRgn((theRgn
= NewRgn()), &varsp
->fRTextArea
);
345 TXNAdjustCursor(varsp
->fTXNRec
, theRgn
);
350 // SetThemeCursor(kThemeArrowCursor);
353 /* if it's in our bounds, set the cursor */
354 GetControlBounds(theControl
, &bounds
);
355 if (PtInRect(mousep
, &bounds
))
357 // SetThemeCursor(kThemeArrowCursor);
361 HSetState((Handle
) tpvars
, state
);
367 /* TPPaneKeyDownProc is called whenever a keydown event is directed
368 at our control. Here, we direct the keydown event to the text
369 edit record and redraw the scroll bar and text field as appropriate. */
370 static pascal ControlPartCode
TPPaneKeyDownProc(ControlHandle theControl
,
371 SInt16 keyCode
, SInt16 charCode
, SInt16 modifiers
) {
372 STPTextPaneVars
**tpvars
;
373 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
374 if (tpvars
!= NULL
) {
375 if ((**tpvars
).fInFocus
) {
376 /* turn autoscrolling on and send the key event to text edit */
377 SetPort((**tpvars
).fDrawingEnvironment
);
378 wxMacWindowClipper
clipper( wxFindControlFromMacControl(theControl
) ) ;
380 memset( &ev
, 0 , sizeof( ev
) ) ;
382 ev
.modifiers
= modifiers
;
383 ev
.message
= (( keyCode
<< 8 ) & keyCodeMask
) + ( charCode
& charCodeMask
) ;
384 TXNKeyDown( (**tpvars
).fTXNRec
, &ev
);
387 return kControlEntireControl
;
391 /* TPPaneActivateProc is called when the window containing
392 the user pane control receives activate events. Here, we redraw
393 the control and it's text as necessary for the activation state. */
394 static pascal void TPPaneActivateProc(ControlHandle theControl
, Boolean activating
) {
396 STPTextPaneVars
**tpvars
, *varsp
;
399 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
400 if (tpvars
!= NULL
) {
401 state
= HGetState((Handle
) tpvars
);
402 HLock((Handle
) tpvars
);
404 /* de/activate the text edit record */
405 SetPort((**tpvars
).fDrawingEnvironment
);
406 wxMacWindowClipper
clipper( wxFindControlFromMacControl(theControl
) ) ;
407 GetControlBounds(theControl
, &bounds
);
408 varsp
->fIsActive
= activating
;
409 TPActivatePaneText(tpvars
, varsp
->fIsActive
&& varsp
->fInFocus
);
410 /* redraw the frame */
411 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
412 if (varsp
->fInFocus
) DrawThemeFocusRect(&varsp
->fRFocusOutline
, varsp
->fIsActive
);
413 HSetState((Handle
) tpvars
, state
);
418 /* TPPaneFocusProc is called when every the focus changes to or
419 from our control. Herein, switch the focus appropriately
420 according to the parameters and redraw the control as
422 static pascal ControlPartCode
TPPaneFocusProc(ControlHandle theControl
, ControlFocusPart action
) {
423 ControlPartCode focusResult
;
424 STPTextPaneVars
**tpvars
, *varsp
;
427 focusResult
= kControlFocusNoPart
;
428 tpvars
= (STPTextPaneVars
**) GetControlReference(theControl
);
429 if (tpvars
!= NULL
) {
430 state
= HGetState((Handle
) tpvars
);
431 HLock((Handle
) tpvars
);
433 /* if kControlFocusPrevPart and kControlFocusNextPart are received when the user is
434 tabbing forwards (or shift tabbing backwards) through the items in the dialog,
435 and kControlFocusNextPart will be received. When the user clicks in our field
436 and it is not the current focus, then the constant kUserClickedToFocusPart will
437 be received. The constant kControlFocusNoPart will be received when our control
438 is the current focus and the user clicks in another control. In your focus routine,
439 you should respond to these codes as follows:
441 kControlFocusNoPart - turn off focus and return kControlFocusNoPart. redraw
442 the control and the focus rectangle as necessary.
444 kControlFocusPrevPart or kControlFocusNextPart - toggle focus on or off
445 depending on its current state. redraw the control and the focus rectangle
446 as appropriate for the new focus state. If the focus state is 'off', return the constant
447 kControlFocusNoPart, otherwise return a non-zero part code.
448 kUserClickedToFocusPart - is a constant defined for this example. You should
449 define your own value for handling click-to-focus type events. */
450 /* save the drawing state */
451 SetPort((**tpvars
).fDrawingEnvironment
);
452 wxMacWindowClipper
clipper( wxFindControlFromMacControl(theControl
) ) ;
453 /* calculate the next highlight state */
456 case kControlFocusNoPart
:
457 TPFocusPaneText(tpvars
, false);
458 focusResult
= kControlFocusNoPart
;
460 case kUserClickedToFocusPart
:
461 TPFocusPaneText(tpvars
, true);
464 case kControlFocusPrevPart
:
465 case kControlFocusNextPart
:
466 TPFocusPaneText(tpvars
, ( ! varsp
->fInFocus
));
467 focusResult
= varsp
->fInFocus
? 1 : kControlFocusNoPart
;
470 TPActivatePaneText(tpvars
, varsp
->fIsActive
&& varsp
->fInFocus
);
471 /* redraw the text fram and focus rectangle to indicate the
473 DrawThemeEditTextFrame(&varsp
->fRTextOutline
, varsp
->fIsActive
? kThemeStateActive
: kThemeStateInactive
);
474 DrawThemeFocusRect(&varsp
->fRFocusOutline
, varsp
->fIsActive
&& varsp
->fInFocus
);
476 HSetState((Handle
) tpvars
, state
);
482 /* mUPOpenControl initializes a user pane control so it will be drawn
483 and will behave as a scrolling text edit field inside of a window.
484 This routine performs all of the initialization steps necessary,
485 except it does not create the user pane control itself. theControl
486 should refer to a user pane control that you have either created
487 yourself or extracted from a dialog's control heirarchy using
488 the GetDialogItemAsControl routine. */
489 OSStatus
mUPOpenControl(ControlHandle theControl
, long wxStyle
)
493 STPTextPaneVars
**tpvars
, *varsp
;
494 OSStatus err
= noErr
;
495 RGBColor rgbWhite
= {0xFFFF, 0xFFFF, 0xFFFF};
498 /* set up our globals */
499 if (gTPDrawProc
== NULL
) gTPDrawProc
= NewControlUserPaneDrawUPP(TPPaneDrawProc
);
500 if (gTPHitProc
== NULL
) gTPHitProc
= NewControlUserPaneHitTestUPP(TPPaneHitTestProc
);
501 if (gTPTrackProc
== NULL
) gTPTrackProc
= NewControlUserPaneTrackingUPP(TPPaneTrackingProc
);
502 if (gTPIdleProc
== NULL
) gTPIdleProc
= NewControlUserPaneIdleUPP(TPPaneIdleProc
);
503 if (gTPKeyProc
== NULL
) gTPKeyProc
= NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc
);
504 if (gTPActivateProc
== NULL
) gTPActivateProc
= NewControlUserPaneActivateUPP(TPPaneActivateProc
);
505 if (gTPFocusProc
== NULL
) gTPFocusProc
= NewControlUserPaneFocusUPP(TPPaneFocusProc
);
507 /* allocate our private storage */
508 tpvars
= (STPTextPaneVars
**) NewHandleClear(sizeof(STPTextPaneVars
));
509 SetControlReference(theControl
, (long) tpvars
);
510 HLock((Handle
) tpvars
);
512 /* set the initial settings for our private data */
513 varsp
->fMultiline
= wxStyle
& wxTE_MULTILINE
;
514 varsp
->fInFocus
= false;
515 varsp
->fIsActive
= true;
516 varsp
->fTEActive
= true; // in order to get a deactivate
517 varsp
->fUserPaneRec
= theControl
;
518 theWindow
= varsp
->fOwner
= GetControlOwner(theControl
);
520 varsp
->fDrawingEnvironment
= (GrafPtr
) GetWindowPort(theWindow
);
522 varsp
->fInDialogWindow
= ( GetWindowKind(varsp
->fOwner
) == kDialogWindowKind
);
523 /* set up the user pane procedures */
524 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneDrawProcTag
, sizeof(gTPDrawProc
), &gTPDrawProc
);
525 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneHitTestProcTag
, sizeof(gTPHitProc
), &gTPHitProc
);
526 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneTrackingProcTag
, sizeof(gTPTrackProc
), &gTPTrackProc
);
527 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneIdleProcTag
, sizeof(gTPIdleProc
), &gTPIdleProc
);
528 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneKeyDownProcTag
, sizeof(gTPKeyProc
), &gTPKeyProc
);
529 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneActivateProcTag
, sizeof(gTPActivateProc
), &gTPActivateProc
);
530 SetControlData(theControl
, kControlEntireControl
, kControlUserPaneFocusProcTag
, sizeof(gTPFocusProc
), &gTPFocusProc
);
531 /* calculate the rectangles used by the control */
532 GetControlBounds(theControl
, &bounds
);
533 SetRect(&varsp
->fRFocusOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
534 SetRect(&varsp
->fRTextOutline
, bounds
.left
, bounds
.top
, bounds
.right
, bounds
.bottom
);
535 SetRect(&varsp
->fRTextArea
, bounds
.left
+ 2 , bounds
.top
+ (varsp
->fMultiline
? 0 : 2) ,
536 bounds
.right
- (varsp
->fMultiline
? 0 : 2), bounds
.bottom
- (varsp
->fMultiline
? 0 : 2));
537 /* calculate the background region for the text. In this case, it's kindof
538 and irregular region because we're setting the scroll bar a little ways inside
540 RectRgn((varsp
->fTextBackgroundRgn
= NewRgn()), &varsp
->fRTextOutline
);
542 /* set up the drawing environment */
543 SetPort(varsp
->fDrawingEnvironment
);
545 /* create the new edit field */
547 TXNFrameOptions frameOptions
=
548 kTXNDontDrawCaretWhenInactiveMask
;
549 if ( ! ( wxStyle
& wxTE_NOHIDESEL
) )
550 frameOptions
|= kTXNDontDrawSelectionWhenInactiveMask
;
552 if ( wxStyle
& wxTE_MULTILINE
)
554 if ( ! ( wxStyle
& wxTE_DONTWRAP
) )
555 frameOptions
|= kTXNAlwaysWrapAtViewEdgeMask
;
558 frameOptions
|= kTXNAlwaysWrapAtViewEdgeMask
;
559 frameOptions
|= kTXNWantHScrollBarMask
;
562 if ( !(wxStyle
& wxTE_NO_VSCROLL
) )
563 frameOptions
|= kTXNWantVScrollBarMask
;
566 frameOptions
|= kTXNSingleLineOnlyMask
;
568 if ( wxStyle
& wxTE_READONLY
)
569 frameOptions
|= kTXNReadOnlyMask
;
571 TXNNewObject(NULL
, varsp
->fOwner
, &varsp
->fRTextArea
,
573 kTXNTextEditStyleFrameType
,
575 kTXNSystemDefaultEncoding
,
576 &varsp
->fTXNRec
, &varsp
->fTXNFrame
, (TXNObjectRefcon
) tpvars
);
578 if ( (wxStyle
& wxTE_MULTILINE
) && (wxStyle
& wxTE_DONTWRAP
) )
580 TXNControlTag tag
= kTXNWordWrapStateTag
;
582 dat
.uValue
= kTXNNoAutoWrap
;
583 TXNSetTXNObjectControls( varsp
->fTXNRec
, false , 1 , &tag
, &dat
) ;
589 GetThemeFont(kThemeSmallSystemFont
, GetApplicationScript() , fontName
, &fontSize
, &fontStyle
) ;
591 TXNTypeAttributes typeAttr
[] =
593 { kTXNQDFontNameAttribute
, kTXNQDFontNameAttributeSize
, { (void*) fontName
} } ,
594 { kTXNQDFontSizeAttribute
, kTXNFontSizeAttributeSize
, { (void*) (fontSize
<< 16) } } ,
595 { kTXNQDFontStyleAttribute
, kTXNQDFontStyleAttributeSize
, { (void*) normal
} } ,
598 err
= TXNSetTypeAttributes (varsp
->fTXNRec
, sizeof( typeAttr
) / sizeof(TXNTypeAttributes
) , typeAttr
,
601 /* set the field's background */
603 tback
.bgType
= kTXNBackgroundTypeRGB
;
604 tback
.bg
.color
= rgbWhite
;
605 TXNSetBackground( varsp
->fTXNRec
, &tback
);
607 /* unlock our storage */
608 HUnlock((Handle
) tpvars
);
609 /* perform final activations and setup for our text field. Here,
610 we assume that the window is going to be the 'active' window. */
611 TPActivatePaneText(tpvars
, varsp
->fIsActive
&& varsp
->fInFocus
);
619 #if !USE_SHARED_LIBRARY
620 IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl
, wxControl
)
622 BEGIN_EVENT_TABLE(wxTextCtrl
, wxControl
)
623 EVT_DROP_FILES(wxTextCtrl::OnDropFiles
)
624 EVT_CHAR(wxTextCtrl::OnChar
)
625 EVT_MENU(wxID_CUT
, wxTextCtrl::OnCut
)
626 EVT_MENU(wxID_COPY
, wxTextCtrl::OnCopy
)
627 EVT_MENU(wxID_PASTE
, wxTextCtrl::OnPaste
)
628 EVT_MENU(wxID_UNDO
, wxTextCtrl::OnUndo
)
629 EVT_MENU(wxID_REDO
, wxTextCtrl::OnRedo
)
631 EVT_UPDATE_UI(wxID_CUT
, wxTextCtrl::OnUpdateCut
)
632 EVT_UPDATE_UI(wxID_COPY
, wxTextCtrl::OnUpdateCopy
)
633 EVT_UPDATE_UI(wxID_PASTE
, wxTextCtrl::OnUpdatePaste
)
634 EVT_UPDATE_UI(wxID_UNDO
, wxTextCtrl::OnUpdateUndo
)
635 EVT_UPDATE_UI(wxID_REDO
, wxTextCtrl::OnUpdateRedo
)
640 wxTextCtrl::wxTextCtrl()
644 m_macTXNvars
= NULL
;
645 m_macUsesTXN
= false ;
647 m_maxLength
= TE_UNLIMITED_LENGTH
;
650 wxTextCtrl::~wxTextCtrl()
654 SetControlReference((ControlHandle
)m_macControl
, 0) ;
655 TXNDeleteObject((TXNObject
)m_macTXN
);
656 /* delete our private storage */
657 DisposeHandle((Handle
) m_macTXNvars
);
658 /* zero the control reference */
662 const short kVerticalMargin
= 2 ;
663 const short kHorizontalMargin
= 2 ;
665 bool wxTextCtrl::Create(wxWindow
*parent
, wxWindowID id
,
668 const wxSize
& size
, long style
,
669 const wxValidator
& validator
,
670 const wxString
& name
)
674 m_macTXNvars
= NULL
;
675 m_macUsesTXN
= false ;
678 m_macUsesTXN
= ! (style
& wxTE_PASSWORD
) ;
680 m_macUsesTXN
&= (TXNInitTextension
!= (void*) kUnresolvedCFragSymbolAddress
) ;
682 // base initialization
683 if ( !wxTextCtrlBase::Create(parent
, id
, pos
, size
, style
, validator
, name
) )
686 wxSize mySize
= size
;
689 m_macHorizontalBorder
= 5 ; // additional pixels around the real control
690 m_macVerticalBorder
= 3 ;
694 m_macHorizontalBorder
= 5 ; // additional pixels around the real control
695 m_macVerticalBorder
= 5 ;
702 if ( mySize.y == -1 )
705 if ( m_windowStyle & wxTE_MULTILINE )
708 mySize.y += 2 * m_macVerticalBorder ;
711 MacPreControlCreate( parent
, id
, wxEmptyString
, pos
, mySize
,style
, validator
, name
, &bounds
, title
) ;
713 if ( m_windowStyle
& wxTE_MULTILINE
)
715 wxASSERT_MSG( !(m_windowStyle
& wxTE_PROCESS_ENTER
),
716 wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );
718 m_windowStyle
|= wxTE_PROCESS_ENTER
;
721 if ( m_windowStyle
& wxTE_READONLY
)
728 m_macControl
= ::NewControl( MAC_WXHWND(parent
->MacGetRootWindow()) , &bounds
, "\p" , true , 0 , 0 , 1,
729 (style
& wxTE_PASSWORD
) ? kControlEditTextPasswordProc
: kControlEditTextProc
, (long) this ) ;
731 ::GetControlData((ControlHandle
) m_macControl
, 0, kControlEditTextTEHandleTag
, sizeof( TEHandle
) , (char*)((TEHandle
*)&m_macTE
) , &size
) ;
738 featurSet
= kControlSupportsEmbedding
| kControlSupportsFocus
| kControlWantsIdle
739 | kControlWantsActivate
| kControlHandlesTracking
| kControlHasSpecialBackground
740 | kControlGetsFocusOnClick
| kControlSupportsLiveFeedback
;
741 /* create the control */
742 m_macControl
= NewControl(MAC_WXHWND(parent
->MacGetRootWindow()), &bounds
, "\p", true, featurSet
, 0, featurSet
, kControlUserPaneProc
, 0);
743 /* set up the mUP specific features and data */
744 mUPOpenControl((ControlHandle
) m_macControl
, m_windowStyle
);
746 MacPostControlCreate() ;
750 wxCharBuffer text
= wxMacStringToCString( st
) ;
751 ::SetControlData( (ControlHandle
) m_macControl
, 0, ( m_windowStyle
& wxTE_PASSWORD
) ? kControlEditTextPasswordTag
: kControlEditTextTextTag
, strlen(text
) , text
) ;
755 STPTextPaneVars
**tpvars
;
757 tpvars
= (STPTextPaneVars
**) GetControlReference((ControlHandle
) m_macControl
);
758 /* set the text in the record */
759 m_macTXN
= (**tpvars
).fTXNRec
;
761 TXNSetData( ((TXNObject
) m_macTXN
) , kTXNUnicodeTextData
, (void*)st
.wc_str(), st
.Length() * 2,
762 kTXNStartOffset
, kTXNEndOffset
);
764 wxCharBuffer text
= wxMacStringToCString( st
) ;
765 TXNSetData( ((TXNObject
) m_macTXN
) , kTXNTextData
, (void*)text
.data(), strlen( text
) ,
766 kTXNStartOffset
, kTXNEndOffset
);
768 m_macTXNvars
= tpvars
;
769 m_macUsesTXN
= true ;
770 TXNSetSelection( (TXNObject
) m_macTXN
, 0, 0);
771 TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
);
777 wxString
wxTextCtrl::GetValue() const
784 err
= ::GetControlDataSize((ControlHandle
) m_macControl
, 0,
785 ( m_windowStyle
& wxTE_PASSWORD
) ? kControlEditTextPasswordTag
: kControlEditTextTextTag
, &actualSize
) ;
788 return wxEmptyString
;
790 if ( actualSize
> 0 )
792 wxCharBuffer
buf(actualSize
) ;
793 ::GetControlData( (ControlHandle
) m_macControl
, 0,
794 ( m_windowStyle
& wxTE_PASSWORD
) ? kControlEditTextPasswordTag
: kControlEditTextTextTag
,
795 actualSize
, buf
.data() , &actualSize
) ;
796 result
= wxMacMakeStringFromCString( buf
) ;
803 err
= TXNGetDataEncoded( ((TXNObject
) m_macTXN
), kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNUnicodeTextData
);
811 actualSize
= GetHandleSize( theText
) ;
812 if ( actualSize
> 0 )
814 wxChar
*ptr
= result
.GetWriteBuf(actualSize
*sizeof(wxChar
)) ;
815 wxStrncpy( ptr
, (wxChar
*) *theText
, actualSize
) ;
816 ptr
[actualSize
] = 0 ;
817 result
.UngetWriteBuf( actualSize
) ;
819 DisposeHandle( theText
) ;
823 err
= TXNGetDataEncoded( ((TXNObject
) m_macTXN
), kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNTextData
);
831 actualSize
= GetHandleSize( theText
) ;
832 if ( actualSize
> 0 )
835 result
= wxMacMakeStringFromCString( *theText
, actualSize
) ;
838 DisposeHandle( theText
) ;
846 void wxTextCtrl::GetSelection(long* from
, long* to
) const
850 *from
= (**((TEHandle
) m_macTE
)).selStart
;
851 *to
= (**((TEHandle
) m_macTE
)).selEnd
;
855 TXNGetSelection( ((TXNObject
) m_macTXN
) , (TXNOffset
*) from
, (TXNOffset
*) to
) ;
859 void wxTextCtrl::SetValue(const wxString
& st
)
863 wxCharBuffer text
= wxMacStringToCString( st
) ;
864 ::SetControlData( (ControlHandle
) m_macControl
, 0, ( m_windowStyle
& wxTE_PASSWORD
) ? kControlEditTextPasswordTag
: kControlEditTextTextTag
, strlen(text
) , text
) ;
868 bool formerEditable
= m_editable
;
869 if ( !formerEditable
)
872 TXNSetData( ((TXNObject
) m_macTXN
), kTXNUnicodeTextData
, (void*)st
.wc_str(), st
.Length() * 2 ,
873 kTXNStartOffset
, kTXNEndOffset
);
875 wxCharBuffer text
= wxMacStringToCString( st
) ;
876 TXNSetData( ((TXNObject
) m_macTXN
), kTXNTextData
, (void*)text
.data(), strlen( text
) ,
877 kTXNStartOffset
, kTXNEndOffset
);
879 TXNSetSelection( (TXNObject
) m_macTXN
, 0, 0);
880 TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
);
881 if ( !formerEditable
)
882 SetEditable(formerEditable
) ;
887 void wxTextCtrl::SetMaxLength(unsigned long len
)
892 bool wxTextCtrl::SetStyle(long start
, long end
, const wxTextAttr
& style
)
896 bool formerEditable
= m_editable
;
897 if ( !formerEditable
)
899 TXNTypeAttributes typeAttr
[4] ;
900 Str255 fontName
= "\pMonaco" ;
901 SInt16 fontSize
= 12 ;
902 Style fontStyle
= normal
;
904 int attrCounter
= 0 ;
905 if ( style
.HasFont() )
907 const wxFont
&font
= style
.GetFont() ;
908 wxMacStringToPascal( font
.GetFaceName() , fontName
) ;
909 fontSize
= font
.GetPointSize() ;
910 if ( font
.GetUnderlined() )
911 fontStyle
|= underline
;
912 if ( font
.GetWeight() == wxBOLD
)
914 if ( font
.GetStyle() == wxITALIC
)
915 fontStyle
|= italic
;
917 typeAttr
[attrCounter
].tag
= kTXNQDFontNameAttribute
;
918 typeAttr
[attrCounter
].size
= kTXNQDFontNameAttributeSize
;
919 typeAttr
[attrCounter
].data
.dataPtr
= (void*) fontName
;
920 typeAttr
[attrCounter
+1].tag
= kTXNQDFontSizeAttribute
;
921 typeAttr
[attrCounter
+1].size
= kTXNFontSizeAttributeSize
;
922 typeAttr
[attrCounter
+1].data
.dataValue
= (fontSize
<< 16) ;
923 typeAttr
[attrCounter
+2].tag
= kTXNQDFontStyleAttribute
;
924 typeAttr
[attrCounter
+2].size
= kTXNQDFontStyleAttributeSize
;
925 typeAttr
[attrCounter
+2].data
.dataValue
= fontStyle
;
929 if ( style
.HasTextColour() )
931 typeAttr
[attrCounter
].tag
= kTXNQDFontColorAttribute
;
932 typeAttr
[attrCounter
].size
= kTXNQDFontColorAttributeSize
;
933 typeAttr
[attrCounter
].data
.dataPtr
= (void*) &color
;
934 color
= MAC_WXCOLORREF(style
.GetTextColour().GetPixel()) ;
938 if ( attrCounter
> 0 )
942 #endif // __WXDEBUG__
943 TXNSetTypeAttributes ((TXNObject
)m_macTXN
, attrCounter
, typeAttr
, start
,end
);
944 wxASSERT_MSG( status
== noErr
, wxT("Couldn't set text attributes") ) ;
946 if ( !formerEditable
)
947 SetEditable(formerEditable
) ;
952 bool wxTextCtrl::SetDefaultStyle(const wxTextAttr
& style
)
954 wxTextCtrlBase::SetDefaultStyle( style
) ;
955 SetStyle( kTXNUseCurrentSelection
, kTXNUseCurrentSelection
, GetDefaultStyle() ) ;
959 // Clipboard operations
960 void wxTextCtrl::Copy()
966 TECopy( ((TEHandle
) m_macTE
) ) ;
974 TXNCopy((TXNObject
)m_macTXN
);
975 TXNConvertToPublicScrap();
980 void wxTextCtrl::Cut()
986 TECut( ((TEHandle
) m_macTE
) ) ;
994 TXNCut((TXNObject
)m_macTXN
);
995 TXNConvertToPublicScrap();
997 wxCommandEvent
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
998 event
.SetString( GetValue() ) ;
999 event
.SetEventObject( this );
1000 GetEventHandler()->ProcessEvent(event
);
1004 void wxTextCtrl::Paste()
1008 if ( !m_macUsesTXN
)
1011 TEPaste( (TEHandle
) m_macTE
) ;
1012 MacRedrawControl() ;
1016 TXNConvertFromPublicScrap();
1017 TXNPaste((TXNObject
)m_macTXN
);
1018 SetStyle( kTXNUseCurrentSelection
, kTXNUseCurrentSelection
, GetDefaultStyle() ) ;
1020 wxCommandEvent
event(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
1021 event
.SetString( GetValue() ) ;
1022 event
.SetEventObject( this );
1023 GetEventHandler()->ProcessEvent(event
);
1027 bool wxTextCtrl::CanCopy() const
1029 // Can copy if there's a selection
1031 GetSelection(& from
, & to
);
1032 return (from
!= to
);
1035 bool wxTextCtrl::CanCut() const
1037 if ( !IsEditable() )
1041 // Can cut if there's a selection
1043 GetSelection(& from
, & to
);
1044 return (from
!= to
);
1047 bool wxTextCtrl::CanPaste() const
1053 OSStatus err
= noErr
;
1056 err
= GetCurrentScrap( &scrapRef
);
1057 if ( err
!= noTypeErr
&& err
!= memFullErr
)
1059 ScrapFlavorFlags flavorFlags
;
1062 if (( err
= GetScrapFlavorFlags( scrapRef
, 'TEXT', &flavorFlags
)) == noErr
)
1064 if (( err
= GetScrapFlavorSize( scrapRef
, 'TEXT', &byteCount
)) == noErr
)
1074 if ( GetScrap( NULL
, 'TEXT' , &offset
) > 0 )
1082 void wxTextCtrl::SetEditable(bool editable
)
1084 if ( editable
!= m_editable
)
1086 m_editable
= editable
;
1087 if ( !m_macUsesTXN
)
1090 UMAActivateControl( (ControlHandle
) m_macControl
) ;
1092 UMADeactivateControl((ControlHandle
) m_macControl
) ;
1096 TXNControlTag tag
[] = { kTXNIOPrivilegesTag
} ;
1097 TXNControlData data
[] = { { editable
? kTXNReadWrite
: kTXNReadOnly
} } ;
1098 TXNSetTXNObjectControls( (TXNObject
) m_macTXN
, false , sizeof(tag
) / sizeof (TXNControlTag
) , tag
, data
) ;
1103 void wxTextCtrl::SetInsertionPoint(long pos
)
1105 SetSelection( pos
, pos
) ;
1108 void wxTextCtrl::SetInsertionPointEnd()
1110 long pos
= GetLastPosition();
1111 SetInsertionPoint(pos
);
1114 long wxTextCtrl::GetInsertionPoint() const
1117 GetSelection( &begin
, &end
) ;
1121 long wxTextCtrl::GetLastPosition() const
1123 if ( !m_macUsesTXN
)
1125 return (**((TEHandle
) m_macTE
)).teLength
;
1131 OSErr err
= TXNGetDataEncoded( (TXNObject
) m_macTXN
, kTXNStartOffset
, kTXNEndOffset
, &theText
, kTXNTextData
);
1139 actualsize
= GetHandleSize( theText
) ;
1140 DisposeHandle( theText
) ;
1146 void wxTextCtrl::Replace(long from
, long to
, const wxString
& value
)
1148 if ( !m_macUsesTXN
)
1150 ControlEditTextSelectionRec selection
;
1152 selection
.selStart
= from
;
1153 selection
.selEnd
= to
;
1154 ::SetControlData((ControlHandle
) m_macControl
, 0, kControlEditTextSelectionTag
, sizeof( selection
) , (char*) &selection
) ;
1155 TESetSelect( from
, to
, ((TEHandle
) m_macTE
) ) ;
1156 TEDelete( ((TEHandle
) m_macTE
) ) ;
1157 TEInsert( value
, value
.Length() , ((TEHandle
) m_macTE
) ) ;
1161 bool formerEditable
= m_editable
;
1162 if ( !formerEditable
)
1164 TXNSetSelection( ((TXNObject
) m_macTXN
) , from
, to
) ;
1165 TXNClear( ((TXNObject
) m_macTXN
) ) ;
1167 TXNSetData( ((TXNObject
) m_macTXN
), kTXNUnicodeTextData
, (void*)value
.wc_str(), value
.Length() * 2 ,
1168 kTXNUseCurrentSelection
, kTXNUseCurrentSelection
);
1170 TXNSetData( ((TXNObject
) m_macTXN
), kTXNTextData
, (void*)value
.c_str(), value
.Length(),
1171 kTXNUseCurrentSelection
, kTXNUseCurrentSelection
);
1173 if ( !formerEditable
)
1174 SetEditable( formerEditable
) ;
1179 void wxTextCtrl::Remove(long from
, long to
)
1181 if ( !m_macUsesTXN
)
1183 ControlEditTextSelectionRec selection
;
1185 selection
.selStart
= from
;
1186 selection
.selEnd
= to
;
1187 ::SetControlData( (ControlHandle
) m_macControl
, 0, kControlEditTextSelectionTag
, sizeof( selection
) , (char*) &selection
) ;
1188 TEDelete( ((TEHandle
) m_macTE
) ) ;
1192 bool formerEditable
= m_editable
;
1193 if ( !formerEditable
)
1195 TXNSetSelection( ((TXNObject
) m_macTXN
) , from
, to
) ;
1196 TXNClear( ((TXNObject
) m_macTXN
) ) ;
1197 if ( !formerEditable
)
1198 SetEditable( formerEditable
) ;
1203 void wxTextCtrl::SetSelection(long from
, long to
)
1209 to
= GetLastPosition();
1211 if ( !m_macUsesTXN
)
1213 ControlEditTextSelectionRec selection
;
1214 selection
.selStart
= from
;
1215 selection
.selEnd
= to
;
1217 TESetSelect( selection
.selStart
, selection
.selEnd
, ((TEHandle
) m_macTE
) ) ;
1218 ::SetControlData((ControlHandle
) m_macControl
, 0, kControlEditTextSelectionTag
, sizeof( selection
) , (char*) &selection
) ;
1222 STPTextPaneVars
**tpvars
;
1223 /* set up our locals */
1224 tpvars
= (STPTextPaneVars
**) GetControlReference((ControlHandle
) m_macControl
);
1225 /* and our drawing environment as the operation
1226 may force a redraw in the text area. */
1227 SetPort((**tpvars
).fDrawingEnvironment
);
1228 /* change the selection */
1229 TXNSetSelection( (**tpvars
).fTXNRec
, from
, to
);
1230 TXNShowSelection( (TXNObject
) m_macTXN
, kTXNShowStart
);
1234 bool wxTextCtrl::LoadFile(const wxString
& file
)
1236 if ( wxTextCtrlBase::LoadFile(file
) )
1244 void wxTextCtrl::WriteText(const wxString
& st
)
1246 if ( !m_macUsesTXN
)
1248 wxCharBuffer text
= wxMacStringToCString( st
) ;
1249 TEInsert( text
, strlen(text
) , ((TEHandle
) m_macTE
) ) ;
1253 bool formerEditable
= m_editable
;
1254 if ( !formerEditable
)
1256 long start
, end
, dummy
;
1257 GetSelection( &start
, &dummy
) ;
1259 TXNSetData( ((TXNObject
) m_macTXN
), kTXNUnicodeTextData
, (void*)st
.wc_str(), st
.Length() * 2 ,
1260 kTXNUseCurrentSelection
, kTXNUseCurrentSelection
);
1262 wxCharBuffer text
= wxMacStringToCString( st
) ;
1263 TXNSetData( ((TXNObject
) m_macTXN
), kTXNTextData
, (void*)text
.data(), strlen( text
) ,
1264 kTXNUseCurrentSelection
, kTXNUseCurrentSelection
);
1266 GetSelection( &dummy
, &end
) ;
1267 SetStyle( start
, end
, GetDefaultStyle() ) ;
1268 if ( !formerEditable
)
1269 SetEditable( formerEditable
) ;
1271 MacRedrawControl() ;
1274 void wxTextCtrl::AppendText(const wxString
& text
)
1276 SetInsertionPointEnd();
1280 void wxTextCtrl::Clear()
1282 if ( !IsEditable() )
1286 if ( !m_macUsesTXN
)
1288 ::SetControlData((ControlHandle
) m_macControl
, 0, ( m_windowStyle
& wxTE_PASSWORD
) ? kControlEditTextPasswordTag
: kControlEditTextTextTag
, 0 , (char*) ((const char*)NULL
) ) ;
1292 TXNSetSelection( (TXNObject
)m_macTXN
, kTXNStartOffset
, kTXNEndOffset
) ;
1293 TXNClear((TXNObject
)m_macTXN
);
1298 bool wxTextCtrl::IsModified() const
1303 bool wxTextCtrl::IsEditable() const
1305 return IsEnabled() && m_editable
;
1308 bool wxTextCtrl::AcceptsFocus() const
1310 // we don't want focus if we can't be edited
1311 return /*IsEditable() && */ wxControl::AcceptsFocus();
1314 wxSize
wxTextCtrl::DoGetBestSize() const
1329 wxGetCharSize(GetHWND(), &cx, &cy, &GetFont());
1331 int wText = DEFAULT_ITEM_WIDTH;
1333 int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);
1335 return wxSize(wText, hText);
1337 if ( m_windowStyle
& wxTE_MULTILINE
)
1341 hText
+= 2 * m_macVerticalBorder
;
1342 wText
+= 2 * m_macHorizontalBorder
;
1343 //else: for single line control everything is ok
1344 return wxSize(wText
, hText
);
1347 // ----------------------------------------------------------------------------
1349 // ----------------------------------------------------------------------------
1351 void wxTextCtrl::Undo()
1357 TXNUndo((TXNObject
)m_macTXN
);
1362 void wxTextCtrl::Redo()
1368 TXNRedo((TXNObject
)m_macTXN
);
1373 bool wxTextCtrl::CanUndo() const
1375 if ( !IsEditable() )
1381 return TXNCanUndo((TXNObject
)m_macTXN
,NULL
);
1386 bool wxTextCtrl::CanRedo() const
1388 if ( !IsEditable() )
1394 return TXNCanRedo((TXNObject
)m_macTXN
,NULL
);
1399 // Makes 'unmodified'
1400 void wxTextCtrl::DiscardEdits()
1405 int wxTextCtrl::GetNumberOfLines() const
1407 // TODO change this if possible to reflect real lines
1408 wxString content
= GetValue() ;
1411 for (size_t i
= 0; i
< content
.Length() ; i
++)
1413 if (content
[i
] == '\r') count
++;
1419 long wxTextCtrl::XYToPosition(long x
, long y
) const
1425 bool wxTextCtrl::PositionToXY(long pos
, long *x
, long *y
) const
1430 void wxTextCtrl::ShowPosition(long pos
)
1435 int wxTextCtrl::GetLineLength(long lineNo
) const
1437 // TODO change this if possible to reflect real lines
1438 wxString content
= GetValue() ;
1442 for (size_t i
= 0; i
< content
.Length() ; i
++)
1444 if (count
== lineNo
)
1446 // Count chars in line then
1448 for (size_t j
= i
; j
< content
.Length(); j
++)
1451 if (content
[j
] == '\r') return count
;
1456 if (content
[i
] == '\r') count
++;
1461 wxString
wxTextCtrl::GetLineText(long lineNo
) const
1463 // TODO change this if possible to reflect real lines
1464 wxString content
= GetValue() ;
1468 for (size_t i
= 0; i
< content
.Length() ; i
++)
1470 if (count
== lineNo
)
1472 // Add chars in line then
1475 for (size_t j
= i
; j
< content
.Length(); j
++)
1477 if (content
[j
] == '\r')
1485 if (content
[i
] == '\r') count
++;
1487 return wxEmptyString
;
1494 void wxTextCtrl::Command(wxCommandEvent
& event
)
1496 SetValue (event
.GetString());
1497 ProcessCommand (event
);
1500 void wxTextCtrl::OnDropFiles(wxDropFilesEvent
& event
)
1502 // By default, load the first file into the text window.
1503 if (event
.GetNumberOfFiles() > 0)
1505 LoadFile(event
.GetFiles()[0]);
1509 void wxTextCtrl::OnChar(wxKeyEvent
& event
)
1511 int key
= event
.GetKeyCode() ;
1512 bool eat_key
= false ;
1514 if ( key
== 'c' && event
.MetaDown() )
1521 if ( !IsEditable() && key
!= WXK_LEFT
&& key
!= WXK_RIGHT
&& key
!= WXK_DOWN
&& key
!= WXK_UP
&& key
!= WXK_TAB
&&
1522 !( key
== WXK_RETURN
&& ( (m_windowStyle
& wxPROCESS_ENTER
) || (m_windowStyle
& wxTE_MULTILINE
) ) )
1523 /* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
1529 if ( key
== 'v' && event
.MetaDown() )
1535 if ( key
== 'x' && event
.MetaDown() )
1544 if (m_windowStyle
& wxPROCESS_ENTER
)
1546 wxCommandEvent
event(wxEVT_COMMAND_TEXT_ENTER
, m_windowId
);
1547 event
.SetEventObject( this );
1548 event
.SetString( GetValue() );
1549 if ( GetEventHandler()->ProcessEvent(event
) )
1552 if ( !(m_windowStyle
& wxTE_MULTILINE
) )
1554 wxWindow
*parent
= GetParent();
1555 while( parent
&& !parent
->IsTopLevel() && parent
->GetDefaultItem() == NULL
) {
1556 parent
= parent
->GetParent() ;
1558 if ( parent
&& parent
->GetDefaultItem() )
1560 wxButton
*def
= wxDynamicCast(parent
->GetDefaultItem(),
1562 if ( def
&& def
->IsEnabled() )
1564 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, def
->GetId() );
1565 event
.SetEventObject(def
);
1566 def
->Command(event
);
1571 // this will make wxWindows eat the ENTER key so that
1572 // we actually prevent line wrapping in a single line
1580 // always produce navigation event - even if we process TAB
1581 // ourselves the fact that we got here means that the user code
1582 // decided to skip processing of this TAB - probably to let it
1583 // do its default job.
1585 wxNavigationKeyEvent eventNav
;
1586 eventNav
.SetDirection(!event
.ShiftDown());
1587 eventNav
.SetWindowChange(event
.ControlDown());
1588 eventNav
.SetEventObject(this);
1590 if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav
) )
1601 // perform keystroke handling
1603 if ( m_macUsesTXN
&& wxTheApp
->MacGetCurrentEvent() != NULL
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL
)
1604 CallNextEventHandler((EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() , (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ;
1609 if ( wxMacConvertEventToRecord( (EventRef
) wxTheApp
->MacGetCurrentEvent() , &rec
) )
1611 EventRecord
*ev
= &rec
;
1614 keychar
= short(ev
->message
& charCodeMask
);
1615 keycode
= short(ev
->message
& keyCodeMask
) >> 8 ;
1617 ::HandleControlKey( (ControlHandle
) m_macControl
, keycode
, keychar
, ev
->modifiers
) ;
1621 if ( ( key
>= 0x20 && key
< WXK_START
) ||
1622 key
== WXK_RETURN
||
1623 key
== WXK_DELETE
||
1626 wxCommandEvent
event1(wxEVT_COMMAND_TEXT_UPDATED
, m_windowId
);
1627 event1
.SetString( GetValue() ) ;
1628 event1
.SetEventObject( this );
1629 wxPostEvent(GetEventHandler(),event1
);
1633 void wxTextCtrl::MacSuperShown( bool show
)
1635 bool former
= m_macControlIsShown
;
1636 wxControl::MacSuperShown( show
) ;
1637 if ( (former
!= m_macControlIsShown
) && m_macUsesTXN
)
1639 if ( m_macControlIsShown
)
1640 TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.top
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.left
,
1641 (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.bottom
,(**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars
**)m_macTXNvars
).fTXNFrame
);
1643 TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.top
+ 30000, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.left
,
1644 (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.bottom
+ 30000, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars
**)m_macTXNvars
).fTXNFrame
);
1648 bool wxTextCtrl::Show(bool show
)
1650 bool former
= m_macControlIsShown
;
1652 bool retval
= wxControl::Show( show
) ;
1654 if ( former
!= m_macControlIsShown
&& m_macUsesTXN
)
1656 if ( m_macControlIsShown
)
1657 TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.top
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.left
,
1658 (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.bottom
,(**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars
**)m_macTXNvars
).fTXNFrame
);
1660 TXNSetFrameBounds( (TXNObject
) m_macTXN
, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.top
+ 30000, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.left
,
1661 (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.bottom
+ 30000, (**(STPTextPaneVars
**)m_macTXNvars
).fRTextArea
.right
, (**(STPTextPaneVars
**)m_macTXNvars
).fTXNFrame
);
1667 // ----------------------------------------------------------------------------
1668 // standard handlers for standard edit menu events
1669 // ----------------------------------------------------------------------------
1671 void wxTextCtrl::OnCut(wxCommandEvent
& WXUNUSED(event
))
1676 void wxTextCtrl::OnCopy(wxCommandEvent
& WXUNUSED(event
))
1681 void wxTextCtrl::OnPaste(wxCommandEvent
& WXUNUSED(event
))
1686 void wxTextCtrl::OnUndo(wxCommandEvent
& WXUNUSED(event
))
1691 void wxTextCtrl::OnRedo(wxCommandEvent
& WXUNUSED(event
))
1696 void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent
& event
)
1698 event
.Enable( CanCut() );
1701 void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent
& event
)
1703 event
.Enable( CanCopy() );
1706 void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent
& event
)
1708 event
.Enable( CanPaste() );
1711 void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent
& event
)
1713 event
.Enable( CanUndo() );
1716 void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent
& event
)
1718 event
.Enable( CanRedo() );
1721 bool wxTextCtrl::MacSetupCursor( const wxPoint
& pt
)
1726 return wxWindow::MacSetupCursor( pt
) ;