[nemiver/profiler: 6/8] WIP



commit bfac39837bd10ded31bcaf00629653a889dafd62
Author: Fabien Parent <parent f gmail com>
Date:   Sat Jun 2 22:15:51 2012 +0200

    WIP

 configure.ac                                       |    2 +
 src/persp/profperspective/Makefile.am              |   12 +-
 src/persp/profperspective/menus/Makefile.am        |   10 ++
 src/persp/profperspective/menus/menus.xml          |   12 ++
 src/persp/profperspective/nmv-call-list.cc         |  158 ++++++++++++++++++++
 src/persp/profperspective/nmv-call-list.h          |   62 ++++++++
 .../profperspective/nmv-load-report-dialog.cc      |   63 ++++++++
 src/persp/profperspective/nmv-load-report-dialog.h |   53 +++++++
 src/persp/profperspective/nmv-prof-perspective.cc  |   84 ++++++++++-
 src/persp/profperspective/ui/Makefile.am           |    8 +
 src/persp/profperspective/ui/loadreportdialog.ui   |  117 +++++++++++++++
 11 files changed, 576 insertions(+), 5 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 8579045..524264a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -500,6 +500,8 @@ src/Makefile
     src/persp/dbgperspective/sqlscripts/sqlite/Makefile
   src/persp/profperspective/Makefile
   src/persp/profperspective/profperspective.conf
+    src/persp/profperspective/ui/Makefile
+    src/persp/profperspective/menus/Makefile
 data/Makefile
     data/icons/Makefile
         data/icons/16x16/Makefile
diff --git a/src/persp/profperspective/Makefile.am b/src/persp/profperspective/Makefile.am
index 7920e02..f88bea5 100644
--- a/src/persp/profperspective/Makefile.am
+++ b/src/persp/profperspective/Makefile.am
@@ -1,3 +1,5 @@
+SUBDIRS=ui menus
+
 h=$(abs_srcdir)
 
 plugin_config_files= \
@@ -15,7 +17,11 @@ plugin_LTLIBRARIES=libprofperspectiveplugin.la
 plugindir= NEMIVER_PLUGINS_DIR@/$(PLUGIN_NAME)
 sources= \
 $(h)/nmv-prof-perspective.cc \
-$(h)/nmv-prof-perspective.h
+$(h)/nmv-prof-perspective.h \
+$(h)/nmv-call-list.cc \
+$(h)/nmv-call-list.h \
+$(h)/nmv-load-report-dialog.cc \
+$(h)/nmv-load-report-dialog.h
 
 libprofperspectiveplugin_la_SOURCES=$(sources)
 libprofperspectiveplugin_la_LDFLAGS= -module -avoid-version -Wl,--as-needed
