merged
authorwenzelm
Sat, 08 Dec 2012 22:41:39 +0100
changeset 50444 f2241b8d0db5
parent 50443 b233d426fa0b (current diff)
parent 50433 9131dadb2bf7 (diff)
child 50445 68c9a6538c0e
merged
--- a/Admin/component_repository/components.sha1	Sat Dec 08 22:15:44 2012 +0100
+++ b/Admin/component_repository/components.sha1	Sat Dec 08 22:41:39 2012 +0100
@@ -18,6 +18,7 @@
 7b012f725ec1cc102dc259df178d511cc7890bba  jedit_build-20120813.tar.gz
 8e1d36f5071e3def2cb281f7fefe9f52352cb88f  jedit_build-20120903.tar.gz
 8fa0c67f59beba369ab836562eed4e56382f672a  jedit_build-20121201.tar.gz
+8122526f1fc362ddae1a328bdbc2152853186fee  jfreechart-1.0.14.tar.gz
 6c737137cc597fc920943783382e928ea79e3feb  kodkodi-1.2.16.tar.gz
 5f95c96bb99927f3a026050f85bd056f37a9189e  kodkodi-1.5.2.tar.gz
 1c8cb6a8f4cbeaedce2d6d1ba8fc7e2ab3663aeb  polyml-5.4.1.tar.gz
--- a/Admin/components/main	Sat Dec 08 22:15:44 2012 +0100
+++ b/Admin/components/main	Sat Dec 08 22:41:39 2012 +0100
@@ -4,6 +4,7 @@
 exec_process-1.0.3
 jdk-7u9
 jedit_build-20121201
+jfreechart-1.0.14
 kodkodi-1.5.2
 polyml-5.5.0
 scala-2.9.2
--- a/src/Pure/System/session.scala	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Pure/System/session.scala	Sat Dec 08 22:41:39 2012 +0100
@@ -22,6 +22,7 @@
   /* events */
 
   //{{{
+  case class Statistics(stats: Properties.T)
   case class Global_Options(options: Options)
   case object Caret_Focus
   case class Raw_Edits(edits: List[Document.Edit_Text])
@@ -58,6 +59,7 @@
 
   /* pervasive event buses */
 
+  val statistics = new Event_Bus[Session.Statistics]
   val global_options = new Event_Bus[Session.Global_Options]
   val caret_focus = new Event_Bus[Session.Caret_Focus.type]
   val raw_edits = new Event_Bus[Session.Raw_Edits]
@@ -359,10 +361,10 @@
           }
 
         case Markup.ML_Statistics(stats) if output.is_protocol =>
-          java.lang.System.err.println(stats.toString)  // FIXME
+          statistics.event(Session.Statistics(stats))
 
         case _ if output.is_init =>
-            phase = Session.Ready
+          phase = Session.Ready
 
         case Markup.Return_Code(rc) if output.is_exit =>
           if (rc == 0) phase = Session.Inactive
--- a/src/Tools/jEdit/lib/Tools/jedit	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Tools/jEdit/lib/Tools/jedit	Sat Dec 08 22:41:39 2012 +0100
@@ -24,6 +24,7 @@
   "src/jedit_main.scala"
   "src/jedit_options.scala"
   "src/jedit_thy_load.scala"
+  "src/monitor_dockable.scala"
   "src/output_dockable.scala"
   "src/plugin.scala"
   "src/pretty_text_area.scala"
@@ -204,6 +205,12 @@
   "$ISABELLE_JEDIT_BUILD_HOME/contrib/js.jar"
 )
 
+declare -a JFREECHART_JARS=()
+for NAME in $JFREECHART_JAR_NAMES
+do
+  JFREECHART_JARS["${#JFREECHART_JARS[@]}"]="$JFREECHART_HOME/lib/$NAME"
+done
+
 
 # target
 
