src/Pure/System/html5_panel.scala
author wenzelm
Sun, 02 Sep 2012 21:01:11 +0200
changeset 49066 1067a639d42a
child 49333 8b144338e1a2
permissions -rw-r--r--
basic setup for HTML5 panel; more JFX_Thread.operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49066
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/System/html5_panel.scala
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     3
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     4
HTML5 panel based on Java FX WebView.
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     5
*/
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     6
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     7
package isabelle
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     8
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
     9
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    10
import javafx.scene.Scene
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    11
import javafx.scene.web.{WebView, WebEngine}
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    12
import javafx.scene.input.KeyEvent
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    13
import javafx.scene.text.FontSmoothingType
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    14
import javafx.scene.layout.{HBox, VBox, Priority}
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    15
import javafx.geometry.{HPos, VPos, Insets}
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    16
import javafx.event.EventHandler
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    17
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    18
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    19
// see http://netbeans.org/bugzilla/show_bug.cgi?id=210414
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    20
// and http://hg.netbeans.org/jet-main/rev/a88434cec458
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    21
private class Web_View_Workaround extends javafx.scene.layout.Pane
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    22
{
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    23
  VBox.setVgrow(this, Priority.ALWAYS)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    24
  HBox.setHgrow(this, Priority.ALWAYS)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    25
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    26
  setMaxWidth(java.lang.Double.MAX_VALUE)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    27
  setMaxHeight(java.lang.Double.MAX_VALUE)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    28
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    29
  val web_view = new WebView
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    30
  web_view.setMinSize(500, 400)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    31
  web_view.setPrefSize(500, 400)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    32
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    33
  getChildren().add(web_view)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    34
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    35
  override protected def layoutChildren()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    36
  {
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    37
    val managed = getManagedChildren()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    38
    val width = getWidth()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    39
    val height = getHeight()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    40
    val top = getInsets().getTop()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    41
    val right = getInsets().getRight()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    42
    val left = getInsets().getLeft()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    43
    val bottom = getInsets().getBottom()
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    44
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    45
    for (i <- 0 until managed.size)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    46
      layoutInArea(managed.get(i), left, top,
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    47
        width - left - right, height - top - bottom,
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    48
        0, Insets.EMPTY, true, true, HPos.CENTER, VPos.CENTER)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    49
  }
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    50
}
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    51
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    52
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    53
class HTML5_Panel extends javafx.embed.swing.JFXPanel
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    54
{
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    55
  private val future =
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    56
    JFX_Thread.future {
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    57
      val pane = new Web_View_Workaround
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    58
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    59
      val web_view = pane.web_view
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    60
      web_view.setFontSmoothingType(FontSmoothingType.GRAY)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    61
      web_view.setOnKeyTyped(new EventHandler[KeyEvent] {
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    62
        def handle(e: KeyEvent) {
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    63
          if (e.isControlDown && e.getCharacter == "0")
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    64
            web_view.setFontScale(1.0)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    65
          if (e.isControlDown && e.getCharacter == "+")
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    66
            web_view.setFontScale(web_view.getFontScale * 1.1)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    67
          else if (e.isControlDown && e.getCharacter == "-")
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    68
            web_view.setFontScale(web_view.getFontScale / 1.1)
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    69
        }
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    70
      })
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    71
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    72
      setScene(new Scene(pane))
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    73
      pane
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    74
    }
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    75
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    76
  def web_view: WebView = future.join.web_view
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    77
  def web_engine: WebEngine = web_view.getEngine
1067a639d42a basic setup for HTML5 panel;
wenzelm
parents:
diff changeset
    78
}