+ m_peer = new wxMacControl() ;
+ verify_noerr( ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()), &bounds, featurSet, *m_peer ) );
+
+ wxMacWindowClipper c(this) ;
+ STPTextPaneVars *varsp ;
+ mUPOpenControl( varsp, *m_peer, 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( *m_peer ) ;
+#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 ;
+ 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;
+}
+
+void wxTextCtrl::MacVisibilityChanged()
+{
+#if wxMAC_USE_MLTE
+#if !wxMAC_USE_MLTE_HIVIEW
+ MLTESetObjectVisibility((STPTextPaneVars*) m_macTXNvars , MacIsReallyShown() , GetWindowStyle() ) ;
+ if ( !MacIsReallyShown() )
+ 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
+}
+
+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( *m_peer , 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( *m_peer , 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
+ {
+ wxMacWindowClipper c( this ) ;
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+
+#if !wxMAC_USE_MLTE_HIVIEW
+ // otherwise scrolling might have problems ?
+ TPUpdateVisibility( ( (STPTextPaneVars *)m_macTXNvars)->fUserPaneRec ) ;
+#endif
+ SetTXNData( (STPTextPaneVars *)m_macTXNvars , (TXNObject) m_macTXN , st , kTXNStartOffset, kTXNEndOffset ) ;
+ TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
+ TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
+ if ( !formerEditable )
+ SetEditable(formerEditable) ;
+ }
+#else
+ wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
+ CFStringRef value = cf ;
+ verify_noerr( SetControlData( *m_peer , 0, GetWindowStyle() & wxTE_PASSWORD ?
+ kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag,
+ sizeof(CFStringRef), &value ) );
+#endif
+}
+
+void wxTextCtrl::SetMaxLength(unsigned long len)
+{
+ m_maxLength = len ;
+}
+
+bool wxTextCtrl::SetFont( const wxFont& font )
+{
+ if ( !wxTextCtrlBase::SetFont( font ) )
+ return FALSE ;
+
+#if wxMAC_USE_MLTE
+ wxMacWindowClipper c( this ) ;
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+
+ TXNTypeAttributes typeAttr[4] ;
+ Str255 fontName = "\pMonaco" ;
+ SInt16 fontSize = 12 ;
+ Style fontStyle = normal ;
+ int attrCounter = 0 ;
+
+ wxMacStringToPascal( font.GetFaceName() , fontName ) ;
+ fontSize = font.MacGetFontSize() ;
+ fontStyle = font.MacGetFontStyle() ;
+
+ typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
+ typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
+ typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
+ typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
+ typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
+ typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ;
+ typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
+ typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
+ typeAttr[attrCounter+2].data.dataValue = fontStyle ;
+ attrCounter += 3 ;
+ /*
+ typeAttr[attrCounter].tag = kTXNQDFontColorAttribute ;
+ typeAttr[attrCounter].size = kTXNQDFontColorAttributeSize ;
+ typeAttr[attrCounter].data.dataPtr = (void*) &color ;
+ color = MAC_WXCOLORREF(GetForegroundColour().GetPixel()) ;
+ attrCounter += 1 ;
+ */
+ verify_noerr( TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr, kTXNStartOffset,kTXNEndOffset) );
+
+ if ( !formerEditable )
+ SetEditable(formerEditable) ;
+#endif
+ return true ;
+}
+
+bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
+{
+#if wxMAC_USE_MLTE
+ bool formerEditable = m_editable ;
+ if ( !formerEditable )
+ SetEditable(true) ;
+ TXNTypeAttributes typeAttr[4] ;
+ Str255 fontName = "\pMonaco" ;
+ SInt16 fontSize = 12 ;
+ Style fontStyle = normal ;
+ RGBColor color ;
+ int attrCounter = 0 ;
+ if ( style.HasFont() )
+ {
+ const wxFont &font = style.GetFont() ;
+ wxMacStringToPascal( font.GetFaceName() , fontName ) ;
+ fontSize = font.GetPointSize() ;
+ if ( font.GetUnderlined() )
+ fontStyle |= underline ;
+ if ( font.GetWeight() == wxBOLD )
+ fontStyle |= bold ;
+ if ( font.GetStyle() == wxITALIC )
+ fontStyle |= italic ;
+
+ typeAttr[attrCounter].tag = kTXNQDFontNameAttribute ;
+ typeAttr[attrCounter].size = kTXNQDFontNameAttributeSize ;
+ typeAttr[attrCounter].data.dataPtr = (void*) fontName ;
+ typeAttr[attrCounter+1].tag = kTXNQDFontSizeAttribute ;
+ typeAttr[attrCounter+1].size = kTXNFontSizeAttributeSize ;
+ typeAttr[attrCounter+1].data.dataValue = (fontSize << 16) ;
+ typeAttr[attrCounter+2].tag = kTXNQDFontStyleAttribute ;
+ typeAttr[attrCounter+2].size = kTXNQDFontStyleAttributeSize ;
+ typeAttr[attrCounter+2].data.dataValue = fontStyle ;
+ attrCounter += 3 ;