@@ -220,7 +227,7 @@
   else
     if [ -n "$ISABELLE_JEDIT_BUILD_HOME" ]; then
       declare -a DEPS=(
-        "$JEDIT_JAR" "${JEDIT_JARS[@]}"
+        "$JEDIT_JAR" "${JEDIT_JARS[@]}" "${JFREECHART_JARS[@]}"
         "$PURE_JAR" "$GRAPHVIEW_JAR" "${SOURCES[@]}" "${RESOURCES[@]}"
       )
     elif [ -e "$ISABELLE_HOME/Admin/build" ]; then
@@ -276,8 +283,8 @@
 
   cp -p -R -f "${JEDIT_JARS[@]}" dist/jars/. || failed
   (
-    for JAR in "$JEDIT_JAR" "${JEDIT_JARS[@]}" "$PURE_JAR" "$GRAPHVIEW_JAR" \
-      "$SCALA_HOME/lib/scala-compiler.jar"
+    for JAR in "$JEDIT_JAR" "${JEDIT_JARS[@]}" "${JFREECHART_JARS[@]}" "$PURE_JAR" \
+      "$GRAPHVIEW_JAR" "$SCALA_HOME/lib/scala-compiler.jar"
     do
       CLASSPATH="$CLASSPATH:$JAR"
     done
--- a/src/Tools/jEdit/src/Isabelle.props	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Tools/jEdit/src/Isabelle.props	Sat Dec 08 22:41:39 2012 +0100
@@ -28,26 +28,37 @@
 
 #menu actions
 plugin.isabelle.jedit.Plugin.menu.label=Isabelle
-plugin.isabelle.jedit.Plugin.menu=isabelle.theories-panel isabelle.output-panel isabelle.graphview-panel isabelle.raw-output-panel isabelle.protocol-panel isabelle.readme-panel isabelle.symbols-panel isabelle.syslog-panel
-isabelle.theories-panel.label=Theories panel
+plugin.isabelle.jedit.Plugin.menu= \
+  isabelle.graphview-panel \
+  isabelle.monitor-panel \
+  isabelle.output-panel \
+  isabelle.protocol-panel \
+  isabelle.raw-output-panel \
+  isabelle.readme-panel \
+  isabelle.symbols-panel \
+  isabelle.syslog-panel \
+  isabelle.theories-panel
+isabelle.graphview-panel.label=Graphview panel
+isabelle.monitor-panel.label=Monitor panel
 isabelle.output-panel.label=Output panel
-isabelle.graphview-panel.label=Graphview panel
+isabelle.protocol-panel.label=Protocol panel
 isabelle.raw-output-panel.label=Raw Output panel
-isabelle.protocol-panel.label=Protocol panel
 isabelle.readme-panel.label=README panel
 isabelle.symbols-panel.label=Symbols panel
 isabelle.syslog-panel.label=Syslog panel
+isabelle.theories-panel.label=Theories panel
 
 #dockables
-isabelle-theories.title=Theories
+isabelle-graphview.title=Graphview
+isabelle-info.title=Info
+isabelle-monitor.title=Monitor
 isabelle-output.title=Output
-isabelle-info.title=Info
-isabelle-graphview.title=Graphview
+isabelle-protocol.title=Protocol
 isabelle-raw-output.title=Raw Output
-isabelle-protocol.title=Protocol
 isabelle-readme.title=README
+isabelle-symbols.title=Symbols
 isabelle-syslog.title=Syslog
-isabelle-symbols.title=Symbols
+isabelle-theories.title=Theories
 
 #SideKick
 mode.isabelle-options.folding=sidekick
--- a/src/Tools/jEdit/src/actions.xml	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Tools/jEdit/src/actions.xml	Sat Dec 08 22:41:39 2012 +0100
@@ -37,6 +37,11 @@
 			wm.addDockableWindow("isabelle-protocol");
 		</CODE>
 	</ACTION>
+	<ACTION NAME="isabelle.monitor-panel">
+		<CODE>
+			wm.addDockableWindow("isabelle-monitor");
+		</CODE>
+	</ACTION>
 	<ACTION NAME="isabelle.symbols-panel">
 		<CODE>
 			wm.addDockableWindow("isabelle-symbols");
--- a/src/Tools/jEdit/src/dockables.xml	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Tools/jEdit/src/dockables.xml	Sat Dec 08 22:41:39 2012 +0100
@@ -26,6 +26,9 @@
 	<DOCKABLE NAME="isabelle-protocol" MOVABLE="TRUE">
 		new isabelle.jedit.Protocol_Dockable(view, position);
 	</DOCKABLE>
+	<DOCKABLE NAME="isabelle-monitor" MOVABLE="TRUE">
+		new isabelle.jedit.Monitor_Dockable(view, position);
+	</DOCKABLE>
 	<DOCKABLE NAME="isabelle-symbols" MOVABLE="TRUE">
 		new isabelle.jedit.Symbols_Dockable(view, position);
 	</DOCKABLE>
--- a/src/Tools/jEdit/src/isabelle.scala	Sat Dec 08 22:15:44 2012 +0100
+++ b/src/Tools/jEdit/src/isabelle.scala	Sat Dec 08 22:41:39 2012 +0100
@@ -44,6 +44,12 @@
       case _ => None
     }
 
