X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e600c175c01c12dafdabbe9c758ea5559e1556d1..94311eef78b66304c9a2f78bcbdd396c798f19a6:/src/mac/textctrl.cpp?ds=sidebyside diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index 141042b1ae..e825d8b3d4 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -23,7 +23,14 @@ #else #include #endif -#include + +#if wxUSE_STD_IOSTREAM + #if wxUSE_IOSTREAMH + #include + #else + #include + #endif +#endif #include "wx/app.h" #include "wx/dc.h" @@ -289,7 +296,13 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point case kmUPTextPart: { SetPort((**tpvars).fDrawingEnvironment); wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; +#if !TARGET_CARBON TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent()); +#else + EventRecord rec ; + ConvertEventRefToEventRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ; + TXNClick( varsp->fTXNRec, &rec ); +#endif } break; @@ -332,12 +345,18 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { RectRgn((theRgn = NewRgn()), &varsp->fRTextArea); TXNAdjustCursor(varsp->fTXNRec, theRgn); DisposeRgn(theRgn); - } else SetThemeCursor(kThemeArrowCursor); + } + else + { + // SetThemeCursor(kThemeArrowCursor); + } } else { /* if it's in our bounds, set the cursor */ GetControlBounds(theControl, &bounds); if (PtInRect(mousep, &bounds)) - SetThemeCursor(kThemeArrowCursor); + { + // SetThemeCursor(kThemeArrowCursor); + } } HSetState((Handle) tpvars, state); @@ -529,29 +548,29 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) TXNFrameOptions frameOptions = kTXNDontDrawCaretWhenInactiveMask ; if ( ! ( wxStyle & wxTE_NOHIDESEL ) ) - frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ; - - if ( wxStyle & wxTE_MULTILINE ) - { - if ( ! ( wxStyle & wxTE_DONTWRAP ) ) - frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ; - else - { - frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ; - frameOptions |= kTXNWantHScrollBarMask ; - } - - if ( !(wxStyle & wxTE_NO_VSCROLL ) ) - frameOptions |= kTXNWantVScrollBarMask ; - } - else - frameOptions |= kTXNSingleLineOnlyMask ; - - if ( wxStyle & wxTE_READONLY ) - frameOptions |= kTXNReadOnlyMask ; + frameOptions |= kTXNDontDrawSelectionWhenInactiveMask ; + + if ( wxStyle & wxTE_MULTILINE ) + { + if ( ! ( wxStyle & wxTE_DONTWRAP ) ) + frameOptions |= kTXNAlwaysWrapAtViewEdgeMask ; + else + { + 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 , + frameOptions , kTXNTextEditStyleFrameType, kTXNTextensionFile, kTXNSystemDefaultEncoding, @@ -715,11 +734,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, /* create the control */ m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0); /* set up the mUP specific features and data */ - mUPOpenControl((ControlHandle) m_macControl, m_windowStyle ); - if ( parent ) - { - parent->MacGetTopLevelWindow()->MacInstallEventHandler() ; - } + mUPOpenControl((ControlHandle) m_macControl, m_windowStyle ); } MacPostControlCreate() ; @@ -745,7 +760,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_macTXN = (**tpvars).fTXNRec ; m_macTXNvars = tpvars ; m_macUsesTXN = true ; - TXNSetSelection( (TXNObject) m_macTXN, 0, 0); + TXNSetSelection( (TXNObject) m_macTXN, 0, 0); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); } @@ -754,44 +769,53 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, wxString wxTextCtrl::GetValue() const { - Size actualsize; - + Size actualSize = 0; + wxString result ; + OSStatus err ; if ( !m_macUsesTXN ) { - ::GetControlData( (ControlHandle) m_macControl, 0, - ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, - 32767 , wxBuffer , &actualsize ) ; + 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) ; + } + } else { Handle theText ; - OSStatus err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData ); + err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData ); // all done if ( err ) { - actualsize = 0 ; + actualSize = 0 ; } else { - actualsize = GetHandleSize( theText ) ; - if (actualsize != 0) - strncpy( wxBuffer , *theText , actualsize ) ; - DisposeHandle( theText ) ; + actualSize = GetHandleSize( theText ) ; + if ( actualSize > 0 ) + { + wxChar *ptr = result.GetWriteBuf(actualSize) ; + strncpy( ptr , *theText , actualSize ) ; + ptr[actualSize] = 0 ; + result.UngetWriteBuf( actualSize ) ; + } + DisposeHandle( theText ) ; } } - wxBuffer[actualsize] = 0 ; - - wxString value; - - if( wxApp::s_macDefaultEncodingIsPC ) - value = wxMacMakePCStringFromMac( wxBuffer ) ; - else - value = wxBuffer; - - value.Replace( "\r", "\n" ); - - return value; + return wxMacMakeStringFromMacString( result ) ; } void wxTextCtrl::GetSelection(long* from, long* to) const @@ -812,11 +836,13 @@ 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; - value.Replace( "\n", "\r" ); if ( !m_macUsesTXN ) { @@ -825,12 +851,14 @@ void wxTextCtrl::SetValue(const wxString& st) else { bool formerEditable = IsEditable() ; - SetEditable(true) ; - TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), - kTXNStartOffset, kTXNEndOffset); - TXNSetSelection( (TXNObject) m_macTXN, 0, 0); + if ( !formerEditable ) + SetEditable(true) ; + TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), + kTXNStartOffset, kTXNEndOffset); + TXNSetSelection( (TXNObject) m_macTXN, 0, 0); TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart); - SetEditable(formerEditable) ; + if ( !formerEditable ) + SetEditable(formerEditable) ; } MacRedrawControl() ; } @@ -845,52 +873,55 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style) if ( m_macUsesTXN ) { bool formerEditable = IsEditable() ; - SetEditable(true) ; - TXNTypeAttributes typeAttr[4] ; - Str255 fontName = "\pMonaco" ; - SInt16 fontSize = 12 ; - Style fontStyle = normal ; - RGBColor color ; - int attrCounter = 0 ; - if ( style.HasFont() ) - { - const wxFont &font = style.GetFont() ; - CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ; - fontSize = font.GetPointSize() ; - if ( font.GetUnderlined() ) - fontStyle |= underline ; - if ( font.GetWeight() == wxBOLD ) - fontStyle |= bold ; - if ( font.GetStyle() == wxITALIC ) - fontStyle |= italic ; - - typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ; - typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ; - typeAttr[attrCounter].data.dataPtr = (void*) fontName ; - typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ; - typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ; - typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ; - typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ; - typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ; - typeAttr[attrCounter+2].data.dataValue = fontStyle ; - attrCounter += 3 ; - - } - if ( style.HasTextColour() ) - { - typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ; - typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ; - typeAttr[attrCounter].data.dataPtr = (void*) &color ; - color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ; - attrCounter += 1 ; - } + if ( !formerEditable ) + SetEditable(true) ; + TXNTypeAttributes typeAttr[4] ; + Str255 fontName = "\pMonaco" ; + SInt16 fontSize = 12 ; + Style fontStyle = normal ; + RGBColor color ; + int attrCounter = 0 ; + if ( style.HasFont() ) + { + const wxFont &font = style.GetFont() ; + CopyCStringToPascal( font.GetFaceName().c_str() , fontName ) ; + fontSize = font.GetPointSize() ; + if ( font.GetUnderlined() ) + fontStyle |= underline ; + if ( font.GetWeight() == wxBOLD ) + fontStyle |= bold ; + if ( font.GetStyle() == wxITALIC ) + fontStyle |= italic ; + + typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ; + typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ; + typeAttr[attrCounter].data.dataPtr = (void*) fontName ; + typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ; + typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ; + typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ; + typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ; + typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ; + typeAttr[attrCounter+2].data.dataValue = fontStyle ; + attrCounter += 3 ; + + } + if ( style.HasTextColour() ) + { + typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ; + typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ; + typeAttr[attrCounter].data.dataPtr = (void*) &color ; + 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" ) ; } - SetEditable(formerEditable) ; + if ( !formerEditable ) + SetEditable(formerEditable) ; } return TRUE ; } @@ -995,7 +1026,6 @@ bool wxTextCtrl::CanPaste() const if (!IsEditable()) return FALSE; - long offset ; #if TARGET_CARBON OSStatus err = noErr; ScrapRef scrapRef; @@ -1017,6 +1047,7 @@ bool wxTextCtrl::CanPaste() const return FALSE; #else + long offset ; if ( GetScrap( NULL , 'TEXT' , &offset ) > 0 ) { return TRUE ; @@ -1033,14 +1064,14 @@ void wxTextCtrl::SetEditable(bool editable) if ( !m_macUsesTXN ) { if ( editable ) - UMAActivateControl( (ControlHandle) m_macControl ) ; + UMAActivateControl( (ControlHandle) m_macControl ) ; else - UMADeactivateControl((ControlHandle) m_macControl ) ; + UMADeactivateControl((ControlHandle) m_macControl ) ; } else { TXNControlTag tag[] = { kTXNIOPrivilegesTag } ; - TXNControlData data[] = { editable ? kTXNReadWrite : kTXNReadOnly } ; + TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ; TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ; } } @@ -1105,12 +1136,14 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value) else { bool formerEditable = IsEditable() ; - SetEditable(true) ; - TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; - TXNClear( ((TXNObject) m_macTXN) ) ; - TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), - kTXNUseCurrentSelection, kTXNUseCurrentSelection); - SetEditable( formerEditable ) ; + if ( !formerEditable ) + SetEditable(true) ; + TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; + TXNClear( ((TXNObject) m_macTXN) ) ; + TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(), + kTXNUseCurrentSelection, kTXNUseCurrentSelection); + if ( !formerEditable ) + SetEditable( formerEditable ) ; } Refresh() ; } @@ -1129,10 +1162,12 @@ void wxTextCtrl::Remove(long from, long to) else { bool formerEditable = IsEditable() ; - SetEditable(true) ; + if ( !formerEditable ) + SetEditable(true) ; TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ; TXNClear( ((TXNObject) m_macTXN) ) ; - SetEditable( formerEditable ) ; + if ( !formerEditable ) + SetEditable( formerEditable ) ; } Refresh() ; } @@ -1177,9 +1212,13 @@ void wxTextCtrl::WriteText(const wxString& text) { 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) ) ; @@ -1187,14 +1226,16 @@ void wxTextCtrl::WriteText(const wxString& text) else { bool formerEditable = IsEditable() ; - SetEditable(true) ; - long start , end , dummy ; - GetSelection( &start , &dummy ) ; + if ( !formerEditable ) + SetEditable(true) ; + long start , end , dummy ; + GetSelection( &start , &dummy ) ; TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(), kTXNUseCurrentSelection, kTXNUseCurrentSelection); - GetSelection( &dummy , &end ) ; + GetSelection( &dummy , &end ) ; SetStyle( start , end , GetDefaultStyle() ) ; - SetEditable( formerEditable ) ; + if ( !formerEditable ) + SetEditable( formerEditable ) ; } MacRedrawControl() ; } @@ -1217,8 +1258,8 @@ void wxTextCtrl::Clear() } else { - ClearCurrentScrap(); - TXNClear((TXNObject)m_macTXN); + TXNSetSelection( (TXNObject)m_macTXN , kTXNStartOffset , kTXNEndOffset ) ; + TXNClear((TXNObject)m_macTXN); } Refresh() ; } @@ -1312,7 +1353,7 @@ int wxTextCtrl::GetNumberOfLines() const wxString content = GetValue() ; int count = 1; - for (int i = 0; i < content.Length() ; i++) + for (size_t i = 0; i < content.Length() ; i++) { if (content[i] == '\r') count++; } @@ -1343,13 +1384,13 @@ int wxTextCtrl::GetLineLength(long lineNo) const // Find line first int count = 0; - for (int i = 0; i < content.Length() ; i++) + for (size_t i = 0; i < content.Length() ; i++) { if (count == lineNo) { // Count chars in line then count = 0; - for (int j = i; j < content.Length(); j++) + for (size_t j = i; j < content.Length(); j++) { count++; if (content[j] == '\r') return count; @@ -1369,14 +1410,14 @@ wxString wxTextCtrl::GetLineText(long lineNo) const // Find line first int count = 0; - for (int i = 0; i < content.Length() ; i++) + for (size_t i = 0; i < content.Length() ; i++) { if (count == lineNo) { // Add chars in line then wxString tmp(""); - for (int j = i; j < content.Length(); j++) + for (size_t j = i; j < content.Length(); j++) { if (content[j] == '\r') return tmp; @@ -1538,7 +1579,7 @@ bool wxTextCtrl::Show(bool show) bool retval = wxControl::Show( show ) ; - if ( former != m_macControlIsShown ) + if ( former != m_macControlIsShown && show ) { if ( m_macControlIsShown ) TXNSetFrameBounds( (TXNObject) m_macTXN, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.top, (**(STPTextPaneVars **)m_macTXNvars).fRTextArea.left, @@ -1555,27 +1596,27 @@ bool wxTextCtrl::Show(bool show) // standard handlers for standard edit menu events // ---------------------------------------------------------------------------- -void wxTextCtrl::OnCut(wxCommandEvent& event) +void wxTextCtrl::OnCut(wxCommandEvent& WXUNUSED(event)) { Cut(); } -void wxTextCtrl::OnCopy(wxCommandEvent& event) +void wxTextCtrl::OnCopy(wxCommandEvent& WXUNUSED(event)) { Copy(); } -void wxTextCtrl::OnPaste(wxCommandEvent& event) +void wxTextCtrl::OnPaste(wxCommandEvent& WXUNUSED(event)) { Paste(); } -void wxTextCtrl::OnUndo(wxCommandEvent& event) +void wxTextCtrl::OnUndo(wxCommandEvent& WXUNUSED(event)) { Undo(); } -void wxTextCtrl::OnRedo(wxCommandEvent& event) +void wxTextCtrl::OnRedo(wxCommandEvent& WXUNUSED(event)) { Redo(); } @@ -1605,7 +1646,13 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) event.Enable( CanRedo() ); } - +bool wxTextCtrl::MacSetupCursor( const wxPoint& pt ) +{ + if ( m_macUsesTXN ) + return true ; + else + return wxWindow::MacSetupCursor( pt ) ; +} #endif // wxUSE_TEXTCTRL