lib/jedit/plugin/isabelle/IsabelleDock.scala
author wenzelm
Sun, 24 Aug 2008 18:11:20 +0200
changeset 27985 fb774d10ea4c
parent 27966 825286a7a3a4
permissions -rw-r--r--
repackaged as isabelle.jedit;
wenzelm@25851
     1
/*  Title:      jedit/plugin/IsabelleDock.scala
wenzelm@25851
     2
    ID:         $Id$
wenzelm@25851
     3
    Author:     Makarius
wenzelm@25851
     4
wenzelm@25851
     5
Dockable window for Isabelle process control.
wenzelm@25851
     6
*/
wenzelm@25851
     7
wenzelm@27985
     8
package isabelle.jedit
wenzelm@25851
     9
wenzelm@25851
    10
import org.gjt.sp.jedit.View
wenzelm@25851
    11
import org.gjt.sp.jedit.gui.DefaultFocusComponent
wenzelm@25851
    12
import org.gjt.sp.jedit.gui.DockableWindowManager
wenzelm@25851
    13
import org.gjt.sp.jedit.gui.RolloverButton
wenzelm@25851
    14
import org.gjt.sp.jedit.gui.HistoryTextField
wenzelm@25851
    15
import org.gjt.sp.jedit.GUIUtilities
wenzelm@25851
    16
wenzelm@25851
    17
import java.awt.Color
wenzelm@25851
    18
import java.awt.Insets
wenzelm@25851
    19
import java.awt.BorderLayout
wenzelm@25851
    20
import java.awt.Dimension
wenzelm@25851
    21
import java.awt.event.ActionListener
wenzelm@25851
    22
import java.awt.event.ActionEvent
wenzelm@25851
    23
import javax.swing.BoxLayout
wenzelm@25851
    24
import javax.swing.JPanel
wenzelm@25851
    25
import javax.swing.JScrollPane
wenzelm@25851
    26
import javax.swing.JTextPane
wenzelm@25851
    27
import javax.swing.text.{StyledDocument, StyleConstants}
wenzelm@25851
    28
import javax.swing.SwingUtilities
wenzelm@25851
    29
import javax.swing.Icon
wenzelm@25851
    30
import javax.swing.Box
wenzelm@25851
    31
import javax.swing.JTextField
wenzelm@25851
    32
import javax.swing.JComboBox
wenzelm@25851
    33
import javax.swing.DefaultComboBoxModel
wenzelm@25851
    34
wenzelm@25851
    35
wenzelm@25851
    36
class IsabelleDock(view: View, position: String)
wenzelm@25851
    37
    extends JPanel(new BorderLayout) with DefaultFocusComponent
