src/Tools/jEdit/src/syntax_style.scala
changeset 67128 4d91b6d5d49c
parent 67127 cf111622c9f8
child 67130 b023f64e0d16
equal deleted inserted replaced
67127:cf111622c9f8 67128:4d91b6d5d49c
    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, _))