def set_preferred_size(): Unit = { val box = graphview.bounding_box() val s = Transform.scale_discrete
painter.preferredSize = new Dimension((box.width * s).ceil.toInt, (box.height * s).ceil.toInt)
painter.revalidate()
}
def refresh(): Unit = { if (painter != null) {
set_preferred_size()
painter.repaint()
}
}
def scroll_to_node(node: Graph_Display.Node): Unit = { val gap = graphview.metrics.gap val info = graphview.layout.get_node(node)
val t = Transform() val p =
t.transform(new Point2D.Double(info.x - info.width2 - gap, info.y - info.height2 - gap), null) val q =
t.transform(new Point2D.Double(info.x + info.width2 + gap, info.y + info.height2 + gap), null)
privateval graph_pane: ScrollPane = new ScrollPane(painter) {
tooltip = ""
overridelazyval peer: JScrollPane = new JScrollPane with SuperMixin { overridedef getToolTipText(event: java.awt.event.MouseEvent): String =
graphview.find_node(Transform.pane_to_graph_coordinates(event.getPoint)) match { case Some(node) =>
graphview.model.full_graph.get_node(node) match { case Nil => null case List(tip: XML.Elem) =>
graphview.make_tooltip(graph_pane.peer, event.getX, event.getY, tip) case body => val tip = Pretty.block(body, indent = 0)
graphview.make_tooltip(graph_pane.peer, event.getX, event.getY, tip)
} case None => null
}
}
listenTo(mouse.moves)
listenTo(mouse.clicks)
reactions +=
{ case MousePressed(_, p, _, _, _) =>
Mouse_Interaction.pressed(p)
painter.repaint() case MouseDragged(_, to, _) =>
Mouse_Interaction.dragged(to)
painter.repaint() case e @ MouseClicked(_, p, m, n, _) =>
Mouse_Interaction.clicked(p, m, n, SwingUtilities.isRightMouseButton(e.peer))
painter.repaint()
}
def apply(): AffineTransform = { val box = graphview.bounding_box() val t = AffineTransform.getScaleInstance(scale_discrete, scale_discrete)
t.translate(- box.x, - box.y)
t
}
def fit_to_window(): Unit = { if (graphview.visible_graph.is_empty)
rescale(1.0) else { val box = graphview.bounding_box()
rescale((size.width / box.width) min (size.height / box.height))
}
}
def pane_to_graph_coordinates(at: Point2D): Point2D = { val s = Transform.scale_discrete val p = Transform().inverseTransform(graph_pane.peer.getViewport.getViewPosition, null)
def pressed(at: Point): Unit = { val c = Transform.pane_to_graph_coordinates(at) val l =
graphview.find_node(c) match { case Some(node) => if (graphview.Selection.contains(node)) graphview.Selection.get() else List(node) case None => Nil
} val d =
l match { case Nil => graphview.find_dummy(c).toList case _ => Nil
}
draginfo = (at, l, d)
}
def dragged(to: Point): Unit = { val (from, p, d) = draginfo
val s = Transform.scale_discrete val dx = to.x - from.x val dy = to.y - from.y
(p, d) match { case (Nil, Nil) => val r = graph_pane.peer.getViewport.getViewRect
r.translate(- dx, - dy)
painter.peer.scrollRectToVisible(r)
case (Nil, ds) =>
ds.foreach(d => graphview.translate_vertex(d, dx / s, dy / s))
case (ls, _) =>
ls.foreach(l => graphview.translate_vertex(Layout.Node(l), dx / s, dy / s))
}
draginfo = (to, p, d)
}
def clicked(at: Point, m: Key.Modifiers, clicks: Int, right_click: Boolean): Unit = { val c = Transform.pane_to_graph_coordinates(at)
if (clicks < 2) { if (right_click) {
// FIXME if (false) { val menu = Popups(graph_panel, graphview.find_node(c), graphview.Selection.get())
menu.show(graph_pane.peer, at.x, at.y)
}
} else {
(graphview.find_node(c), m) match { case (Some(node), Key.Modifier.Control) => graphview.Selection.add(node) case (None, Key.Modifier.Control) =>
case (Some(node), Key.Modifier.Shift) => graphview.Selection.add(node) case (None, Key.Modifier.Shift) =>
case (Some(node), _) =>
graphview.Selection.clear()
graphview.Selection.add(node) case (None, _) =>
graphview.Selection.clear()
}
}
}
}
}
/** controls **/
privateval mutator_dialog = new Mutator_Dialog(graphview, graphview.model.Mutators, "Filters", "Hide", false) privateval color_dialog = new Mutator_Dialog(graphview, graphview.model.Colors, "Colorations")
privateval chooser = new FileChooser {
fileSelectionMode = FileChooser.SelectionMode.FilesOnly
title = "Save image (.png or .pdf)"
}
privateval show_content = new CheckBox() {
selected = graphview.show_content
action = Action("Show content") {
graphview.show_content = selected
graphview.update_layout()
refresh()
}
tooltip = "Show full node content within graph layout"
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.