# HG changeset patch # User wenzelm # Date 1260450889 -3600 # Node ID 49245d68f7e4d5deb61184cd7220517611f00c76 # Parent 1fa46633336104424e8c42eb422a9ae842e0adaf basic setup for HTML_Panel event handling; diff -r 1fa466333361 -r 49245d68f7e4 src/Tools/jEdit/src/jedit/output_dockable.scala --- a/src/Tools/jEdit/src/jedit/output_dockable.scala Thu Dec 10 13:47:50 2009 +0100 +++ b/src/Tools/jEdit/src/jedit/output_dockable.scala Thu Dec 10 14:14:49 2009 +0100 @@ -31,7 +31,8 @@ /* HTML panel */ - private val html_panel = new HTML_Panel(Isabelle.system, Isabelle.Int_Property("font-size")) + private val html_panel = + new HTML_Panel(Isabelle.system, Isabelle.Int_Property("font-size"), null) add(html_panel, BorderLayout.CENTER) diff -r 1fa466333361 -r 49245d68f7e4 src/Tools/jEdit/src/proofdocument/html_panel.scala --- a/src/Tools/jEdit/src/proofdocument/html_panel.scala Thu Dec 10 13:47:50 2009 +0100 +++ b/src/Tools/jEdit/src/proofdocument/html_panel.scala Thu Dec 10 14:14:49 2009 +0100 @@ -9,10 +9,13 @@ import java.io.StringReader import java.awt.{BorderLayout, Dimension} +import java.awt.event.MouseEvent + import javax.swing.{JButton, JPanel, JScrollPane} import java.util.logging.{Logger, Level} import org.w3c.dom.Document +import org.w3c.dom.html2.HTMLElement import org.lobobrowser.html.parser.{DocumentBuilderImpl, InputSourceImpl} import org.lobobrowser.html.gui.HtmlPanel @@ -23,7 +26,21 @@ import scala.actors.Actor._ -class HTML_Panel(sys: Isabelle_System, initial_font_size: Int) extends HtmlPanel +object HTML_Panel +{ + sealed abstract class Event { val element: HTMLElement; val mouse: MouseEvent } + case class Context_Menu(val element: HTMLElement, mouse: MouseEvent) extends Event + case class Mouse_Click(val element: HTMLElement, mouse: MouseEvent) extends Event + case class Double_Click(val element: HTMLElement, mouse: MouseEvent) extends Event + case class Mouse_Over(val element: HTMLElement, mouse: MouseEvent) extends Event + case class Mouse_Out(val element: HTMLElement, mouse: MouseEvent) extends Event +} + + +class HTML_Panel( + sys: Isabelle_System, + initial_font_size: Int, + handler: PartialFunction[HTML_Panel.Event, Unit]) extends HtmlPanel { // global logging Logger.getLogger("org.lobobrowser").setLevel(Level.WARNING) @@ -59,7 +76,25 @@ /* actor with local state */ private val ucontext = new SimpleUserAgentContext + private val rcontext = new SimpleHtmlRendererContext(this, ucontext) + { + private def handle(event: HTML_Panel.Event): Boolean = + if (handler != null && handler.isDefinedAt(event)) { handler(event); true } + else false + + override def onContextMenu(elem: HTMLElement, event: MouseEvent): Boolean = + handle(HTML_Panel.Context_Menu(elem, event)) + override def onMouseClick(elem: HTMLElement, event: MouseEvent): Boolean = + handle(HTML_Panel.Mouse_Click(elem, event)) + override def onDoubleClick(elem: HTMLElement, event: MouseEvent): Boolean = + handle(HTML_Panel.Double_Click(elem, event)) + override def onMouseOver(elem: HTMLElement, event: MouseEvent) + { handle(HTML_Panel.Mouse_Over(elem, event)) } + override def onMouseOut(elem: HTMLElement, event: MouseEvent) + { handle(HTML_Panel.Mouse_Out(elem, event)) } + } + private val builder = new DocumentBuilderImpl(ucontext, rcontext) private case class Init(font_size: Int)