summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Thompson <will@willthompson.co.uk>2012-01-23 08:55:51 +0000
committerWill Thompson <will@willthompson.co.uk>2012-01-23 08:57:57 +0000
commite0200367c6134db99d391de0f19ccf321aa68a96 (patch)
tree5ddb289650a8ced4c71a46d510a9817099dd8fd8
parent1d935e6fa85fe9e2adf06cfa8e0db75305646064 (diff)
Convert main window to GtkBuilder
-rw-r--r--Bustle/StatisticsPane.hs7
-rw-r--r--Bustle/UI.hs17
-rw-r--r--Bustle/UI/Canvas.hs7
-rw-r--r--bustle.cabal1
-rw-r--r--data/bustle.glade320
-rw-r--r--data/bustle.ui371
6 files changed, 387 insertions, 336 deletions
diff --git a/Bustle/StatisticsPane.hs b/Bustle/StatisticsPane.hs
index 2d14ab8..90d5bb6 100644
--- a/Bustle/StatisticsPane.hs
+++ b/Bustle/StatisticsPane.hs
@@ -27,7 +27,6 @@ import Control.Applicative ((<$>))
import Control.Monad (forM_)
import Text.Printf
import Graphics.UI.Gtk hiding (Markup)
-import Graphics.UI.Gtk.Glade
import Bustle.Stats
import Bustle.Types (Log)
import qualified Bustle.Markup as Markup
@@ -40,12 +39,12 @@ data StatsPane =
, spSizeStore :: ListStore SizeInfo
}
-statsPaneNew :: GladeXML
+statsPaneNew :: Builder
-> Maybe Pixbuf
-> Maybe Pixbuf
-> IO StatsPane
-statsPaneNew xml methodIcon signalIcon = do
- [frequencySW, durationSW, sizeSW] <- mapM (xmlGetWidget xml castToScrolledWindow)
+statsPaneNew builder methodIcon signalIcon = do
+ [frequencySW, durationSW, sizeSW] <- mapM (builderGetObject builder castToScrolledWindow)
["frequencySW", "durationSW", "sizeSW"]
(countStore, countView) <- newCountView methodIcon signalIcon
diff --git a/Bustle/UI.hs b/Bustle/UI.hs
index 7164105..874151a 100644
--- a/Bustle/UI.hs
+++ b/Bustle/UI.hs
@@ -54,7 +54,6 @@ import Bustle.Loader
import System.Glib.GError (GError(..), catchGError)
import Graphics.UI.Gtk
-import Graphics.UI.Gtk.Glade
import Graphics.Rendering.Cairo (withPDFSurface, renderWith)
@@ -83,7 +82,7 @@ data Page =
data WindowInfo =
WindowInfo { wiWindow :: Window
, wiSave :: ImageMenuItem
- , wiExport :: ImageMenuItem
+ , wiExport :: MenuItem
, wiViewStatistics :: CheckMenuItem
, wiFilterNames :: MenuItem
, wiNotebook :: Notebook
@@ -317,15 +316,17 @@ maybeQuit = do
emptyWindow :: B WindowInfo
emptyWindow = do
- Just xml <- io $ xmlNew =<< getDataFileName "data/bustle.glade"
+ builder <- io builderNew
+ io $ builderAddFromFile builder =<< getDataFileName "data/bustle.ui"
-- Grab a bunch of widgets. Surely there must be a better way to do this?
- let getW cast name = io $ xmlGetWidget xml cast name
+ let getW cast name = io $ builderGetObject builder cast name
window <- getW castToWindow "diagramWindow"
- [newItem, openItem, saveItem, exportItem, closeItem, aboutItem] <-
+ [newItem, openItem, saveItem, closeItem, aboutItem] <-
mapM (getW castToImageMenuItem)
- ["new", "open", "save", "export", "close", "about"]
+ ["new", "open", "save", "close", "about"]
+ exportItem <- getW castToMenuItem "export"
openTwoItem <- getW castToMenuItem "openTwo"
viewStatistics <- getW castToCheckMenuItem "statistics"
filterNames <- getW castToMenuItem "filter"
@@ -356,7 +357,7 @@ emptyWindow = do
m <- asks methodIcon
s <- asks signalIcon
- statsPane <- io $ statsPaneNew xml m s
+ statsPane <- io $ statsPaneNew builder m s
details <- io $ detailsViewNew
io $ do
@@ -370,7 +371,7 @@ emptyWindow = do
io $ widgetHide statsBook
showBounds <- asks debugEnabled
- canvas <- io $ canvasNew xml showBounds (updateDetailsView details)
+ canvas <- io $ canvasNew builder showBounds (updateDetailsView details)
logDetailsRef <- io $ newIORef Nothing
let windowInfo = WindowInfo { wiWindow = window
diff --git a/Bustle/UI/Canvas.hs b/Bustle/UI/Canvas.hs
index 86c4060..46c1582 100644
--- a/Bustle/UI/Canvas.hs
+++ b/Bustle/UI/Canvas.hs
@@ -34,7 +34,6 @@ import Data.IORef
import Control.Monad (when)
import Graphics.UI.Gtk
-import Graphics.UI.Gtk.Glade
import Bustle.Diagram
import Bustle.Regions
@@ -54,12 +53,12 @@ data Canvas a =
}
canvasNew :: Eq a
- => GladeXML
+ => Builder
-> Bool
-> (Maybe a -> IO ())
-> IO (Canvas a)
-canvasNew xml showBounds selectionChangedCb = do
- layout <- xmlGetWidget xml castToLayout "diagramLayout"
+canvasNew builder showBounds selectionChangedCb = do
+ layout <- builderGetObject builder castToLayout "diagramLayout"
idRef <- newIORef Nothing
shapesRef <- newIORef []
widthRef <- newIORef 0
diff --git a/bustle.cabal b/bustle.cabal
index 4e00087..988dcbb 100644
--- a/bustle.cabal
+++ b/bustle.cabal
@@ -12,6 +12,7 @@ Data-files: data/bustle.png,
data/dfeet-method.png,
data/dfeet-signal.png,
data/bustle.glade,
+ data/bustle.ui,
LICENSE
Build-type: Simple
Extra-source-files:
diff --git a/data/bustle.glade b/data/bustle.glade
index e6e07d1..d1f6156 100644
--- a/data/bustle.glade
+++ b/data/bustle.glade
@@ -2,326 +2,6 @@
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
- <widget class="GtkWindow" id="diagramWindow">
- <property name="title" translatable="yes">No document &#x2014; Bustle</property>
- <property name="default_width">900</property>
- <property name="default_height">700</property>
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <child>
- <widget class="GtkMenuBar" id="menubar1">
- <property name="visible">True</property>
- <child>
- <widget class="GtkMenuItem" id="menuitem1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_File</property>
- <property name="use_underline">True</property>
- <child>
- <widget class="GtkMenu" id="menu1">
- <property name="visible">True</property>
- <child>
- <widget class="GtkImageMenuItem" id="new">
- <property name="label">gtk-new</property>
- <property name="visible">True</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkImageMenuItem" id="open">
- <property name="label">gtk-open</property>
- <property name="visible">True</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="openTwo">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Display two logs&#x2014;one for the session bus, one for the system bus&#x2014;side by side.</property>
- <property name="label" translatable="yes">O_pen a pair of logs&#x2026;</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkImageMenuItem" id="save">
- <property name="label">gtk-save</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkImageMenuItem" id="export">
- <property name="label">_Export as PDF…</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="use_underline">True</property>
- <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK | GDK_SHIFT_MASK"/>
- </widget>
- </child>
- <child>
- <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
- <property name="visible">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkImageMenuItem" id="close">
- <property name="label">gtk-close</property>
- <property name="visible">True</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menuitem2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_View</property>
- <property name="use_underline">True</property>
- <child>
- <widget class="GtkMenu" id="menu2">
- <property name="visible">True</property>
- <child>
- <widget class="GtkMenuItem" id="filter">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="label" translatable="yes">_Filter visible services…</property>
- <property name="use_underline">True</property>
- <accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/>
- </widget>
- </child>
- <child>
- <widget class="GtkCheckMenuItem" id="statistics">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="label" translatable="yes">_Statistics</property>
- <property name="use_underline">True</property>
- <accelerator key="F9" signal="activate"/>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menuitem4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Help</property>
- <property name="use_underline">True</property>
- <child>
- <widget class="GtkMenu" id="menu3">
- <property name="visible">True</property>
- <child>
- <widget class="GtkImageMenuItem" id="about">
- <property name="label">gtk-about</property>
- <property name="visible">True</property>
- <property name="use_underline">True</property>
- <property name="use_stock">True</property>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkNotebook" id="diagramOrNot">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">False</property>
- <property name="show_border">False</property>
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">
- &lt;big&gt;&lt;b&gt;No log loaded&lt;/b&gt;&lt;/big&gt;
-
- • Choose &lt;b&gt;File → New&lt;/b&gt; to record a new D-Bus traffic log;
- • Choose &lt;b&gt;File → Open&lt;/b&gt; to load a previously-recorded log.
-
- You may also use the &lt;i&gt;bustle-pcap&lt;/i&gt; command-line tool to record logs.
- </property>
- <property name="use_markup">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Please Hold</property>
- </widget>
- <packing>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">
- &lt;big&gt;&lt;b&gt;Waiting for D-Bus traffic; please hold…&lt;/b&gt;&lt;/big&gt;
- </property>
- <property name="use_markup">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Instructions</property>
- </widget>
- <packing>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHPaned" id="hpaned1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="position_set">True</property>
- <child>
- <widget class="GtkNotebook" id="statsBook">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_border">False</property>
- <child>
- <widget class="GtkScrolledWindow" id="frequencySW">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">automatic</property>
- <child>
- <placeholder/>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="frequencyTabLabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Message frequencies</property>
- </widget>
- <packing>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- <child>
- <widget class="GtkScrolledWindow" id="durationSW">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">automatic</property>
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="durationTabLabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Method durations</property>
- </widget>
- <packing>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- <child>
- <widget class="GtkScrolledWindow" id="sizeSW">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">never</property>
- <property name="vscrollbar_policy">automatic</property>
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="sizeTabLabel">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Message sizes</property>
- </widget>
- <packing>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="resize">True</property>
- <property name="shrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVPaned" id="contentVPaned">
- <property name="visible">True</property>
- <property name="position">100000</property>
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <child>
- <widget class="GtkLayout" id="diagramLayout">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="resize">True</property>
- <property name="shrink">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Diagram</property>
- </widget>
- <packing>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="GtkDialog" id="openTwoDialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Open a pair of logs</property>
diff --git a/data/bustle.ui b/data/bustle.ui
new file mode 100644
index 0000000..fbfb41f
--- /dev/null
+++ b/data/bustle.ui
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkWindow" id="diagramWindow">
+ <property name="can_focus">False</property>
+ <property name="default_width">900</property>
+ <property name="default_height">700</property>
+ <child>
+ <object class="GtkVBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="menuitem1">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="new">
+ <property name="label">gtk-new</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="open">
+ <property name="label">gtk-open</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="openTwo">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip_text" translatable="yes">Display two logs—one for the session bus, one for the system bus—side by side.</property>
+ <property name="label" translatable="yes">O_pen a pair of logs…</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="save">
+ <property name="label">gtk-save-as</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="export">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Export as PDF…</property>
+ <property name="use_underline">True</property>
+ <accelerator key="s" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="close">
+ <property name="label">gtk-close</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <accelerator key="w" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem3">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_View</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="filter">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Filter visible services…</property>
+ <property name="use_underline">True</property>
+ <accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckMenuItem" id="statistics">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Statistics</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F9" signal="activate"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="menuitem4">
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Help</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkImageMenuItem" id="about">
+ <property name="label">gtk-about</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkNotebook" id="diagramOrNot">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="show_tabs">False</property>
+ <property name="show_border">False</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;No log loaded&lt;/b&gt;&lt;/big&gt;
+
+• Choose &lt;b&gt;File → New&lt;/b&gt; to record a new D-Bus traffic log;
+• Choose &lt;b&gt;File → Open&lt;/b&gt; to load a previously-recorded log.
+
+You may also use the &lt;i&gt;bustle-pcap&lt;/i&gt; command-line tool to record logs.</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Instructions</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Waiting for D-Bus traffic; please hold…&lt;/b&gt;&lt;/big&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Please hold</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkHPaned" id="paned1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkNotebook" id="statsBook">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="frequencySW">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Message frequencies</property>
+ </object>
+ <packing>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="durationSW">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Method durations</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="sizeSW">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Message sizes</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVPaned" id="contentVPaned">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="vscrollbar_policy">always</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkLayout" id="diagramLayout">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Diagram</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>