X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..12fddefcbbc1731b7de244d484f946d47402740d:/src/mac/textctrl.cpp diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index ae6063d20c..852aa49750 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -85,7 +85,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 +130,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 +164,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 +195,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 +212,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,12 +291,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 +305,9 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point #endif } break; - + } - + HSetState((Handle) tpvars, state); } return partCodeResult; @@ -345,8 +345,8 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { RectRgn((theRgn = NewRgn()), &varsp->fRTextArea); TXNAdjustCursor(varsp->fTXNRec, theRgn); DisposeRgn(theRgn); - } - else + } + else { // SetThemeCursor(kThemeArrowCursor); } @@ -358,7 +358,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { // SetThemeCursor(kThemeArrowCursor); } } - + HSetState((Handle) tpvars, state); } } @@ -487,7 +487,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 +495,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 +504,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 +533,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 +544,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 +559,27 @@ 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); Str255 fontName ; SInt16 fontSize ; Style fontStyle ; - + GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; TXNTypeAttributes typeAttr[] = @@ -593,10 +593,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, @@ -667,11 +668,11 @@ 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) ) return FALSE; @@ -697,11 +698,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,7 +719,7 @@ 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 ) ; @@ -738,16 +739,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,15 +750,21 @@ 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; } @@ -776,26 +777,24 @@ wxString wxTextCtrl::GetValue() const { 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) ; - + + if ( err ) + return wxEmptyString ; + + if ( actualSize > 0 ) + { + wxCharBuffer buf(actualSize) ; ::GetControlData( (ControlHandle) m_macControl, 0, - ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, - actualSize , ptr , &actualSize ) ; - ptr[actualSize] = 0 ; - result.UngetWriteBuf(actualSize) ; + ( 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 , kTXNTextData ); + err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData ); // all done if ( err ) { @@ -804,18 +803,38 @@ wxString wxTextCtrl::GetValue() const else { actualSize = GetHandleSize( theText ) ; - if ( actualSize > 0 ) - { - wxChar *ptr = result.GetWriteBuf(actualSize) ; - strncpy( ptr , *theText , actualSize ) ; + 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 + if ( err ) + { + actualSize = 0 ; + } + else + { + actualSize = GetHandleSize( 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 +852,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 +878,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 +887,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 +899,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 +907,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 +918,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 +928,12 @@ 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" ) ; + wxASSERT_MSG( status == noErr , wxT("Couldn't set text attributes") ) ; } if ( !formerEditable ) SetEditable(formerEditable) ; @@ -948,7 +963,7 @@ void wxTextCtrl::Copy() else { ClearCurrentScrap(); - TXNCopy((TXNObject)m_macTXN); + TXNCopy((TXNObject)m_macTXN); TXNConvertToPublicScrap(); } } @@ -968,7 +983,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 +1006,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 +1044,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 +1060,7 @@ bool wxTextCtrl::CanPaste() const } } return FALSE; - + #else long offset ; if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 ) @@ -1125,7 +1140,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) if ( !m_macUsesTXN ) { ControlEditTextSelectionRec selection ; - + selection.selStart = from ; selection.selEnd = to ; ::SetControlData((ControlHandle) m_macControl , 0, kControlEditTextSelectionTag , sizeof( selection ) , (char*) &selection ) ; @@ -1135,13 +1150,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); +#endif if ( !formerEditable ) SetEditable( formerEditable ) ; } @@ -1153,7 +1173,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 ) ; @@ -1161,11 +1181,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 ) ; } @@ -1174,13 +1194,18 @@ void wxTextCtrl::Remove(long from, long to) void wxTextCtrl::SetSelection(long from, long to) { - + if ( from == -1 ) + from = 0; + + 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 ) ; } @@ -1208,30 +1233,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 ) @@ -1259,7 +1282,7 @@ void wxTextCtrl::Clear() else { TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ; - TXNClear((TXNObject)m_macTXN); + TXNClear((TXNObject)m_macTXN); } Refresh() ; } @@ -1283,7 +1306,7 @@ bool wxTextCtrl::AcceptsFocus() const wxSize wxTextCtrl::DoGetBestSize() const { int wText = 100 ; - + int hText; if ( m_macUsesTXN ) { @@ -1351,13 +1374,13 @@ 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; } @@ -1381,7 +1404,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++) @@ -1395,7 +1418,7 @@ int wxTextCtrl::GetLineLength(long lineNo) const count++; if (content[j] == '\r') return count; } - + return count; } if (content[i] == '\r') count++; @@ -1415,27 +1438,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 +1478,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 +1516,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) event.SetString( GetValue() ); if ( GetEventHandler()->ProcessEvent(event) ) return; - } + } if ( !(m_windowStyle & wxTE_MULTILINE) ) { wxWindow *parent = GetParent(); @@ -1512,7 +1535,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,7 +1563,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } break; } - + if (!eat_key) { // default handling @@ -1548,7 +1571,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } 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 +1581,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 ; }