+ switch ( style.GetAlignment() )
+ {
+ case wxTEXT_ALIGNMENT_LEFT:
+ align = kTXNFlushLeft;
+ break;
+ case wxTEXT_ALIGNMENT_CENTRE:
+ align = kTXNCenter;
+ break;
+ case wxTEXT_ALIGNMENT_RIGHT:
+ align = kTXNFlushRight;
+ break;
+ case wxTEXT_ALIGNMENT_JUSTIFIED:
+ align = kTXNFullJust;
+ break;
+ default :
+ case wxTEXT_ALIGNMENT_DEFAULT:
+ align = kTXNFlushDefault;
+ break;
+ }
+
+ controlTags[controlAttrCount] = kTXNJustificationTag ;
+ controlData[controlAttrCount].sValue = align ;
+ controlAttrCount++ ;
+ }
+
+ if ( style.HasLeftIndent() || style.HasRightIndent() )
+ {
+ wxASSERT( controlAttrCount < WXSIZEOF(controlTags) );
+ controlTags[controlAttrCount] = kTXNMarginsTag;
+ controlData[controlAttrCount].marginsPtr = &margins;
+ verify_noerr( TXNGetTXNObjectControls (m_txn, 1 ,
+ &controlTags[controlAttrCount], &controlData[controlAttrCount]) );
+ if ( style.HasLeftIndent() )
+ {
+ margins.leftMargin = wxConvertToTXN(style.GetLeftIndent());
+ }
+ if ( style.HasRightIndent() )
+ {
+ margins.rightMargin = wxConvertToTXN(style.GetRightIndent());
+ }
+ controlAttrCount++ ;
+ }
+
+ if ( style.HasTabs() )
+ {
+ const wxArrayInt& tabarray = style.GetTabs();
+ // unfortunately Mac only applies a tab distance, not individually different tabs
+ controlTags[controlAttrCount] = kTXNTabSettingsTag;
+ if ( tabarray.size() > 0 )
+ controlData[controlAttrCount].tabValue.value = wxConvertToTXN(tabarray[0]);
+ else
+ controlData[controlAttrCount].tabValue.value = 72 ;
+
+ controlData[controlAttrCount].tabValue.tabType = kTXNLeftTab;
+ controlAttrCount++ ;
+ }
+
+ // unfortunately the relayout is not automatic
+ if ( controlAttrCount > 0 )
+ {
+ verify_noerr( TXNSetTXNObjectControls (m_txn, false /* don't clear all */, controlAttrCount,
+ controlTags, controlData) );
+ relayout = true;
+ }
+
+ if ( typeAttrCount > 0 )
+ {
+ verify_noerr( TXNSetTypeAttributes( m_txn , typeAttrCount, typeAttr, from , to ) );
+ relayout = true;
+ }
+
+ if ( tabs != NULL )
+ {
+ delete[] tabs;
+ }
+
+ if ( relayout )
+ {
+ TXNRecalcTextLayout( m_txn );
+ }
+}
+
+void wxMacMLTEControl::SetFont(const wxFont & font,
+ const wxColour& foreground,
+ long WXUNUSED(windowStyle))
+{
+ wxMacEditHelper help( m_txn ) ;
+ TXNSetAttribute( wxTextAttr( foreground, wxNullColour, font ), kTXNStartOffset, kTXNEndOffset ) ;
+}
+
+void wxMacMLTEControl::SetStyle( long start, long end, const wxTextAttr& style )
+{
+ wxMacEditHelper help( m_txn ) ;
+ TXNSetAttribute( style, start, end ) ;
+}
+
+void wxMacMLTEControl::Copy()
+{
+ TXNCopy( m_txn );
+}
+
+void wxMacMLTEControl::Cut()
+{
+ TXNCut( m_txn );
+}
+
+void wxMacMLTEControl::Paste()
+{
+ TXNPaste( m_txn );
+}
+
+bool wxMacMLTEControl::CanPaste() const
+{
+ return TXNIsScrapPastable() ;
+}
+
+void wxMacMLTEControl::SetEditable(bool editable)
+{
+ TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
+ TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;
+ TXNSetTXNObjectControls( m_txn, false, WXSIZEOF(tag), tag, data ) ;
+}
+
+wxTextPos wxMacMLTEControl::GetLastPosition() const
+{
+ wxTextPos actualsize = 0 ;
+
+ Handle theText ;
+ OSErr err = TXNGetDataEncoded( m_txn, kTXNStartOffset, kTXNEndOffset, &theText, kTXNTextData );
+
+ // all done
+ if ( err == noErr )
+ {
+ actualsize = GetHandleSize( theText ) ;
+ DisposeHandle( theText ) ;
+ }
+ else
+ {
+ actualsize = 0 ;
+ }
+
+ return actualsize ;
+}
+
+void wxMacMLTEControl::Replace( long from , long to , const wxString &str )