X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/427ff66291af2d8dd34ff5ee68c81436997144a1..5c250a10332dc17263c66deb629b5fa8c4320f8a:/src/mac/carbon/textctrl.cpp diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index 0f6f9e9ab7..ad911c3987 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -60,7 +60,6 @@ #define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL -extern wxApp *wxTheApp ; extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ; // CS:TODO we still have a problem getting properly at the text events of a control because under Carbon @@ -85,7 +84,7 @@ extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ; These routines are useful for cases where you would like to use an existing user pane control in, say, a dialog window as a scrolling text edit field.*/ - + /* mUPOpenControl initializes a user pane control so it will be drawn and will behave as a scrolling text edit field inside of a window. This routine performs all of the initialization steps necessary, @@ -130,8 +129,8 @@ typedef struct { /* flags */ Boolean fInFocus; /* true while the focus rect is drawn around the control */ Boolean fIsActive; /* true while the control is drawn in the active state */ - Boolean fTEActive; /* reflects the activation state of the text edit record */ - Boolean fInDialogWindow; /* true if displayed in a dialog window */ + Boolean fTEActive; /* reflects the activation state of the text edit record */ + Boolean fInDialogWindow; /* true if displayed in a dialog window */ /* calculated locations */ Rect fRTextArea; /* area where the text is drawn */ Rect fRFocusOutline; /* rectangle used to draw the focus box */ @@ -164,9 +163,9 @@ static void TPActivatePaneText(STPTextPaneVars **tpvars, Boolean setActive) { STPTextPaneVars *varsp; varsp = *tpvars; if (varsp->fTEActive != setActive) { - + varsp->fTEActive = setActive; - + TXNActivate(varsp->fTXNRec, varsp->fTXNFrame, varsp->fTEActive); if (varsp->fInFocus) @@ -195,13 +194,13 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart char state; Rect bounds; /* set up our globals */ - + tpvars = (STPTextPaneVars **) GetControlReference(theControl); if (tpvars != NULL) { state = HGetState((Handle) tpvars); HLock((Handle) tpvars); varsp = *tpvars; - + /* save the drawing state */ SetPort((**tpvars).fDrawingEnvironment); /* verify our boundary */ @@ -212,29 +211,38 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart // scrollbar is on the border, we add one Rect oldbounds = varsp->fRFocusOutline ; InsetRect( &oldbounds , -1 , -1 ) ; - - InvalWindowRect( GetControlOwner( theControl ) , &oldbounds ) ; + + if ( IsControlVisible( theControl ) ) + InvalWindowRect( GetControlOwner( theControl ) , &oldbounds ) ; SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); - SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) , + SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) , bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2)); RectRgn(varsp->fTextBackgroundRgn, &varsp->fRTextOutline); - TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, - varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); + if ( IsControlVisible( theControl ) ) + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, + varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); + else + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 30000 , varsp->fRTextArea.left + 30000 , + varsp->fRTextArea.bottom + 30000 , varsp->fRTextArea.right + 30000 , varsp->fTXNFrame); + } + if ( IsControlVisible( theControl ) ) + { /* update the text region */ - RGBColor white = { 65535 , 65535 , 65535 } ; - RGBBackColor( &white ) ; - EraseRgn(varsp->fTextBackgroundRgn); - TXNDraw(varsp->fTXNRec, NULL); - /* restore the drawing environment */ - /* draw the text frame and focus frame (if necessary) */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true); - /* release our globals */ - HSetState((Handle) tpvars, state); - + RGBColor white = { 65535 , 65535 , 65535 } ; + RGBBackColor( &white ) ; + EraseRgn(varsp->fTextBackgroundRgn); + TXNDraw(varsp->fTXNRec, NULL); + /* restore the drawing environment */ + /* draw the text frame and focus frame (if necessary) */ + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + if ((**tpvars).fIsActive && varsp->fInFocus) + DrawThemeFocusRect(&varsp->fRFocusOutline, true); + /* release our globals */ + HSetState((Handle) tpvars, state); + } } } @@ -250,7 +258,7 @@ static pascal ControlPartCode TPPaneHitTestProc(ControlHandle theControl, Point /* set up our locals and lock down our globals*/ result = 0; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl) ) { state = HGetState((Handle) tpvars); HLock((Handle) tpvars); /* find the region where we clicked */ @@ -277,7 +285,7 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point /* make sure we have some variables... */ partCodeResult = 0; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl ) ) { /* lock 'em down */ state = HGetState((Handle) tpvars); HLock((Handle) tpvars); @@ -291,12 +299,12 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point } /* find the location for the click */ switch (TPPaneHitTestProc(theControl, startPt)) { - + /* handle clicks in the text part */ case kmUPTextPart: { SetPort((**tpvars).fDrawingEnvironment); wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; -#if !TARGET_CARBON +#if !TARGET_CARBON TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent()); #else EventRecord rec ; @@ -305,9 +313,9 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point #endif } break; - + } - + HSetState((Handle) tpvars, state); } return partCodeResult; @@ -320,7 +328,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { STPTextPaneVars **tpvars, *varsp; /* set up locals */ tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl ) ) { /* if we're not active, then we have nothing to say about the cursor */ if ((**tpvars).fIsActive) { char state; @@ -345,8 +353,8 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { RectRgn((theRgn = NewRgn()), &varsp->fRTextArea); TXNAdjustCursor(varsp->fTXNRec, theRgn); DisposeRgn(theRgn); - } - else + } + else { // SetThemeCursor(kThemeArrowCursor); } @@ -358,7 +366,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { // SetThemeCursor(kThemeArrowCursor); } } - + HSetState((Handle) tpvars, state); } } @@ -405,12 +413,16 @@ static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activati /* de/activate the text edit record */ SetPort((**tpvars).fDrawingEnvironment); wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; - GetControlBounds(theControl, &bounds); - varsp->fIsActive = activating; - TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); + GetControlBounds(theControl, &bounds); + varsp->fIsActive = activating; + TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); /* redraw the frame */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - if (varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive); + if ( IsControlVisible( theControl ) ) + { + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + if (varsp->fInFocus) + DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive); + } HSetState((Handle) tpvars, state); } } @@ -427,7 +439,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF /* set up locals */ focusResult = kControlFocusNoPart; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL ) { state = HGetState((Handle) tpvars); HLock((Handle) tpvars); varsp = *tpvars; @@ -448,10 +460,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF kControlFocusNoPart, otherwise return a non-zero part code. kUserClickedToFocusPart - is a constant defined for this example. You should define your own value for handling click-to-focus type events. */ - /* save the drawing state */ - SetPort((**tpvars).fDrawingEnvironment); - wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; - /* calculate the next highlight state */ + /* calculate the next highlight state */ switch (action) { default: case kControlFocusNoPart: @@ -468,11 +477,17 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF focusResult = varsp->fInFocus ? 1 : kControlFocusNoPart; break; } - TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); - /* redraw the text fram and focus rectangle to indicate the - new focus state */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive && varsp->fInFocus); + TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); + /* redraw the text fram and focus rectangle to indicate the + new focus state */ + if ( IsControlVisible( theControl ) ) + { + /* save the drawing state */ + SetPort((**tpvars).fDrawingEnvironment); + wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive && varsp->fInFocus); + } /* done */ HSetState((Handle) tpvars, state); } @@ -487,7 +502,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF should refer to a user pane control that you have either created yourself or extracted from a dialog's control heirarchy using the GetDialogItemAsControl routine. */ -OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) +OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) { Rect bounds; WindowRef theWindow; @@ -495,7 +510,7 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) OSStatus err = noErr ; RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF}; TXNBackground tback; - + /* set up our globals */ if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(TPPaneDrawProc); if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(TPPaneHitTestProc); @@ -504,7 +519,7 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc); if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(TPPaneActivateProc); if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(TPPaneFocusProc); - + /* allocate our private storage */ tpvars = (STPTextPaneVars **) NewHandleClear(sizeof(STPTextPaneVars)); SetControlReference(theControl, (long) tpvars); @@ -533,7 +548,7 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) GetControlBounds(theControl, &bounds); SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom); - SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) , + SetRect(&varsp->fRTextArea, bounds.left + 2 , bounds.top + (varsp->fMultiline ? 0 : 2) , bounds.right - (varsp->fMultiline ? 0 : 2), bounds.bottom - (varsp->fMultiline ? 0 : 2)); /* calculate the background region for the text. In this case, it's kindof and irregular region because we're setting the scroll bar a little ways inside @@ -544,12 +559,12 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) SetPort(varsp->fDrawingEnvironment); /* create the new edit field */ - - TXNFrameOptions frameOptions = + + TXNFrameOptions frameOptions = kTXNDontDrawCaretWhenInactiveMask ; if ( ! ( wxStyle & wxTE_NOHIDESEL ) ) frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ; - + if ( wxStyle & wxTE_MULTILINE ) { if ( ! ( wxStyle & wxTE_DONTWRAP ) ) @@ -559,27 +574,39 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ; frameOptions |= kTXNWantHScrollBarMask ; } - + if ( !(wxStyle & wxTE_NO_VSCROLL ) ) frameOptions |= kTXNWantVScrollBarMask ; } else frameOptions |= kTXNSingleLineOnlyMask ; - + if ( wxStyle & wxTE_READONLY ) frameOptions |= kTXNReadOnlyMask ; - + TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea, frameOptions , kTXNTextEditStyleFrameType, kTXNTextensionFile, - kTXNSystemDefaultEncoding, + kTXNSystemDefaultEncoding, &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars); + if ( !IsControlVisible( theControl ) ) + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 30000 , varsp->fRTextArea.left + 30000 , + varsp->fRTextArea.bottom + 30000 , varsp->fRTextArea.right + 30000 , varsp->fTXNFrame); + + + if ( (wxStyle & wxTE_MULTILINE) && (wxStyle & wxTE_DONTWRAP) ) + { + TXNControlTag tag = kTXNWordWrapStateTag ; + TXNControlData dat ; + dat.uValue = kTXNNoAutoWrap ; + TXNSetTXNObjectControls( varsp->fTXNRec , false , 1 , &tag , &dat ) ; + } Str255 fontName ; SInt16 fontSize ; Style fontStyle ; - + GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; TXNTypeAttributes typeAttr[] = @@ -597,7 +624,7 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) tback.bgType = kTXNBackgroundTypeRGB; tback.bg.color = rgbWhite; TXNSetBackground( varsp->fTXNRec, &tback); - + /* unlock our storage */ HUnlock((Handle) tpvars); /* perform final activations and setup for our text field. Here, @@ -631,13 +658,16 @@ END_EVENT_TABLE() #endif // Text item -wxTextCtrl::wxTextCtrl() +void wxTextCtrl::Init() { m_macTE = NULL ; m_macTXN = NULL ; m_macTXNvars = NULL ; m_macUsesTXN = false ; + m_editable = true ; + m_dirty = false; + m_maxLength = TE_UNLIMITED_LENGTH ; } @@ -657,7 +687,7 @@ const short kVerticalMargin = 2 ; const short kHorizontalMargin = 2 ; bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, - const wxString& st, + const wxString& str, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, @@ -668,13 +698,13 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_macTXNvars = NULL ; m_macUsesTXN = false ; m_editable = true ; - - m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; - + + m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; + m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ; - + // base initialization - if ( !CreateBase(parent, id, pos, size, style, validator, name) ) + if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) ) return FALSE; wxSize mySize = size ; @@ -698,7 +728,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, mySize.y = 13 ; if ( m_windowStyle & wxTE_MULTILINE ) mySize.y *= 5 ; - + mySize.y += 2 * m_macVerticalBorder ; } */ @@ -717,12 +747,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_editable = FALSE ; } + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; if ( !m_macUsesTXN ) { - m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , "\p" , true , 0 , 0 , 1, + m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , "\p" , false , 0 , 0 , 1, (style & wxTE_PASSWORD) ? kControlEditTextPasswordProc : kControlEditTextProc , (long) this ) ; long size ; - ::GetControlData((ControlHandle) m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*) &((TEHandle) m_macTE) , &size ) ; + ::GetControlData((ControlHandle) m_macControl , 0, kControlEditTextTEHandleTag , sizeof( TEHandle ) , (char*)((TEHandle *)&m_macTE) , &size ) ; } else @@ -733,7 +765,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; /* create the control */ - m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0); + m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", false , featurSet, 0, featurSet, kControlUserPaneProc, 0); /* set up the mUP specific features and data */ mUPOpenControl((ControlHandle) m_macControl, m_windowStyle ); } @@ -741,7 +773,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ; } else @@ -755,7 +787,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2, kTXNStartOffset, kTXNEndOffset); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData, (void*)text.data(), strlen( text ) , kTXNStartOffset, kTXNEndOffset); #endif @@ -764,7 +796,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, TXNSetSelection( (TXNObject) m_macTXN, 0, 0); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); } - + return TRUE; } @@ -777,17 +809,17 @@ wxString wxTextCtrl::GetValue() const { err = ::GetControlDataSize((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, &actualSize ) ; - + if ( err ) return wxEmptyString ; - + if ( actualSize > 0 ) { - wxCharBuffer buf(actualSize) ; + wxCharBuffer buf(actualSize) ; ::GetControlData( (ControlHandle) m_macControl, 0, - ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, + ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, actualSize , buf.data() , &actualSize ) ; - result = wxMacMakeStringFromCString( buf ) ; + result = wxString( buf , wxConvLocal) ; } } else @@ -826,14 +858,14 @@ wxString wxTextCtrl::GetValue() const if ( actualSize > 0 ) { HLock( theText ) ; - result = wxMacMakeStringFromCString( *theText , actualSize ) ; + result = wxString( *theText , wxConvLocal , actualSize ) ; HUnlock( theText ) ; } DisposeHandle( theText ) ; } #endif } - + wxMacConvertNewlines10To13( &result ) ; return result ; } @@ -850,23 +882,25 @@ void wxTextCtrl::GetSelection(long* from, long* to) const } } -void wxTextCtrl::SetValue(const wxString& st) +void wxTextCtrl::SetValue(const wxString& str) { + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ; } else { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; #if wxUSE_UNICODE TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNStartOffset, kTXNEndOffset); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , kTXNStartOffset, kTXNEndOffset); #endif @@ -878,7 +912,7 @@ void wxTextCtrl::SetValue(const wxString& st) MacRedrawControl() ; } -void wxTextCtrl::SetMaxLength(unsigned long len) +void wxTextCtrl::SetMaxLength(unsigned long len) { m_maxLength = len ; } @@ -887,7 +921,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) { if ( m_macUsesTXN ) { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; TXNTypeAttributes typeAttr[4] ; @@ -907,7 +941,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) fontStyle |= bold ; if ( font.GetStyle() == wxITALIC ) fontStyle |= italic ; - + typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ; typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ; typeAttr[attrCounter].data.dataPtr = (void*) fontName ; @@ -918,7 +952,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ; typeAttr[attrCounter+2].data.dataValue = fontStyle ; attrCounter += 3 ; - + } if ( style.HasTextColour() ) { @@ -928,11 +962,13 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ; attrCounter += 1 ; } - + if ( attrCounter > 0 ) { - OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr, - start,end); +#ifdef __WXDEBUG__ + OSStatus status = +#endif // __WXDEBUG__ + TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr, start,end); wxASSERT_MSG( status == noErr , wxT("Couldn't set text attributes") ) ; } if ( !formerEditable ) @@ -963,7 +999,7 @@ void wxTextCtrl::Copy() else { ClearCurrentScrap(); - TXNCopy((TXNObject)m_macTXN); + TXNCopy((TXNObject)m_macTXN); TXNConvertToPublicScrap(); } } @@ -983,7 +1019,7 @@ void wxTextCtrl::Cut() else { ClearCurrentScrap(); - TXNCut((TXNObject)m_macTXN); + TXNCut((TXNObject)m_macTXN); TXNConvertToPublicScrap(); } wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); @@ -1006,7 +1042,7 @@ void wxTextCtrl::Paste() else { TXNConvertFromPublicScrap(); - TXNPaste((TXNObject)m_macTXN); + TXNPaste((TXNObject)m_macTXN); SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ; } wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); @@ -1044,13 +1080,13 @@ bool wxTextCtrl::CanPaste() const #if TARGET_CARBON OSStatus err = noErr; ScrapRef scrapRef; - + err = GetCurrentScrap( &scrapRef ); - if ( err != noTypeErr && err != memFullErr ) + if ( err != noTypeErr && err != memFullErr ) { ScrapFlavorFlags flavorFlags; Size byteCount; - + if (( err = GetScrapFlavorFlags( scrapRef, 'TEXT', &flavorFlags )) == noErr) { if (( err = GetScrapFlavorSize( scrapRef, 'TEXT', &byteCount )) == noErr) @@ -1060,7 +1096,7 @@ bool wxTextCtrl::CanPaste() const } } return FALSE; - + #else long offset ; if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 ) @@ -1135,12 +1171,14 @@ long wxTextCtrl::GetLastPosition() const } } -void wxTextCtrl::Replace(long from, long to, const wxString& value) +void wxTextCtrl::Replace(long from, long to, const wxString& str) { + wxString value = str ; + wxMacConvertNewlines13To10( &value ) ; if ( !m_macUsesTXN ) { ControlEditTextSelectionRec selection ; - + selection.selStart = from ; selection.selEnd = to ; ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; @@ -1150,7 +1188,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) } else { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; @@ -1173,7 +1211,7 @@ void wxTextCtrl::Remove(long from, long to) if ( !m_macUsesTXN ) { ControlEditTextSelectionRec selection ; - + selection.selStart = from ; selection.selEnd = to ; ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; @@ -1181,11 +1219,11 @@ void wxTextCtrl::Remove(long from, long to) } else { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; - TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; - TXNClear( ((TXNObject) m_macTXN) ) ; + TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; + TXNClear( ((TXNObject) m_macTXN) ) ; if ( !formerEditable ) SetEditable( formerEditable ) ; } @@ -1194,13 +1232,20 @@ void wxTextCtrl::Remove(long from, long to) void wxTextCtrl::SetSelection(long from, long to) { - if ( !m_macUsesTXN ) { ControlEditTextSelectionRec selection ; - selection.selStart = from ; - selection.selEnd = to ; - + if ((from == -1) && (to == -1)) + { + selection.selStart = 0 ; + selection.selEnd = 32767 ; + } + else + { + selection.selStart = from ; + selection.selEnd = to ; + } + TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ; ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; } @@ -1213,7 +1258,10 @@ void wxTextCtrl::SetSelection(long from, long to) may force a redraw in the text area. */ SetPort((**tpvars).fDrawingEnvironment); /* change the selection */ - TXNSetSelection( (**tpvars).fTXNRec, from, to); + if ((from == -1) && (to == -1)) + TXNSelectAll((TXNObject) m_macTXN); + else + TXNSetSelection( (**tpvars).fTXNRec, from, to); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); } } @@ -1228,16 +1276,18 @@ bool wxTextCtrl::LoadFile(const wxString& file) return FALSE; } -void wxTextCtrl::WriteText(const wxString& st) -{ +void wxTextCtrl::WriteText(const wxString& str) +{ + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ; } else { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; long start , end , dummy ; @@ -1246,7 +1296,7 @@ void wxTextCtrl::WriteText(const wxString& st) TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNUseCurrentSelection, kTXNUseCurrentSelection); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , kTXNUseCurrentSelection, kTXNUseCurrentSelection); #endif @@ -1266,10 +1316,6 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - if ( !IsEditable() ) - { - return ; - } if ( !m_macUsesTXN ) { ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ; @@ -1277,14 +1323,14 @@ void wxTextCtrl::Clear() else { TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ; - TXNClear((TXNObject)m_macTXN); + TXNClear((TXNObject)m_macTXN); } Refresh() ; } bool wxTextCtrl::IsModified() const { - return TRUE; + return m_dirty; } bool wxTextCtrl::IsEditable() const @@ -1301,7 +1347,7 @@ bool wxTextCtrl::AcceptsFocus() const wxSize wxTextCtrl::DoGetBestSize() const { int wText = 100 ; - + int hText; if ( m_macUsesTXN ) { @@ -1339,6 +1385,10 @@ void wxTextCtrl::Undo() { if (CanUndo()) { + if ( m_macUsesTXN ) + { + TXNUndo((TXNObject)m_macTXN); + } } } @@ -1346,36 +1396,61 @@ void wxTextCtrl::Redo() { if (CanRedo()) { + if ( m_macUsesTXN ) + { + TXNRedo((TXNObject)m_macTXN); + } } } bool wxTextCtrl::CanUndo() const { + if ( !IsEditable() ) + { + return false ; + } + if ( m_macUsesTXN ) + { + return TXNCanUndo((TXNObject)m_macTXN,NULL); + } return FALSE ; } bool wxTextCtrl::CanRedo() const { + if ( !IsEditable() ) + { + return false ; + } + if ( m_macUsesTXN ) + { + return TXNCanRedo((TXNObject)m_macTXN,NULL); + } return FALSE ; } -// Makes 'unmodified' +// Makes modifie or unmodified +void wxTextCtrl::MarkDirty() +{ + m_dirty = true; +} + void wxTextCtrl::DiscardEdits() { - // TODO + m_dirty = false; } int wxTextCtrl::GetNumberOfLines() const { // TODO change this if possible to reflect real lines wxString content = GetValue() ; - + int count = 1; for (size_t i = 0; i < content.Length() ; i++) { if (content[i] == '\r') count++; } - + return count; } @@ -1399,7 +1474,7 @@ int wxTextCtrl::GetLineLength(long lineNo) const { // TODO change this if possible to reflect real lines wxString content = GetValue() ; - + // Find line first int count = 0; for (size_t i = 0; i < content.Length() ; i++) @@ -1411,12 +1486,12 @@ int wxTextCtrl::GetLineLength(long lineNo) const for (size_t j = i; j < content.Length(); j++) { count++; - if (content[j] == '\r') return count; + if (content[j] == '\n') return count; } - + return count; } - if (content[i] == '\r') count++; + if (content[i] == '\n') count++; } return 0; } @@ -1434,18 +1509,18 @@ wxString wxTextCtrl::GetLineText(long lineNo) const { // Add chars in line then wxString tmp; - + for (size_t j = i; j < content.Length(); j++) { - if (content[j] == '\r') + if (content[j] == '\n') return tmp; - + tmp += content[j]; } - + return tmp; } - if (content[i] == '\r') count++; + if (content[i] == '\n') count++; } return wxEmptyString ; } @@ -1453,7 +1528,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const /* * Text item */ - + void wxTextCtrl::Command(wxCommandEvent & event) { SetValue (event.GetString()); @@ -1473,22 +1548,26 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) { int key = event.GetKeyCode() ; bool eat_key = false ; - + if ( key == 'c' && event.MetaDown() ) { if ( CanCopy() ) Copy() ; return ; } - - if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB && - !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) ) + + if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB && + !( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) ) /* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */ ) { // eat it return ; } + + // assume that any key not processed yet is going to modify the control + m_dirty = true; + if ( key == 'v' && event.MetaDown() ) { if ( CanPaste() ) @@ -1511,7 +1590,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.SetString( GetValue() ); if ( GetEventHandler()->ProcessEvent(event) ) return; - } + } if ( !(m_windowStyle & wxTE_MULTILINE) ) { wxWindow *parent = GetParent(); @@ -1530,7 +1609,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) return ; } } - + // this will make wxWindows eat the ENTER key so that // we actually prevent line wrapping in a single line // text control @@ -1558,15 +1637,40 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } break; } - + if (!eat_key) { - // default handling - event.Skip() ; + // perform keystroke handling +#if TARGET_CARBON + if ( m_macUsesTXN && wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL ) + CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ; + else + { + EventRecord rec ; + if ( wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ) + { + EventRecord *ev = &rec ; + short keycode ; + short keychar ; + keychar = short(ev->message & charCodeMask); + keycode = short(ev->message & keyCodeMask) >> 8 ; + + ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; + } + } +#else + EventRecord *ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ; + short keycode ; + short keychar ; + keychar = short(ev->message & charCodeMask); + keycode = short(ev->message & keyCodeMask) >> 8 ; + + ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; +#endif } if ( ( key >= 0x20 && key < WXK_START ) || key == WXK_RETURN || - key == WXK_DELETE || + key == WXK_DELETE || key == WXK_BACK) { wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); @@ -1576,37 +1680,37 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } } -void wxTextCtrl::MacSuperShown( bool show ) +void wxTextCtrl::MacSuperShown( bool show ) { bool former = m_macControlIsShown ; wxControl::MacSuperShown( show ) ; if ( (former != m_macControlIsShown) && m_macUsesTXN ) { if ( m_macControlIsShown ) - TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); else - TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); } } -bool wxTextCtrl::Show(bool show) +bool wxTextCtrl::Show(bool show) { bool former = m_macControlIsShown ; - + bool retval = wxControl::Show( show ) ; - + if ( former != m_macControlIsShown && m_macUsesTXN ) { if ( m_macControlIsShown ) - TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom,(**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); else - TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, + TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.bottom + 30000, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.right, (**(STPTextPaneVars **)m_macTXNvars).fTXNFrame); } - + return retval ; }