@@ -30,5 +36,5 @@ INCLUDES= NEMIVERPROFPERSP_CFLAGS@ -DENABLE_NLS=1 -DDATADIR=\"${datadir}\" \
 -I$(abs_top_srcdir)/src/uicommon \
 -I$(abs_top_srcdir)/src/workbench \
 -I$(abs_top_srcdir)/src/persp \
--I$(abs_top_srcdir)/src/profperspective
-
+-I$(abs_top_srcdir)/src/profperspective \
+-I$(abs_top_srcdir)/src/profengine
diff --git a/src/persp/profperspective/menus/Makefile.am b/src/persp/profperspective/menus/Makefile.am
new file mode 100644
index 0000000..2563be1
--- /dev/null
+++ b/src/persp/profperspective/menus/Makefile.am
@@ -0,0 +1,10 @@
+PLUGIN_NAME=profperspective
+
+menusfiles = \
+menus.xml
+
+menusdir = @NEMIVER_PLUGINS_DIR@/$(PLUGIN_NAME)/menus
+menus_DATA = $(menusfiles)
+
+EXTRA_DIST = $(menusfiles)
+
diff --git a/src/persp/profperspective/menus/menus.xml b/src/persp/profperspective/menus/menus.xml
new file mode 100644
index 0000000..940a2be
--- /dev/null
+++ b/src/persp/profperspective/menus/menus.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ <ui>
+  <menubar name="MenuBar">
+    <menu action="FileMenuAction" name="FileMenu">
+        <placeholder name="FileMenuAdditions">
+            <menuitem action="LoadReportMenuItemAction"
+                      name="LoadReportMenuItem"/>
+        </placeholder>
+    </menu>
+  </menubar>
+ </ui>
+
diff --git a/src/persp/profperspective/nmv-call-list.cc b/src/persp/profperspective/nmv-call-list.cc
new file mode 100644
index 0000000..6f5f2b4
--- /dev/null
+++ b/src/persp/profperspective/nmv-call-list.cc
@@ -0,0 +1,158 @@
+//Author: Fabien Parent
+/*
+ *This file is part of the Nemiver project
+ *
+ *Nemiver is free software; you can redistribute
+ *it and/or modify it under the terms of
+ *the GNU General Public License as published by the
+ *Free Software Foundation; either version 2,
+ *or (at your option) any later version.
+ *
+ *Nemiver is distributed in the hope that it will
+ *be useful, but WITHOUT ANY WARRANTY;
+ *without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *See the GNU General Public License for more details.
+ *
+ *You should have received a copy of the
+ *GNU General Public License along with Nemiver;
+ *see the file COPYING.
+ *If not, write to the Free Software Foundation,
+ *Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *See COPYRIGHT file copyright information.
+ */
+
+#include "nmv-call-list.h"
+#include "common/nmv-exception.h"
+#include "uicommon/nmv-ui-utils.h"
+#include <gtkmm/treeview.h>
+#include <gtkmm/treemodel.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <glib/gi18n.h>
+
+NEMIVER_BEGIN_NAMESPACE (nemiver)
+
+struct CallListColumns : public Gtk::TreeModel::ColumnRecord
+{
+    CallListColumns ()
+    {
+        add (function_name);
+        add (usage);
+        add (call_node);
+    }
+
+    Gtk::TreeModelColumn<CallGraphNodeSafePtr> call_node;
+    Gtk::TreeModelColumn<Glib::ustring> function_name;
+    Gtk::TreeModelColumn<float> usage;
+};
+
+struct CallList::Priv {
+    Gtk::TreeView treeview;
+    Gtk::ScrolledWindow body;
+    CallListColumns columns;
+    Glib::RefPtr<Gtk::TreeStore> store;
+    IProfilerSafePtr profiler;
+
+    Priv (const IProfilerSafePtr &a_profiler) :
+        profiler (a_profiler)
+    {
+        body.add (treeview);
+        body.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+        body.show_all ();
+
+        store = Gtk::TreeStore::create (columns);
+
+        Gtk::CellRendererProgress *renderer =
+            Gtk::manage (new Gtk::CellRendererProgress);
+        THROW_IF_FAIL (renderer);
+
+        treeview.append_column (_("Function"), columns.function_name);
+        int usage_col_id = treeview.append_column (_("Usage"), *renderer);
+        treeview.set_model (store);
+        //treeview.signal_row_activated ().connect
+        //    (sigc::mem_fun (*this, &CallList::Priv::on_signal_row_activated));
+
+        Gtk::TreeViewColumn *column = treeview.get_column (usage_col_id - 1);
+        if (column) {
+            column->add_attribute (renderer->property_value(), columns.usage);
+        }
+    }
+
+/*    void
+    on_signal_row_activated (const Gtk::TreeModel::Path &a_path,
+                             Gtk::TreeViewColumn*)
+    {
+        NEMIVER_TRY
+
+        THROW_IF_FAIL (store);
+
+        Gtk::TreeModel::iterator iter = store->get_iter (a_path);
+        if (!iter) {
+            return;
+        }
+
+        CallNodeSafePtr call_node = iter->get_value (columns.call_node);
+        THROW_IF_FAIL (call_node);
+        
+        THROW_IF_FAIL (profiler);
+        profiler->annotate_source_file (call_node->filepath ());
+
+        NEMIVER_CATCH
+    }
+*/
+
+    void
+    add_node (CallGraphNodeSafePtr a_call_graph_node,
+              Gtk::TreeModel::iterator a_parent = Gtk::TreeModel::iterator ())
+    {
+        const std::list<CallGraphNodeSafePtr>& children =
+            a_call_graph_node->children ();
+        for (std::list<CallGraphNodeSafePtr>::const_iterator iter =
+                 children.begin ();
+             iter != children.end ();
+             ++iter) {
+
+            Gtk::TreeModel::iterator row;
+            if (a_parent) {
+                row = store->append (a_parent->children ());
+            } else {
+                row = store->append ();
+            }
+
+            if (row) {
+                (*row)[columns.function_name] = (*iter)->function ();
+                (*row)[columns.usage] = (*iter)->percentage ();
+                (*row)[columns.call_node] = *iter;
+            }
+
+            add_node (*iter, row);
+        }
+    }
+};
+
+Gtk::Widget& CallList::widget () const
+{
+    THROW_IF_FAIL (m_priv);
+    return m_priv->body;
+}
+
+void
+CallList::load_call_graph (CallGraphSafePtr a_call_graph)
+{
+    THROW_IF_FAIL (m_priv);
+    m_priv->add_node(a_call_graph);
+}
+
+CallList::CallList (const IProfilerSafePtr &a_profiler) :
+    m_priv (new Priv (a_profiler))
+{
+}
+
+CallList::~CallList ()
+{
+}
+
+NEMIVER_END_NAMESPACE (nemiver)
+
diff --git a/src/persp/profperspective/nmv-call-list.h b/src/persp/profperspective/nmv-call-list.h
new file mode 100644
index 0000000..436ebb5
--- /dev/null
+++ b/src/persp/profperspective/nmv-call-list.h
@@ -0,0 +1,62 @@
+//Author: Fabien Parent
+/*
+ *This file is part of the Nemiver project
+ *
+ *Nemiver is free software; you can redistribute
+ *it and/or modify it under the terms of
+ *the GNU General Public License as published by the
+ *Free Software Foundation; either version 2,
+ *or (at your option) any later version.
+ *
+ *Nemiver is distributed in the hope that it will
+ *be useful, but WITHOUT ANY WARRANTY;
+ *without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *See the GNU General Public License for more details.
+ *
+ *You should have received a copy of the
+ *GNU General Public License along with Nemiver;
+ *see the file COPYING.
+ *If not, write to the Free Software Foundation,
+ *Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *See COPYRIGHT file copyright information.
+ */
+#ifndef __NMV_CALL_LIST_H__
+#define __NMV_CALL_LIST_H__
+
+#include "common/nmv-safe-ptr.h"
+#include "common/nmv-namespace.h"
+#include "nmv-call-graph-node.h"
+#include "nmv-i-profiler.h"
+
+namespace Gtk {
+    class Widget;
+}
+
+NEMIVER_BEGIN_NAMESPACE (nemiver)
+
+using common::SafePtr;
+
+class CallNode;
+typedef CallNode CallTree;
+
+class CallList {
+    //non copyable
+    CallList (const CallList&);
+    CallList& operator= (const CallList&);
+
+    struct Priv;
+    SafePtr<Priv> m_priv;
+public:
+
+    CallList (const IProfilerSafePtr&);
+    ~CallList ();
+    Gtk::Widget& widget () const;
+    void load_call_graph (CallGraphSafePtr);
+};
+
+NEMIVER_END_NAMESPACE (nemiver)
+
+#endif //__NMV_CALL_LIST_H__
+
diff --git a/src/persp/profperspective/nmv-load-report-dialog.cc b/src/persp/profperspective/nmv-load-report-dialog.cc
new file mode 100644
index 0000000..18a8cbc
--- /dev/null
+++ b/src/persp/profperspective/nmv-load-report-dialog.cc
@@ -0,0 +1,63 @@
+//Author: Fabien Parent
+/*
+ *This file is part of the Nemiver project
+ *
+ *Nemiver is free software; you can redistribute
+ *it and/or modify it under the terms of
+ *the GNU General Public License as published by the
+ *Free Software Foundation; either version 2,
+ *or (at your option) any later version.
+ *
+ *Nemiver is distributed in the hope that it will
+ *be useful, but WITHOUT ANY WARRANTY;
+ *without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *See the GNU General Public License for more details.
+ *
+ *You should have received a copy of the
+ *GNU General Public License along with Nemiver;
+ *see the file COPYING.
+ *If not, write to the Free Software Foundation,
+ *Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *See COPYRIGHT file copyright information.
+ */
+#include "config.h"
+#include <vector>
+#include <glib/gi18n.h>
+#include <gtkmm/dialog.h>
+#include <gtkmm/filechooserbutton.h>
+#include <gtkmm/stock.h>
+#include "common/nmv-exception.h"
+#include "common/nmv-env.h"
+#include "common/nmv-ustring.h"
+#include "nmv-load-report-dialog.h"
+#include "nmv-ui-utils.h"
+
+using namespace std;
+using namespace nemiver::common;
+
+NEMIVER_BEGIN_NAMESPACE (nemiver)
+
+class LoadReportDialog::Priv {
+    Gtk::Button *okbutton;
+
+public:
+    Priv (const Glib::RefPtr<Gtk::Builder> &/*a_gtkbuilder*/) :
+        okbutton (0)
+    {
+    }
+};//end class LoadReportDialog::Priv
+
+LoadReportDialog::LoadReportDialog (const UString &a_root_path) :
+    Dialog (a_root_path, "loadreportdialog.ui", "loadreportdialog")
+{
+    m_priv.reset (new Priv (gtkbuilder ()));
+}
+
+LoadReportDialog::~LoadReportDialog ()
+{
+}
+
+NEMIVER_END_NAMESPACE (nemiver)
+
diff --git a/src/persp/profperspective/nmv-load-report-dialog.h b/src/persp/profperspective/nmv-load-report-dialog.h
new file mode 100644
index 0000000..f57011b
--- /dev/null
+++ b/src/persp/profperspective/nmv-load-report-dialog.h
@@ -0,0 +1,53 @@
+//Author: Fabien Parent
+/*
+ *This file is part of the Nemiver project
+ *
+ *Nemiver is free software; you can redistribute
+ *it and/or modify it under the terms of
+ *the GNU General Public License as published by the
+ *Free Software Foundation; either version 2,
+ *or (at your option) any later version.
+ *
+ *Nemiver is distributed in the hope that it will
+ *be useful, but WITHOUT ANY WARRANTY;
+ *without even the implied warranty of
+ *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *See the GNU General Public License for more details.
+ *
+ *You should have received a copy of the
+ *GNU General Public License along with Nemiver;
+ *see the file COPYING.
+ *If not, write to the Free Software Foundation,
+ *Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *See COPYRIGHT file copyright information.
+ */
+#ifndef __NMV_LOAD_REPORT_DIALOG_H__
+#define __NMV_LOAD_REPORT_DIALOG_H__
+
+#include "common/nmv-safe-ptr-utils.h"
+#include "nmv-dialog.h"
+
+NEMIVER_BEGIN_NAMESPACE (nemiver)
+
+namespace common {
+class UString;
+}
+
+using nemiver::common::UString;
+using nemiver::common::SafePtr;
+
+class LoadReportDialog : public Dialog {
+    class Priv;
+    SafePtr<Priv> m_priv;
+
+public:
+    LoadReportDialog (const UString &a_resource_root_path);
+    virtual ~LoadReportDialog ();
+
+};//end class LoadReportDialog
+
+NEMIVER_END_NAMESPACE (nemiver)
+
+#endif //__NMV_LOAD_REPORT_DIALOG_H__
+
diff --git a/src/persp/profperspective/nmv-prof-perspective.cc b/src/persp/profperspective/nmv-prof-perspective.cc
index f78cc6a..7757a7c 100644
--- a/src/persp/profperspective/nmv-prof-perspective.cc
+++ b/src/persp/profperspective/nmv-prof-perspective.cc
@@ -24,7 +24,11 @@
  */
 
 #include "nmv-prof-perspective.h"
