21 object Syntax_Style |
21 object Syntax_Style |
22 { |
22 { |
23 /* extended syntax styles */ |
23 /* extended syntax styles */ |
24 |
24 |
25 private val plain_range: Int = JEditToken.ID_COUNT |
25 private val plain_range: Int = JEditToken.ID_COUNT |
26 private val full_range = 6 * plain_range + 1 |
|
27 private def check_range(i: Int) { require(0 <= i && i < plain_range) } |
26 private def check_range(i: Int) { require(0 <= i && i < plain_range) } |
28 |
27 |
29 def subscript(i: Byte): Byte = { check_range(i); (i + plain_range).toByte } |
28 def subscript(i: Byte): Byte = { check_range(i); (i + plain_range).toByte } |
30 def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte } |
29 def superscript(i: Byte): Byte = { check_range(i); (i + 2 * plain_range).toByte } |
31 def bold(i: Byte): Byte = { check_range(i); (i + 3 * plain_range).toByte } |
30 def bold(i: Byte): Byte = { check_range(i); (i + 3 * plain_range).toByte } |
32 def user_font(idx: Int, i: Byte): Byte = { check_range(i); (i + (4 + idx) * plain_range).toByte } |
31 def user_font(idx: Int, i: Byte): Byte = { check_range(i); (i + (4 + idx) * plain_range).toByte } |
33 val hidden: Byte = (6 * plain_range).toByte |
32 val hidden: Byte = (6 * plain_range).toByte |
|
33 val control: Byte = (hidden + JEditToken.DIGIT).toByte |
34 |
34 |
35 private def font_style(style: SyntaxStyle, f: Font => Font): SyntaxStyle = |
35 private def font_style(style: SyntaxStyle, f: Font => Font): SyntaxStyle = |
36 new SyntaxStyle(style.getForegroundColor, style.getBackgroundColor, f(style.getFont)) |
36 new SyntaxStyle(style.getForegroundColor, style.getBackgroundColor, f(style.getFont)) |
37 |
37 |
38 private def script_style(style: SyntaxStyle, i: Int): SyntaxStyle = |
38 private def script_style(style: SyntaxStyle, i: Int): SyntaxStyle = |
67 error("Too many user symbol fonts (" + max_user_fonts + " permitted): " + |
67 error("Too many user symbol fonts (" + max_user_fonts + " permitted): " + |
68 Symbol.font_names.mkString(", ")) |
68 Symbol.font_names.mkString(", ")) |
69 |
69 |
70 override def extendStyles(styles: Array[SyntaxStyle]): Array[SyntaxStyle] = |
70 override def extendStyles(styles: Array[SyntaxStyle]): Array[SyntaxStyle] = |
71 { |
71 { |
72 val new_styles = new Array[SyntaxStyle](full_range) |
72 val style0 = styles(0) |
|
73 val font0 = style0.getFont |
|
74 |
|
75 val new_styles = Array.fill[SyntaxStyle](java.lang.Byte.MAX_VALUE)(styles(0)) |
73 for (i <- 0 until plain_range) { |
76 for (i <- 0 until plain_range) { |
74 val style = styles(i) |
77 val style = styles(i) |
75 new_styles(i) = style |
78 new_styles(i) = style |
76 new_styles(subscript(i.toByte)) = script_style(style, -1) |
79 new_styles(subscript(i.toByte)) = script_style(style, -1) |
77 new_styles(superscript(i.toByte)) = script_style(style, 1) |
80 new_styles(superscript(i.toByte)) = script_style(style, 1) |
81 for ((family, idx) <- Symbol.font_index) |
84 for ((family, idx) <- Symbol.font_index) |
82 new_styles(user_font(idx, i.toByte)) = font_style(style, GUI.imitate_font(_, family)) |
85 new_styles(user_font(idx, i.toByte)) = font_style(style, GUI.imitate_font(_, family)) |
83 } |
86 } |
84 new_styles(hidden) = |
87 new_styles(hidden) = |
85 new SyntaxStyle(hidden_color, null, |
88 new SyntaxStyle(hidden_color, null, |
86 { val font = styles(0).getFont |
89 GUI.transform_font(new Font(font0.getFamily, 0, 1), |
87 GUI.transform_font(new Font(font.getFamily, 0, 1), |
90 AffineTransform.getScaleInstance(1.0, font0.getSize.toDouble))) |
88 AffineTransform.getScaleInstance(1.0, font.getSize.toDouble)) }) |
91 new_styles(control) = |
|
92 new SyntaxStyle(style0.getForegroundColor, style0.getBackgroundColor, |
|
93 { val font_style = |
|
94 (if (font0.isItalic) 0 else Font.ITALIC) | |
|
95 (if (font0.isBold) 0 else Font.BOLD) |
|
96 new Font(font0.getFamily, font_style, font0.getSize) }) |
89 new_styles |
97 new_styles |
90 } |
98 } |
91 } |
99 } |
92 |
100 |
93 private def control_style(sym: String): Option[Byte => Byte] = |
101 private def control_style(sym: String): Option[Byte => Byte] = |
103 { |
111 { |
104 for (i <- start until stop) result += (i -> style) |
112 for (i <- start until stop) result += (i -> style) |
105 } |
113 } |
106 |
114 |
107 var offset = 0 |
115 var offset = 0 |
108 var control = "" |
116 var control_sym = "" |
109 for (sym <- Symbol.iterator(text)) { |
117 for (sym <- Symbol.iterator(text)) { |
110 val end_offset = offset + sym.length |
118 val end_offset = offset + sym.length |
111 |
119 |
112 if (control_style(sym).isDefined) control = sym |
120 if (control_style(sym).isDefined) control_sym = sym |
113 else if (control != "") { |
121 else if (control_sym != "") { |
114 if (Symbol.is_controllable(sym) && !Symbol.fonts.isDefinedAt(sym)) { |
122 if (Symbol.is_controllable(sym) && !Symbol.fonts.isDefinedAt(sym)) { |
115 mark(offset - control.length, offset, _ => hidden) |
123 mark(offset - control_sym.length, offset, _ => hidden) |
116 mark(offset, end_offset, control_style(control).get) |
124 mark(offset, end_offset, control_style(control_sym).get) |
117 } |
125 } |
118 control = "" |
126 control_sym = "" |
119 } |
127 } |
120 |
128 |
121 if (Symbol.is_control_encoded(sym)) { |
129 if (Symbol.is_control_encoded(sym)) { |
122 val a = offset + Symbol.control_prefix.length |
130 val a = offset + Symbol.control_prefix.length |
123 val b = end_offset - Symbol.control_suffix.length |
131 val b = end_offset - Symbol.control_suffix.length |
124 mark(offset, a, _ => hidden) |
132 mark(offset, a, _ => hidden) |
125 mark(a, b, _ => JEditToken.KEYWORD4) |
133 mark(a, b, _ => control) |
126 mark(b, end_offset, _ => hidden) |
134 mark(b, end_offset, _ => hidden) |
127 } |
135 } |
128 |
136 |
129 Symbol.lookup_font(sym) match { |
137 Symbol.lookup_font(sym) match { |
130 case Some(idx) => mark(offset, end_offset, user_font(idx, _)) |
138 case Some(idx) => mark(offset, end_offset, user_font(idx, _)) |