New test.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms.RTF / Style.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Authors:
23 //      Peter Bartok    (pbartok@novell.com)
24 //
25 //
26
27 // COMPLETE
28
29 namespace System.Windows.Forms.RTF {
30         internal class Style {
31                 #region Local Variables
32                 public const int        NoStyleNum = 222;
33                 public const int        NormalStyleNum = 0;
34
35                 private string          name;
36                 private StyleType       type;
37                 private bool            additive;
38                 private int             num;
39                 private int             based_on;
40                 private int             next_par;
41                 private int             se_list;
42                 private bool            expanding;
43                 private StyleElement    elements;
44                 private Style           next;
45                 #endregion Local Variables
46
47                 #region Constructors
48                 public Style(RTF rtf) {
49                         num = -1;
50                         type = StyleType.Paragraph;
51                         based_on = NoStyleNum;
52                         next_par = -1;
53
54                         lock (rtf) {
55                                 if (rtf.Styles == null) {
56                                         rtf.Styles = this;
57                                 } else {
58                                         Style s = rtf.Styles;
59                                         while (s.next != null)
60                                                 s = s.next;
61                                         s.next = this;
62                                 }
63                         }
64                 }
65                 #endregion      // Constructors
66
67                 #region Properties
68                 public string Name {
69                         get {
70                                 return name;
71                         }
72
73                         set {
74                                 name = value;
75                         }
76                 }
77
78                 public StyleType Type {
79                         get {
80                                 return type;
81                         }
82
83                         set {
84                                 type = value;
85                         }
86                 }
87
88                 public bool Additive {
89                         get {
90                                 return additive;
91                         }
92
93                         set {
94                                 additive = value;
95                         }
96                 }
97
98                 public int BasedOn {
99                         get {
100                                 return based_on;
101                         }
102
103                         set {
104                                 based_on = value;
105                         }
106                 }
107
108                 public StyleElement Elements {
109                         get {
110                                 return elements;
111                         }
112
113                         set {
114                                 elements = value;
115                         }
116                 }
117
118                 public bool Expanding {
119                         get {
120                                 return expanding;
121                         }
122
123                         set {
124                                 expanding = value;
125                         }
126                 }
127
128                 public int NextPar {
129                         get {
130                                 return next_par;
131                         }
132
133                         set {
134                                 next_par = value;
135                         }
136                 }
137
138                 public int Num {
139                         get {
140                                 return num;
141                         }
142
143                         set {
144                                 num = value;
145                         }
146                 }
147                 #endregion      // Properties
148
149                 #region Methods
150                 public void Expand(RTF rtf) {
151                         StyleElement    se;
152
153                         if (num == -1) {
154                                 return;
155                         }
156
157                         if (expanding) {
158                                 throw new Exception("Recursive style expansion");
159                         }
160                         expanding = true;
161
162                         if (num != based_on) {
163                                 rtf.SetToken(TokenClass.Control, Major.ParAttr, Minor.StyleNum, based_on, "\\s");
164                                 rtf.RouteToken();
165                         }
166
167                         se = elements;
168                         while (se != null) {
169                                 rtf.TokenClass = se.TokenClass;
170                                 rtf.Major = se.Major;
171                                 rtf.Minor = se.Minor;
172                                 rtf.Param = se.Param;
173                                 rtf.Text = se.Text;
174                                 rtf.RouteToken();
175                         }
176
177                         expanding = false;
178                 }
179
180                 static public Style GetStyle(RTF rtf, int style_number) {
181                         Style s;
182
183                         lock (rtf) {
184                                 s = GetStyle(rtf.Styles, style_number);
185                         }
186                         return s;
187                 }
188
189                 static public Style GetStyle(Style start, int style_number) {
190                         Style   s;
191
192                         if (style_number == -1) {
193                                 return start;
194                         }
195
196                         s = start;
197
198                         while ((s != null) && (s.num != style_number)) {
199                                 s = s.next;
200                         }
201                         return s;
202                 }
203                 #endregion      // Methods
204         }
205 }