+// ----------------------------------------------------------------------------
+// implementation base class
+// ----------------------------------------------------------------------------
+
+wxMacTextControl::wxMacTextControl()
+{
+}
+
+wxMacTextControl::~wxMacTextControl()
+{
+}
+
+void wxMacTextControl::SetStyle(long start, long end, const wxTextAttr& style)
+{
+}
+
+void wxMacTextControl::Copy()
+{
+}
+
+void wxMacTextControl::Cut()
+{
+}
+
+void wxMacTextControl::Paste()
+{
+}
+
+bool wxMacTextControl::CanPaste() const
+{
+ return false ;
+}
+
+void wxMacTextControl::SetEditable(bool editable)
+{
+}
+
+wxTextPos wxMacTextControl::GetLastPosition() const
+{
+ return GetStringValue().Length() ;
+}
+
+void wxMacTextControl::Replace( long from , long to , const wxString str )
+{
+}
+
+void wxMacTextControl::Clear()
+{
+ SetStringValue( wxEmptyString ) ;
+}
+
+bool wxMacTextControl::CanUndo() const
+{
+ return false ;
+}
+
+void wxMacTextControl::Undo() { }
+
+bool wxMacTextControl::CanRedo() const
+{
+ return false ;
+}
+
+void wxMacTextControl::Redo()
+{
+}
+
+long wxMacTextControl::XYToPosition(long x, long y) const
+{
+ return 0 ;
+}
+
+bool wxMacTextControl::PositionToXY(long pos, long *x, long *y) const
+{
+ return false ;
+}
+
+void wxMacTextControl::ShowPosition( long WXUNUSED(pos) )
+{
+}
+
+int wxMacTextControl::GetNumberOfLines() const
+{
+ ItemCount lines = 0 ;
+ wxString content = GetStringValue() ;
+ lines = 1;
+ for (size_t i = 0; i < content.Length() ; i++)
+ {
+ if (content[i] == '\r') lines++;
+ }
+ return lines ;
+}
+
+wxString wxMacTextControl::GetLineText(long lineNo) const
+{
+ // TODO change this if possible to reflect real lines
+ wxString content = GetStringValue() ;
+
+ // 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 ;
+}
+
+int wxMacTextControl::GetLineLength(long lineNo) const
+{
+ // TODO change this if possible to reflect real lines
+ wxString content = GetStringValue() ;
+
+ // 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++;
+ }
+ return 0 ;
+}
+
+// ----------------------------------------------------------------------------
+// standard unicode control implementation
+// ----------------------------------------------------------------------------
+
+#if TARGET_API_MAC_OSX
+
+wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxWindow *wxPeer,
+ const wxString& str,
+ const wxPoint& pos,
+ const wxSize& size, long style )
+{
+ m_font = wxPeer->GetFont() ;
+ m_windowStyle = style ;
+ Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
+ wxString st = str ;
+ wxMacConvertNewlines10To13( &st ) ;
+ wxMacCFStringHolder cf(st , m_font.GetEncoding()) ;
+ CFStringRef cfr = cf ;
+ Boolean isPassword = ( m_windowStyle & wxTE_PASSWORD ) != 0 ;
+ m_valueTag = isPassword ? kControlEditTextPasswordCFStringTag : kControlEditTextCFStringTag ;
+ CreateEditUnicodeTextControl( MAC_WXHWND(wxPeer->MacGetTopLevelWindowRef()), &bounds , cfr , isPassword , NULL , &m_controlRef ) ;
+
+ if ( !(m_windowStyle & wxTE_MULTILINE) )
+ {
+ SetData<Boolean>( kControlEditTextPart , kControlEditTextSingleLineTag , true ) ;
+ }
+}
+
+wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
+{
+}
+
+void wxMacUnicodeTextControl::VisibilityChanged(bool shown)
+{
+ if ( !(m_windowStyle & wxTE_MULTILINE) && shown )