X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5de694f065b551d24ecf723e7fd1a276019a26b6..694f70fa9c0cc8889c208020bf75b2e3861f6818:/src/mac/carbon/textctrl.cpp diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index 0cf2f1696d..2c69426a4c 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -196,6 +196,7 @@ public : virtual void ShowPosition( long WXUNUSED(pos) ) ; virtual int GetLineLength(long lineNo) const ; virtual wxString GetLineText(long lineNo) const ; + virtual bool SetupCursor( const wxPoint& pt ) { return false ; } #ifndef __WXMAC_OSX__ virtual void MacControlUserPaneDrawProc(wxInt16 part) = 0 ; @@ -214,7 +215,7 @@ public : class wxMacMLTEControl : public wxMacTextControl { public : - wxMacMLTEControl( wxTextCtrl *peer ) : wxMacTextControl( peer ) {} + wxMacMLTEControl( wxTextCtrl *peer ) ; virtual wxString GetStringValue() const ; virtual void SetStringValue( const wxString &str) ; @@ -271,7 +272,6 @@ public : const wxSize& size, long style ) ; virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; virtual bool HasFocus() const ; - virtual bool NeedsFocusRect() const; protected : HIViewRef m_scrollView ; HIViewRef m_textView ; @@ -318,7 +318,6 @@ public : ~wxMacMLTEClassicControl() ; virtual void VisibilityChanged(bool shown) ; virtual void SuperChangedPosition() ; - virtual bool NeedsFocusRect() const; virtual void MacControlUserPaneDrawProc(wxInt16 part) ; virtual wxInt16 MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) ; @@ -329,6 +328,8 @@ public : virtual wxInt16 MacControlUserPaneFocusProc(wxInt16 action) ; virtual void MacControlUserPaneBackgroundProc(void* info) ; + virtual bool SetupCursor( const wxPoint& WXUNUSED(pt) ) { MacControlUserPaneIdleProc() ; return true ;} + virtual void SetRect( Rect *r ) ; protected : @@ -410,8 +411,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) ) return false; - Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; - if ( m_windowStyle & wxTE_MULTILINE ) { wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER), @@ -446,6 +445,8 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, { SetEditable( false ) ; } + + SetCursor( wxCursor( wxCURSOR_IBEAM ) ) ; return true; } @@ -1014,7 +1015,10 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event) bool wxTextCtrl::MacSetupCursor( const wxPoint& pt ) { - return true ; + if ( !GetPeer()->SetupCursor(pt) ) + return wxWindow::MacSetupCursor( pt ) ; + else + return true ; } #if !TARGET_API_MAC_OSX @@ -1377,6 +1381,11 @@ public : TXNControlData m_data[1] ; } ; +wxMacMLTEControl::wxMacMLTEControl( wxTextCtrl *peer ) : wxMacTextControl( peer ) +{ + SetNeedsFocusRect( true ) ; +} + wxString wxMacMLTEControl::GetStringValue() const { wxString result ; @@ -1523,24 +1532,28 @@ void wxMacMLTEControl::AdjustCreationAttributes( const wxColour &background, boo iControlTags, iControlData )) ; // setting the default font + // under 10.2 this causes a visible caret, therefore we avoid it - Str255 fontName ; - SInt16 fontSize ; - Style fontStyle ; - - GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; - - TXNTypeAttributes typeAttr[] = + if ( UMAGetSystemVersion() >= 0x1030 ) { - { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } , - { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } , - { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } , - } ; + Str255 fontName ; + SInt16 fontSize ; + Style fontStyle ; - verify_noerr( TXNSetTypeAttributes (m_txn, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr, - kTXNStartOffset, - kTXNEndOffset) ); + GetThemeFont(kThemeSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; + TXNTypeAttributes typeAttr[] = + { + { kTXNQDFontNameAttribute , kTXNQDFontNameAttributeSize , { (void*) fontName } } , + { kTXNQDFontSizeAttribute , kTXNFontSizeAttributeSize , { (void*) (fontSize << 16) } } , + { kTXNQDFontStyleAttribute , kTXNQDFontStyleAttributeSize , { (void*) normal } } , + } ; + + verify_noerr( TXNSetTypeAttributes (m_txn, sizeof( typeAttr ) / sizeof(TXNTypeAttributes) , typeAttr, + kTXNStartOffset, + kTXNEndOffset) ); + } + if ( m_windowStyle & wxTE_PASSWORD ) { UniChar c = 0xA5 ; @@ -2092,7 +2105,26 @@ void wxMacMLTEClassicControl::MacFocusPaneText(Boolean setFocus) void wxMacMLTEClassicControl::MacSetObjectVisibility(Boolean vis) { + ControlRef controlFocus = 0 ; + GetKeyboardFocus( m_txnWindow , &controlFocus ) ; + + if ( controlFocus == m_controlRef && vis == false ) + { + SetKeyboardFocus( m_txnWindow , m_controlRef , kControlFocusNoPart ) ; + } + + TXNControlTag iControlTags[1] = { kTXNVisibilityTag }; + TXNControlData iControlData[1] = { {(UInt32) false } }; + verify_noerr( TXNGetTXNObjectControls( m_txn , 1, + iControlTags, iControlData ) ) ; + + if ( iControlData[0].uValue != vis ) + { + iControlData[0].uValue = vis ; + verify_noerr( TXNSetTXNObjectControls( m_txn, false , 1, + iControlTags, iControlData )) ; + } // we right now are always clipping as partial visibility (overlapped) visibility // is also a problem, if we run into further problems we might set the FrameBounds to an empty // rect here @@ -2115,8 +2147,11 @@ void wxMacMLTEClassicControl::MacUpdatePosition() Rect oldBounds = m_txnControlBounds ; m_txnControlBounds = bounds ; wxMacWindowClipper cl(textctrl) ; + wxRect visRect = textctrl->MacGetClippedRect() ; + Rect visBounds = { visRect.y , visRect.x , visRect.y + visRect.height , visRect.x + visRect.width } ; #ifdef __WXMAC_OSX__ + bool isCompositing = textctrl->MacGetTopLevelWindow()->MacUsesCompositing() ; if ( m_sbHorizontal || m_sbVertical ) { int w = bounds.right - bounds.left ; @@ -2130,6 +2165,10 @@ void wxMacMLTEClassicControl::MacUpdatePosition() sbBounds.top = h - 14 ; sbBounds.right = w + 1 ; sbBounds.bottom = h + 1 ; + + if ( !isCompositing ) + OffsetRect( &sbBounds , m_txnControlBounds.left , m_txnControlBounds.top ) ; + SetControlBounds( m_sbHorizontal , &sbBounds ) ; SetControlViewSize( m_sbHorizontal , w ) ; } @@ -2142,12 +2181,39 @@ void wxMacMLTEClassicControl::MacUpdatePosition() sbBounds.right = w + 1 ; sbBounds.bottom = m_sbHorizontal ? h - 14 : h + 1 ; + if ( !isCompositing ) + OffsetRect( &sbBounds , m_txnControlBounds.left , m_txnControlBounds.top ) ; + SetControlBounds( m_sbVertical , &sbBounds ) ; SetControlViewSize( m_sbVertical , h ) ; } } + int x , y ; + x = y = 0 ; + textctrl->MacWindowToRootWindow( &x , &y ) ; + OffsetRect( &visBounds , x , y ) ; + + Rect oldviewRect ; + TXNLongRect olddestRect ; + TXNGetRectBounds( m_txn , &oldviewRect , &olddestRect , NULL ) ; + + Rect viewRect = { m_txnControlBounds.top, m_txnControlBounds.left, + m_txnControlBounds.bottom - ( m_sbHorizontal ? 14 : 0 ) , m_txnControlBounds.right - ( m_sbVertical ? 14 : 0 ) } ; + TXNLongRect destRect = { m_txnControlBounds.top, m_txnControlBounds.left, + m_txnControlBounds.bottom - ( m_sbHorizontal ? 14 : 0 ) , m_txnControlBounds.right - ( m_sbVertical ? 14 : 0 ) } ; + + if ( olddestRect.right >= 10000 ) + destRect.right = destRect.left + 32000 ; + + if ( olddestRect.bottom >= 0x20000000 ) + destRect.bottom = destRect.top + 0x40000000 ; + + SectRect( &viewRect , &visBounds , &viewRect ) ; + TXNSetRectBounds( m_txn , &viewRect , &destRect , false ) ; +/* TXNSetFrameBounds( m_txn, m_txnControlBounds.top, m_txnControlBounds.left, m_txnControlBounds.bottom - ( m_sbHorizontal ? 14 : 0 ) , m_txnControlBounds.right - ( m_sbVertical ? 14 : 0 ), m_txnFrameID); +*/ #else TXNSetFrameBounds( m_txn, m_txnControlBounds.top, m_txnControlBounds.left, @@ -2298,7 +2364,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneKeyDownProc (wxInt16 keyCode, ev.modifiers = modifiers ; ev.message = (( keyCode << 8 ) & keyCodeMask ) + ( charCode & charCodeMask ) ; TXNKeyDown( m_txn , &ev); - + return kControlEntireControl; } @@ -2327,7 +2393,7 @@ wxInt16 wxMacMLTEClassicControl::MacControlUserPaneFocusProc(wxInt16 action) case kControlFocusPrevPart: case kControlFocusNextPart: MacFocusPaneText( ( !wasFocused)); - focusResult = (!wasFocused) ? kControlEditTextPart : kControlFocusNoPart; + focusResult = (!wasFocused) ? (ControlPartCode) kControlEditTextPart : (ControlPartCode) kControlFocusNoPart; break; case kControlFocusNoPart: @@ -2358,17 +2424,17 @@ wxMacMLTEClassicControl::wxMacMLTEClassicControl( wxTextCtrl *wxPeer, short featurSet; featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle - | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground + | kControlWantsActivate | kControlHandlesTracking // | kControlHasSpecialBackground | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(wxPeer->GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, &m_controlRef ) ); DoCreate(); - MacSetObjectVisibility( wxPeer->MacIsReallyShown() ) ; - AdjustCreationAttributes( *wxWHITE , true) ; + MacSetObjectVisibility( wxPeer->MacIsReallyShown() ) ; + wxMacWindowClipper clipper( m_peer ) ; SetTXNData( st , kTXNStartOffset, kTXNEndOffset ) ; TXNSetSelection( m_txn, 0, 0); @@ -2392,11 +2458,6 @@ void wxMacMLTEClassicControl::SuperChangedPosition() wxMacControl::SuperChangedPosition() ; } -bool wxMacMLTEClassicControl::NeedsFocusRect() const -{ - return true; -} - #ifdef __WXMAC_OSX__ ControlUserPaneDrawUPP gTPDrawProc = NULL; @@ -2410,7 +2471,7 @@ ControlUserPaneFocusUPP gTPFocusProc = NULL; static pascal void wxMacControlUserPaneDrawProc(ControlRef control, SInt16 part) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) win->MacControlUserPaneDrawProc(part) ; } @@ -2418,7 +2479,7 @@ static pascal void wxMacControlUserPaneDrawProc(ControlRef control, SInt16 part) static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control, Point where) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) return win->MacControlUserPaneHitTestProc(where.h , where.v) ; else @@ -2428,7 +2489,7 @@ static pascal ControlPartCode wxMacControlUserPaneHitTestProc(ControlRef control static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef control, Point startPt, ControlActionUPP actionProc) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) return win->MacControlUserPaneTrackingProc( startPt.h , startPt.v , (void*) actionProc) ; else @@ -2438,7 +2499,7 @@ static pascal ControlPartCode wxMacControlUserPaneTrackingProc(ControlRef contro static pascal void wxMacControlUserPaneIdleProc(ControlRef control) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) win->MacControlUserPaneIdleProc() ; } @@ -2446,7 +2507,7 @@ static pascal void wxMacControlUserPaneIdleProc(ControlRef control) static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control, SInt16 keyCode, SInt16 charCode, SInt16 modifiers) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) return win->MacControlUserPaneKeyDownProc(keyCode,charCode,modifiers) ; else @@ -2456,7 +2517,7 @@ static pascal ControlPartCode wxMacControlUserPaneKeyDownProc(ControlRef control static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean activating) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) win->MacControlUserPaneActivateProc(activating) ; } @@ -2464,20 +2525,22 @@ static pascal void wxMacControlUserPaneActivateProc(ControlRef control, Boolean static pascal ControlPartCode wxMacControlUserPaneFocusProc(ControlRef control, ControlFocusPart action) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) return win->MacControlUserPaneFocusProc(action) ; else return kControlNoPart ; } +/* static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, ControlBackgroundPtr info) { wxTextCtrl *textCtrl = wxDynamicCast( wxFindControlFromMacControl(control) , wxTextCtrl ) ; - wxMacMLTEClassicControl * win = textCtrl ? dynamic_cast(textCtrl->GetPeer()) : NULL ; + wxMacMLTEClassicControl * win = textCtrl ? (wxMacMLTEClassicControl*)(textCtrl->GetPeer()) : NULL ; if ( win ) win->MacControlUserPaneBackgroundProc(info) ; } +*/ #endif // TXNRegisterScrollInfoProc @@ -2570,7 +2633,29 @@ OSStatus wxMacMLTEClassicControl::DoCreate() kTXNTextensionFile, kTXNSystemDefaultEncoding, &m_txn, &m_txnFrameID, NULL ) ); +/* + TXNCarbonEventInfo cInfo ; + + cInfo.useCarbonEvents = false ; + cInfo.filler = 0 ; + cInfo.flags = 0 ; + cInfo.fDictionary = NULL ; + TXNControlTag iControlTags[] = + { + kTXNUseCarbonEvents , + }; + TXNControlData iControlData[] = + { + {(UInt32) &cInfo }, + }; + + int toptag = WXSIZEOF( iControlTags ) ; + + verify_noerr( TXNSetTXNObjectControls( m_txn, false , toptag, + iControlTags, iControlData )) ; + +*/ #ifdef __WXMAC_OSX__ TXNRegisterScrollInfoProc( m_txn, gTXNScrollInfoProc, (SInt32) this); #endif @@ -2650,11 +2735,6 @@ bool wxMacMLTEHIViewControl::HasFocus() const return control == m_textView ; } -bool wxMacMLTEHIViewControl::NeedsFocusRect() const -{ - return m_windowStyle & wxNO_BORDER ? false : true; -} - #endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2