src/Tools/jEdit/src/font_info.scala
author wenzelm
Sat, 01 Mar 2014 19:55:01 +0100
changeset 55827 8a881f83e206
parent 55826 e56a52dd770a
child 56662 f373fb77e0a4
permissions -rw-r--r--
clarified module structure;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55827
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
     1
/*  Title:      Tools/jEdit/src/font_info.scala
55825
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     3
55827
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
     4
Font information, derived from main jEdit view font.
55825
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     5
*/
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     6
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     8
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
     9
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    10
import isabelle._
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    11
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    12
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    13
import java.awt.Font
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    14
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    15
import org.gjt.sp.jedit.{jEdit, View}
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    16
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    17
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    18
object Font_Info
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    19
{
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    20
  /* size range */
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    21
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    22
  val min_size = 5
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    23
  val max_size = 250
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    24
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    25
  def restrict_size(size: Float): Float = size max min_size min max_size
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    26
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    27
55827
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    28
  /* main jEdit font */
55825
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    29
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    30
  def main_family(): String = jEdit.getProperty("view.font")
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    31
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    32
  def main_size(scale: Double = 1.0): Float =
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    33
    restrict_size(jEdit.getIntegerProperty("view.fontsize", 16).toFloat * scale.toFloat)
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    34
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    35
  def main(scale: Double = 1.0): Font_Info =
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    36
    Font_Info(main_family(), main_size(scale))
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    37
55827
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    38
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    39
  /* incremental size change */
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    40
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    41
  object main_change
55825
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    42
  {
55827
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    43
    private def change_size(change: Float => Float)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    44
    {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    45
      Swing_Thread.require()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    46
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    47
      val size0 = main_size()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    48
      val size = restrict_size(change(size0)).round
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    49
      if (size != size0) {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    50
        jEdit.setIntegerProperty("view.fontsize", size)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    51
        jEdit.propertiesChanged()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    52
        jEdit.saveSettings()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    53
        jEdit.getActiveView().getStatus.setMessageAndClear("Text font size: " + size)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    54
      }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    55
    }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    56
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    57
    // owned by Swing thread
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    58
    private var steps = 0
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    59
    private val delay = Swing_Thread.delay_last(PIDE.options.seconds("editor_input_delay"))
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    60
    {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    61
      change_size(size =>
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    62
        {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    63
          var i = size.round
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    64
          while (steps != 0 && i > 0) {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    65
            if (steps > 0)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    66
              { i += (i / 10) max 1; steps -= 1 }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    67
            else
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    68
              { i -= (i / 10) max 1; steps += 1 }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    69
          }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    70
          steps = 0
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    71
          i.toFloat
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    72
        })
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    73
    }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    74
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    75
    def step(i: Int)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    76
    {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    77
      steps += i
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    78
      delay.invoke()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    79
    }
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    80
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    81
    def reset(size: Float)
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    82
    {
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    83
      delay.revoke()
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    84
      steps = 0
8a881f83e206 clarified module structure;
wenzelm
parents: 55826
diff changeset
    85
      change_size(_ => size)
55825
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    86
    }
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    87
  }
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    88
}
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    89
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    90
sealed case class Font_Info(family: String, size: Float)
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    91
{
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    92
  def font: Font = new Font(family, Font.PLAIN, size.round)
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    93
}
694833e3e4a0 tuned signature -- separate module Font_Info;
wenzelm
parents:
diff changeset
    94