X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01703fba231c24fd46f12c041ce2e8851219d280..4b134bb2ce1cba6a0033bdc553817d45de5b2cf7:/src/mac/carbon/textctrl.cpp?ds=sidebyside diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index d95006ca29..7cc3dd0fae 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -199,7 +199,6 @@ public : virtual wxString GetStringValue() const ; virtual void SetStringValue( const wxString &str) ; - static int ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes attr[] ) ; static TXNFrameOptions FrameOptionsFromWXStyle( long wxStyle ) ; void AdjustCreationAttributes( const wxColour& background , bool visible ) ; @@ -234,6 +233,7 @@ public : void SetTXNData( const wxString& st , TXNOffset start , TXNOffset end ) ; protected : + void TXNSetAttribute( const wxTextAttr& style , long from , long to ) ; TXNObject m_txn ; } ; @@ -252,7 +252,7 @@ public : const wxSize& size, long style ) ; virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; virtual bool HasFocus() const ; - virtual bool NeedsFocusRect() const ; + virtual bool NeedsFocusRect() const; protected : HIViewRef m_scrollView ; HIViewRef m_textView ; @@ -434,6 +434,11 @@ void wxTextCtrl::SetValue(const wxString& str) return ; GetPeer()->SetStringValue(str) ; + + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); + event.SetString( GetValue() ) ; + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); } void wxTextCtrl::SetMaxLength(unsigned long len) @@ -479,7 +484,6 @@ void wxTextCtrl::Cut() GetPeer()->Cut() ; wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - event.SetString( GetValue() ) ; event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); } @@ -493,7 +497,6 @@ void wxTextCtrl::Paste() // eventually we should add setting the default style again wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - event.SetString( GetValue() ) ; event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); } @@ -792,6 +795,16 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) return ; } + // Check if we have reached the max # of chars, but still allow navigation and deletion + if ( !IsMultiLine() && GetValue().Length() >= m_maxLength && + key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB && + key != WXK_BACK && !( key == WXK_RETURN && (m_windowStyle & wxPROCESS_ENTER) ) + ) + { + // eat it, we don't want to add more than allowed # of characters + return; + } + // assume that any key not processed yet is going to modify the control m_dirty = true; @@ -892,7 +905,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) key == WXK_BACK) { wxCommandEvent event1(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); - event1.SetString( GetValue() ) ; event1.SetEventObject( this ); wxPostEvent(GetEventHandler(),event1); } @@ -1200,7 +1212,7 @@ wxString wxMacUnicodeTextControl::GetStringValue() const wxMacCFStringHolder cf(value) ; result = cf.AsString() ; } -#if TARGET_API_MAC_OSX +#if '\n' == 10 wxMacConvertNewlines13To10( &result ) ; #else wxMacConvertNewlines10To13( &result ) ; @@ -1378,7 +1390,7 @@ wxString wxMacMLTEControl::GetStringValue() const } #endif } -#if TARGET_API_MAC_OSX +#if '\n' == 10 wxMacConvertNewlines13To10( &result ) ; #else wxMacConvertNewlines10To13( &result ) ; @@ -1494,8 +1506,9 @@ void wxMacMLTEControl::SetBackground( const wxBrush &brush ) TXNSetBackground( m_txn , &tback); } -int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttributes typeAttr[] ) +void wxMacMLTEControl::TXNSetAttribute( const wxTextAttr& style , long from , long to) { + TXNTypeAttributes typeAttr[4] ; Str255 fontName = "\pMonaco" ; SInt16 fontSize = 12 ; Style fontStyle = normal ; @@ -1512,7 +1525,7 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu fontStyle |= bold ; if ( font.GetStyle() == wxITALIC ) fontStyle |= italic ; - + typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ; typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ; typeAttr[attrCounter].data.dataPtr = (void*) fontName ; @@ -1532,29 +1545,21 @@ int wxMacMLTEControl::ConvertAttribute( const wxTextAttr& style , TXNTypeAttribu color = MAC_WXCOLORREF(style.GetTextColour().GetPixel()) ; attrCounter += 1 ; } - return attrCounter ; + if ( attrCounter > 0 ) + { + verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, from , to) ); + } } void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) { EditHelper help(m_txn) ; - wxTextAttr style(foreground,wxNullColour,font) ; - TXNTypeAttributes typeAttr[4] ; - int attrCounter = ConvertAttribute( style , typeAttr ) ; - if ( attrCounter > 0 ) - { - verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, kTXNStartOffset,kTXNEndOffset) ); - } + TXNSetAttribute( wxTextAttr(foreground,wxNullColour,font) , kTXNStartOffset,kTXNEndOffset ) ; } void wxMacMLTEControl::SetStyle(long start, long end, const wxTextAttr& style) { EditHelper help(m_txn) ; - TXNTypeAttributes typeAttr[4] ; - int attrCounter = ConvertAttribute( style , typeAttr ) ; - if ( attrCounter > 0 ) - { - verify_noerr( TXNSetTypeAttributes ( m_txn , attrCounter , typeAttr, start,end) ); - } + TXNSetAttribute( style , start,end ) ; } void wxMacMLTEControl::Copy() @@ -1839,7 +1844,7 @@ wxString wxMacMLTEControl::GetLineText(long lineNo) const currentHeight += lineHeight; } - Point thePoint = { firstPoint.v + Fix2Long(currentHeight), firstPoint.h + Fix2Long(0) }; + Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) }; TXNOffset theOffset; TXNPointToOffset(m_txn, thePoint, &theOffset); @@ -1878,7 +1883,7 @@ int wxMacMLTEControl::GetLineLength(long lineNo) const currentHeight += lineHeight; } - Point thePoint = { firstPoint.v + Fix2Long(currentHeight), firstPoint.h + Fix2Long(0) }; + Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) }; TXNOffset theOffset; TXNPointToOffset(m_txn, thePoint, &theOffset); @@ -1988,21 +1993,36 @@ static void TPCalculateBounds(STPTextPaneVars *varsp, const Rect& bounds) OSStatus MLTESetObjectVisibility( STPTextPaneVars *varsp, Boolean vis , long wxStyle) { OSStatus err = noErr ; -#if TARGET_API_MAC_OSX - TXNControlTag iControlTags[1] = { kTXNVisibilityTag }; - TXNControlData iControlData[1] = {{ vis }}; - err = ::TXNSetTXNObjectControls( varsp->fTXNRec, false, 1, iControlTags, iControlData ); -#endif wxTextCtrl* textctrl = (wxTextCtrl*) GetControlReference(varsp->fUserPaneRec); - if ( vis && textctrl ) + if ( textctrl ) { +#if TARGET_API_MAC_OSX + TXNControlTag iControlTags[1] = { kTXNVisibilityTag }; + TXNControlData iControlData[1] = {{ vis }}; + err = ::TXNSetTXNObjectControls( varsp->fTXNRec, false, 1, iControlTags, iControlData ); +#endif Rect bounds ; UMAGetControlBoundsInWindowCoords( varsp->fUserPaneRec, &bounds); TPCalculateBounds( varsp , bounds ) ; - wxMacWindowClipper cl(textctrl) ; - TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, - varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); - TXNShowSelection( varsp->fTXNRec, kTXNShowStart); + if ( vis ) + { + wxMacWindowClipper cl(textctrl) ; + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, + varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); + TXNShowSelection( varsp->fTXNRec, kTXNShowStart); + } + else + { +#if TARGET_API_MAC_OSX + // in 10.2 the scrollbars are still actively redrawn when using only the code above + if ( UMAGetSystemVersion() < 0x1030 ) + { + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 20000 , varsp->fRTextArea.left + 20000 , + varsp->fRTextArea.bottom + 20000 , varsp->fRTextArea.right + 20000 , varsp->fTXNFrame); + + } +#endif + } } return err ; } @@ -2060,7 +2080,7 @@ static void TPRedrawFocusOutline(STPTextPaneVars *varsp) { if (varsp->fFocusDrawState != (varsp->fIsActive && varsp->fInFocus)) { varsp->fFocusDrawState = (varsp->fIsActive && varsp->fInFocus); - DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fFocusDrawState); + // DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fFocusDrawState); } } @@ -2404,6 +2424,11 @@ void wxMacMLTEClassicControl::VisibilityChanged(bool shown) InvalWindowRect( GetControlOwner( m_controlRef ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ; } +bool wxMacMLTEClassicControl::NeedsFocusRect() const +{ + return true; +} + OSStatus wxMacMLTEClassicControl::DoCreate() { Rect bounds; @@ -2473,21 +2498,6 @@ OSStatus wxMacMLTEClassicControl::DoCreate() return err; } -// -// HACKHACK: (RN) -// Classic controls are not initially focused and -// smaller ones are focused badly with the focus rect -// this "fixes" the above issue - but there is probably a -// a better way. -// -// Still, on smaller text controls the focus rect is off -// - -bool wxMacMLTEClassicControl::NeedsFocusRect() const -{ - return m_windowStyle & wxNO_BORDER ? false : true; -} - // ---------------------------------------------------------------------------- // MLTE control implementation (OSX part) // ----------------------------------------------------------------------------