+  def docked_monitor(view: View): Option[Monitor_Dockable] =
+    wm(view).getDockableWindow("isabelle-monitor") match {
+      case dockable: Monitor_Dockable => Some(dockable)
+      case _ => None
+    }
+
 
   /* font size */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/jEdit/src/monitor_dockable.scala	Sat Dec 08 22:41:39 2012 +0100
@@ -0,0 +1,77 @@
+/*  Title:      Tools/jEdit/src/monitor_dockable.scala
+    Author:     Makarius
+
+Monitor for runtime statistics.
+*/
+
+package isabelle.jedit
+
+
+import isabelle._
+
+import scala.actors.Actor._
+import scala.swing.{TextArea, ScrollPane, Component}
+
+import org.jfree.chart.{ChartFactory, ChartPanel}
+import org.jfree.data.time.{Millisecond, TimeSeries, TimeSeriesCollection}
+
+import org.gjt.sp.jedit.View
+
+
+class Monitor_Dockable(view: View, position: String) extends Dockable(view, position)
+{
+  /* properties */  // FIXME avoid hardwired stuff
+
+  private val Now = new Properties.Double("now")
+  private val Size_Heap = new Properties.Double("size_heap")
+
+  private val series = new TimeSeries("ML heap size", classOf[Millisecond])
+
+
+  /* chart */
+
+  private val chart_panel =
+  {
+    val data = new TimeSeriesCollection(series)
+    val chart = ChartFactory.createTimeSeriesChart(null, "Time", "Value", data, true, true, false)
+    val plot = chart.getXYPlot()
+
+    val x_axis = plot.getDomainAxis()
+    x_axis.setAutoRange(true)
+    x_axis.setFixedAutoRange(60000.0)
+
+    val y_axis = plot.getRangeAxis()
+    y_axis.setAutoRange(true)
+
+    new ChartPanel(chart)
+  }
+  set_content(chart_panel)
+
+
+  /* main actor */
+
+  private val main_actor = actor {
+    var t0: Option[Double] = None
+    loop {
+      react {
+        case Session.Statistics(stats) =>
+          java.lang.System.err.println(stats)
+          stats match {
+            case Now(t1) =>
+              if (t0.isEmpty) t0 = Some(t1)
+              val t = t1 - t0.get
+              stats match {
+                case Size_Heap(x) => series.add(new Millisecond(), x)  // FIXME proper time point
+                case _ =>
+              }
+            case _ =>
+          }
+        case bad => java.lang.System.err.println("Monitor_Dockable: ignoring bad message " + bad)
+      }
+    }
+  }
+
+  override def init() { PIDE.session.statistics += main_actor }
+  override def exit() { PIDE.session.statistics -= main_actor }
+}
+