src/Tools/Graphview/popups.scala
author wenzelm
Thu, 01 Jan 2015 14:37:25 +0100
changeset 59225 d0edf67253d3
parent 59221 f779f83ef4ec
child 59228 56b34fc7a015
permissions -rw-r--r--
tuned imports;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59202
711c2446dc9d clarified source location;
wenzelm
parents: 55618
diff changeset
     1
/*  Title:      Tools/Graphview/popups.scala
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     2
    Author:     Markus Kaiser, TU Muenchen
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     3
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     4
PopupMenu generation for graph components.
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     5
*/
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     6
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     7
package isabelle.graphview
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     8
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
     9
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    10
import isabelle._
55618
995162143ef4 tuned imports;
wenzelm
parents: 50475
diff changeset
    11
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    12
import javax.swing.JPopupMenu
49558
af7b652180d5 minimal component and build setup for graphview;
wenzelm
parents: 49557
diff changeset
    13
import scala.swing.{Action, Menu, MenuItem, Separator}
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    14
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    15
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    16
object Popups
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    17
{
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    18
  def apply(panel: Graph_Panel, under_mouse: Option[String], selected: List[String]): JPopupMenu =
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    19
  {
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    20
    val visualizer = panel.visualizer
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    21
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    22
    val add_mutator = visualizer.model.Mutators.add _
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
    23
    val curr = visualizer.model.current
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
    24
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    25
    def filter_context(ls: List[String], reverse: Boolean, caption: String, edges: Boolean) =
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    26
      new Menu(caption) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    27
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    28
          new MenuItem(new Action("This") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    29
            def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    30
              add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, reverse, false, false)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    31
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    32
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    33
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    34
          new MenuItem(new Action("Family") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    35
            def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    36
              add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, reverse, true, true)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    37
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    38
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    39
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    40
          new MenuItem(new Action("Parents") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    41
            def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    42
              add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, reverse, false, true)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    43
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    44
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    45
        contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    46
          new MenuItem(new Action("Children") {
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    47
            def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    48
              add_mutator(Mutator.make(visualizer, Mutator.Node_List(ls, reverse, true, false)))
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    49
          })
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    50
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    51
        if (edges) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    52
          val outs =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    53
            ls.map(l => (l, curr.imm_succs(l)))  // FIXME iterator
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    54
              .filter(_._2.size > 0).sortBy(_._1)
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    55
          val ins =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    56
            ls.map(l => (l, curr.imm_preds(l)))  // FIXME iterator
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    57
              .filter(_._2.size > 0).sortBy(_._1)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    58
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    59
          if (outs.nonEmpty || ins.nonEmpty) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    60
            contents += new Separator()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    61
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    62
            contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    63
              new Menu("Edge") {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    64
                if (outs.nonEmpty) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    65
                  contents += new MenuItem("From...") { enabled = false }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    66
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    67
                  outs.map(e => {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    68
                    val (from, tos) = e
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    69
                    contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    70
                      new Menu(from) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    71
                        contents += new MenuItem("To...") { enabled = false }
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    72
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    73
                        tos.toList.sorted.distinct.map(to => {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    74
                          contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    75
                            new MenuItem(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    76
                              new Action(to) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    77
                                def apply =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    78
                                  add_mutator(
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    79
                                    Mutator.make(visualizer, Mutator.Edge_Endpoints(from, to)))
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    80
                              })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    81
                        })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    82
                      }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    83
                  })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    84
                }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    85
                if (outs.nonEmpty && ins.nonEmpty) { contents += new Separator() }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    86
                if (ins.nonEmpty) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    87
                  contents += new MenuItem("To...") { enabled = false }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
    88
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    89
                  ins.map(e => {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    90
                    val (to, froms) = e
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    91
                    contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    92
                      new Menu(to) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    93
                        contents += new MenuItem("From...") { enabled = false }
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
    94
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    95
                        froms.toList.sorted.distinct.map(from => {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    96
                          contents +=
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    97
                            new MenuItem(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    98
                              new Action(from) {
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
    99
                                def apply =
59221
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   100
                                  add_mutator(
f779f83ef4ec tuned signature;
wenzelm
parents: 59218
diff changeset
   101
                                    Mutator.make(visualizer, Mutator.Edge_Endpoints(from, to)))
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   102
                              })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   103
                        })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   104
                      }
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   105
                  })
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   106
                }
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   107
              }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   108
          }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   109
        }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   110
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   111
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   112
    val popup = new JPopupMenu()
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   113
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   114
    popup.add(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   115
      new MenuItem(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   116
        new Action("Remove all filters") {
50475
8cc351df4a23 just one class with parameters;
wenzelm
parents: 50472
diff changeset
   117
          def apply = visualizer.model.Mutators(Nil)
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   118
        }).peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   119
    popup.add(new JPopupMenu.Separator)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   120
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   121
    if (under_mouse.isDefined) {
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   122
      val v = under_mouse.get
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   123
      popup.add(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   124
        new MenuItem("Mouseover: %s".format(visualizer.Caption(v))) { enabled = false }.peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   125
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   126
      popup.add(filter_context(List(v), true, "Hide", true).peer)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   127
      popup.add(filter_context(List(v), false, "Show only", false).peer)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   128
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   129
      popup.add(new JPopupMenu.Separator)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   130
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   131
    if (!selected.isEmpty) {
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   132
      val text =
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   133
        if (selected.length > 1) "Multiple"
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   134
        else visualizer.Caption(selected.head)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   135
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   136
      popup.add(new MenuItem("Selected: %s".format(text)) { enabled = false }.peer)
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   137
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   138
      popup.add(filter_context(selected, true, "Hide", true).peer)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   139
      popup.add(filter_context(selected, false, "Show only", false).peer)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   140
      popup.add(new JPopupMenu.Separator)
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   141
    }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   142
59218
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   143
    popup.add(
eadd82d440b0 tuned whitespace;
wenzelm
parents: 59202
diff changeset
   144
      new MenuItem(new Action("Fit to Window") { def apply = panel.fit_to_window() }).peer)
50472
bad1a1ca61e1 separate instance of class Parameters for each Main_Panel -- avoid global program state;
wenzelm
parents: 50463
diff changeset
   145
49557
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   146
    popup
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   147
  }
61988f9df94d added Graphview tool, based on Isabelle/Scala and Swing/Graphics2D;
Markus Kaiser <markus.kaiser@in.tum.de>
parents:
diff changeset
   148
}