src/Tools/Graphview/metrics.scala
author wenzelm
Mon, 04 Nov 2024 20:55:01 +0100
changeset 81340 30f7eb65d679
parent 75393 87ebf5a50283
child 81343 b5b0c398cdec
permissions -rw-r--r--
clarified signature; clarified modules;
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
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    12
import java.awt.Font
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    13
import java.awt.geom.Rectangle2D
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    14
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    15
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73909
diff changeset
    16
object Metrics {
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    17
  def apply(font: Font): Metrics = new Metrics(font)
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    18
  val default: Metrics = apply(Font_Metric.default.font)
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    19
}
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    20
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    21
class Metrics private(font: Font) extends Font_Metric(font = font) {
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    22
  val ascent: Double = font.getLineMetrics("", context).getAscent
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    23
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    24
  def gap: Double = (average_width * 3).ceil
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    25
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    26
  def dummy_size2: Double = (average_width / 2).ceil
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    27
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    28
  def node_width2(lines: List[String]): Double =
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    29
    ((lines.foldLeft(0.0)({ case (w, s) => w max string_width(s) }) + 2 * average_width) / 2).ceil
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    30
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    31
  def node_height2(num_lines: Int): Double =
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    32
    ((height.ceil * (num_lines max 1) + average_width) / 2).ceil
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    33
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    34
  def level_height2(num_lines: Int, num_edges: Int): Double =
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    35
    (node_height2(num_lines) + gap) max (node_height2(1) * (num_edges max 5))
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    36
}