src/Tools/Graphview/metrics.scala
author wenzelm
Tue, 06 Jan 2015 16:41:31 +0100
changeset 59303 15cd9bcd6ddb
parent 59302 4d985afc0565
child 59384 c75327a34960
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/Graphview/metrics.scala
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     3
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     4
Physical metrics for layout and painting.
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     5
*/
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     6
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     7
package isabelle.graphview
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     8
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     9
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    10
import isabelle._
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    11
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    12
import java.awt.{Font, RenderingHints}
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    13
import java.awt.font.FontRenderContext
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    14
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    15
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    16
object Metrics
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    17
{
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    18
  val rendering_hints: RenderingHints =
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    19
    new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    20
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    21
  val font_render_context: FontRenderContext =
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    22
    new FontRenderContext(null, true, false)
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    23
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    24
  def apply(font: Font): Metrics = new Metrics(font)
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    25
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    26
  val default: Metrics = apply(new Font("Helvetica", Font.PLAIN, 12))
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    27
}
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    28
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    29
class Metrics private(val font: Font)
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    30
{
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    31
  def string_bounds(s: String) = font.getStringBounds(s, Metrics.font_render_context)
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    32
  private val mix = string_bounds("mix")
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    33
  val space_width = string_bounds(" ").getWidth
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    34
  def char_width: Double = mix.getWidth / 3
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    35
  def height: Double = mix.getHeight
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    36
  def ascent: Double = font.getLineMetrics("", Metrics.font_render_context).getAscent
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    37
  def gap: Double = mix.getWidth
59293
305e79989d48 tuned metrics;
wenzelm
parents: 59290
diff changeset
    38
  def pad_x: Double = char_width * 1.5
305e79989d48 tuned metrics;
wenzelm
parents: 59290
diff changeset
    39
  def pad_y: Double = char_width
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    40
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    41
  def dummy_width2: Double = (pad_x / 2).ceil
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    42
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    43
  def box_width2(node: Graph_Display.Node): Double =
59293
305e79989d48 tuned metrics;
wenzelm
parents: 59290
diff changeset
    44
    ((string_bounds(node.toString).getWidth + pad_x) / 2).ceil
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    45
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    46
  def box_width2(vertex: Layout.Vertex): Double =
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    47
    vertex match {
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    48
      case Layout.Node(node) => box_width2(node)
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    49
      case _: Layout.Dummy => dummy_width2
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    50
    }
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    51
  def box_gap: Double = gap.ceil
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    52
  def box_height(n: Int): Double = (char_width * 1.5 * (5 max n)).ceil
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    53
}
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    54