+#include "nmv-ui-utils.h"
+#include "nmv-load-report-dialog.h"
+
 #include <list>
+#include <glib/gi18n.h>
 #include <gtkmm/widget.h>
 
 NEMIVER_BEGIN_NAMESPACE (nemiver)
@@ -34,8 +38,10 @@ class ProfPerspective : public IProfPerspective {
     ProfPerspective (const IProfPerspective&);
     ProfPerspective& operator= (const IProfPerspective&);
 
-    Gtk::TextView body;
+    Glib::RefPtr<Gtk::ActionGroup> default_action_group;
+    Gtk::HPaned body;
     IWorkbench *workbench;
+
     sigc::signal<void, bool> signal_activated;
     sigc::signal<void> signal_layout_changed;
 
@@ -57,6 +63,9 @@ public:
     Gtk::Widget* load_menu (const UString &a_filename,
                             const UString &a_widget_name);
     bool agree_to_shutdown ();
+    void init_actions ();
+    void load_report_file ();
+    void on_load_report_file_action ();
 
     sigc::signal<void, bool>& activated_signal ();
     sigc::signal<void>& layout_changed_signal ();
@@ -98,6 +107,7 @@ void
 ProfPerspective::do_init (IWorkbench *a_workbench)
 {
     workbench = a_workbench;
+    init_actions ();
 }
 
 const UString&
@@ -126,10 +136,80 @@ ProfPerspective::get_workbench ()
     return *workbench;
 }
 
