X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2eefc6d59ec6299faf87a5a3d34c65b882660abf..17f8d2a701c9d0321a3b37c3c0b1d2ddc9ec91d1:/src/mac/textctrl.cpp diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index e11f32c7de..b79f2fc5d3 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // Name: textctrl.cpp // Purpose: wxTextCtrl -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: -// Created: ??/??/98 +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR +// Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -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,14 +211,14 @@ 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 ) ; 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, + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); } @@ -291,23 +290,23 @@ 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 ; - ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ; + EventRecord rec ; + ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ; TXNClick( varsp->fTXNRec, &rec ); #endif } break; - + } - + HSetState((Handle) tpvars, state); } return partCodeResult; @@ -345,8 +344,8 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { RectRgn((theRgn = NewRgn()), &varsp->fRTextArea); TXNAdjustCursor(varsp->fTXNRec, theRgn); DisposeRgn(theRgn); - } - else + } + else { // SetThemeCursor(kThemeArrowCursor); } @@ -358,7 +357,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { // SetThemeCursor(kThemeArrowCursor); } } - + HSetState((Handle) tpvars, state); } } @@ -487,7 +486,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 +494,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 +503,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 +532,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 +543,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 +558,34 @@ 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 ( (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[] = @@ -593,10 +599,11 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) kTXNStartOffset, kTXNEndOffset); /* set the field's background */ + 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, @@ -662,16 +669,16 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - m_macTE = NULL ; - m_macTXN = NULL ; - m_macTXNvars = NULL ; - m_macUsesTXN = false ; - m_editable = true ; + m_macTE = NULL ; + m_macTXN = NULL ; + m_macTXNvars = NULL ; + m_macUsesTXN = false ; + m_editable = true ; + + m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; - m_macUsesTXN = ! (style & wxTE_PASSWORD ) ; + m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ; - m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ; - // base initialization if ( !CreateBase(parent, id, pos, size, style, validator, name) ) return FALSE; @@ -697,11 +704,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, mySize.y = 13 ; if ( m_windowStyle & wxTE_MULTILINE ) mySize.y *= 5 ; - + mySize.y += 2 * m_macVerticalBorder ; } */ - MacPreControlCreate( parent , id , "" , pos , mySize ,style, validator , name , &bounds , title ) ; + MacPreControlCreate( parent , id , wxEmptyString , pos , mySize ,style, validator , name , &bounds , title ) ; if ( m_windowStyle & wxTE_MULTILINE ) { @@ -718,10 +725,10 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, 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" , true , 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 @@ -738,16 +745,10 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, } MacPostControlCreate() ; - wxString value ; - - if( wxApp::s_macDefaultEncodingIsPC ) - value = wxMacMakeMacStringFromPC( st ) ; - else - value = st ; - if ( !m_macUsesTXN ) { - ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; + wxCharBuffer text = wxMacStringToCString( st ) ; + ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ; } else { @@ -755,16 +756,22 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, /* set up locals */ tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl); /* set the text in the record */ - TXNSetData( (**tpvars).fTXNRec, kTXNTextData, (void*)value.c_str(), value.Length(), - kTXNStartOffset, kTXNEndOffset); m_macTXN = (**tpvars).fTXNRec ; +#if wxUSE_UNICODE + TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2, + kTXNStartOffset, kTXNEndOffset); +#else + wxCharBuffer text = wxMacStringToCString( st ) ; + TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData, (void*)text.data(), strlen( text ) , + kTXNStartOffset, kTXNEndOffset); +#endif m_macTXNvars = tpvars ; m_macUsesTXN = true ; TXNSetSelection( (TXNObject) m_macTXN, 0, 0); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); } - - return TRUE; + + return TRUE; } wxString wxTextCtrl::GetValue() const @@ -774,26 +781,44 @@ wxString wxTextCtrl::GetValue() const OSStatus err ; if ( !m_macUsesTXN ) { - err = ::GetControlDataSize((ControlHandle) m_macControl, 0, + err = ::GetControlDataSize((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, &actualSize ) ; - - if ( err ) - return wxEmptyString ; - - if ( actualSize > 0 ) - { - wxChar *ptr = result.GetWriteBuf(actualSize) ; - - ::GetControlData( (ControlHandle) m_macControl, 0, - ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, - actualSize , ptr , &actualSize ) ; - ptr[actualSize] = 0 ; - result.UngetWriteBuf(actualSize) ; + + if ( err ) + return wxEmptyString ; + + if ( actualSize > 0 ) + { + wxCharBuffer buf(actualSize) ; + ::GetControlData( (ControlHandle) m_macControl, 0, + ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, + actualSize , buf.data() , &actualSize ) ; + result = wxMacMakeStringFromCString( buf ) ; } - } else { +#if wxUSE_UNICODE + Handle theText ; + err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData ); + // all done + if ( err ) + { + actualSize = 0 ; + } + else + { + actualSize = GetHandleSize( theText ) ; + if ( actualSize > 0 ) + { + wxChar *ptr = result.GetWriteBuf(actualSize*sizeof(wxChar)) ; + wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ; + ptr[actualSize] = 0 ; + result.UngetWriteBuf( actualSize ) ; + } + DisposeHandle( theText ) ; + } +#else Handle theText ; err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData ); // all done @@ -804,18 +829,18 @@ wxString wxTextCtrl::GetValue() const else { actualSize = GetHandleSize( theText ) ; - if ( actualSize > 0 ) - { - wxChar *ptr = result.GetWriteBuf(actualSize) ; - strncpy( ptr , *theText , actualSize ) ; - ptr[actualSize] = 0 ; - result.UngetWriteBuf( actualSize ) ; - } - DisposeHandle( theText ) ; + if ( actualSize > 0 ) + { + HLock( theText ) ; + result = wxMacMakeStringFromCString( *theText , actualSize ) ; + HUnlock( theText ) ; + } + DisposeHandle( theText ) ; } +#endif } - - return wxMacMakeStringFromMacString( result ) ; + + return result ; } void wxTextCtrl::GetSelection(long* from, long* to) const @@ -833,28 +858,24 @@ void wxTextCtrl::GetSelection(long* from, long* to) const void wxTextCtrl::SetValue(const wxString& st) { - wxString value; - - if( wxApp::s_macDefaultEncodingIsPC ) - { - value = wxMacMakeMacStringFromPC( st ) ; - // value.Replace( "\n", "\r" ); TODO this should be handled by the conversion - } - else - value = st; - - if ( !m_macUsesTXN ) { - ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , value.Length() , (char*) ((const char*)value) ) ; + wxCharBuffer text = wxMacStringToCString( st ) ; + ::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) ; - TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), +#if wxUSE_UNICODE + TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNStartOffset, kTXNEndOffset); +#else + wxCharBuffer text = wxMacStringToCString( st ) ; + TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , + kTXNStartOffset, kTXNEndOffset); +#endif TXNSetSelection( (TXNObject) m_macTXN, 0, 0); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); if ( !formerEditable ) @@ -863,7 +884,7 @@ void wxTextCtrl::SetValue(const wxString& st) MacRedrawControl() ; } -void wxTextCtrl::SetMaxLength(unsigned long len) +void wxTextCtrl::SetMaxLength(unsigned long len) { m_maxLength = len ; } @@ -872,7 +893,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] ; @@ -884,7 +905,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) if ( style.HasFont() ) { const wxFont &font = style.GetFont() ; - CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ; + wxMacStringToPascal( font.GetFaceName() , fontName ) ; fontSize = font.GetPointSize() ; if ( font.GetUnderlined() ) fontStyle |= underline ; @@ -892,7 +913,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 ; @@ -903,7 +924,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() ) { @@ -913,12 +934,14 @@ 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); - wxASSERT_MSG( status == noErr , "Couldn't set text attributes" ) ; +#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 ) SetEditable(formerEditable) ; @@ -948,7 +971,7 @@ void wxTextCtrl::Copy() else { ClearCurrentScrap(); - TXNCopy((TXNObject)m_macTXN); + TXNCopy((TXNObject)m_macTXN); TXNConvertToPublicScrap(); } } @@ -968,7 +991,7 @@ void wxTextCtrl::Cut() else { ClearCurrentScrap(); - TXNCut((TXNObject)m_macTXN); + TXNCut((TXNObject)m_macTXN); TXNConvertToPublicScrap(); } wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); @@ -991,7 +1014,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); @@ -1029,13 +1052,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) @@ -1045,7 +1068,7 @@ bool wxTextCtrl::CanPaste() const } } return FALSE; - + #else long offset ; if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 ) @@ -1090,42 +1113,42 @@ void wxTextCtrl::SetInsertionPointEnd() long wxTextCtrl::GetInsertionPoint() const { - long begin,end ; - GetSelection( &begin , &end ) ; - return begin ; + long begin,end ; + GetSelection( &begin , &end ) ; + return begin ; } long wxTextCtrl::GetLastPosition() const { if ( !m_macUsesTXN ) - { - return (**((TEHandle) m_macTE)).teLength ; - } - else - { - Handle theText ; - long actualsize ; - OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData ); - /* all done */ - if ( err ) { - actualsize = 0 ; + return (**((TEHandle) m_macTE)).teLength ; } else { - actualsize = GetHandleSize( theText ) ; - DisposeHandle( theText ) ; + Handle theText ; + long actualsize ; + OSErr err = TXNGetDataEncoded( (TXNObject) m_macTXN, kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData ); + /* all done */ + if ( err ) + { + actualsize = 0 ; + } + else + { + actualsize = GetHandleSize( theText ) ; + DisposeHandle( theText ) ; + } + return actualsize ; } - return actualsize ; - } } void wxTextCtrl::Replace(long from, long to, const wxString& value) { - if ( !m_macUsesTXN ) - { + if ( !m_macUsesTXN ) + { ControlEditTextSelectionRec selection ; - + selection.selStart = from ; selection.selEnd = to ; ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; @@ -1135,13 +1158,18 @@ 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 ) ; TXNClear( ((TXNObject) m_macTXN) ) ; +#if wxUSE_UNICODE + TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)value.wc_str(), value.Length() * 2 , + kTXNUseCurrentSelection, kTXNUseCurrentSelection); +#else TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), - kTXNUseCurrentSelection, kTXNUseCurrentSelection); + kTXNUseCurrentSelection, kTXNUseCurrentSelection); +#endif if ( !formerEditable ) SetEditable( formerEditable ) ; } @@ -1150,52 +1178,57 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) 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 ) ; - TEDelete( ((TEHandle) m_macTE) ) ; - } - else - { - bool formerEditable = IsEditable() ; - if ( !formerEditable ) - SetEditable(true) ; - TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; - TXNClear( ((TXNObject) m_macTXN) ) ; - if ( !formerEditable ) - SetEditable( formerEditable ) ; - } + if ( !m_macUsesTXN ) + { + ControlEditTextSelectionRec selection ; + + selection.selStart = from ; + selection.selEnd = to ; + ::SetControlData( (ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; + TEDelete( ((TEHandle) m_macTE) ) ; + } + else + { + bool formerEditable = m_editable ; + if ( !formerEditable ) + SetEditable(true) ; + TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; + TXNClear( ((TXNObject) m_macTXN) ) ; + if ( !formerEditable ) + SetEditable( formerEditable ) ; + } Refresh() ; } void wxTextCtrl::SetSelection(long from, long to) { + if ( from == -1 ) + from = 0; - if ( !m_macUsesTXN ) - { - ControlEditTextSelectionRec selection ; - selection.selStart = from ; - selection.selEnd = to ; - - TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ; - ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; - } - else - { - STPTextPaneVars **tpvars; + if ( to == -1 ) + to = GetLastPosition(); + + if ( !m_macUsesTXN ) + { + ControlEditTextSelectionRec selection ; + selection.selStart = from ; + selection.selEnd = to ; + + TESetSelect( selection.selStart , selection.selEnd , ((TEHandle) m_macTE) ) ; + ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; + } + else + { + STPTextPaneVars **tpvars; /* set up our locals */ - tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl); + tpvars = (STPTextPaneVars **) GetControlReference((ControlHandle) m_macControl); /* and our drawing environment as the operation may force a redraw in the text area. */ - SetPort((**tpvars).fDrawingEnvironment); + SetPort((**tpvars).fDrawingEnvironment); /* change the selection */ - TXNSetSelection( (**tpvars).fTXNRec, from, to); - TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); - } + TXNSetSelection( (**tpvars).fTXNRec, from, to); + TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); + } } bool wxTextCtrl::LoadFile(const wxString& file) @@ -1208,30 +1241,28 @@ bool wxTextCtrl::LoadFile(const wxString& file) return FALSE; } -void wxTextCtrl::WriteText(const wxString& text) +void wxTextCtrl::WriteText(const wxString& st) { - wxString value ; - if( wxApp::s_macDefaultEncodingIsPC ) - { - value = wxMacMakeMacStringFromPC( text ) ; - // value.Replace( "\n", "\r" ); // TODO this should be handled by the conversion - } - else - value = text ; - if ( !m_macUsesTXN ) { - TEInsert( value , value.Length() , ((TEHandle) m_macTE) ) ; + wxCharBuffer text = wxMacStringToCString( st ) ; + TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ; } else { - bool formerEditable = IsEditable() ; + bool formerEditable = m_editable ; if ( !formerEditable ) SetEditable(true) ; long start , end , dummy ; GetSelection( &start , &dummy ) ; - TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(), +#if wxUSE_UNICODE + TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNUseCurrentSelection, kTXNUseCurrentSelection); +#else + wxCharBuffer text = wxMacStringToCString( st ) ; + TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , + kTXNUseCurrentSelection, kTXNUseCurrentSelection); +#endif GetSelection( &dummy , &end ) ; SetStyle( start , end , GetDefaultStyle() ) ; if ( !formerEditable ) @@ -1252,15 +1283,15 @@ void wxTextCtrl::Clear() { return ; } - if ( !m_macUsesTXN ) - { - ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ; - } - else - { + if ( !m_macUsesTXN ) + { + ::SetControlData((ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , 0 , (char*) ((const char*)NULL) ) ; + } + else + { TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ; - TXNClear((TXNObject)m_macTXN); - } + TXNClear((TXNObject)m_macTXN); + } Refresh() ; } @@ -1283,7 +1314,7 @@ bool wxTextCtrl::AcceptsFocus() const wxSize wxTextCtrl::DoGetBestSize() const { int wText = 100 ; - + int hText; if ( m_macUsesTXN ) { @@ -1321,6 +1352,10 @@ void wxTextCtrl::Undo() { if (CanUndo()) { + if ( m_macUsesTXN ) + { + TXNUndo((TXNObject)m_macTXN); + } } } @@ -1328,16 +1363,36 @@ 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 ; } @@ -1349,15 +1404,15 @@ void wxTextCtrl::DiscardEdits() int wxTextCtrl::GetNumberOfLines() const { - // TODO change this if possible to reflect real lines - wxString content = GetValue() ; - + // 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; } @@ -1379,9 +1434,9 @@ void wxTextCtrl::ShowPosition(long pos) int wxTextCtrl::GetLineLength(long lineNo) const { - // TODO change this if possible to reflect real lines - wxString content = GetValue() ; - + // 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++) @@ -1395,7 +1450,7 @@ int wxTextCtrl::GetLineLength(long lineNo) const count++; if (content[j] == '\r') return count; } - + return count; } if (content[i] == '\r') count++; @@ -1405,8 +1460,8 @@ int wxTextCtrl::GetLineLength(long lineNo) const wxString wxTextCtrl::GetLineText(long lineNo) const { - // TODO change this if possible to reflect real lines - wxString content = GetValue() ; + // TODO change this if possible to reflect real lines + wxString content = GetValue() ; // Find line first int count = 0; @@ -1415,27 +1470,27 @@ wxString wxTextCtrl::GetLineText(long lineNo) const if (count == lineNo) { // Add chars in line then - wxString tmp(""); - + wxString tmp; + for (size_t j = i; j < content.Length(); j++) { if (content[j] == '\r') return tmp; - + tmp += content[j]; } - + return tmp; } if (content[i] == '\r') count++; } - return "" ; + return wxEmptyString ; } /* * Text item */ - + void wxTextCtrl::Command(wxCommandEvent & event) { SetValue (event.GetString()); @@ -1455,16 +1510,16 @@ 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 */ ) { @@ -1493,7 +1548,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.SetString( GetValue() ); if ( GetEventHandler()->ProcessEvent(event) ) return; - } + } if ( !(m_windowStyle & wxTE_MULTILINE) ) { wxWindow *parent = GetParent(); @@ -1512,7 +1567,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 @@ -1540,15 +1595,32 @@ 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 +#endif + { + 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 ) ; + } + } } 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); @@ -1558,37 +1630,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 ; }