X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/da31cbc4ef4ea342ac1cbb2339cd85074d28ff98..44d0c580e62670c6bdd488b0a5ba2aa0b7f13db7:/src/mac/textctrl.cpp diff --git a/src/mac/textctrl.cpp b/src/mac/textctrl.cpp index 183c86981c..a28eb9241c 100644 --- a/src/mac/textctrl.cpp +++ b/src/mac/textctrl.cpp @@ -212,28 +212,37 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart Rect oldbounds = varsp->fRFocusOutline ; InsetRect( &oldbounds , -1 , -1 ) ; - InvalWindowRect( GetControlOwner( theControl ) , &oldbounds ) ; + if ( IsControlVisible( theControl ) ) + 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) , 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, - varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); + if ( IsControlVisible( theControl ) ) + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top, varsp->fRTextArea.left, + varsp->fRTextArea.bottom, varsp->fRTextArea.right, varsp->fTXNFrame); + else + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 30000 , varsp->fRTextArea.left + 30000 , + varsp->fRTextArea.bottom + 30000 , varsp->fRTextArea.right + 30000 , varsp->fTXNFrame); + } + if ( IsControlVisible( theControl ) ) + { /* update the text region */ - RGBColor white = { 65535 , 65535 , 65535 } ; - RGBBackColor( &white ) ; - EraseRgn(varsp->fTextBackgroundRgn); - TXNDraw(varsp->fTXNRec, NULL); - /* restore the drawing environment */ - /* draw the text frame and focus frame (if necessary) */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true); - /* release our globals */ - HSetState((Handle) tpvars, state); - + RGBColor white = { 65535 , 65535 , 65535 } ; + RGBBackColor( &white ) ; + EraseRgn(varsp->fTextBackgroundRgn); + TXNDraw(varsp->fTXNRec, NULL); + /* restore the drawing environment */ + /* draw the text frame and focus frame (if necessary) */ + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + if ((**tpvars).fIsActive && varsp->fInFocus) + DrawThemeFocusRect(&varsp->fRFocusOutline, true); + /* release our globals */ + HSetState((Handle) tpvars, state); + } } } @@ -249,7 +258,7 @@ static pascal ControlPartCode TPPaneHitTestProc(ControlHandle theControl, Point /* set up our locals and lock down our globals*/ result = 0; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl) ) { state = HGetState((Handle) tpvars); HLock((Handle) tpvars); /* find the region where we clicked */ @@ -276,7 +285,7 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point /* make sure we have some variables... */ partCodeResult = 0; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl ) ) { /* lock 'em down */ state = HGetState((Handle) tpvars); HLock((Handle) tpvars); @@ -319,7 +328,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) { STPTextPaneVars **tpvars, *varsp; /* set up locals */ tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL) { + if (tpvars != NULL && IsControlVisible( theControl ) ) { /* if we're not active, then we have nothing to say about the cursor */ if ((**tpvars).fIsActive) { char state; @@ -404,12 +413,16 @@ static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activati /* de/activate the text edit record */ SetPort((**tpvars).fDrawingEnvironment); wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; - GetControlBounds(theControl, &bounds); - varsp->fIsActive = activating; - TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); + GetControlBounds(theControl, &bounds); + varsp->fIsActive = activating; + TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); /* redraw the frame */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - if (varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive); + if ( IsControlVisible( theControl ) ) + { + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + if (varsp->fInFocus) + DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive); + } HSetState((Handle) tpvars, state); } } @@ -426,7 +439,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF /* set up locals */ focusResult = kControlFocusNoPart; tpvars = (STPTextPaneVars **) GetControlReference(theControl); - if (tpvars != NULL && IsControlVisible( theControl ) ) { + if (tpvars != NULL ) { state = HGetState((Handle) tpvars); HLock((Handle) tpvars); varsp = *tpvars; @@ -447,10 +460,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF kControlFocusNoPart, otherwise return a non-zero part code. kUserClickedToFocusPart - is a constant defined for this example. You should define your own value for handling click-to-focus type events. */ - /* save the drawing state */ - SetPort((**tpvars).fDrawingEnvironment); - wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; - /* calculate the next highlight state */ + /* calculate the next highlight state */ switch (action) { default: case kControlFocusNoPart: @@ -467,11 +477,17 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF focusResult = varsp->fInFocus ? 1 : kControlFocusNoPart; break; } - TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); - /* redraw the text fram and focus rectangle to indicate the - new focus state */ - DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); - DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive && varsp->fInFocus); + TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus); + /* redraw the text fram and focus rectangle to indicate the + new focus state */ + if ( IsControlVisible( theControl ) ) + { + /* save the drawing state */ + SetPort((**tpvars).fDrawingEnvironment); + wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ; + DrawThemeEditTextFrame(&varsp->fRTextOutline, varsp->fIsActive ? kThemeStateActive: kThemeStateInactive); + DrawThemeFocusRect(&varsp->fRFocusOutline, varsp->fIsActive && varsp->fInFocus); + } /* done */ HSetState((Handle) tpvars, state); } @@ -575,6 +591,11 @@ OSStatus mUPOpenControl(ControlHandle theControl, long wxStyle ) kTXNSystemDefaultEncoding, &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars); + if ( !IsControlVisible( theControl ) ) + TXNSetFrameBounds( varsp->fTXNRec, varsp->fRTextArea.top + 30000 , varsp->fRTextArea.left + 30000 , + varsp->fRTextArea.bottom + 30000 , varsp->fRTextArea.right + 30000 , varsp->fTXNFrame); + + if ( (wxStyle & wxTE_MULTILINE) && (wxStyle & wxTE_DONTWRAP) ) { TXNControlTag tag = kTXNWordWrapStateTag ; @@ -666,7 +687,7 @@ const short kVerticalMargin = 2 ; const short kHorizontalMargin = 2 ; bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, - const wxString& st, + const wxString& str, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, @@ -683,7 +704,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_macUsesTXN &= (TXNInitTextension != (void*) kUnresolvedCFragSymbolAddress) ; // base initialization - if ( !wxTextCtrlBase::Create(parent, id, pos, size, style, validator, name) ) + if ( !wxTextCtrlBase::Create(parent, id, pos, size, style & ~(wxHSCROLL|wxVSCROLL), validator, name) ) return FALSE; wxSize mySize = size ; @@ -726,9 +747,11 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, m_editable = FALSE ; } + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; 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" , false , 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 ) ; @@ -742,7 +765,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground | kControlGetsFocusOnClick | kControlSupportsLiveFeedback; /* create the control */ - m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", true, featurSet, 0, featurSet, kControlUserPaneProc, 0); + m_macControl = NewControl(MAC_WXHWND(parent->MacGetRootWindow()), &bounds, "\p", false , featurSet, 0, featurSet, kControlUserPaneProc, 0); /* set up the mUP specific features and data */ mUPOpenControl((ControlHandle) m_macControl, m_windowStyle ); } @@ -750,7 +773,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ; } else @@ -764,7 +787,7 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, TXNSetData( ((TXNObject) m_macTXN) , kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2, kTXNStartOffset, kTXNEndOffset); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN) , kTXNTextData, (void*)text.data(), strlen( text ) , kTXNStartOffset, kTXNEndOffset); #endif @@ -796,7 +819,7 @@ wxString wxTextCtrl::GetValue() const ::GetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag, actualSize , buf.data() , &actualSize ) ; - result = wxMacMakeStringFromCString( buf ) ; + result = wxString( buf , wxConvLocal) ; } } else @@ -835,14 +858,14 @@ wxString wxTextCtrl::GetValue() const if ( actualSize > 0 ) { HLock( theText ) ; - result = wxMacMakeStringFromCString( *theText , actualSize ) ; + result = wxString( *theText , wxConvLocal , actualSize ) ; HUnlock( theText ) ; } DisposeHandle( theText ) ; } #endif } - + wxMacConvertNewlines10To13( &result ) ; return result ; } @@ -859,11 +882,13 @@ void wxTextCtrl::GetSelection(long* from, long* to) const } } -void wxTextCtrl::SetValue(const wxString& st) +void wxTextCtrl::SetValue(const wxString& str) { + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; ::SetControlData( (ControlHandle) m_macControl, 0, ( m_windowStyle & wxTE_PASSWORD ) ? kControlEditTextPasswordTag : kControlEditTextTextTag , strlen(text) , text ) ; } else @@ -875,7 +900,7 @@ void wxTextCtrl::SetValue(const wxString& st) TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNStartOffset, kTXNEndOffset); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , kTXNStartOffset, kTXNEndOffset); #endif @@ -1146,8 +1171,10 @@ long wxTextCtrl::GetLastPosition() const } } -void wxTextCtrl::Replace(long from, long to, const wxString& value) +void wxTextCtrl::Replace(long from, long to, const wxString& str) { + wxString value = str ; + wxMacConvertNewlines13To10( &value ) ; if ( !m_macUsesTXN ) { ControlEditTextSelectionRec selection ; @@ -1249,11 +1276,13 @@ bool wxTextCtrl::LoadFile(const wxString& file) return FALSE; } -void wxTextCtrl::WriteText(const wxString& st) +void wxTextCtrl::WriteText(const wxString& str) { + wxString st = str ; + wxMacConvertNewlines13To10( &st ) ; if ( !m_macUsesTXN ) { - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TEInsert( text , strlen(text) , ((TEHandle) m_macTE) ) ; } else @@ -1267,7 +1296,7 @@ void wxTextCtrl::WriteText(const wxString& st) TXNSetData( ((TXNObject) m_macTXN), kTXNUnicodeTextData, (void*)st.wc_str(), st.Length() * 2 , kTXNUseCurrentSelection, kTXNUseCurrentSelection); #else - wxCharBuffer text = wxMacStringToCString( st ) ; + wxCharBuffer text = st.mb_str(wxConvLocal) ; TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)text.data(), strlen( text ) , kTXNUseCurrentSelection, kTXNUseCurrentSelection); #endif @@ -1404,7 +1433,12 @@ bool wxTextCtrl::CanRedo() const return FALSE ; } -// Makes 'unmodified' +// Makes modifie or unmodified +void wxTextCtrl::MarkDirty() +{ + m_dirty = true; +} + void wxTextCtrl::DiscardEdits() { m_dirty = false; @@ -1456,12 +1490,12 @@ int wxTextCtrl::GetLineLength(long lineNo) const for (size_t j = i; j < content.Length(); j++) { count++; - if (content[j] == '\r') return count; + if (content[j] == '\n') return count; } return count; } - if (content[i] == '\r') count++; + if (content[i] == '\n') count++; } return 0; } @@ -1482,7 +1516,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const for (size_t j = i; j < content.Length(); j++) { - if (content[j] == '\r') + if (content[j] == '\n') return tmp; tmp += content[j]; @@ -1490,7 +1524,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const return tmp; } - if (content[i] == '\r') count++; + if (content[i] == '\n') count++; } return wxEmptyString ; } @@ -1615,7 +1649,6 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) if ( m_macUsesTXN && wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL ) CallNextEventHandler((EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() , (EventRef) wxTheApp->MacGetCurrentEvent() ) ; else -#endif { EventRecord rec ; if ( wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ) @@ -1629,6 +1662,15 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; } } +#else + EventRecord *ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ; + short keycode ; + short keychar ; + keychar = short(ev->message & charCodeMask); + keycode = short(ev->message & keyCodeMask) >> 8 ; + + ::HandleControlKey( (ControlHandle) m_macControl , keycode , keychar , ev->modifiers ) ; +#endif } if ( ( key >= 0x20 && key < WXK_START ) || key == WXK_RETURN ||