+void
+ProfPerspective::init_actions ()
+{
+    Gtk::StockID nil_stock_id ("");
+    sigc::slot<void> nil_slot;
+    Glib::RefPtr<Gtk::UIManager> uimanager = get_workbench ().get_ui_manager ();
+    THROW_IF_FAIL (uimanager);
+
+    static ui_utils::ActionEntry s_default_action_entries [] = {
+        {
+            "LoadReportMenuItemAction",
+            nil_stock_id,
+            _("_Load Report File..."),
+            _("Load a report file from disk"),
+            sigc::mem_fun (*this, &ProfPerspective::on_load_report_file_action),
+            ui_utils::ActionEntry::DEFAULT,
+            "",
+            false
+        }
+    };
+
+    default_action_group =
+        Gtk::ActionGroup::create ("profiler-default-action-group");
+    default_action_group->set_sensitive (true);
+
+    int num_actions =
+        sizeof (s_default_action_entries) / sizeof (ui_utils::ActionEntry);
+
+    ui_utils::add_action_entries_to_action_group
+        (s_default_action_entries, num_actions, default_action_group);
+
+    uimanager->insert_action_group (default_action_group);
+
+    get_workbench ().get_root_window ().add_accel_group
+        (uimanager->get_accel_group ());
+}
+
 std::list<Gtk::UIManager::ui_merge_id>
 ProfPerspective::edit_workbench_menu ()
 {
-    return std::list<Gtk::UIManager::ui_merge_id> ();
+    std::string relative_path = Glib::build_filename ("menus", "menus.xml");
+    std::string absolute_path;
+    THROW_IF_FAIL (build_absolute_resource_path
+        (Glib::filename_to_utf8 (relative_path), absolute_path));
+
+    Glib::RefPtr<Gtk::UIManager> uimanager = get_workbench ().get_ui_manager ();
+    THROW_IF_FAIL (uimanager);
+    Gtk::UIManager::ui_merge_id menubar_merge_id =
+        uimanager->add_ui_from_file (Glib::filename_to_utf8 (absolute_path));
+
+    std::list<Gtk::UIManager::ui_merge_id> merge_ids;
+    merge_ids.push_back (menubar_merge_id);
+    return merge_ids;
+}
+
+void
+ProfPerspective::load_report_file ()
+{
+    LoadReportDialog dialog (plugin_path ());
+
+    int result = dialog.run ();
+    if (result != Gtk::RESPONSE_OK) {
+        return;
+    }
+}
+
+void
+ProfPerspective::on_load_report_file_action ()
+{
+    NEMIVER_TRY
+
+    load_report_file ();
+
+    NEMIVER_CATCH
 }
 
 Gtk::Widget*
