]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/textctrl.cpp
unicode for mac fixes
[wxWidgets.git] / src / mac / carbon / textctrl.cpp
CommitLineData
e9576ca5
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: textctrl.cpp
3// Purpose: wxTextCtrl
a31a5f85 4// Author: Stefan Csomor
e9576ca5 5// Modified by:
a31a5f85 6// Created: 1998-01-01
e9576ca5 7// RCS-ID: $Id$
a31a5f85 8// Copyright: (c) Stefan Csomor
ed8c2780 9// Licence: wxWindows licence
e9576ca5
SC
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "textctrl.h"
14#endif
15
fedad417
GD
16#include "wx/defs.h"
17
18#if wxUSE_TEXTCTRL
19
f5c6eb5c 20#ifdef __DARWIN__
03e11df5
GD
21 #include <sys/types.h>
22 #include <sys/stat.h>
e9576ca5 23#else
03e11df5 24 #include <stat.h>
e9576ca5 25#endif
2b5f62a0
VZ
26
27#if wxUSE_STD_IOSTREAM
28 #if wxUSE_IOSTREAMH
29 #include <fstream.h>
30 #else
31 #include <fstream>
32 #endif
33#endif
e9576ca5 34
03e11df5 35#include "wx/app.h"
5fde6fcc 36#include "wx/dc.h"
03e11df5 37#include "wx/button.h"
422644a3 38#include "wx/toplevel.h"
e9576ca5 39#include "wx/textctrl.h"
90b22aca
SC
40#include "wx/notebook.h"
41#include "wx/tabctrl.h"
e9576ca5
SC
42#include "wx/settings.h"
43#include "wx/filefn.h"
44#include "wx/utils.h"
45
46#if defined(__BORLANDC__) && !defined(__WIN32__)
03e11df5 47 #include <alloc.h>
f5c6eb5c 48#elif !defined(__MWERKS__) && !defined(__GNUWIN32) && !defined(__DARWIN__)
03e11df5 49 #include <malloc.h>
e9576ca5
SC
50#endif
51
66a09d47
SC
52#ifndef __DARWIN__
53#include <Scrap.h>
1b2b1638
SC
54#endif
55#include <MacTextEditor.h>
56#include "ATSUnicode.h"
57#include "TextCommon.h"
58#include "TextEncodingConverter.h"
59#include "wx/mac/uma.h"
72055702 60
29b30405
SC
61#define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
62
e600c175 63extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
72055702 64
7759d157
SC
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
72055702
SC
69
70#include "MacTextEditor.h"
71
72/* part codes */
73
74/* kmUPTextPart is the part code we return to indicate the user has clicked
ed8c2780 75 in the text area of our control */
72055702
SC
76#define kmUPTextPart 1
77
78/* kmUPScrollPart is the part code we return to indicate the user has clicked
ed8c2780 79 in the scroll bar part of the control. */
72055702
SC
80#define kmUPScrollPart 2
81
82
83/* routines for using existing user pane controls.
ed8c2780
RR
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
86 text edit field.*/
ef4a634b 87
72055702 88/* mUPOpenControl initializes a user pane control so it will be drawn
ed8c2780
RR
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. */
29b30405 95OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle);
72055702
SC
96
97/* Utility Routines */
98
72055702 99enum {
ed8c2780 100 kShiftKeyCode = 56
72055702
SC
101};
102
103/* kUserClickedToFocusPart is a part code we pass to the SetKeyboardFocus
ed8c2780
RR
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'. */
72055702
SC
107#define kUserClickedToFocusPart 100
108
109
110/* kmUPClickScrollDelayTicks is a time measurement in ticks used to
ed8c2780
RR
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. */
72055702
SC
114#define kmUPClickScrollDelayTicks 3
115
116
117/* STPTextPaneVars is a structure used for storing the the mUP Control's
ed8c2780
RR
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. */
72055702
SC
121
122typedef struct {
ed8c2780
RR
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 */
129 /* flags */
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 */
ef4a634b
RD
132 Boolean fTEActive; /* reflects the activation state of the text edit record */
133 Boolean fInDialogWindow; /* true if displayed in a dialog window */
ed8c2780
RR
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;
29e4a190 142 bool fMultiline ;
72055702
SC
143} STPTextPaneVars;
144
145
146
147
148/* Univerals Procedure Pointer variables used by the
ed8c2780
RR
149 mUP Control. These variables are set up
150 the first time that mUPOpenControl is called. */
72055702
SC
151ControlUserPaneDrawUPP gTPDrawProc = NULL;
152ControlUserPaneHitTestUPP gTPHitProc = NULL;
153ControlUserPaneTrackingUPP gTPTrackProc = NULL;
154ControlUserPaneIdleUPP gTPIdleProc = NULL;
155ControlUserPaneKeyDownUPP gTPKeyProc = NULL;
156ControlUserPaneActivateUPP gTPActivateProc = NULL;
157ControlUserPaneFocusUPP gTPFocusProc = NULL;
158
72055702 159/* TPActivatePaneText activates or deactivates the text edit record
ed8c2780
RR
160 according to the value of setActive. The primary purpose of this
161 routine is to ensure each call is only made once. */
72055702 162static void TPActivatePaneText(STPTextPaneVars **tpvars, Boolean setActive) {
ed8c2780
RR
163 STPTextPaneVars *varsp;
164 varsp = *tpvars;
165 if (varsp->fTEActive != setActive) {
ef4a634b 166
ed8c2780 167 varsp->fTEActive = setActive;
ef4a634b 168
ed8c2780 169 TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTEActive);
7759d157 170
ed8c2780
RR
171 if (varsp->fInFocus)
172 TXNFocus( varsp->fTXNRec, varsp->fTEActive);
173 }
72055702
SC
174}
175
176
177/* TPFocusPaneText set the focus state for the text record. */
178static void TPFocusPaneText(STPTextPaneVars **tpvars, Boolean setFocus) {
ed8c2780
RR
179 STPTextPaneVars *varsp;
180 varsp = *tpvars;
181 if (varsp->fInFocus != setFocus) {
182 varsp->fInFocus = setFocus;
183 TXNFocus( varsp->fTXNRec, varsp->fInFocus);
184 }
72055702
SC
185}
186
187
188/* TPPaneDrawProc is called to redraw the control and for update events
ed8c2780
RR
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. */
72055702 192static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart) {
ed8c2780
RR
193 STPTextPaneVars **tpvars, *varsp;
194 char state;
195 Rect bounds;
196 /* set up our globals */
ef4a634b 197
ed8c2780
RR
198 tpvars = (STPTextPaneVars **) GetControlReference(theControl);
199 if (tpvars != NULL) {
200 state = HGetState((Handle) tpvars);
201 HLock((Handle) tpvars);
202 varsp = *tpvars;
ef4a634b 203
ed8c2780
RR
204 /* save the drawing state */
205 SetPort((**tpvars).fDrawingEnvironment);
e600c175 206 /* verify our boundary */
ed8c2780 207 GetControlBounds(theControl, &bounds);
e600c175
SC
208
209 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
29e4a190
RR
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 ) ;
ef4a634b 214
29e4a190
RR
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);
ef4a634b 218 SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
29e4a190 219 bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2));
ed8c2780 220 RectRgn(varsp->fTextBackgroundRgn, &varsp->fRTextOutline);
ef4a634b 221 TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left,
29e4a190 222 varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame);
ed8c2780
RR
223 }
224
225 /* update the text region */
29e4a190
RR
226 RGBColor white = { 65535 , 65535 , 65535 } ;
227 RGBBackColor( &white ) ;
ed8c2780
RR
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);
e600c175 236
ed8c2780 237 }
72055702
SC
238}
239
240
241/* TPPaneHitTestProc is called when the control manager would
ed8c2780
RR
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. */
72055702 245static pascal ControlPartCode TPPaneHitTestProc(ControlHandle theControl, Point where) {
ed8c2780
RR
246 STPTextPaneVars **tpvars;
247 ControlPartCode result;
248 char state;
249 /* set up our locals and lock down our globals*/
250 result = 0;
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;
258 } else result = 0;
259 /* release oure globals */
260 HSetState((Handle) tpvars, state);
261 }
262 return result;
72055702
SC
263}
264
265
266
267
268
269/* TPPaneTrackingProc is called when the mouse is being held down
ed8c2780
RR
270 over our control. This routine handles clicks in the text area
271 and in the scroll bar. */
72055702 272static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point startPt, ControlActionUPP actionProc) {
ed8c2780
RR
273 STPTextPaneVars **tpvars, *varsp;
274 char state;
275 ControlPartCode partCodeResult;
276 /* make sure we have some variables... */
277 partCodeResult = 0;
278 tpvars = (STPTextPaneVars **) GetControlReference(theControl);
279 if (tpvars != NULL) {
280 /* lock 'em down */
281 state = HGetState((Handle) tpvars);
282 HLock((Handle) tpvars);
283 varsp = *tpvars;
284 /* we don't do any of these functions unless we're in focus */
285 if ( ! varsp->fInFocus) {
286 WindowPtr owner;
287 owner = GetControlOwner(theControl);
288 ClearKeyboardFocus(owner);
289 SetKeyboardFocus(owner, theControl, kUserClickedToFocusPart);
290 }
291 /* find the location for the click */
292 switch (TPPaneHitTestProc(theControl, startPt)) {
ef4a634b 293
ed8c2780
RR
294 /* handle clicks in the text part */
295 case kmUPTextPart:
296 { SetPort((**tpvars).fDrawingEnvironment);
e600c175 297 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
ef4a634b 298#if !TARGET_CARBON
1b2b1638 299 TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
c5c9378c 300#else
e40298d5
JS
301 EventRecord rec ;
302 ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;
c5c9378c
SC
303 TXNClick( varsp->fTXNRec, &rec );
304#endif
ed8c2780
RR
305 }
306 break;
ef4a634b 307
ed8c2780 308 }
ef4a634b 309
ed8c2780
RR
310 HSetState((Handle) tpvars, state);
311 }
312 return partCodeResult;
72055702
SC
313}
314
315
316/* TPPaneIdleProc is our user pane idle routine. When our text field
ed8c2780 317 is active and in focus, we use this routine to set the cursor. */
72055702 318static pascal void TPPaneIdleProc(ControlHandle theControl) {
ed8c2780
RR
319 STPTextPaneVars **tpvars, *varsp;
320 /* set up locals */
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) {
325 char state;
326 Rect bounds;
327 Point mousep;
328 /* lock down the globals */
329 state = HGetState((Handle) tpvars);
330 HLock((Handle) tpvars);
331 varsp = *tpvars;
332 /* get the current mouse coordinates (in our window) */
1b2b1638 333 SetPortWindowPort(GetControlOwner(theControl));
e600c175 334 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
ed8c2780
RR
335 GetMouse(&mousep);
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);
341 /* set the cursor */
342 if (PtInRect(mousep, &varsp->fRTextArea)) {
343 RgnHandle theRgn;
344 RectRgn((theRgn = NewRgn()), &varsp->fRTextArea);
345 TXNAdjustCursor(varsp->fTXNRec, theRgn);
346 DisposeRgn(theRgn);
ef4a634b
RD
347 }
348 else
2b5f62a0
VZ
349 {
350 // SetThemeCursor(kThemeArrowCursor);
351 }
ed8c2780
RR
352 } else {
353 /* if it's in our bounds, set the cursor */
354 GetControlBounds(theControl, &bounds);
355 if (PtInRect(mousep, &bounds))
2b5f62a0
VZ
356 {
357 // SetThemeCursor(kThemeArrowCursor);
358 }
ed8c2780 359 }
ef4a634b 360
ed8c2780
RR
361 HSetState((Handle) tpvars, state);
362 }
363 }
72055702
SC
364}
365
366
367/* TPPaneKeyDownProc is called whenever a keydown event is directed
ed8c2780
RR
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. */
72055702 370static pascal ControlPartCode TPPaneKeyDownProc(ControlHandle theControl,
ed8c2780
RR
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);
e600c175 378 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
8c82361c
SC
379 EventRecord ev ;
380 memset( &ev , 0 , sizeof( ev ) ) ;
381 ev.what = keyDown ;
382 ev.modifiers = modifiers ;
45c8d9e5 383 ev.message = (( keyCode << 8 ) & keyCodeMask ) + ( charCode & charCodeMask ) ;
8c82361c 384 TXNKeyDown( (**tpvars).fTXNRec, &ev);
ed8c2780
RR
385 }
386 }
387 return kControlEntireControl;
72055702
SC
388}
389
390
391/* TPPaneActivateProc is called when the window containing
ed8c2780
RR
392 the user pane control receives activate events. Here, we redraw
393 the control and it's text as necessary for the activation state. */
72055702 394static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activating) {
ed8c2780
RR
395 Rect bounds;
396 STPTextPaneVars **tpvars, *varsp;
397 char state;
398 /* set up locals */
399 tpvars = (STPTextPaneVars **) GetControlReference(theControl);
400 if (tpvars != NULL) {
401 state = HGetState((Handle) tpvars);
402 HLock((Handle) tpvars);
403 varsp = *tpvars;
404 /* de/activate the text edit record */
405 SetPort((**tpvars).fDrawingEnvironment);
e600c175 406 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
ed8c2780
RR
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);
414 }
72055702
SC
415}
416
417
418/* TPPaneFocusProc is called when every the focus changes to or
ed8c2780
RR
419 from our control. Herein, switch the focus appropriately
420 according to the parameters and redraw the control as
421 necessary. */
72055702 422static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlFocusPart action) {
ed8c2780
RR
423 ControlPartCode focusResult;
424 STPTextPaneVars **tpvars, *varsp;
425 char state;
426 /* set up locals */
427 focusResult = kControlFocusNoPart;
428 tpvars = (STPTextPaneVars **) GetControlReference(theControl);
429 if (tpvars != NULL) {
430 state = HGetState((Handle) tpvars);
431 HLock((Handle) tpvars);
432 varsp = *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:
440
441 kControlFocusNoPart - turn off focus and return kControlFocusNoPart. redraw
442 the control and the focus rectangle as necessary.
443
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);
e600c175 452 wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
ed8c2780
RR
453 /* calculate the next highlight state */
454 switch (action) {
455 default:
456 case kControlFocusNoPart:
457 TPFocusPaneText(tpvars, false);
458 focusResult = kControlFocusNoPart;
459 break;
460 case kUserClickedToFocusPart:
461 TPFocusPaneText(tpvars, true);
462 focusResult = 1;
463 break;
464 case kControlFocusPrevPart:
465 case kControlFocusNextPart:
466 TPFocusPaneText(tpvars, ( ! varsp->fInFocus));
467 focusResult = varsp->fInFocus ? 1 : kControlFocusNoPart;
468 break;
469 }
470 TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
471 /* redraw the text fram and focus rectangle to indicate the
472 new focus state */
473 DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive);
474 DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive && varsp->fInFocus);
475 /* done */
1b2b1638 476 HSetState((Handle) tpvars, state);
ed8c2780 477 }
1b2b1638 478 return focusResult;
72055702
SC
479}
480
72055702 481
1b2b1638 482/* mUPOpenControl initializes a user pane control so it will be drawn
29e4a190
RR
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. */
ef4a634b 489OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle )
1b2b1638 490{
29e4a190
RR
491 Rect bounds;
492 WindowRef theWindow;
493 STPTextPaneVars **tpvars, *varsp;
29b30405 494 OSStatus err = noErr ;
29e4a190
RR
495 RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF};
496 TXNBackground tback;
ef4a634b 497
29e4a190
RR
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);
ef4a634b 506
29e4a190
RR
507 /* allocate our private storage */
508 tpvars = (STPTextPaneVars **) NewHandleClear(sizeof(STPTextPaneVars));
509 SetControlReference(theControl, (long) tpvars);
510 HLock((Handle) tpvars);
511 varsp = *tpvars;
512 /* set the initial settings for our private data */
29b30405 513 varsp->fMultiline = wxStyle & wxTE_MULTILINE ;
29e4a190
RR
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);
1b2b1638
SC
519
520 varsp->fDrawingEnvironment = (GrafPtr) GetWindowPort(theWindow);
72055702 521
1b2b1638
SC
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);
ef4a634b 535 SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) ,
1b2b1638
SC
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
539 of the text area. */
540 RectRgn((varsp->fTextBackgroundRgn = NewRgn()), &varsp->fRTextOutline);
72055702 541
1b2b1638
SC
542 /* set up the drawing environment */
543 SetPort(varsp->fDrawingEnvironment);
544
545 /* create the new edit field */
ef4a634b
RD
546
547 TXNFrameOptions frameOptions =
29b30405
SC
548 kTXNDontDrawCaretWhenInactiveMask ;
549 if ( ! ( wxStyle & wxTE_NOHIDESEL ) )
2b5f62a0 550 frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ;
ef4a634b 551
2b5f62a0
VZ
552 if ( wxStyle & wxTE_MULTILINE )
553 {
554 if ( ! ( wxStyle & wxTE_DONTWRAP ) )
555 frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
556 else
557 {
558 frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ;
559 frameOptions |= kTXNWantHScrollBarMask ;
560 }
ef4a634b 561
2b5f62a0
VZ
562 if ( !(wxStyle & wxTE_NO_VSCROLL ) )
563 frameOptions |= kTXNWantVScrollBarMask ;
564 }
565 else
566 frameOptions |= kTXNSingleLineOnlyMask ;
ef4a634b 567
2b5f62a0
VZ
568 if ( wxStyle & wxTE_READONLY )
569 frameOptions |= kTXNReadOnlyMask ;
ef4a634b 570
1b2b1638 571 TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
2b5f62a0 572 frameOptions ,
1b2b1638
SC
573 kTXNTextEditStyleFrameType,
574 kTXNTextensionFile,
ef4a634b 575 kTXNSystemDefaultEncoding,
1b2b1638
SC
576 &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars);
577
29e4a190
RR
578 Str255 fontName ;
579 SInt16 fontSize ;
580 Style fontStyle ;
ef4a634b 581
29e4a190 582 GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
1b2b1638 583
29e4a190
RR
584 TXNTypeAttributes typeAttr[] =
585 {
402679b0 586 { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } ,
29e4a190
RR
587 { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } ,
588 { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } ,
402679b0 589 } ;
1b2b1638 590
29b30405
SC
591 err = TXNSetTypeAttributes (varsp->fTXNRec, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr,
592 kTXNStartOffset,
593 kTXNEndOffset);
1b2b1638 594 /* set the field's background */
427ff662 595
1b2b1638
SC
596 tback.bgType = kTXNBackgroundTypeRGB;
597 tback.bg.color = rgbWhite;
598 TXNSetBackground( varsp->fTXNRec, &tback);
ef4a634b 599
1b2b1638
SC
600 /* unlock our storage */
601 HUnlock((Handle) tpvars);
602 /* perform final activations and setup for our text field. Here,
603 we assume that the window is going to be the 'active' window. */
604 TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
ed8c2780 605 /* all done */
29b30405 606 return err;
72055702
SC
607}
608
1b2b1638
SC
609
610
611
72055702
SC
612#if !USE_SHARED_LIBRARY
613IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl)
614
615BEGIN_EVENT_TABLE(wxTextCtrl, wxControl)
ed8c2780
RR
616 EVT_DROP_FILES(wxTextCtrl::OnDropFiles)
617 EVT_CHAR(wxTextCtrl::OnChar)
72055702
SC
618 EVT_MENU(wxID_CUT, wxTextCtrl::OnCut)
619 EVT_MENU(wxID_COPY, wxTextCtrl::OnCopy)
620 EVT_MENU(wxID_PASTE, wxTextCtrl::OnPaste)
621 EVT_MENU(wxID_UNDO, wxTextCtrl::OnUndo)
622 EVT_MENU(wxID_REDO, wxTextCtrl::OnRedo)
623
624 EVT_UPDATE_UI(wxID_CUT, wxTextCtrl::OnUpdateCut)
625 EVT_UPDATE_UI(wxID_COPY, wxTextCtrl::OnUpdateCopy)
626 EVT_UPDATE_UI(wxID_PASTE, wxTextCtrl::OnUpdatePaste)
627 EVT_UPDATE_UI(wxID_UNDO, wxTextCtrl::OnUpdateUndo)
628 EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo)
629END_EVENT_TABLE()
630#endif
631
632// Text item
633wxTextCtrl::wxTextCtrl()
634{
402679b0
SC
635 m_macTE = NULL ;
636 m_macTXN = NULL ;
637 m_macTXNvars = NULL ;
1b2b1638
SC
638 m_macUsesTXN = false ;
639 m_editable = true ;
29b30405 640 m_maxLength = TE_UNLIMITED_LENGTH ;
1b2b1638
SC
641}
642
643wxTextCtrl::~wxTextCtrl()
644{
645 if ( m_macUsesTXN )
646 {
402679b0 647 SetControlReference((ControlHandle)m_macControl, 0) ;
1b2b1638 648 TXNDeleteObject((TXNObject)m_macTXN);
1b2b1638
SC
649 /* delete our private storage */
650 DisposeHandle((Handle) m_macTXNvars);
651 /* zero the control reference */
1b2b1638 652 }
72055702
SC
653}
654
655const short kVerticalMargin = 2 ;
656const short kHorizontalMargin = 2 ;
657
658bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
ed8c2780 659 const wxString& st,
72055702
SC
660 const wxPoint& pos,
661 const wxSize& size, long style,
662 const wxValidator& validator,
663 const wxString& name)
664{
e40298d5
JS
665 m_macTE = NULL ;
666 m_macTXN = NULL ;
667 m_macTXNvars = NULL ;
668 m_macUsesTXN = false ;
669 m_editable = true ;
ef4a634b
RD
670
671 m_macUsesTXN = ! (style & wxTE_PASSWORD ) ;
672
e40298d5 673 m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ;
ef4a634b 674
72055702
SC
675 // base initialization
676 if ( !CreateBase(parent, id, pos, size, style, validator, name) )
677 return FALSE;
678
ed8c2780 679 wxSize mySize = size ;
29e4a190
RR
680 if ( m_macUsesTXN )
681 {
682 m_macHorizontalBorder = 5 ; // additional pixels around the real control
683 m_macVerticalBorder = 3 ;
684 }
685 else
ed8c2780
RR
686 {
687 m_macHorizontalBorder = 5 ; // additional pixels around the real control
688 m_macVerticalBorder = 5 ;
689 }
ed8c2780
RR
690
691
692 Rect bounds ;
693 Str255 title ;
402679b0 694 /*
ed8c2780
RR
695 if ( mySize.y == -1 )
696 {
402679b0
SC
697 mySize.y = 13 ;
698 if ( m_windowStyle & wxTE_MULTILINE )
699 mySize.y *= 5 ;
ef4a634b 700
ed8c2780
RR
701 mySize.y += 2 * m_macVerticalBorder ;
702 }
402679b0 703 */
427ff662 704 MacPreControlCreate( parent , id , wxEmptyString , pos , mySize ,style, validator , name , &bounds , title ) ;
72055702
SC
705
706 if ( m_windowStyle & wxTE_MULTILINE )
707 {
708 wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER),
709 wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );
710
711 m_windowStyle |= wxTE_PROCESS_ENTER;
712 }
713
29b30405
SC
714 if ( m_windowStyle & wxTE_READONLY)
715 {
716 m_editable = FALSE ;
717 }
72055702 718
1b2b1638 719 if ( !m_macUsesTXN )
9c641c05 720 {
ef4a634b 721 m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , "\p" , true , 0 , 0 , 1,
29e4a190
RR
722 (style & wxTE_PASSWORD) ? kControlEditTextPasswordProc : kControlEditTextProc , (long) this ) ;
723 long size ;
73bdd73a 724 ::GetControlData((ControlHandle) m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*)((TEHandle *)&m_macTE) , &size ) ;
1b2b1638 725
ed8c2780 726 }
29e4a190
RR
727 else
728 {
1b2b1638
SC
729 short featurSet;
730
29b30405 731 featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle
1b2b1638
SC
732 | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
733 | kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
734 /* create the control */
175a6271 735 m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0);
1b2b1638 736 /* set up the mUP specific features and data */
2b5f62a0 737 mUPOpenControl((ControlHandle) m_macControl, m_windowStyle );
29e4a190 738 }
ed8c2780
RR
739 MacPostControlCreate() ;
740
29e4a190
RR
741 if ( !m_macUsesTXN )
742 {
427ff662
SC
743 wxCharBuffer text = wxMacStringToCString( st ) ;
744 ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
1b2b1638 745 }
ed8c2780 746 else
ed8c2780 747 {
1b2b1638 748 STPTextPaneVars **tpvars;
29e4a190 749 /* set up locals */
1b2b1638 750 tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
29e4a190 751 /* set the text in the record */
1b2b1638 752 m_macTXN = (**tpvars).fTXNRec ;
427ff662
SC
753#if wxUSE_UNICODE
754 TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2,
755 kTXNStartOffset, kTXNEndOffset);
756#else
757 wxCharBuffer text = wxMacStringToCString( st ) ;
758 TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData, (void*)text.data(), strlen( text ) ,
759 kTXNStartOffset, kTXNEndOffset);
760#endif
1b2b1638
SC
761 m_macTXNvars = tpvars ;
762 m_macUsesTXN = true ;
2b5f62a0 763 TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
e600c175 764 TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
1b2b1638 765 }
ef4a634b 766
e40298d5 767 return TRUE;
72055702
SC
768}
769
770wxString wxTextCtrl::GetValue() const
771{
c5c9378c
SC
772 Size actualSize = 0;
773 wxString result ;
774 OSStatus err ;
29e4a190
RR
775 if ( !m_macUsesTXN )
776 {
e40298d5 777 err = ::GetControlDataSize((ControlHandle) m_macControl, 0,
c5c9378c 778 ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, &actualSize ) ;
ef4a634b 779
427ff662
SC
780 if ( err )
781 return wxEmptyString ;
ef4a634b 782
427ff662
SC
783 if ( actualSize > 0 )
784 {
ef4a634b 785 wxCharBuffer buf(actualSize) ;
e40298d5 786 ::GetControlData( (ControlHandle) m_macControl, 0,
ef4a634b 787 ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag,
427ff662
SC
788 actualSize , buf.data() , &actualSize ) ;
789 result = wxMacMakeStringFromCString( buf ) ;
c5c9378c 790 }
29e4a190
RR
791 }
792 else
793 {
427ff662 794#if wxUSE_UNICODE
29e4a190 795 Handle theText ;
427ff662 796 err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData );
29e4a190
RR
797 // all done
798 if ( err )
799 {
c5c9378c 800 actualSize = 0 ;
29e4a190
RR
801 }
802 else
803 {
c5c9378c 804 actualSize = GetHandleSize( theText ) ;
427ff662
SC
805 if ( actualSize > 0 )
806 {
807 wxChar *ptr = result.GetWriteBuf(actualSize*sizeof(wxChar)) ;
808 wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
e40298d5
JS
809 ptr[actualSize] = 0 ;
810 result.UngetWriteBuf( actualSize ) ;
811 }
812 DisposeHandle( theText ) ;
29e4a190 813 }
427ff662
SC
814#else
815 Handle theText ;
816 err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
817 // all done
818 if ( err )
819 {
820 actualSize = 0 ;
821 }
822 else
823 {
824 actualSize = GetHandleSize( theText ) ;
825 if ( actualSize > 0 )
826 {
827 HLock( theText ) ;
828 result = wxMacMakeStringFromCString( *theText , actualSize ) ;
829 HUnlock( theText ) ;
830 }
831 DisposeHandle( theText ) ;
832 }
833#endif
29e4a190 834 }
ef4a634b 835
427ff662 836 return result ;
72055702
SC
837}
838
839void wxTextCtrl::GetSelection(long* from, long* to) const
840{
1b2b1638 841 if ( !m_macUsesTXN )
72055702 842 {
1b2b1638
SC
843 *from = (**((TEHandle) m_macTE)).selStart;
844 *to = (**((TEHandle) m_macTE)).selEnd;
72055702
SC
845 }
846 else
847 {
1b2b1638 848 TXNGetSelection( ((TXNObject) m_macTXN) , (TXNOffset*) from , (TXNOffset*) to ) ;
72055702
SC
849 }
850}
851
852void wxTextCtrl::SetValue(const wxString& st)
853{
29e4a190
RR
854 if ( !m_macUsesTXN )
855 {
427ff662
SC
856 wxCharBuffer text = wxMacStringToCString( st ) ;
857 ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ;
29e4a190
RR
858 }
859 else
860 {
68698f03 861 bool formerEditable = m_editable ;
2b5f62a0
VZ
862 if ( !formerEditable )
863 SetEditable(true) ;
427ff662
SC
864#if wxUSE_UNICODE
865 TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 ,
866 kTXNStartOffset, kTXNEndOffset);
867#else
868 wxCharBuffer text = wxMacStringToCString( st ) ;
869 TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) ,
2b5f62a0 870 kTXNStartOffset, kTXNEndOffset);
427ff662 871#endif
2b5f62a0 872 TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
e600c175 873 TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
2b5f62a0
VZ
874 if ( !formerEditable )
875 SetEditable(formerEditable) ;
29e4a190 876 }
1b2b1638 877 MacRedrawControl() ;
72055702
SC
878}
879
ef4a634b 880void wxTextCtrl::SetMaxLength(unsigned long len)
29b30405
SC
881{
882 m_maxLength = len ;
883}
884
885bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
886{
887 if ( m_macUsesTXN )
888 {
68698f03 889 bool formerEditable = m_editable ;
2b5f62a0
VZ
890 if ( !formerEditable )
891 SetEditable(true) ;
892 TXNTypeAttributes typeAttr[4] ;
893 Str255 fontName = "\pMonaco" ;
894 SInt16 fontSize = 12 ;
895 Style fontStyle = normal ;
896 RGBColor color ;
897 int attrCounter = 0 ;
898 if ( style.HasFont() )
899 {
900 const wxFont &font = style.GetFont() ;
427ff662 901 wxMacStringToPascal( font.GetFaceName() , fontName ) ;
2b5f62a0
VZ
902 fontSize = font.GetPointSize() ;
903 if ( font.GetUnderlined() )
904 fontStyle |= underline ;
905 if ( font.GetWeight() == wxBOLD )
906 fontStyle |= bold ;
907 if ( font.GetStyle() == wxITALIC )
908 fontStyle |= italic ;
ef4a634b 909
2b5f62a0
VZ
910 typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
911 typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
912 typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
913 typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
914 typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
915 typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ;
916 typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
917 typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
918 typeAttr[attrCounter+2].data.dataValue = fontStyle ;
919 attrCounter += 3 ;
ef4a634b 920
2b5f62a0
VZ
921 }
922 if ( style.HasTextColour() )
923 {
924 typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ;
925 typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ;
926 typeAttr[attrCounter].data.dataPtr = (void*) &color ;
927 color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ;
928 attrCounter += 1 ;
929 }
ef4a634b 930
29b30405
SC
931 if ( attrCounter > 0 )
932 {
a40af6f9
VZ
933#ifdef __WXDEBUG__
934 OSStatus status =
935#endif // __WXDEBUG__
936 TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr, start,end);
427ff662 937 wxASSERT_MSG( status == noErr , wxT("Couldn't set text attributes") ) ;
29b30405 938 }
2b5f62a0
VZ
939 if ( !formerEditable )
940 SetEditable(formerEditable) ;
29b30405
SC
941 }
942 return TRUE ;
943}
944
945bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
946{
947 wxTextCtrlBase::SetDefaultStyle( style ) ;
948 SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
949 return TRUE ;
950}
951
72055702
SC
952// Clipboard operations
953void wxTextCtrl::Copy()
954{
955 if (CanCopy())
956 {
1b2b1638 957 if ( !m_macUsesTXN )
72055702 958 {
29e4a190
RR
959 TECopy( ((TEHandle) m_macTE) ) ;
960 ClearCurrentScrap();
961 TEToScrap() ;
962 MacRedrawControl() ;
963 }
964 else
965 {
32b5be3d 966 ClearCurrentScrap();
ef4a634b 967 TXNCopy((TXNObject)m_macTXN);
1b2b1638 968 TXNConvertToPublicScrap();
29e4a190 969 }
32b5be3d 970 }
72055702
SC
971}
972
973void wxTextCtrl::Cut()
974{
975 if (CanCut())
976 {
1b2b1638 977 if ( !m_macUsesTXN )
32b5be3d 978 {
29e4a190
RR
979 TECut( ((TEHandle) m_macTE) ) ;
980 ClearCurrentScrap();
981 TEToScrap() ;
982 MacRedrawControl() ;
32b5be3d 983 }
29e4a190
RR
984 else
985 {
1b2b1638 986 ClearCurrentScrap();
ef4a634b 987 TXNCut((TXNObject)m_macTXN);
1b2b1638 988 TXNConvertToPublicScrap();
29e4a190 989 }
1b2b1638
SC
990 wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
991 event.SetString( GetValue() ) ;
992 event.SetEventObject( this );
993 GetEventHandler()->ProcessEvent(event);
29e4a190 994 }
72055702
SC
995}
996
997void wxTextCtrl::Paste()
998{
999 if (CanPaste())
1000 {
1b2b1638
SC
1001 if ( !m_macUsesTXN )
1002 {
1003 TEFromScrap() ;
1004 TEPaste( (TEHandle) m_macTE ) ;
1005 MacRedrawControl() ;
1006 }
29e4a190
RR
1007 else
1008 {
1b2b1638 1009 TXNConvertFromPublicScrap();
ef4a634b 1010 TXNPaste((TXNObject)m_macTXN);
e600c175 1011 SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
29e4a190 1012 }
1b2b1638
SC
1013 wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
1014 event.SetString( GetValue() ) ;
1015 event.SetEventObject( this );
1016 GetEventHandler()->ProcessEvent(event);
32b5be3d 1017 }
72055702
SC
1018}
1019
1020bool wxTextCtrl::CanCopy() const
1021{
1022 // Can copy if there's a selection
1023 long from, to;
1024 GetSelection(& from, & to);
1025 return (from != to);
1026}
1027
1028bool wxTextCtrl::CanCut() const
1029{
1b2b1638
SC
1030 if ( !IsEditable() )
1031 {
1032 return false ;
1033 }
72055702
SC
1034 // Can cut if there's a selection
1035 long from, to;
1036 GetSelection(& from, & to);
1037 return (from != to);
1038}
1039
1040bool wxTextCtrl::CanPaste() const
1041{
1042 if (!IsEditable())
1043 return FALSE;
1044
72055702 1045#if TARGET_CARBON
ed8c2780
RR
1046 OSStatus err = noErr;
1047 ScrapRef scrapRef;
ef4a634b 1048
ed8c2780 1049 err = GetCurrentScrap( &scrapRef );
ef4a634b 1050 if ( err != noTypeErr && err != memFullErr )
ed8c2780 1051 {
29e4a190
RR
1052 ScrapFlavorFlags flavorFlags;
1053 Size byteCount;
ef4a634b 1054
ed8c2780
RR
1055 if (( err = GetScrapFlavorFlags( scrapRef, 'TEXT', &flavorFlags )) == noErr)
1056 {
1057 if (( err = GetScrapFlavorSize( scrapRef, 'TEXT', &byteCount )) == noErr)
1058 {
1059 return TRUE ;
1060 }
1061 }
1062 }
1063 return FALSE;
ef4a634b 1064
72055702 1065#else
49b45dcd 1066 long offset ;
ed8c2780
RR
1067 if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 )
1068 {
1069 return TRUE ;
1070 }
72055702 1071#endif
ed8c2780 1072 return FALSE ;
72055702
SC
1073}
1074
1075void wxTextCtrl::SetEditable(bool editable)
1076{
1b2b1638
SC
1077 if ( editable != m_editable )
1078 {
1079 m_editable = editable ;
e600c175
SC
1080 if ( !m_macUsesTXN )
1081 {
1082 if ( editable )
2b5f62a0 1083 UMAActivateControl( (ControlHandle) m_macControl ) ;
e600c175 1084 else
2b5f62a0 1085 UMADeactivateControl((ControlHandle) m_macControl ) ;
e600c175 1086 }
1b2b1638 1087 else
e600c175
SC
1088 {
1089 TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
49b45dcd 1090 TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
e600c175
SC
1091 TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
1092 }
1b2b1638 1093 }
72055702
SC
1094}
1095
1096void wxTextCtrl::SetInsertionPoint(long pos)
1097{
ed8c2780 1098 SetSelection( pos , pos ) ;
72055702
SC
1099}
1100
1101void wxTextCtrl::SetInsertionPointEnd()
1102{
1103 long pos = GetLastPosition();
1104 SetInsertionPoint(pos);
1105}
1106
1107long wxTextCtrl::GetInsertionPoint() const
1108{
e40298d5
JS
1109 long begin,end ;
1110 GetSelection( &begin , &end ) ;
1111 return begin ;
72055702
SC
1112}
1113
1114long wxTextCtrl::GetLastPosition() const
1115{
1b2b1638 1116 if ( !m_macUsesTXN )
32b5be3d 1117 {
e40298d5 1118 return (**((TEHandle) m_macTE)).teLength ;
32b5be3d
RR
1119 }
1120 else
1121 {
e40298d5
JS
1122 Handle theText ;
1123 long actualsize ;
1124 OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
1125 /* all done */
1126 if ( err )
1127 {
1128 actualsize = 0 ;
1129 }
1130 else
1131 {
1132 actualsize = GetHandleSize( theText ) ;
1133 DisposeHandle( theText ) ;
1134 }
1135 return actualsize ;
32b5be3d 1136 }
72055702
SC
1137}
1138
1139void wxTextCtrl::Replace(long from, long to, const wxString& value)
1140{
e40298d5
JS
1141 if ( !m_macUsesTXN )
1142 {
29e4a190 1143 ControlEditTextSelectionRec selection ;
ef4a634b 1144
29e4a190
RR
1145 selection.selStart = from ;
1146 selection.selEnd = to ;
1147 ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
1148 TESetSelect( from , to , ((TEHandle) m_macTE) ) ;
1149 TEDelete( ((TEHandle) m_macTE) ) ;
1150 TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ;
1151 }
1152 else
1153 {
68698f03 1154 bool formerEditable = m_editable ;
2b5f62a0
VZ
1155 if ( !formerEditable )
1156 SetEditable(true) ;
1157 TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
1158 TXNClear( ((TXNObject) m_macTXN) ) ;
427ff662
SC
1159#if wxUSE_UNICODE
1160 TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)value.wc_str(), value.Length() * 2 ,
1161 kTXNUseCurrentSelection, kTXNUseCurrentSelection);
1162#else
2b5f62a0 1163 TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
e40298d5 1164 kTXNUseCurrentSelection, kTXNUseCurrentSelection);
427ff662 1165#endif
2b5f62a0
VZ
1166 if ( !formerEditable )
1167 SetEditable( formerEditable ) ;
29e4a190 1168 }
32b5be3d 1169 Refresh() ;
72055702
SC
1170}
1171
1172void wxTextCtrl::Remove(long from, long to)
1173{
e40298d5
JS
1174 if ( !m_macUsesTXN )
1175 {
1176 ControlEditTextSelectionRec selection ;
ef4a634b 1177
e40298d5
JS
1178 selection.selStart = from ;
1179 selection.selEnd = to ;
1180 ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
1181 TEDelete( ((TEHandle) m_macTE) ) ;
1182 }
1183 else
1184 {
68698f03 1185 bool formerEditable = m_editable ;
e40298d5
JS
1186 if ( !formerEditable )
1187 SetEditable(true) ;
ef4a634b
RD
1188 TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
1189 TXNClear( ((TXNObject) m_macTXN) ) ;
e40298d5
JS
1190 if ( !formerEditable )
1191 SetEditable( formerEditable ) ;
1192 }
ed8c2780 1193 Refresh() ;
72055702
SC
1194}
1195
1196void wxTextCtrl::SetSelection(long from, long to)
1197{
ef4a634b
RD
1198 if ( from == -1 )
1199 from = 0;
1200
1201 if ( to == -1 )
1202 to = GetLastPosition();
1203
e40298d5
JS
1204 if ( !m_macUsesTXN )
1205 {
1206 ControlEditTextSelectionRec selection ;
1207 selection.selStart = from ;
1208 selection.selEnd = to ;
ef4a634b 1209
e40298d5
JS
1210 TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ;
1211 ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ;
1212 }
1213 else
1214 {
1215 STPTextPaneVars **tpvars;
29e4a190 1216 /* set up our locals */
e40298d5 1217 tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl);
29e4a190
RR
1218 /* and our drawing environment as the operation
1219 may force a redraw in the text area. */
e40298d5 1220 SetPort((**tpvars).fDrawingEnvironment);
29e4a190 1221 /* change the selection */
e40298d5
JS
1222 TXNSetSelection( (**tpvars).fTXNRec, from, to);
1223 TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
1224 }
72055702
SC
1225}
1226
1227bool wxTextCtrl::LoadFile(const wxString& file)
1228{
1229 if ( wxTextCtrlBase::LoadFile(file) )
1230 {
1231 return TRUE;
1232 }
1233
1234 return FALSE;
1235}
1236
427ff662 1237void wxTextCtrl::WriteText(const wxString& st)
ef4a634b 1238{
1b2b1638 1239 if ( !m_macUsesTXN )
72055702 1240 {
427ff662
SC
1241 wxCharBuffer text = wxMacStringToCString( st ) ;
1242 TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ;
29e4a190
RR
1243 }
1244 else
1245 {
68698f03 1246 bool formerEditable = m_editable ;
2b5f62a0
VZ
1247 if ( !formerEditable )
1248 SetEditable(true) ;
1249 long start , end , dummy ;
1250 GetSelection( &start , &dummy ) ;
427ff662
SC
1251#if wxUSE_UNICODE
1252 TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 ,
29e4a190 1253 kTXNUseCurrentSelection, kTXNUseCurrentSelection);
427ff662
SC
1254#else
1255 wxCharBuffer text = wxMacStringToCString( st ) ;
1256 TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) ,
1257 kTXNUseCurrentSelection, kTXNUseCurrentSelection);
1258#endif
2b5f62a0 1259 GetSelection( &dummy , &end ) ;
29b30405 1260 SetStyle( start , end , GetDefaultStyle() ) ;
2b5f62a0
VZ
1261 if ( !formerEditable )
1262 SetEditable( formerEditable ) ;
29e4a190
RR
1263 }
1264 MacRedrawControl() ;
72055702
SC
1265}
1266
1267void wxTextCtrl::AppendText(const wxString& text)
1268{
1269 SetInsertionPointEnd();
1270 WriteText(text);
1271}
1272
1273void wxTextCtrl::Clear()
1274{
1b2b1638
SC
1275 if ( !IsEditable() )
1276 {
1277 return ;
1278 }
e40298d5
JS
1279 if ( !m_macUsesTXN )
1280 {
1281 ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ;
1282 }
1283 else
1284 {
9c34dd9d 1285 TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ;
ef4a634b 1286 TXNClear((TXNObject)m_macTXN);
e40298d5 1287 }
32b5be3d 1288 Refresh() ;
72055702
SC
1289}
1290
1291bool wxTextCtrl::IsModified() const
1292{
1293 return TRUE;
1294}
1295
1296bool wxTextCtrl::IsEditable() const
1297{
1b2b1638 1298 return IsEnabled() && m_editable ;
72055702
SC
1299}
1300
1301bool wxTextCtrl::AcceptsFocus() const
1302{
1303 // we don't want focus if we can't be edited
1b2b1638 1304 return /*IsEditable() && */ wxControl::AcceptsFocus();
72055702
SC
1305}
1306
1307wxSize wxTextCtrl::DoGetBestSize() const
1308{
1309 int wText = 100 ;
ef4a634b 1310
402679b0 1311 int hText;
29e4a190
RR
1312 if ( m_macUsesTXN )
1313 {
1314 hText = 17 ;
1315 }
1316 else
1317 {
1318 hText = 13 ;
1319 }
72055702
SC
1320/*
1321 int cx, cy;
1322 wxGetCharSize(GetHWND(), &cx, &cy, &GetFont());
1323
1324 int wText = DEFAULT_ITEM_WIDTH;
1325
1326 int hText = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);
1327
1328 return wxSize(wText, hText);
1329*/
1330 if ( m_windowStyle & wxTE_MULTILINE )
1331 {
402679b0 1332 hText *= 5 ;
72055702 1333 }
402679b0
SC
1334 hText += 2 * m_macVerticalBorder ;
1335 wText += 2 * m_macHorizontalBorder ;
72055702
SC
1336 //else: for single line control everything is ok
1337 return wxSize(wText, hText);
1338}
1339
1340// ----------------------------------------------------------------------------
1341// Undo/redo
1342// ----------------------------------------------------------------------------
1343
1344void wxTextCtrl::Undo()
1345{
1346 if (CanUndo())
1347 {
65334b43
SC
1348 if ( m_macUsesTXN )
1349 {
1350 TXNUndo((TXNObject)m_macTXN);
1351 }
72055702
SC
1352 }
1353}
1354
1355void wxTextCtrl::Redo()
1356{
1357 if (CanRedo())
1358 {
65334b43
SC
1359 if ( m_macUsesTXN )
1360 {
1361 TXNRedo((TXNObject)m_macTXN);
1362 }
72055702
SC
1363 }
1364}
1365
1366bool wxTextCtrl::CanUndo() const
1367{
65334b43
SC
1368 if ( !IsEditable() )
1369 {
1370 return false ;
1371 }
1372 if ( m_macUsesTXN )
1373 {
1374 return TXNCanUndo((TXNObject)m_macTXN,NULL);
1375 }
72055702
SC
1376 return FALSE ;
1377}
1378
1379bool wxTextCtrl::CanRedo() const
1380{
65334b43
SC
1381 if ( !IsEditable() )
1382 {
1383 return false ;
1384 }
1385 if ( m_macUsesTXN )
1386 {
1387 return TXNCanRedo((TXNObject)m_macTXN,NULL);
1388 }
72055702
SC
1389 return FALSE ;
1390}
1391
1392// Makes 'unmodified'
1393void wxTextCtrl::DiscardEdits()
1394{
1395 // TODO
1396}
1397
1398int wxTextCtrl::GetNumberOfLines() const
1399{
e40298d5
JS
1400 // TODO change this if possible to reflect real lines
1401 wxString content = GetValue() ;
ef4a634b 1402
32b5be3d 1403 int count = 1;
49b45dcd 1404 for (size_t i = 0; i < content.Length() ; i++)
29e4a190
RR
1405 {
1406 if (content[i] == '\r') count++;
32b5be3d 1407 }
ef4a634b 1408
1b2b1638 1409 return count;
72055702
SC
1410}
1411
1412long wxTextCtrl::XYToPosition(long x, long y) const
1413{
1414 // TODO
1415 return 0;
1416}
1417
1418bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const
1419{
1420 return FALSE ;
1421}
1422
1423void wxTextCtrl::ShowPosition(long pos)
1424{
1425 // TODO
1426}
1427
1428int wxTextCtrl::GetLineLength(long lineNo) const
1429{
e40298d5
JS
1430 // TODO change this if possible to reflect real lines
1431 wxString content = GetValue() ;
ef4a634b 1432
29e4a190
RR
1433 // Find line first
1434 int count = 0;
49b45dcd 1435 for (size_t i = 0; i < content.Length() ; i++)
32b5be3d
RR
1436 {
1437 if (count == lineNo)
1438 {
1439 // Count chars in line then
1440 count = 0;
49b45dcd 1441 for (size_t j = i; j < content.Length(); j++)
32b5be3d
RR
1442 {
1443 count++;
29e4a190
RR
1444 if (content[j] == '\r') return count;
1445 }
ef4a634b 1446
29e4a190
RR
1447 return count;
1448 }
1449 if (content[i] == '\r') count++;
1450 }
72055702
SC
1451 return 0;
1452}
1453
1454wxString wxTextCtrl::GetLineText(long lineNo) const
1455{
e40298d5
JS
1456 // TODO change this if possible to reflect real lines
1457 wxString content = GetValue() ;
9c641c05 1458
29e4a190
RR
1459 // Find line first
1460 int count = 0;
49b45dcd 1461 for (size_t i = 0; i < content.Length() ; i++)
32b5be3d
RR
1462 {
1463 if (count == lineNo)
1464 {
1465 // Add chars in line then
427ff662 1466 wxString tmp;
ef4a634b 1467
49b45dcd 1468 for (size_t j = i; j < content.Length(); j++)
29e4a190
RR
1469 {
1470 if (content[j] == '\r')
1471 return tmp;
ef4a634b 1472
29e4a190
RR
1473 tmp += content[j];
1474 }
ef4a634b 1475
29e4a190
RR
1476 return tmp;
1477 }
1478 if (content[i] == '\r') count++;
1479 }
427ff662 1480 return wxEmptyString ;
72055702
SC
1481}
1482
1483/*
1484 * Text item
1485 */
ef4a634b 1486
72055702
SC
1487void wxTextCtrl::Command(wxCommandEvent & event)
1488{
1489 SetValue (event.GetString());
1490 ProcessCommand (event);
1491}
1492
1493void wxTextCtrl::OnDropFiles(wxDropFilesEvent& event)
1494{
1495 // By default, load the first file into the text window.
1496 if (event.GetNumberOfFiles() > 0)
1497 {
1498 LoadFile(event.GetFiles()[0]);
1499 }
1500}
1501
1502void wxTextCtrl::OnChar(wxKeyEvent& event)
1503{
1b2b1638
SC
1504 int key = event.GetKeyCode() ;
1505 bool eat_key = false ;
ef4a634b 1506
e600c175
SC
1507 if ( key == 'c' && event.MetaDown() )
1508 {
1509 if ( CanCopy() )
1510 Copy() ;
1511 return ;
1512 }
ef4a634b
RD
1513
1514 if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
1515 !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
1b2b1638
SC
1516/* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
1517 )
1518 {
1519 // eat it
1520 return ;
1521 }
e600c175
SC
1522 if ( key == 'v' && event.MetaDown() )
1523 {
1524 if ( CanPaste() )
1525 Paste() ;
1526 return ;
1527 }
1528 if ( key == 'x' && event.MetaDown() )
1529 {
1530 if ( CanCut() )
1531 Cut() ;
1532 return ;
1533 }
1b2b1638 1534 switch ( key )
72055702
SC
1535 {
1536 case WXK_RETURN:
ed8c2780
RR
1537 if (m_windowStyle & wxPROCESS_ENTER)
1538 {
72055702
SC
1539 wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
1540 event.SetEventObject( this );
1b2b1638 1541 event.SetString( GetValue() );
72055702
SC
1542 if ( GetEventHandler()->ProcessEvent(event) )
1543 return;
ef4a634b 1544 }
72055702
SC
1545 if ( !(m_windowStyle & wxTE_MULTILINE) )
1546 {
ed8c2780 1547 wxWindow *parent = GetParent();
9c641c05
SC
1548 while( parent && !parent->IsTopLevel() && parent->GetDefaultItem() == NULL ) {
1549 parent = parent->GetParent() ;
ed8c2780 1550 }
9c641c05 1551 if ( parent && parent->GetDefaultItem() )
ed8c2780 1552 {
9c641c05 1553 wxButton *def = wxDynamicCast(parent->GetDefaultItem(),
72055702 1554 wxButton);
ed8c2780
RR
1555 if ( def && def->IsEnabled() )
1556 {
1557 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() );
1558 event.SetEventObject(def);
1559 def->Command(event);
1560 return ;
72055702 1561 }
ed8c2780 1562 }
ef4a634b 1563
1b2b1638
SC
1564 // this will make wxWindows eat the ENTER key so that
1565 // we actually prevent line wrapping in a single line
1566 // text control
1567 eat_key = TRUE;
72055702 1568 }
72055702
SC
1569
1570 break;
1571
1572 case WXK_TAB:
1573 // always produce navigation event - even if we process TAB
1574 // ourselves the fact that we got here means that the user code
1575 // decided to skip processing of this TAB - probably to let it
1576 // do its default job.
1577 {
1578 wxNavigationKeyEvent eventNav;
1579 eventNav.SetDirection(!event.ShiftDown());
1580 eventNav.SetWindowChange(event.ControlDown());
1581 eventNav.SetEventObject(this);
1582
1583 if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) )
1584 return;
1b2b1638 1585
ed8c2780 1586 event.Skip() ;
1b2b1638 1587 return;
72055702
SC
1588 }
1589 break;
1590 }
ef4a634b 1591
1b2b1638 1592 if (!eat_key)
ed8c2780 1593 {
45c8d9e5
SC
1594 // default handling
1595 event.Skip() ;
1b2b1638 1596 }
e600c175 1597 if ( ( key >= 0x20 && key < WXK_START ) ||
45c8d9e5 1598 key == WXK_RETURN ||
ef4a634b 1599 key == WXK_DELETE ||
45c8d9e5 1600 key == WXK_BACK)
1b2b1638
SC
1601 {
1602 wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
1603 event1.SetString( GetValue() ) ;
1604 event1.SetEventObject( this );
45c8d9e5 1605 wxPostEvent(GetEventHandler(),event1);
ed8c2780 1606 }
72055702
SC
1607}
1608
ef4a634b 1609void wxTextCtrl::MacSuperShown( bool show )
fd4393b8
SC
1610{
1611 bool former = m_macControlIsShown ;
1612 wxControl::MacSuperShown( show ) ;
1613 if ( (former != m_macControlIsShown) && m_macUsesTXN )
1614 {
1615 if ( m_macControlIsShown )
ef4a634b 1616 TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,
29e4a190 1617 (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame);
fd4393b8 1618 else
ef4a634b 1619 TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,
29e4a190 1620 (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame);
fd4393b8
SC
1621 }
1622}
1623
ef4a634b 1624bool wxTextCtrl::Show(bool show)
fd4393b8
SC
1625{
1626 bool former = m_macControlIsShown ;
ef4a634b 1627
fd4393b8 1628 bool retval = wxControl::Show( show ) ;
ef4a634b 1629
2eefc6d5 1630 if ( former != m_macControlIsShown && m_macUsesTXN )
fd4393b8
SC
1631 {
1632 if ( m_macControlIsShown )
ef4a634b 1633 TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,
29e4a190 1634 (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame);
fd4393b8 1635 else
ef4a634b 1636 TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left,
29e4a190 1637 (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame);
fd4393b8 1638 }
ef4a634b 1639
fd4393b8
SC
1640 return retval ;
1641}
1642
72055702
SC
1643// ----------------------------------------------------------------------------
1644// standard handlers for standard edit menu events
1645// ----------------------------------------------------------------------------
1646
eb22f2a6 1647void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event))
72055702
SC
1648{
1649 Cut();
1650}
1651
eb22f2a6 1652void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event))
72055702
SC
1653{
1654 Copy();
1655}
1656
eb22f2a6 1657void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event))
72055702
SC
1658{
1659 Paste();
1660}
1661
eb22f2a6 1662void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event))
72055702
SC
1663{
1664 Undo();
1665}
1666
eb22f2a6 1667void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event))
72055702
SC
1668{
1669 Redo();
1670}
1671
1672void wxTextCtrl::OnUpdateCut(wxUpdateUIEvent& event)
1673{
1674 event.Enable( CanCut() );
1675}
1676
1677void wxTextCtrl::OnUpdateCopy(wxUpdateUIEvent& event)
1678{
1679 event.Enable( CanCopy() );
1680}
1681
1682void wxTextCtrl::OnUpdatePaste(wxUpdateUIEvent& event)
1683{
1684 event.Enable( CanPaste() );
1685}
1686
1687void wxTextCtrl::OnUpdateUndo(wxUpdateUIEvent& event)
1688{
1689 event.Enable( CanUndo() );
1690}
1691
1692void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
1693{
1694 event.Enable( CanRedo() );
1695}
1696
2b5f62a0
VZ
1697bool wxTextCtrl::MacSetupCursor( const wxPoint& pt )
1698{
1699 if ( m_macUsesTXN )
1700 return true ;
1701 else
1702 return wxWindow::MacSetupCursor( pt ) ;
1703}
72055702 1704
fedad417
GD
1705#endif
1706 // wxUSE_TEXTCTRL