using System.Collections;
using System.ComponentModel;
using System.Drawing;
+using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
[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
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
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);
#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();
}
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 {
}
}
+#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;
}
}
+#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 {
}
}
+#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")]
}
set {
- scrollbars = value;
+ if (!Enum.IsDefined (typeof (RichTextBoxScrollBars), value))
+ throw new InvalidEnumArgumentException ("value", (int) value,
+ typeof (RichTextBoxScrollBars));
+
+ if (value != scrollbars) {
+ scrollbars = value;
+ CalculateDocument ();
+ }
}
}
}
}
+#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)]
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);
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);
}
}
}
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);
return Find(str, -1, -1, options);
}
+
+#if !NET_2_0
public char GetCharFromPosition(Point pt) {
LineTag tag;
int pos;
}
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;
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;
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;
// 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;
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 {
// }
}
+#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
eh (this, e);
}
+#if !NET_2_0
protected override void OnSystemColorsChanged(EventArgs e) {
base.OnSystemColorsChanged (e);
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged (e);
}
+#endif
protected virtual void OnVScroll(EventArgs e) {
EventHandler eh = (EventHandler)(Events [VScrollEvent]);
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
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
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;
}
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);
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);
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;
break;
}
- case Minor.Italic: {
+ case RTF.Minor.Italic: {
FlushText(rtf, false);
if (rtf.Param == RTF.RTF.NoParam) {
rtf_rtfstyle |= FontStyle.Italic;
break;
}
- case Minor.StrikeThru: {
+ case RTF.Minor.StrikeThru: {
FlushText(rtf, false);
if (rtf.Param == RTF.RTF.NoParam) {
rtf_rtfstyle |= FontStyle.Strikeout;
break;
}
- case Minor.Underline: {
+ case RTF.Minor.Underline: {
FlushText(rtf, false);
if (rtf.Param == RTF.RTF.NoParam) {
rtf_rtfstyle |= FontStyle.Underline;
break;
}
- case Minor.NoUnderline: {
+ case RTF.Minor.NoUnderline: {
FlushText(rtf, false);
rtf_rtfstyle &= ~FontStyle.Underline;
break;
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;
}
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;
}
return;
}
+ /*
if ((RTF.StandardCharCode)rtf.Minor != RTF.StandardCharCode.nothing) {
rtf_line.Append(rtf_text_map[(RTF.StandardCharCode)rtf.Minor]);
} else {
Console.Write("[Literal:0x{0:X2}]", (int)rtf.Major);
}
}
+ */
+ rtf_line.Append (rtf.EncodedText);
}
private void FlushText(RTF.RTF rtf, bool newline) {
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;
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;
}
}
}
}
- pos = tag.start + tag.length - 1;
+ pos = tag.start + tag.Length - 1;
tag = tag.next;
}
pos = 0;
// 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");
}
}