wenzelm@25851
    38
{
wenzelm@25851
    39
  private val text = new HistoryTextField("isabelle", false, true)
wenzelm@25851
    40
  private val logicCombo = new JComboBox
wenzelm@25851
    41
wenzelm@25851
    42
  {
wenzelm@25851
    43
    // output pane
wenzelm@25851
    44
    val pane = new JTextPane
wenzelm@25851
    45
    pane.setEditable(false)
wenzelm@25851
    46
    add(BorderLayout.CENTER, new JScrollPane(pane))
wenzelm@25851
    47
    if (position == DockableWindowManager.FLOATING)
wenzelm@25851
    48
      setPreferredSize(new Dimension(1000, 500))
wenzelm@25851
    49
wenzelm@25851
    50
    val doc = pane.getDocument.asInstanceOf[StyledDocument]
wenzelm@25851
    51
wenzelm@25851
    52
    def makeStyle(name: String, bg: Boolean, color: Color) = {
wenzelm@25851
    53
      val style = doc.addStyle(name, null)
wenzelm@25851
    54
      if (bg) StyleConstants.setBackground(style, color)
wenzelm@25851
    55
      else StyleConstants.setForeground(style, color)
wenzelm@25851
    56
      style
wenzelm@25851
    57
    }
wenzelm@25851
    58
    val rawStyle = makeStyle("raw", false, Color.GRAY)
wenzelm@25851
    59
    val infoStyle = makeStyle("info", true, new Color(160, 255, 160))
wenzelm@25851
    60
    val warningStyle = makeStyle("warning", true, new Color(255, 255, 160))
wenzelm@25851
    61
    val errorStyle = makeStyle("error", true, new Color(255, 160, 160))
wenzelm@25851
    62
wenzelm@25851
    63
    IsabellePlugin.addPermanentConsumer (result =>
wenzelm@27966
    64
      if (result != null && !result.is_system) {
wenzelm@25851
    65
        SwingUtilities.invokeLater(new Runnable {
wenzelm@25851
    66
          def run = {
wenzelm@25851
    67
            val logic = IsabellePlugin.isabelle.session
wenzelm@25851
    68
            logicCombo.setModel(new DefaultComboBoxModel(Array(logic).asInstanceOf[Array[AnyRef]]))
wenzelm@25851
    69
            logicCombo.setPrototypeDisplayValue("AAAA")  // FIXME ??
wenzelm@25851
    70
wenzelm@25851
    71
            val doc = pane.getDocument.asInstanceOf[StyledDocument]
wenzelm@25851
    72
            val style = result.kind match {
wenzelm@27966
    73
              case IsabelleProcess.Kind.WARNING => warningStyle
wenzelm@27966
    74
              case IsabelleProcess.Kind.ERROR => errorStyle
wenzelm@27966
    75
              case IsabelleProcess.Kind.TRACING => infoStyle
wenzelm@27966
    76
              case _ => if (result.is_raw) rawStyle else null
wenzelm@25851
    77
            }
wenzelm@27966
    78
            doc.insertString(doc.getLength, IsabellePlugin.result_content(result), style)
wenzelm@27966
    79
            if (!result.is_raw) doc.insertString(doc.getLength, "\n", style)
wenzelm@25851
    80
            pane.setCaretPosition(doc.getLength)
wenzelm@25851
    81
          }
wenzelm@25851
    82
        })
wenzelm@25851
    83
      })
wenzelm@25851
    84
wenzelm@25851
    85
wenzelm@25851
    86
    // control box
wenzelm@25851
    87
    val box = new Box(BoxLayout.X_AXIS)
wenzelm@25851
    88
    add(BorderLayout.SOUTH, box)
wenzelm@25851
    89
wenzelm@25851
    90
wenzelm@25851
    91
    // logic combo
wenzelm@25851
    92
    logicCombo.setToolTipText("Isabelle logics")
wenzelm@25851
    93
    logicCombo.setRequestFocusEnabled(false)
wenzelm@25851
    94
    logicCombo.setModel(new DefaultComboBoxModel(Array("default").asInstanceOf[Array[AnyRef]]))
wenzelm@25851
    95
    box.add(logicCombo)
wenzelm@25851
    96
wenzelm@25851
    97
wenzelm@25851
    98
    // mode combo
wenzelm@25851
    99
    val modeIsar = "Isar"
wenzelm@25851
   100
    val modeML = "ML"
wenzelm@25851
   101
    val modes = Array(modeIsar, modeML)
wenzelm@25851
   102
    var mode = modeIsar
wenzelm@25851
   103
wenzelm@25851
   104
    val modeCombo = new JComboBox
wenzelm@25851
   105
    modeCombo.setToolTipText("Toplevel mode")
wenzelm@25851
   106
    modeCombo.setRequestFocusEnabled(false)
wenzelm@25851
   107
    modeCombo.setModel(new DefaultComboBoxModel(modes.asInstanceOf[Array[AnyRef]]))
wenzelm@25851
   108
    modeCombo.setPrototypeDisplayValue("AAAA")
wenzelm@25851
   109
    modeCombo.addActionListener(new ActionListener {
wenzelm@25851
   110
      def actionPerformed(evt: ActionEvent): Unit = {
wenzelm@25851
   111
        mode = modeCombo.getSelectedItem.asInstanceOf[String]
wenzelm@25851
   112
      }
wenzelm@25851
   113
    })
wenzelm@25851
   114
    box.add(modeCombo)
wenzelm@25851
   115
wenzelm@25851
   116
wenzelm@25851
   117
    // input field
wenzelm@25851
   118
    text.setToolTipText("Command line")
wenzelm@25851
   119
    text.addActionListener(new ActionListener {
wenzelm@25851
   120
      def actionPerformed(evt: ActionEvent): Unit = {
wenzelm@25851
   121
        val command = text.getText
wenzelm@25851
   122
        if (command.length > 0) {
wenzelm@25851
   123
          if (mode == modeIsar)
wenzelm@25851
   124
            IsabellePlugin.isabelle.command(command)
wenzelm@25851
   125
          else if (mode == modeML)
wenzelm@25851
   126
            IsabellePlugin.isabelle.ML(command)
wenzelm@25851
   127
          text.setText("")
wenzelm@25851
   128
        }
wenzelm@25851
   129
      }
wenzelm@25851
   130
    })
wenzelm@25851
   131
    box.add(text)
wenzelm@25851
   132
wenzelm@25851
   133
wenzelm@25851
   134
    // buttons
wenzelm@25851
   135
    def iconButton(icon: String, tip: String, action: => Unit) = {
wenzelm@25851
   136
      val button = new RolloverButton(GUIUtilities.loadIcon(icon))
wenzelm@25851
   137
      button.setToolTipText(tip)
wenzelm@25851
   138
      button.setMargin(new Insets(0,0,0,0))
wenzelm@25851
   139
      button.setRequestFocusEnabled(false)
wenzelm@25851
   140
      button.addActionListener(new ActionListener {
wenzelm@25851
   141
        def actionPerformed(evt: ActionEvent): Unit = action
wenzelm@25851
   142
      })
wenzelm@25851
   143
      box.add(button)
wenzelm@25851
   144
    }
wenzelm@25851
   145
wenzelm@25851
   146
    iconButton("Cancel.png", "Stop", IsabellePlugin.isabelle.interrupt)
wenzelm@25851
   147
    iconButton("Clear.png", "Clear", pane.setText(""))
wenzelm@25851
   148
  }
wenzelm@25851
   149
wenzelm@25851
   150
  def focusOnDefaultComponent: Unit = text.requestFocus
wenzelm@25851
   151
}
wenzelm@25851
   152