2 // IndentingTextWriter.cs: Helper class to indent text written to a TextWriter
4 // Author: Jonathan Pryor (jonpryor@vt.edu)
6 // (C) 2002 Jonathan Pryor
10 using System.Collections;
12 using System.Diagnostics;
13 using System.Reflection;
15 using System.Text.RegularExpressions;
17 namespace Mono.TypeReflector.Displayers
19 public class IndentingTextWriter : TextWriter {
21 private static BooleanSwitch info =
22 new BooleanSwitch ("indenting-text-writer", "IndentingTextWriter messages");
24 private TextWriter _writer;
26 private int indentLevel = 0;
27 private int indentSize = 4;
28 private bool needIndent = true;
29 private char indentChar = ' ';
31 public IndentingTextWriter (TextWriter writer)
36 public int IndentLevel {
37 get {return indentLevel;}
38 set {indentLevel = value;}
41 public int IndentSize {
42 get {return indentSize;}
43 set {indentSize = value;}
46 public char IndentChar {
47 get {return indentChar;}
48 set {indentChar = value;}
56 public void Unindent ()
61 protected bool NeedIndent {
62 get {return needIndent;}
63 set {needIndent = value;}
66 protected virtual void WriteIndent ()
69 Trace.WriteLineIf (info.Enabled, String.Format(
70 "WriteIndent: char='{0}',level={1},size={2}",
71 IndentChar, IndentLevel, IndentSize));
72 string indent = new string (IndentChar,
73 IndentLevel * IndentSize);
77 protected override void Dispose (bool disposing)
83 public override System.Text.Encoding Encoding {
84 get {return _writer.Encoding;}
87 public override void Write (string value)
89 string[] lines = value.Split ('\n');
91 if (lines.Length > 1) {
93 for (int i = 1; i != lines.Length; ++i)
94 _WriteLine (lines[i]);
98 private void _Write (string value)
102 _writer.Write (value);
105 public override void WriteLine ()
109 _writer.WriteLine ();
113 public override void WriteLine (string value)
115 string[] lines = value.Split ('\n');
116 foreach (string s in lines)
120 private void _WriteLine (string value)
122 Trace.WriteLineIf (info.Enabled, String.Format(
123 "WriteLine: NeedIndent={0}", NeedIndent));
126 _writer.WriteLine (value);
131 public class Indenter : IDisposable {
133 private static BooleanSwitch info =
134 new BooleanSwitch ("indenter", "Indenter Messages");
136 private IndentingTextWriter _writer;
139 public Indenter (IndentingTextWriter writer)
144 public Indenter (IndentingTextWriter writer, int level)
148 _writer.IndentLevel += level;
149 // _writer.Indent ();
152 public void Dispose ()
154 _writer.IndentLevel -= level;
155 // _writer.Unindent ();
156 Trace.WriteLineIf (info.Enabled, String.Format(
157 "Disposing; indentlevel={0}",
158 _writer.IndentLevel));