Don't require that types be specified on the command line if the displayer
[mono.git] / mcs / tools / type-reflector / IndentingTextWriter.cs
1 //
2 // IndentingTextWriter.cs: Helper class to indent text written to a TextWriter
3 //
4 // Author: Jonathan Pryor (jonpryor@vt.edu)
5 //
6 // (C) 2002 Jonathan Pryor
7 //
8
9 using System;
10 using System.Collections;
11 using System.IO;
12 using System.Diagnostics;
13 using System.Reflection;
14 using System.Text;
15 using System.Text.RegularExpressions;
16
17 namespace Mono.TypeReflector.Displayers
18 {
19         public class IndentingTextWriter : TextWriter {
20
21                 private static BooleanSwitch info = 
22                         new BooleanSwitch ("indenting-text-writer", "IndentingTextWriter messages");
23
24                 private TextWriter _writer;
25
26                 private int indentLevel = 0;
27                 private int indentSize = 4;
28                 private bool needIndent = true;
29                 private char indentChar = ' ';
30
31                 public IndentingTextWriter (TextWriter writer)
32                 {
33                         _writer = writer;
34                 }
35
36                 public int IndentLevel {
37                         get {return indentLevel;}
38                         set {indentLevel = value;}
39                 }
40
41                 public int IndentSize {
42                         get {return indentSize;}
43                         set {indentSize = value;}
44                 }
45
46                 public char IndentChar {
47                         get {return indentChar;}
48                         set {indentChar = value;}
49                 }
50
51                 public void Indent ()
52                 {
53                         ++IndentLevel;
54                 }
55
56                 public void Unindent ()
57                 {
58                         --IndentLevel;
59                 }
60
61                 protected bool NeedIndent {
62                         get {return needIndent;}
63                         set {needIndent = value;}
64                 }
65
66                 protected virtual void WriteIndent ()
67                 {
68                         NeedIndent = false;
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);
74                         Write (indent);
75                 }
76
77                 protected override void Dispose (bool disposing)
78                 {
79                         if (disposing)
80                                 _writer.Close ();
81                 }
82
83                 public override System.Text.Encoding Encoding {
84                         get {return _writer.Encoding;}
85                 }
86
87                 public override void Write (string value)
88                 {
89       string[] lines = value.Split ('\n');
90       _Write (lines[0]);
91       if (lines.Length > 1) {
92         WriteLine ();
93         for (int i = 1; i != lines.Length; ++i)
94           _WriteLine (lines[i]);
95       }
96                 }
97
98     private void _Write (string value)
99     {
100                         if (NeedIndent)
101                                 WriteIndent ();
102                         _writer.Write (value);
103     }
104
105                 public override void WriteLine ()
106                 {
107                         if (NeedIndent)
108                                 WriteIndent ();
109                         _writer.WriteLine ();
110                         NeedIndent = true;
111                 }
112
113                 public override void WriteLine (string value)
114                 {
115       string[] lines = value.Split ('\n');
116       foreach (string s in lines)
117         _WriteLine (s);
118                 }
119
120     private void _WriteLine (string value)
121     {
122                         Trace.WriteLineIf (info.Enabled, String.Format(
123                                 "WriteLine: NeedIndent={0}", NeedIndent));
124                         if (NeedIndent)
125                                 WriteIndent ();
126                         _writer.WriteLine (value);
127                         NeedIndent = true;
128     }
129         }
130
131         public class Indenter : IDisposable {
132
133                 private static BooleanSwitch info = 
134                         new BooleanSwitch ("indenter", "Indenter Messages");
135
136                 private IndentingTextWriter _writer;
137                 private int level;
138
139                 public Indenter (IndentingTextWriter writer) 
140                         : this (writer, 1)
141                 {
142                 }
143
144                 public Indenter (IndentingTextWriter writer, int level)
145                 {
146                         this.level = level;
147                         _writer = writer;
148                         _writer.IndentLevel += level;
149                         // _writer.Indent ();
150                 }
151
152                 public void Dispose ()
153                 {
154                         _writer.IndentLevel -= level;
155                         // _writer.Unindent ();
156                         Trace.WriteLineIf (info.Enabled, String.Format(
157                                 "Disposing; indentlevel={0}", 
158                                 _writer.IndentLevel));
159                 }
160         }
161 }
162