diff --git a/src/persp/profperspective/ui/Makefile.am b/src/persp/profperspective/ui/Makefile.am
new file mode 100644
index 0000000..b7347c3
--- /dev/null
+++ b/src/persp/profperspective/ui/Makefile.am
@@ -0,0 +1,8 @@
+PLUGIN_NAME=profperspective
+uifiles = loadreportdialog.ui
+
+uidir = @NEMIVER_PLUGINS_DIR@/$(PLUGIN_NAME)/ui
+ui_DATA = $(uifiles)
+
+EXTRA_DIST = $(uifiles)
+
diff --git a/src/persp/profperspective/ui/loadreportdialog.ui b/src/persp/profperspective/ui/loadreportdialog.ui
new file mode 100644
index 0000000..f4396ae
--- /dev/null
+++ b/src/persp/profperspective/ui/loadreportdialog.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkDialog" id="loadreportdialog">
+    <property name="width_request">300</property>
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Choose a Report File</property>
+    <property name="resizable">False</property>
+    <property name="default_width">350</property>
+    <property name="default_height">200</property>
+    <property name="type_hint">dialog</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="cancelbutton">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="okbutton">
+                <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">6</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkFrame" id="frame_reportfile">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">none</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <object class="GtkFileChooserButton" id="filechooserbutton_reportfile">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="title" translatable="yes">Select A Core File</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label_reportfile">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Report File:&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">cancelbutton</action-widget>
+      <action-widget response="-5">okbutton</action-widget>
+    </action-widgets>
+  </object>
+</interface>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]