+
+ Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ;
+
+ if ( m_windowStyle & wxTE_MULTILINE )
+ {
+ wxASSERT_MSG( !(m_windowStyle & wxTE_PROCESS_ENTER),
+ wxT("wxTE_PROCESS_ENTER style is ignored for multiline text controls (they always process it)") );
+
+ m_windowStyle |= wxTE_PROCESS_ENTER;
+ }
+
+ wxString st = str ;
+ wxMacConvertNewlines13To10( &st ) ;
+#if wxMAC_USE_MLTE
+ {
+#if wxMAC_USE_MLTE_HIVIEW
+ HIRect hr = { bounds.left , bounds.top , bounds.right - bounds.left , bounds.bottom- bounds.top } ;
+ HIViewRef scrollView = NULL ;
+ TXNFrameOptions frameOptions = FrameOptionsFromWXStyle( style ) ;
+
+ if ( frameOptions & (kTXNWantVScrollBarMask|kTXNWantHScrollBarMask) )
+ {
+ HIScrollViewCreate(( frameOptions & kTXNWantHScrollBarMask ? kHIScrollViewOptionsHorizScroll : 0) |
+ ( frameOptions & kTXNWantVScrollBarMask ? kHIScrollViewOptionsVertScroll: 0 ) , &scrollView ) ;
+
+ HIViewSetFrame( scrollView, &hr );
+ HIViewSetVisible( scrollView, true );
+ }
+ HIViewRef textView ;
+ HITextViewCreate( NULL , 0, frameOptions , (ControlRef*) &textView ) ;
+ m_macTXN = HITextViewGetTXNObject( textView) ;
+ AdjustAttributesFromWXStyle( (TXNObject) m_macTXN , style , true ) ;
+ HIViewSetVisible( (ControlRef) textView , true ) ;
+ if ( scrollView )
+ {
+ HIViewAddSubview( scrollView , textView ) ;
+ m_macControl = (WXWidget) scrollView ;
+ }
+ else
+ {
+ m_macControl = (WXWidget) textView ;
+ }
+#else
+ short featurSet;
+
+ featurSet = kControlSupportsEmbedding | kControlSupportsFocus | kControlWantsIdle
+ | kControlWantsActivate | kControlHandlesTracking | kControlHasSpecialBackground
+ | kControlGetsFocusOnClick | kControlSupportsLiveFeedback;
+ /* create the control */
+ verify_noerr( CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds, featurSet , (ControlRef*) &m_macControl) ) ;
+
+ wxMacWindowClipper c(this) ;
+ STPTextPaneVars *varsp ;
+ mUPOpenControl( varsp, (ControlRef) m_macControl, m_windowStyle );
+ m_macTXNvars = varsp ;
+ m_macTXN = varsp->fTXNRec ;
+#endif
+
+ if ( style & wxTE_PASSWORD )
+ {
+ UniChar c = 0xA5 ;
+ verify_noerr(TXNEchoMode( (TXNObject) m_macTXN , c , 0 , true )) ;
+ }
+ }
+ MacPostControlCreate(pos,size) ;
+
+#if !wxMAC_USE_MLTE_HIVIEW
+ if ( MacIsReallyShown() )
+ MLTESetObjectVisibility( (STPTextPaneVars*) m_macTXNvars, true , GetWindowStyle() ) ;
+#endif
+
+ {
+ wxMacWindowClipper clipper( this ) ;
+#if !wxMAC_USE_MLTE_HIVIEW
+ TPUpdateVisibility( (ControlRef) m_macControl ) ;
+#endif
+ SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
+
+ TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+ TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+ }
+
+ // in case MLTE is catching events before we get the chance to do so, we'd have to reintroduce the tlw-handler in front :
+ // parent->MacGetTopLevelWindow()->MacInstallTopLevelWindowEventHandler() ;
+
+ SetBackgroundColour( *wxWHITE ) ;
+
+ TXNBackground tback;
+ tback.bgType = kTXNBackgroundTypeRGB;
+ tback.bg.color = MAC_WXCOLORREF( GetBackgroundColour().GetPixel() );
+ TXNSetBackground( (TXNObject) m_macTXN , &tback);
+
+#else
+ wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
+ CFStringRef cfr = cf ;
+ Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
+ CreateEditUnicodeTextControl( MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds , cfr , isPassword , NULL , (ControlRef*) &m_macControl ) ;
+ if ( !(m_windowStyle & wxTE_MULTILINE) )
+ {
+ Boolean singleline = true ;
+ ::SetControlData( (ControlHandle) m_macControl, kControlEditTextPart , kControlEditTextSingleLineTag , sizeof( singleline ) , &singleline ) ;
+ }
+ MacPostControlCreate(pos,size) ;
+
+#endif
+ if ( m_windowStyle & wxTE_READONLY)
+ {
+ SetEditable( false ) ;
+ }
+
+
+ return TRUE;
+}
+
+void wxTextCtrl::MacVisibilityChanged()
+{
+#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 ) ;
+#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( (ControlRef) m_macControl , 0, kControlEditTextSelectionTag,
+ sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) );
+ verify_noerr( GetControlData( (ControlRef) m_macControl , 0, datatag , sizeof(CFStringRef), &value, &actualSize ) );
+
+ verify_noerr( SetControlData( (ControlRef) m_macControl , 0, datatag, sizeof(CFStringRef), &value ) );
+ verify_noerr( SetControlData( (ControlRef) m_macControl , 0, kControlEditTextSelectionTag, sizeof(ControlEditTextSelectionRec), &sel ) );
+
+ CFRelease( value ) ;
+ }
+#endif
+}
+
+void wxTextCtrl::MacEnabledStateChanged()
+{
+}
+
+
+wxString wxTextCtrl::GetValue() const
+{
+ wxString result ;
+#if wxMAC_USE_MLTE
+ OSStatus err ;
+ Size actualSize = 0;
+ {
+#if wxUSE_UNICODE
+ Handle theText ;
+ err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNUnicodeTextData );
+ // all done
+ if ( err )
+ {
+ actualSize = 0 ;
+ }
+ else
+ {
+ actualSize = GetHandleSize( theText ) / sizeof( UniChar) ;
+ if ( actualSize > 0 )
+ {
+ wxChar *ptr = NULL ;
+#if SIZEOF_WCHAR_T == 2
+ ptr = new wxChar[actualSize + 1 ] ;
+ wxStrncpy( ptr , (wxChar*) *theText , actualSize ) ;
+
+#else
+ SetHandleSize( theText , ( actualSize + 1 ) * sizeof( UniChar ) ) ;
+ HLock( theText ) ;
+ (((UniChar*)*theText)[actualSize]) = 0 ;
+ wxMBConvUTF16BE converter ;
+ size_t noChars = converter.MB2WC( NULL , (const char*)*theText , 0 ) ;
+ ptr = new wxChar[noChars + 1] ;
+
+ noChars = converter.MB2WC( ptr , (const char*)*theText , noChars ) ;
+ ptr[noChars] = 0 ;
+ HUnlock( theText ) ;
+#endif
+ ptr[actualSize] = 0 ;
+ result = wxString( ptr ) ;
+ delete[] ptr ;
+ }
+ DisposeHandle( theText ) ;
+ }
+#else
+ Handle theText ;
+ err = TXNGetDataEncoded( ((TXNObject) m_macTXN), kTXNStartOffset, kTXNEndOffset, &theText , kTXNTextData );
+ // all done
+ if ( err )
+ {
+ actualSize = 0 ;
+ }
+ else
+ {
+ actualSize = GetHandleSize( theText ) ;
+ if ( actualSize > 0 )
+ {
+ HLock( theText ) ;
+ result = wxString( *theText , wxConvLocal , actualSize ) ;
+ HUnlock( theText ) ;
+ }
+ DisposeHandle( theText ) ;
+ }
+#endif
+ }
+#else
+ CFStringRef value = NULL ;
+ Size actualSize = 0 ;
+
+ verify_noerr( GetControlData( (ControlRef) m_macControl , 0, GetWindowStyle() & wxTE_PASSWORD ?
+ kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag,
+ sizeof(CFStringRef), &value, &actualSize ) );
+ if ( value )
+ {
+ wxMacCFStringHolder cf(value) ;
+ result = cf.AsString() ;
+ }
+#endif
+ wxMacConvertNewlines10To13( &result ) ;
+ return result ;
+}
+
+void wxTextCtrl::GetSelection(long* from, long* to) const
+{
+#if wxMAC_USE_MLTE
+ TXNGetSelection( (TXNObject) m_macTXN , (TXNOffset*) from , (TXNOffset*) to ) ;
+#else
+ ControlEditTextSelectionRec sel ;
+ Size actualSize ;
+ verify_noerr( GetControlData( (ControlRef) m_macControl , 0, kControlEditTextSelectionTag,
+ sizeof(ControlEditTextSelectionRec), &sel, &actualSize ) );
+ if ( from ) *from = sel.selStart ;
+ if ( to ) *to = sel.selEnd ;
+#endif
+}
+
+void wxTextCtrl::SetValue(const wxString& str)
+{
+ // optimize redraws
+ if ( GetValue() == str )
+ return ;
+
+ wxString st = str ;
+ wxMacConvertNewlines13To10( &st ) ;
+#if wxMAC_USE_MLTE