X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7548762cb5d8320cf8a36518594dfb5269cd8c60..fdd74b41b0a94b214aab4b7b03e75b60e877bd4e:/src/mac/carbon/textctrl.cpp diff --git a/src/mac/carbon/textctrl.cpp b/src/mac/carbon/textctrl.cpp index f260ca06fc..b1ae31ebe5 100644 --- a/src/mac/carbon/textctrl.cpp +++ b/src/mac/carbon/textctrl.cpp @@ -738,7 +738,7 @@ void wxTextCtrl::Init() wxTextCtrl::~wxTextCtrl() { #if wxMAC_USE_MLTE - SetControlReference((ControlRef)m_macControl, 0) ; + SetControlReference(*m_peer, 0) ; #if !wxMAC_USE_MLTE_HIVIEW TXNDeleteObject((TXNObject)m_macTXN); #endif @@ -803,11 +803,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if ( scrollView ) { HIViewAddSubview( scrollView , textView ) ; - m_macControl = (WXWidget) scrollView ; + m_peer = scrollView ; } else { - m_macControl = (WXWidget) textView ; + m_peer = textView ; } #else short featurSet; @@ -816,11 +816,12 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; /* create the control */ - verify_noerr( CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds, featurSet , (ControlRef*) &m_macControl) ) ; + m_peer = new wxMacControl() ; + verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, *m_peer ) ); wxMacWindowClipper c(this) ; STPTextPaneVars *varsp ; - mUPOpenControl( varsp, (ControlRef) m_macControl, m_windowStyle ); + mUPOpenControl( varsp, *m_peer, m_windowStyle ); m_macTXNvars = varsp ; m_macTXN = varsp->fTXNRec ; #endif @@ -841,7 +842,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, { wxMacWindowClipper clipper( this ) ; #if !wxMAC_USE_MLTE_HIVIEW - TPUpdateVisibility( (ControlRef) m_macControl ) ; + TPUpdateVisibility( *m_peer ) ; #endif SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ; @@ -859,15 +860,25 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, tback.bg.color = MAC_WXCOLORREF( GetBackgroundColour().GetPixel() ); TXNSetBackground( (TXNObject) m_macTXN , &tback); - if ( m_windowStyle & wxTE_READONLY) - { - SetEditable( false ) ; - } #else wxMacCFStringHolder cf(st , m_font.GetEncoding()) ; - CreateEditUnicodeTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds , cf , style & wxTE_PASSWORD , NULL , (ControlRef*) &m_macControl ) ; + CFStringRef cfr = cf ; + Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ; + m_peer = new wxMacControl() ; + CreateEditUnicodeTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds , cfr , isPassword , NULL , *m_peer ) ; + + if ( !(m_windowStyle & wxTE_MULTILINE) ) + { + Boolean singleline = true ; + ::SetControlData( *m_peer, kControlEditTextPart , kControlEditTextSingleLineTag , sizeof( singleline ) , &singleline ) ; + } MacPostControlCreate(pos,size) ; + #endif + if ( m_windowStyle & wxTE_READONLY) + { + SetEditable( false ) ; + } return TRUE; @@ -875,10 +886,31 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, void wxTextCtrl::MacVisibilityChanged() { -#if wxMAC_USE_MLTE && !wxMAC_USE_MLTE_HIVIEW +#if wxMAC_USE_MLTE +#if !wxMAC_USE_MLTE_HIVIEW MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , MacIsReallyShown() , GetWindowStyle() ) ; if ( !MacIsReallyShown() ) - InvalWindowRect( GetControlOwner( (ControlHandle) m_macControl ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ; + InvalWindowRect( GetControlOwner( *m_peer ) , &((STPTextPaneVars *)m_macTXNvars)->fRBounds ) ; +#endif +#else + if ( !(m_windowStyle & wxTE_MULTILINE) && MacIsReallyShown() ) + { + // work around a refresh issue insofar as not always the entire content is shown even if this would be possible + ControlEditTextSelectionRec sel ; + CFStringRef value = NULL ; + Size actualSize = 0 ; + ResType datatag = GetWindowStyle() & wxTE_PASSWORD ? + kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag ; + + verify_noerr( GetControlData( *m_peer , 0, kControlEditTextSelectionTag, + sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) ); + verify_noerr( GetControlData( *m_peer , 0, datatag , sizeof(CFStringRef), &value, &actualSize ) ); + + verify_noerr( SetControlData( *m_peer , 0, datatag, sizeof(CFStringRef), &value ) ); + verify_noerr( SetControlData( *m_peer , 0, kControlEditTextSelectionTag, sizeof(ControlEditTextSelectionRec), &sel ) ); + + CFRelease( value ) ; + } #endif } @@ -955,7 +987,7 @@ wxString wxTextCtrl::GetValue() const CFStringRef value = NULL ; Size actualSize = 0 ; - verify_noerr( GetControlData( (ControlRef) m_macControl , 0, GetWindowStyle() & wxTE_PASSWORD ? + verify_noerr( GetControlData( *m_peer , 0, GetWindowStyle() & wxTE_PASSWORD ? kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag, sizeof(CFStringRef), &value, &actualSize ) ); if ( value ) @@ -975,7 +1007,7 @@ void wxTextCtrl::GetSelection(long* from, long* to) const #else ControlEditTextSelectionRec sel ; Size actualSize ; - verify_noerr( GetControlData( (ControlRef) m_macControl , 0, kControlEditTextSelectionTag, + verify_noerr( GetControlData( *m_peer , 0, kControlEditTextSelectionTag, sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) ); if ( from ) *from = sel.selStart ; if ( to ) *to = sel.selEnd ; @@ -1010,7 +1042,7 @@ void wxTextCtrl::SetValue(const wxString& str) #else wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ; CFStringRef value = cf ; - verify_noerr( SetControlData( (ControlRef) m_macControl , 0, GetWindowStyle() & wxTE_PASSWORD ? + verify_noerr( SetControlData( *m_peer , 0, GetWindowStyle() & wxTE_PASSWORD ? kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag, sizeof(CFStringRef), &value ) ); #endif @@ -1138,6 +1170,8 @@ void wxTextCtrl::Copy() ClearCurrentScrap(); TXNCopy((TXNObject)m_macTXN); TXNConvertToPublicScrap(); +#else + m_peer->SendHICommand( kHICommandCopy ) ; #endif } } @@ -1150,6 +1184,8 @@ void wxTextCtrl::Cut() ClearCurrentScrap(); TXNCut((TXNObject)m_macTXN); TXNConvertToPublicScrap(); +#else + m_peer->SendHICommand( kHICommandCut ) ; #endif wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); event.SetString( GetValue() ) ; @@ -1166,6 +1202,8 @@ void wxTextCtrl::Paste() TXNConvertFromPublicScrap(); TXNPaste((TXNObject)m_macTXN); SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ; +#else + m_peer->SendHICommand( kHICommandPaste ) ; #endif wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId); event.SetString( GetValue() ) ; @@ -1215,6 +1253,9 @@ void wxTextCtrl::SetEditable(bool editable) TXNControlTag tag[] = { kTXNIOPrivilegesTag } ; TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ; TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ; +#else + Boolean value = !editable ; + ::SetControlData( *m_peer, 0, kControlEditTextLockedTag , sizeof( value ) , &value ) ; #endif } } @@ -1304,7 +1345,7 @@ void wxTextCtrl::SetSelection(long from, long to) ControlEditTextSelectionRec sel ; sel.selStart = from ; sel.selEnd = to ; - verify_noerr( SetControlData( (ControlRef) m_macControl , 0, kControlEditTextSelectionTag, + verify_noerr( SetControlData( *m_peer , 0, kControlEditTextSelectionTag, sizeof(ControlEditTextSelectionRec), &sel ) ); #endif @@ -1413,7 +1454,9 @@ void wxTextCtrl::WriteText(const wxString& str) { if ( !wxIsMainThread() ) { - wxMacMPRemoteGUICall( this , &wxTextCtrl::WriteText , str ) ; + // unfortunately CW 8 is not able to correctly deduce the template types, so we have + // to instantiate explicitely + wxMacMPRemoteGUICall( this , &wxTextCtrl::WriteText , str ) ; return ; } else @@ -1440,7 +1483,7 @@ void wxTextCtrl::WriteText(const wxString& str) #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ; CFStringRef value = cf ; - SetControlData( (ControlRef) m_macControl , 0, kControlEditTextInsertCFStringRefTag, + SetControlData( *m_peer , 0, kControlEditTextInsertCFStringRefTag, sizeof(CFStringRef), &value ); #else wxString val = GetValue() ; @@ -1449,6 +1492,7 @@ void wxTextCtrl::WriteText(const wxString& str) val.Remove( start , end - start ) ; val.insert( start , str ) ; SetValue( val ) ; + SetInsertionPoint( start + str.Length() ) ; #endif #endif } @@ -1516,6 +1560,13 @@ wxSize wxTextCtrl::DoGetBestSize() const break ; } +#if !wxMAC_USE_MLTE + // unicode text control is using client size, ie 3 pixels on every side + // TODO make this fit into normal window size concept, probably having + // to reintroduce the margin vars + hText -= 6 ; +#endif + if ( m_windowStyle & wxTE_MULTILINE ) { hText *= 5 ; @@ -1590,6 +1641,13 @@ int wxTextCtrl::GetNumberOfLines() const ItemCount lines = 0 ; #if wxMAC_USE_MLTE TXNGetLineCount((TXNObject)m_macTXN, &lines ) ; +#else + wxString content = GetValue() ; + lines = 1; + for (size_t i = 0; i < content.Length() ; i++) + { + if (content[i] == '\r') lines++; + } #endif return lines ; } @@ -1736,14 +1794,36 @@ int wxTextCtrl::GetLineLength(long lineNo) const ++xpos ; } } +#else + // 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++) + { + if (count == lineNo) + { + // Count chars in line then + count = 0; + for (size_t j = i; j < content.Length(); j++) + { + count++; + if (content[j] == '\n') return count; + } + + return count; + } + if (content[i] == '\n') count++; + } #endif return 0; } wxString wxTextCtrl::GetLineText(long lineNo) const { - wxString line ; #if wxMAC_USE_MLTE + wxString line ; Point curpt ; wxString content = GetValue() ; @@ -1781,8 +1861,34 @@ wxString wxTextCtrl::GetLineText(long lineNo) const } } } -#endif return line ; +#else + // 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++) + { + if (count == lineNo) + { + // Add chars in line then + wxString tmp; + + for (size_t j = i; j < content.Length(); j++) + { + if (content[j] == '\n') + return tmp; + + tmp += content[j]; + } + + return tmp; + } + if (content[i] == '\n') count++; + } + return wxEmptyString ; +#endif } /* @@ -1870,7 +1976,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) } } - // this will make wxWindows eat the ENTER key so that + // this will make wxWidgets eat the ENTER key so that // we actually prevent line wrapping in a single line // text control eat_key = TRUE; @@ -1879,22 +1985,23 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) break; case WXK_TAB: - // always produce navigation event - even if we process TAB - // ourselves the fact that we got here means that the user code - // decided to skip processing of this TAB - probably to let it - // do its default job. + if ( !(m_windowStyle & wxTE_PROCESS_TAB)) { - wxNavigationKeyEvent eventNav; - eventNav.SetDirection(!event.ShiftDown()); - eventNav.SetWindowChange(event.ControlDown()); - eventNav.SetEventObject(this); - - if ( GetParent()->GetEventHandler()->ProcessEvent(eventNav) ) - return; - - event.Skip() ; + int flags = 0; + if (!event.ShiftDown()) + flags |= wxNavigationKeyEvent::IsForward ; + if (event.ControlDown()) + flags |= wxNavigationKeyEvent::WinChange ; + Navigate(flags); return; } + else + { + // This is necessary (don't know why) or the tab will not + // be inserted. + WriteText(wxT("\t")); + } + break; } @@ -1914,7 +2021,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) keychar = short(ev->message & charCodeMask); keycode = short(ev->message & keyCodeMask) >> 8 ; - ::HandleControlKey( (ControlRef) m_macControl , keycode , keychar , ev->modifiers ) ; + ::HandleControlKey( *m_peer , keycode , keychar , ev->modifiers ) ; } } }