2007-10-04 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / RichTextBox.cs
index 6101d3a678975b6e272790b6528cdad9a36f459d..7901a63d754d4ba0cf065a43ed363dcef76ad681 100644 (file)
@@ -30,6 +30,7 @@ using System;
 using System.Collections;
 using System.ComponentModel;
 using System.Drawing;
+using System.Drawing.Imaging;
 using System.IO;
 using System.Text;
 using System.Runtime.InteropServices;
@@ -40,6 +41,7 @@ namespace System.Windows.Forms {
        [ClassInterface (ClassInterfaceType.AutoDispatch)]
        [Docking (DockingBehavior.Ask)]
        [ComVisible (true)]
+       [Designer ("System.Windows.Forms.Design.RichTextBoxDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
 #endif
        public class RichTextBox : TextBoxBase {
                #region Local Variables
@@ -62,6 +64,13 @@ namespace System.Windows.Forms {
                private int             rtf_cursor_y;
                private int             rtf_chars;
                private int rtf_par_line_left_indent;
+
+#if NET_2_0
+               private bool            enable_auto_drag_drop;
+               private RichTextBoxLanguageOptions language_option;
+               private bool            rich_text_shortcuts_enabled;
+               private Color           selection_back_color;
+#endif
                #endregion      // Local Variables
 
                #region Public Constructors
@@ -75,13 +84,21 @@ namespace System.Windows.Forms {
                        zoom = 1;
                        base.Multiline = true;
                        document.CRLFSize = 1;
+                       shortcuts_enabled = true;
 
                        scrollbars = RichTextBoxScrollBars.Both;
                        alignment = HorizontalAlignment.Left;
                        LostFocus += new EventHandler(RichTextBox_LostFocus);
                        GotFocus += new EventHandler(RichTextBox_GotFocus);
                        BackColor = ThemeEngine.Current.ColorWindow;
+#if NET_2_0
+                       backcolor_set = false;
+                       language_option = RichTextBoxLanguageOptions.AutoFontSizeAdjust;
+                       rich_text_shortcuts_enabled = true;
+                       selection_back_color = DefaultBackColor;
+#endif
                        ForeColor = ThemeEngine.Current.ColorWindowText;
+
                        base.HScrolled += new EventHandler(RichTextBox_HScrolled);
                        base.VScrolled += new EventHandler(RichTextBox_VScrolled);
 
@@ -92,6 +109,21 @@ namespace System.Windows.Forms {
                #endregion      // Public Constructors
 
                #region Private & Internal Methods
+               internal override Color ChangeBackColor (Color backColor)
+               {
+                       if (backColor == Color.Empty) {
+#if NET_2_0
+                               backcolor_set = false;
+                               if (!ReadOnly) {
+                                       backColor = SystemColors.Window;
+                               }
+#else
+                               backColor = SystemColors.Window;
+#endif
+                       }
+                       return backColor;
+               }
+
                private void RichTextBox_LostFocus(object sender, EventArgs e) {
                        Invalidate();
                }
@@ -152,6 +184,15 @@ namespace System.Windows.Forms {
                        set { base.BackgroundImage = value; }
                }
 
+#if NET_2_0
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public override ImageLayout BackgroundImageLayout {
+                       get { return base.BackgroundImageLayout; }
+                       set { base.BackgroundImageLayout = value; }
+               }
+#endif
+
                [DefaultValue(0)]
                [Localizable(true)]
                public int BulletIndent {
@@ -183,6 +224,15 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               [MonoTODO ("Stub")]
+               [DefaultValue (false)]
+               public bool EnableAutoDragDrop {
+                       get { return enable_auto_drag_drop; }
+                       set { enable_auto_drag_drop = value; }
+               }
+#endif
+
                public override Font Font {
                        get {
                                return base.Font;
@@ -219,6 +269,16 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               [MonoTODO ("Stub")]
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public RichTextBoxLanguageOptions LanguageOption {
+                       get { return language_option; }
+                       set { language_option = value; }
+               }
+#endif
+
                [DefaultValue(Int32.MaxValue)]
                public override int MaxLength {
                        get {
@@ -250,6 +310,17 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               [MonoTODO ("Stub")]
+               [Browsable (false)]
+               [DefaultValue (true)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public bool RichTextShortcutsEnabled {
+                       get { return rich_text_shortcuts_enabled; }
+                       set { rich_text_shortcuts_enabled = value; }
+               }
+#endif
+
                [DefaultValue(0)]
                [Localizable(true)]
                [MonoTODO("Teach TextControl.RecalculateLine to consider the right margin as well")]
@@ -302,7 +373,14 @@ namespace System.Windows.Forms {
                        }
 
                        set {
-                               scrollbars = value;
+                               if (!Enum.IsDefined (typeof (RichTextBoxScrollBars), value))
+                                       throw new InvalidEnumArgumentException ("value", (int) value,
+                                               typeof (RichTextBoxScrollBars));
+
+                               if (value != scrollbars) {
+                                       scrollbars = value;
+                                       CalculateDocument ();
+                               }
                        }
                }
 
@@ -409,6 +487,16 @@ namespace System.Windows.Forms {
                        }
                }
 
+#if NET_2_0
+               [MonoTODO ("Stub")]
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public Color SelectionBackColor {
+                       get { return selection_back_color; }
+                       set { selection_back_color = value; }
+               }
+#endif
+
                [Browsable(false)]
                [DefaultValue(false)]
                [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
@@ -444,42 +532,32 @@ namespace System.Windows.Forms {
                                LineTag end;
                                LineTag tag;
 
-                               start = document.selection_start.tag;
-                               end = document.selection_end.tag;
-                               color = ((SolidBrush)document.selection_start.tag.color).Color;
+                               start = document.selection_start.line.FindTag (document.selection_start.pos);
+                               end = document.selection_start.line.FindTag (document.selection_end.pos);
+                               color = start.color.Color;
 
                                tag = start;
-                               while (true) {
-                                       if (!color.Equals(((SolidBrush)tag.color).Color)) {
-                                               return Color.Empty;
-                                       }
-
-                                       if (tag == end) {
-                                               break;
-                                       }
+                               while (tag != null && tag != end) {
 
-                                       tag = document.NextTag(tag);
+                                       if (!color.Equals (tag.color.Color))
+                                               return Color.Empty;
 
-                                       if (tag == null) {
-                                               break;
-                                       }
+                                       tag = document.NextTag (tag);
                                }
 
                                return color;
                        }
 
                        set {
-                               FontDefinition  attributes;
-                               int             sel_start;
-                               int             sel_end;
-
-                               attributes = new FontDefinition();
-                               attributes.color = value;
+                               int sel_start;
+                               int sel_end;
 
                                sel_start = document.LineTagToCharIndex(document.selection_start.line, document.selection_start.pos);
                                sel_end = document.LineTagToCharIndex(document.selection_end.line, document.selection_end.pos);
 
-                               document.FormatText(document.selection_start.line, document.selection_start.pos + 1, document.selection_end.line, document.selection_end.pos + 1, attributes);
+                               document.FormatText (document.selection_start.line, document.selection_start.pos + 1,
+                                               document.selection_end.line, document.selection_end.pos + 1, null,
+                                               new SolidBrush (value), null, FormatSpecified.Color);
 
                                document.CharIndexToLineTag(sel_start, out document.selection_start.line, out document.selection_start.tag, out document.selection_start.pos);
                                document.CharIndexToLineTag(sel_end, out document.selection_end.line, out document.selection_end.tag, out document.selection_end.pos);
@@ -498,24 +576,18 @@ namespace System.Windows.Forms {
                                LineTag end;
                                LineTag tag;
 
-                               start = document.selection_start.tag;
-                               end = document.selection_end.tag;
-                               font = document.selection_start.tag.font;
+                               start = document.selection_start.line.FindTag (document.selection_start.pos);
+                               end = document.selection_start.line.FindTag (document.selection_end.pos);
+                               font = start.font;
 
-                               tag = start;
-                               while (true) {
-                                       if (!font.Equals(tag.font)) {
-                                               return null;
-                                       }
+                               if (selection_length > 1) {
+                                       tag = start;
+                                       while (tag != null && tag != end) {
 
-                                       if (tag == end) {
-                                               break;
-                                       }
-
-                                       tag = document.NextTag(tag);
+                                               if (!font.Equals(tag.font))
+                                                       return null;
 
-                                       if (tag == null) {
-                                               break;
+                                               tag = document.NextTag (tag);
                                        }
                                }
 
@@ -523,17 +595,15 @@ namespace System.Windows.Forms {
                        }
 
                        set {
-                               FontDefinition  attributes;
                                int             sel_start;
                                int             sel_end;
 
-                               attributes = new FontDefinition();
-                               attributes.font_obj = value;
-
                                sel_start = document.LineTagToCharIndex(document.selection_start.line, document.selection_start.pos);
                                sel_end = document.LineTagToCharIndex(document.selection_end.line, document.selection_end.pos);
 
-                               document.FormatText(document.selection_start.line, document.selection_start.pos + 1, document.selection_end.line, document.selection_end.pos + 1, attributes);
+                               document.FormatText (document.selection_start.line, document.selection_start.pos + 1,
+                                               document.selection_end.line, document.selection_end.pos + 1, value,
+                                               null, null, FormatSpecified.Font);
 
                                document.CharIndexToLineTag(sel_start, out document.selection_start.line, out document.selection_start.tag, out document.selection_start.pos);
                                document.CharIndexToLineTag(sel_end, out document.selection_end.line, out document.selection_end.tag, out document.selection_end.pos);
@@ -820,6 +890,8 @@ namespace System.Windows.Forms {
                        return Find(str, -1, -1, options);
                }
 
+               
+#if !NET_2_0
                public char GetCharFromPosition(Point pt) {
                        LineTag tag;
                        int     pos;
@@ -831,10 +903,27 @@ namespace System.Windows.Forms {
                        }
 
                        return tag.line.text[pos];
-                       
                }
+#else
+               internal override char GetCharFromPositionInternal (Point p)
+               {
+                       LineTag tag;
+                       int pos;
+
+                       PointToTagPos (p, out tag, out pos);
 
-               public int GetCharIndexFromPosition(Point pt) {
+                       if (pos >= tag.line.text.Length)
+                               return '\n';
+
+                       return tag.line.text[pos];
+               }
+#endif
+
+               public
+#if NET_2_0
+               override
+#endif 
+               int GetCharIndexFromPosition(Point pt) {
                        LineTag tag;
                        int     pos;
 
@@ -843,7 +932,11 @@ namespace System.Windows.Forms {
                        return document.LineTagToCharIndex(tag.line, pos);
                }
 
-               public int GetLineFromCharIndex(int index) {
+               public
+#if NET_2_0
+               override
+#endif
+               int GetLineFromCharIndex(int index) {
                        Line    line;
                        LineTag tag;
                        int     pos;
@@ -853,7 +946,11 @@ namespace System.Windows.Forms {
                        return line.LineNo - 1;
                }
 
-               public Point GetPositionFromCharIndex(int index) {
+               public
+#if NET_2_0
+               override
+#endif
+               Point GetPositionFromCharIndex(int index) {
                        Line    line;
                        LineTag tag;
                        int     pos;
@@ -869,21 +966,21 @@ namespace System.Windows.Forms {
                        
                        // FIXME - ignoring unicode
                        if (fileType == RichTextBoxStreamType.PlainText) {
-                               StringBuilder   sb;
-                               int             count;
-                               byte[]          buffer;
+                               StringBuilder sb;
+                               char[] buffer;
 
                                try {
-                                       sb = new StringBuilder((int)data.Length);
-                                       buffer = new byte[1024];
+                                       sb = new StringBuilder ((int) data.Length);
+                                       buffer = new char [1024];
                                } catch {
                                        throw new IOException("Not enough memory to load document");
                                }
 
-                               count = 0;
-                               while (count < data.Length) {
-                                       count += data.Read(buffer, count, 1024);
-                                       sb.Append(buffer);
+                               StreamReader sr = new StreamReader (data, Encoding.Default, true);
+                               int charsRead = sr.Read (buffer, 0, buffer.Length);
+                               while (charsRead > 0) {
+                                       sb.Append (buffer, 0, charsRead);
+                                       charsRead = sr.Read (buffer, 0, buffer.Length);
                                }
                                base.Text = sb.ToString();
                                return;
@@ -917,8 +1014,8 @@ namespace System.Windows.Forms {
                                LoadFile(data, fileType);
                        }
 #if !DEBUG
-                       catch {
-                               throw new IOException("Could not open file " + path);
+                       catch (Exception ex) {
+                               throw new IOException("Could not open file " + path, ex);
                        }
 #endif
                        finally {
@@ -1023,6 +1120,23 @@ namespace System.Windows.Forms {
 //                     }
                }
 
+#if NET_2_0
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public new void DrawToBitmap (Bitmap bitmap, Rectangle clip)
+               {
+                       Graphics dc = Graphics.FromImage (bitmap);
+
+                       if (backcolor_set || (Enabled && !read_only)) {
+                               dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (BackColor), clip);
+                       } else {
+                               dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ThemeEngine.Current.ColorControl), clip);
+                       }
+                       
+                       // Draw the viewable document
+                       document.Draw (dc, clip);
+               }
+#endif
+
                #endregion      // Public Instance Methods
 
                #region Protected Instance Methods
@@ -1087,6 +1201,7 @@ namespace System.Windows.Forms {
                                eh (this, e);
                }
 
+#if !NET_2_0
                protected override void OnSystemColorsChanged(EventArgs e) {
                        base.OnSystemColorsChanged (e);
                }
@@ -1094,6 +1209,7 @@ namespace System.Windows.Forms {
                protected override void OnTextChanged(EventArgs e) {
                        base.OnTextChanged (e);
                }
+#endif
 
                protected virtual void OnVScroll(EventArgs e) {
                        EventHandler eh = (EventHandler)(Events [VScrollEvent]);
@@ -1104,6 +1220,13 @@ namespace System.Windows.Forms {
                protected override void WndProc(ref Message m) {
                        base.WndProc (ref m);
                }
+
+#if NET_2_0
+               protected override bool ProcessCmdKey (ref Message msg, Keys keyData)
+               {
+                       return base.ProcessCmdKey (ref msg, keyData);
+               }
+#endif
                #endregion      // Protected Instance Methods
 
                #region Events
@@ -1122,17 +1245,28 @@ namespace System.Windows.Forms {
                        remove { base.BackgroundImageChanged -= value; }
                }
 
+#if NET_2_0
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public new event EventHandler BackgroundImageLayoutChanged {
+                       add { base.BackgroundImageLayoutChanged += value; }
+                       remove { base.BackgroundImageLayoutChanged -= value; }
+               }
+#endif
+
                public event ContentsResizedEventHandler ContentsResized {
                        add { Events.AddHandler (ContentsResizedEvent, value); }
                        remove { Events.RemoveHandler (ContentsResizedEvent, value); }
                }
 
+#if !NET_2_0
                [Browsable(false)]
                [EditorBrowsable(EditorBrowsableState.Never)]
                public new event EventHandler DoubleClick {
                        add { base.DoubleClick += value; }
                        remove { base.DoubleClick -= value; }
                }
+#endif
 
                [Browsable(false)]
 #if !NET_2_0
@@ -1224,12 +1358,12 @@ namespace System.Windows.Forms {
                        switch(rtf.Major) {
                                case RTF.Major.Unicode: {
                                        switch(rtf.Minor) {
-                                               case Minor.UnicodeCharBytes: {
+                                               case RTF.Minor.UnicodeCharBytes: {
                                                        rtf_skip_width = rtf.Param;
                                                        break;
                                                }
 
-                                               case Minor.UnicodeChar: {
+                                               case RTF.Minor.UnicodeChar: {
                                                        rtf_skip_count += rtf_skip_width;
                                                        rtf_line.Append((char)rtf.Param);
                                                        break;
@@ -1245,28 +1379,19 @@ namespace System.Windows.Forms {
                                }
 
                                case RTF.Major.PictAttr:
-                                       switch (rtf.Minor) {
-                                       case Minor.PngBlip:
-                                               FlushText (rtf, false);
-                                               try {
-                                                       Image img = new Bitmap (new MemoryStream (rtf.Image));
-
-                                                       Line line = document.GetLine (rtf_cursor_y);
-                                                       document.InsertImage (line, 0, img);
-                                                       rtf_cursor_x++;
-
-                                                       FlushText (rtf, true);
-                                                       rtf.Image = null;
-                                               } catch (Exception e) {
-                                                       Console.Error.WriteLine ("EXCEPTION while loading image:   {0}", e);
-                                               }
-                                               break;
+                                       if (rtf.Picture != null && rtf.Picture.IsValid ()) {
+                                               Line line = document.GetLine (rtf_cursor_y);
+                                               document.InsertPicture (line, 0, rtf.Picture);
+                                               rtf_cursor_x++;
+
+                                               FlushText (rtf, true);
+                                               rtf.Picture = null;
                                        }
                                        break;
 
                                case RTF.Major.CharAttr: {
                                        switch(rtf.Minor) {
-                                               case Minor.ForeColor: {
+                                               case RTF.Minor.ForeColor: {
                                                        System.Windows.Forms.RTF.Color  color;
 
                                                        color = System.Windows.Forms.RTF.Color.GetColor(rtf, rtf.Param);
@@ -1283,13 +1408,13 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.FontSize: {
+                                               case RTF.Minor.FontSize: {
                                                        FlushText(rtf, false);
                                                        this.rtf_rtffont_size = rtf.Param / 2;
                                                        break;
                                                }
 
-                                               case Minor.FontNum: {
+                                               case RTF.Minor.FontNum: {
                                                        System.Windows.Forms.RTF.Font   font;
 
                                                        font = System.Windows.Forms.RTF.Font.GetFont(rtf, rtf.Param);
@@ -1300,13 +1425,13 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.Plain: {
+                                               case RTF.Minor.Plain: {
                                                        FlushText(rtf, false);
                                                        rtf_rtfstyle = FontStyle.Regular;
                                                        break;
                                                }
 
-                                               case Minor.Bold: {
+                                               case RTF.Minor.Bold: {
                                                        FlushText(rtf, false);
                                                        if (rtf.Param == RTF.RTF.NoParam) {
                                                                rtf_rtfstyle |= FontStyle.Bold;
@@ -1316,7 +1441,7 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.Italic: {
+                                               case RTF.Minor.Italic: {
                                                        FlushText(rtf, false);
                                                        if (rtf.Param == RTF.RTF.NoParam) {
                                                                rtf_rtfstyle |= FontStyle.Italic;
@@ -1326,7 +1451,7 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.StrikeThru: {
+                                               case RTF.Minor.StrikeThru: {
                                                        FlushText(rtf, false);
                                                        if (rtf.Param == RTF.RTF.NoParam) {
                                                                rtf_rtfstyle |= FontStyle.Strikeout;
@@ -1336,7 +1461,7 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.Underline: {
+                                               case RTF.Minor.Underline: {
                                                        FlushText(rtf, false);
                                                        if (rtf.Param == RTF.RTF.NoParam) {
                                                                rtf_rtfstyle |= FontStyle.Underline;
@@ -1346,7 +1471,7 @@ namespace System.Windows.Forms {
                                                        break;
                                                }
 
-                                               case Minor.NoUnderline: {
+                                               case RTF.Minor.NoUnderline: {
                                                        FlushText(rtf, false);
                                                        rtf_rtfstyle &= ~FontStyle.Underline;
                                                        break;
@@ -1357,7 +1482,7 @@ namespace System.Windows.Forms {
 
                        case RTF.Major.ParAttr: {
                                switch (rtf.Minor) {
-                               case Minor.LeftIndent:
+                               case RTF.Minor.LeftIndent:
                                        rtf_par_line_left_indent = (int) (((float) rtf.Param / 1440.0F) * CreateGraphics ().DpiX + 0.5F);
                                        break;
                                }
@@ -1374,72 +1499,72 @@ namespace System.Windows.Forms {
 
                private void SpecialChar(RTF.RTF rtf) {
                        switch(rtf.Minor) {
-                               case Minor.Page:
-                               case Minor.Sect:
-                               case Minor.Row:
-                               case Minor.Line:
-                               case Minor.Par: {
+                               case RTF.Minor.Page:
+                               case RTF.Minor.Sect:
+                               case RTF.Minor.Row:
+                               case RTF.Minor.Line:
+                               case RTF.Minor.Par: {
                                        FlushText(rtf, true);
                                        break;
                                }
 
-                               case Minor.Cell: {
+                               case RTF.Minor.Cell: {
                                        Console.Write(" ");
                                        break;
                                }
 
-                               case Minor.NoBrkSpace: {
+                               case RTF.Minor.NoBrkSpace: {
                                        Console.Write(" ");
                                        break;
                                }
 
-                               case Minor.Tab: {
+                               case RTF.Minor.Tab: {
                                        rtf_line.Append ("\t");
 //                                     FlushText (rtf, false);
                                        break;
                                }
 
-                               case Minor.NoReqHyphen:
-                               case Minor.NoBrkHyphen: {
+                               case RTF.Minor.NoReqHyphen:
+                               case RTF.Minor.NoBrkHyphen: {
                                        rtf_line.Append ("-");
 //                                     FlushText (rtf, false);
                                        break;
                                }
 
-                               case Minor.Bullet: {
+                               case RTF.Minor.Bullet: {
                                        Console.WriteLine("*");
                                        break;
                                }
 
-                       case Minor.WidowCtrl:
+                       case RTF.Minor.WidowCtrl:
                                break;
 
-                               case Minor.EmDash: {
+                               case RTF.Minor.EmDash: {
                                rtf_line.Append ("\u2014");
                                        break;
                                }
 
-                               case Minor.EnDash: {
+                               case RTF.Minor.EnDash: {
                                        rtf_line.Append ("\u2013");
                                        break;
                                }
 /*
-                               case Minor.LQuote: {
+                               case RTF.Minor.LQuote: {
                                        Console.Write("\u2018");
                                        break;
                                }
 
-                               case Minor.RQuote: {
+                               case RTF.Minor.RQuote: {
                                        Console.Write("\u2019");
                                        break;
                                }
 
-                               case Minor.LDblQuote: {
+                               case RTF.Minor.LDblQuote: {
                                        Console.Write("\u201C");
                                        break;
                                }
 
-                               case Minor.RDblQuote: {
+                               case RTF.Minor.RDblQuote: {
                                        Console.Write("\u201D");
                                        break;
                                }
@@ -1458,6 +1583,7 @@ namespace System.Windows.Forms {
                                return;
                        }
 
+                       /*
                        if ((RTF.StandardCharCode)rtf.Minor != RTF.StandardCharCode.nothing) {
                                rtf_line.Append(rtf_text_map[(RTF.StandardCharCode)rtf.Minor]);
                        } else {
@@ -1468,6 +1594,8 @@ namespace System.Windows.Forms {
                                        Console.Write("[Literal:0x{0:X2}]", (int)rtf.Major);
                                }
                        }
+                       */
+                       rtf_line.Append (rtf.EncodedText);
                }
 
                private void FlushText(RTF.RTF rtf, bool newline) {
@@ -1502,8 +1630,11 @@ namespace System.Windows.Forms {
 
                        rtf_chars += rtf_line.Length;
 
+                       
+
                        if (rtf_cursor_x == 0) {
-                               document.Add(rtf_cursor_y, rtf_line.ToString(), rtf_rtfalign, font, rtf_color);
+                               document.Add(rtf_cursor_y, rtf_line.ToString(), rtf_rtfalign, font, rtf_color,
+                                               newline ? LineEnding.Rich : LineEnding.Wrap);
                                if (rtf_par_line_left_indent != 0) {
                                        Line line = document.GetLine (rtf_cursor_y);
                                        line.indent = rtf_par_line_left_indent;
@@ -1515,10 +1646,14 @@ namespace System.Windows.Forms {
                                line.indent = rtf_par_line_left_indent;
                                if (rtf_line.Length > 0) {
                                        document.InsertString(line, rtf_cursor_x, rtf_line.ToString());
-                                       document.FormatText(line, rtf_cursor_x + 1, line, rtf_cursor_x + 1 + length, font, rtf_color, null, FormatSpecified.Font | FormatSpecified.Color); // FormatText is 1-based
+                                       document.FormatText (line, rtf_cursor_x + 1, line, rtf_cursor_x + 1 + length,
+                                                       font, rtf_color, null,
+                                                       FormatSpecified.Font | FormatSpecified.Color);
                                }
                                if (newline) {
                                        document.Split(line, rtf_cursor_x + length);
+                                       line = document.GetLine (rtf_cursor_y);
+                                       line.ending = LineEnding.Rich;
                                }
                        }
 
@@ -1733,7 +1868,7 @@ namespace System.Windows.Forms {
                                                }
                                        }
 
-                                       pos = tag.start + tag.length - 1;
+                                       pos = tag.start + tag.Length - 1;
                                        tag = tag.next;
                                }
                                pos = 0;
@@ -1814,21 +1949,21 @@ namespace System.Windows.Forms {
 
                                        // Emit the string itself
                                        if (line_no != end_line.line_no) {
-                                               EmitRTFText(sb, tag.line.text.ToString(pos, tag.start + tag.length - pos - 1));
+                                               EmitRTFText(sb, tag.line.text.ToString(pos, tag.start + tag.Length - pos - 1));
                                        } else {
-                                               if (end_pos < (tag.start + tag.length - 1)) {
+                                               if (end_pos < (tag.start + tag.Length - 1)) {
                                                        // Emit partial tag only, end_pos is inside this tag
                                                        EmitRTFText(sb, tag.line.text.ToString(pos, end_pos - pos));
                                                } else {
-                                                       EmitRTFText(sb, tag.line.text.ToString(pos, tag.start + tag.length - pos - 1));
+                                                       EmitRTFText(sb, tag.line.text.ToString(pos, tag.start + tag.Length - pos - 1));
                                                }
                                        }
 
-                                       pos = tag.start + tag.length - 1;
+                                       pos = tag.start + tag.Length - 1;
                                        tag = tag.next;
                                }
                                if (pos >= line.text.Length) {
-                                       if (!line.soft_break) {
+                                       if (line.ending != LineEnding.Wrap) {
                                                sb.Append("\\par\n");
                                        }
                                }