[tracker/new-tracker-search-tool] New tracker search tool - first version



commit 5fceea4b16259d17976700d62ea32ed6400379ad
Author: Jamie McCracken <jamiemcc gnome org>
Date:   Mon Sep 21 10:58:51 2009 -0400

    New tracker search tool - first version

 configure.ac                                       |   43 +-
 src/tracker-search-tool/Makefile.am                |   89 +-
 src/tracker-search-tool/tracker-category-view.gs   |   91 +
 src/tracker-search-tool/tracker-entry.gs           |   28 +
 src/tracker-search-tool/tracker-query.gs           |   65 +
 src/tracker-search-tool/tracker-result-grid.gs     |  102 +
 .../tracker-search-tool-callbacks.c                | 1699 --------------
 .../tracker-search-tool-callbacks.h                |  213 --
 .../tracker-search-tool-support.c                  | 1524 -------------
 .../tracker-search-tool-support.h                  |  180 --
 src/tracker-search-tool/tracker-search-tool.c      | 2344 --------------------
 src/tracker-search-tool/tracker-search-tool.gs     |   66 +
 src/tracker-search-tool/tracker-utils.gs           |   76 +
 src/tracker-search-tool/tst.ui                     |  135 ++
 14 files changed, 623 insertions(+), 6032 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 4759a84..653fc79 100644
--- a/configure.ac
+++ b/configure.ac
@@ -813,43 +813,24 @@ AC_ARG_ENABLE(tracker-search-tool,
 	      [enable_tracker_search_tool=auto])
 
 if test "x$enable_tracker_search_tool" != "xno"; then
-   PKG_CHECK_MODULES(GNOME_UTILS, 
-		     [libgnome-2.0 >= $LIBGNOME_REQUIRED
-		      libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED],
-	             [have_gnome_libs=yes], 
-		     [have_gnome_libs=no])
-
-   AC_SUBST(GNOME_UTILS_CFLAGS)
-   AC_SUBST(GNOME_UTILS_LIBS)
-
-   PKG_CHECK_MODULES(GNOMEDESKTOP, 
-  		     [gnome-desktop-2.0 >= $LIBGNOME_DESKTOP_REQUIRED],
-        	     [have_gnome_desktop=yes], 
-	 	     [have_gnome_desktop=no])
-
-   AC_SUBST(GNOMEDESKTOP_CFLAGS)
-   AC_SUBST(GNOMEDESKTOP_LIBS)
-
-   if test "x$have_gnome_libs" != "xyes"; then
-      tracker_search_tool_error="Couldn't find GNOME library dependencies (libgnome-2.0 >= $LIBGNOME_REQUIRED, libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED)."
-      have_tracker_search_tool="no"
-   elif test "x$have_gnome_desktop" != "xyes"; then
-      tracker_search_tool_error="Couldn't find GNOME desktop dependencies (gnome-desktop-2.0 >= $LIBGNOME_DESKTOP_REQUIRED)."
-      have_tracker_search_tool="no"
-   elif test "x$have_libtrackergtk" != "xyes"; then
-      tracker_search_tool_error="Not building tracker-search-tool because libtracker-gtk is disabled or missing dependencies."
-      have_tracker_search_tool="no"
-   else 
-      have_tracker_search_tool="yes"
-      GNOME_COMMON_INIT
-   fi
+   PKG_CHECK_MODULES(TRACKER_SEARCH_TOOL, [
+		glib-2.0    >= $GLIB_REQUIRED
+		gtk+-2.0    >= $GTK_REQUIRED
+		dbus-1      >= $DBUS_REQUIRED
+		dbus-glib-1 >= $DBUS_REQUIRED
+		gee-1.0     >= $GEE_REQUIRED],
+		[have_tracker_search_tool=yes],
+		[have_tracker_search_tool=no])
+
+   AC_SUBST([TRACKER_SEARCH_TOOL_CFLAGS])
+   AC_SUBST([TRACKER_SEARCH_TOOL_LIBS])
 else
    have_tracker_search_tool="no  (disabled)"
 fi
 
 if test "x$enable_tracker_search_tool" = "xyes"; then
    if test "x$have_tracker_search_tool" != "xyes"; then
-      AC_MSG_ERROR([$tracker_search_tool_error])
+      AC_MSG_ERROR([Couldn't find tracker-search-tool dependencies (glib-2.0 >= $GLIB_REQUIRED, gtk+-2.0 >= $GTK_REQUIRED, dbus-1 >= $DBUS_REQUIRED, dbus-glib-1 >= $DBUS_REQUIRED, gee-1.0 >= $GEE_REQUIRED).])
    fi
 fi
 
diff --git a/src/tracker-search-tool/Makefile.am b/src/tracker-search-tool/Makefile.am
index b6a9f8c..10ae4f4 100644
--- a/src/tracker-search-tool/Makefile.am
+++ b/src/tracker-search-tool/Makefile.am
@@ -1,50 +1,57 @@
 include $(top_srcdir)/Makefile.decl
 
- INTLTOOL_DESKTOP_RULE@
-
-INCLUDES = 	\
-	-DG_DISABLE_DEPRECATED					\
-	-DTRACKER_LOCALEDIR=\""$(localedir)"\" 			\
-	-DTRACKER_DATADIR=\""$(datadir)"\"			\
-	-DGREP_COMMAND=\""$(GREP_COMMAND)"\"			\
-	-I$(top_srcdir)/src/					\
-	$(WARN_CFLAGS)						\
-	$(GLIB2_CFLAGS)						\
-	$(GCOV_CFLAGS)						\
-	$(GIO_CFLAGS)						\
-	$(DBUS_CFLAGS)						\
-	$(GNOME_UTILS_CFLAGS)					\
-	$(GNOMEDESKTOP_CFLAGS)					\
-	$(LIBTRACKERGTK_CFLAGS)					
-
 bin_PROGRAMS = tracker-search-tool
 
-tracker_search_tool_SOURCES =     				\
-	tracker-search-tool-support.c   			\
-	tracker-search-tool-support.h   			\
-	tracker-search-tool-callbacks.c 			\
-	tracker-search-tool-callbacks.h 			\
-	tracker-search-tool.c	        			\
-	tracker-search-tool.h
-
-tracker_search_tool_LDADD =   					\
-	$(GLIB2_LIBS) 						\
-	$(GNOME_UTILS_LIBS) 					\
-	$(GIO_LIBS)    						\
-	$(GCOV_LIBS)    						\
-	$(GNOMEDESKTOP_LIBS) 					\
-	$(DBUS_LIBS)						\
-        $(top_builddir)/src/libtracker-gtk/libtracker-gtk- TRACKER_API_VERSION@.la 	\
-	$(top_builddir)/src/libtracker-client/libtracker-client- TRACKER_API_VERSION@.la 
+tracker_search_tool_VALASOURCES = \
+	tracker-query.gs \
+	tracker-entry.gs \
+	tracker-result-grid.gs \	
+    tracker-search-tool.gs \
+    tracker-category-view.gs \
+    tracker-utils.gs \
+	$(NULL)
 
 
-desktopdir = $(datadir)/applications
-desktop_DATA = tracker-search-tool.desktop
+tracker_search_tool_SOURCES = \
+	$(tracker_search_tool_VALASOURCES:.gs=.c) \
+	$(NULL)
 
-icondir = $(datadir)/tracker/icons
-icon_DATA = thumbnail_frame.png
+tracker_search_tool.gs.stamp: $(tracker_search_tool_VALASOURCES)
+	$(VALAC) -C -g --pkg dbus-glib-1 --pkg gee-1.0 --pkg gtk+-2.0 $^
+	touch tracker_search_tool.gs.stamp
 
-EXTRA_DIST = $(icon_DATA)
-
-CLEANFILES = $(desktop_DATA)
+tracker_search_tool_CFLAGS = \
+	-DTRACKER_UI_DIR=\"$(datadir)/tracker/\"		\
+	-DSRCDIR=\"$(abs_srcdir)/\"				\
+	$(WARN_CFLAGS)						\
+	$(GCOV_CFLAGS)						\
+	$(TRACKER_SEARCH_TOOL_CFLAGS)	\
+	-include$(top_srcdir)/config.h  \
+	$(NULL)
+
+tracker_search_tool_LDADD = \
+	$(GCOV_LIBS)						\
+	$(TRACKER_SEARCH_TOOL_LIBS)				\
+	$(NULL)
+
+uidir = $(datadir)/tracker
+ui_DATA = \
+	tst.ui
+
+
+EXTRA_DIST = \
+	$(tracker_search_tool_SOURCES) \
+	$(tracker_search_tool_VALASOURCES) \
+	tracker_search_tool.gs.stamp \
+	tst.ui \
+	$(NULL)
+
+MAINTAINERCLEANFILES = \
+	$(tracker_search_tool_SOURCES) \
+	tracker_search_tool.gs.stamp \
+	$(NULL)
+
+BUILT_SOURCES = \
+	tracker_search_tool.gs.stamp \
+	$(NULL)
 
diff --git a/src/tracker-search-tool/tracker-category-view.gs b/src/tracker-search-tool/tracker-category-view.gs
new file mode 100644
index 0000000..9317593
--- /dev/null
+++ b/src/tracker-search-tool/tracker-category-view.gs
@@ -0,0 +1,91 @@
+[indent=4]
+
+uses
+    Gtk
+    TrackerUtils
+    
+    
+enum CategoryColumns
+    Icon
+    Name
+    DisplayName
+    NumOfCols
+
+
+const icon_size : int = 16
+    
+class TrackerCategoryView : ScrolledWindow
+    store : ListStore
+    treeview : TreeView
+    
+    prop Query : TrackerQuery
+    
+    init
+   
+        hscrollbar_policy = PolicyType.NEVER
+        vscrollbar_policy = PolicyType.AUTOMATIC
+        shadow_type = ShadowType.ETCHED_OUT
+           
+        store = new ListStore (CategoryColumns.NumOfCols, typeof (Gdk.Pixbuf), typeof (string), typeof (string))
+        iter : TreeIter
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("system-file-manager", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "All", CategoryColumns.DisplayName, N_("All Files") , -1);
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("x-office-document", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:Document", CategoryColumns.DisplayName, N_("Office Documents") , -1);
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("text-x-generic", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:TextDocument", CategoryColumns.DisplayName, N_("Text Documents") , -1);
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("image-x-generic", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:Image", CategoryColumns.DisplayName, N_("Images") , -1);        
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("audio-x-generic", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:Audio", CategoryColumns.DisplayName, N_("Music") , -1);        
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("video-x-generic", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:Video", CategoryColumns.DisplayName, N_("Videos") , -1);        
+                   
+        store.append (out iter);
+        store.set (iter, CategoryColumns.Icon, GetThemePixbufByName ("system-run", icon_size, get_screen ()), \
+                   CategoryColumns.Name, "nfo:SoftwareApplication", CategoryColumns.DisplayName, N_("Applications") , -1);        
+                
+        treeview = new TreeView.with_model (store)
+        treeview.insert_column_with_attributes (-1, "icon", new CellRendererPixbuf (), "pixbuf", 0, null)
+        treeview.insert_column_with_attributes (-1, "name", new CellRendererText (), "text", 2, null)
+        treeview.set_headers_visible (false)
+        
+        var category_selection = treeview.get_selection ()
+        category_selection.set_mode (SelectionMode.BROWSE)
+        
+        category_selection.changed += selection_changed 
+        
+        add (treeview)
+        
+        show_all ()
+
+    def selection_changed (sel : TreeSelection)
+        iter : TreeIter
+        model : TreeModel
+        
+        sel.get_selected (out model , out iter)
+        
+        name : weak string
+        
+        store.get (iter, CategoryColumns.Name, out name);
+        
+        if Query is not null
+            Query.Category = name
+
+            
+   
+
+		
+
+    
diff --git a/src/tracker-search-tool/tracker-entry.gs b/src/tracker-search-tool/tracker-entry.gs
new file mode 100644
index 0000000..3052ee8
--- /dev/null
+++ b/src/tracker-search-tool/tracker-entry.gs
@@ -0,0 +1,28 @@
+[indent=4]
+
+uses
+    Gtk
+    
+    
+class TrackerSearchEntry  : Gtk.Entry
+
+    prop Query : TrackerQuery 
+
+    init
+        set_icon_from_stock (EntryIconPosition.PRIMARY, STOCK_FIND)
+        set_icon_from_stock (EntryIconPosition.SECONDARY, STOCK_CLEAR)
+        set_icon_sensitive (EntryIconPosition.SECONDARY, false)
+        set_icon_tooltip_text (EntryIconPosition.SECONDARY, _("Clear the search text"))
+        changed += entry_changed
+        
+        
+    def private entry_changed (editable : Editable) 
+        if Query is not null
+            if text is null
+                Query.SearchTerms = ""
+            else
+                Query.SearchTerms = text
+        
+    
+    
+
diff --git a/src/tracker-search-tool/tracker-query.gs b/src/tracker-search-tool/tracker-query.gs
new file mode 100644
index 0000000..3e90dc1
--- /dev/null
+++ b/src/tracker-search-tool/tracker-query.gs
@@ -0,0 +1,65 @@
+[indent=4]
+
+[DBus (name = "org.freedesktop.Tracker1.Resources")]
+interface Resources : GLib.Object 
+    def abstract SparqlQuery (query : string) : array of string[,]  raises DBus.Error
+    def abstract SparqlUpdate (query : string) raises DBus.Error
+
+
+class TrackerQuery : Object
+
+    tracker : Resources;
+
+    event SearchSettingsChanged ()    
+
+    prop SearchTerms : string
+    prop Category : string
+    prop SortField : string
+    prop Fields : array of string
+    
+    
+    init
+        Category = "All"
+    
+         self.notify += def (t, propety)
+            if propety.name is "SearchTerms" or propety.name is "Category" or  propety.name is "SortField" or propety.name is "Fields"
+                SearchSettingsChanged ()
+
+         
+
+    def Connect () : bool
+        
+        try    
+            var conn = DBus.Bus.get (DBus.BusType.SESSION)
+            tracker = conn.get_object ("org.freedesktop.Tracker1", "/org/freedesktop/Tracker1/Resources", "org.freedesktop.Tracker1.Resources") as Resources
+        except e : DBus.Error
+            print "Cannot connect to Session bus. Error is %s", e.message     
+            return false
+            
+        return true
+       
+       
+    def Search () : array of string[,] 
+    
+        query : string
+    
+        if SearchTerms is null or SearchTerms.length < 3
+            return null
+            
+        if Category is null or Category is "All"    
+            query = "SELECT ?s WHERE { ?s fts:match \"%s*\"} limit 100 ".printf(SearchTerms)
+        else
+            query = "SELECT ?s WHERE { ?s fts:match \"%s*\". ?s a %s} limit 100 ".printf(SearchTerms, Category)   
+
+        // to do : add Fields, Category and SortField
+        return tracker.SparqlQuery (query)
+        
+        
+    def Query (sparql : string) : array of string[,] 
+        return tracker.SparqlQuery (sparql)
+        
+        
+        
+  
+        
+            
diff --git a/src/tracker-search-tool/tracker-result-grid.gs b/src/tracker-search-tool/tracker-result-grid.gs
new file mode 100644
index 0000000..a5af1e0
--- /dev/null
+++ b/src/tracker-search-tool/tracker-result-grid.gs
@@ -0,0 +1,102 @@
+[indent=4]
+
+uses
+    Gtk
+    TrackerUtils
+    
+    
+enum ResultColumns
+    Uri
+    Icon
+    DisplayName
+    Mime
+    Category
+    Snippet
+    IsDirectory
+    NumOfCols
+
+    
+class TrackerResultGrid : ScrolledWindow
+    store : ListStore
+    iconview: IconView
+    _query : TrackerQuery
+    
+    event SelectedUriChanged ()    
+    
+    prop Query : TrackerQuery
+        get
+            return _query
+        set
+            if value is not null
+                _query = value
+                _query.SearchSettingsChanged += def ()
+                    RefreshQuery ()
+
+    init
+    
+        hscrollbar_policy = PolicyType.NEVER
+        vscrollbar_policy = PolicyType.AUTOMATIC
+        shadow_type = ShadowType.ETCHED_OUT
+           
+        store = new ListStore (ResultColumns.NumOfCols, typeof (string), typeof (Gdk.Pixbuf), typeof (string), \
+                               typeof (string), typeof (string), typeof (string), typeof (bool))
+
+        // to do add treeview        
+						
+        iconview = new IconView.with_model (store)
+        iconview.set_pixbuf_column (ResultColumns.Icon)
+        iconview.set_text_column (ResultColumns.DisplayName)	
+        iconview.set_item_width (150)
+        iconview.set_row_spacing (10)
+        iconview.item_activated += ActivateUri 
+        iconview.selection_changed += def ()
+            SelectedUriChanged ()
+		
+        add (iconview)
+		
+        show_all ()
+
+                
+    def RefreshQuery ()
+        if _query is not null
+            var results = _query.Search ()
+            iter : TreeIter
+
+            store.clear ()
+            
+            for uri in results
+                if uri.has_prefix ("file://")
+                    
+                    var file = File.new_for_uri (uri)
+                    
+                    try
+                        var info =  file.query_info ("standard::display-name,standard::icon,thumbnail::path", \
+                                                     FileQueryInfoFlags.NONE, null) 
+                                                 
+                        var filetype =  info.get_file_type ()
+                        store.append (out iter);
+                        store.set (iter, ResultColumns.Uri, uri, ResultColumns.Icon, GetThumbNail (info, 64, 48, get_screen()), \
+                                  ResultColumns.DisplayName, info.get_display_name(), ResultColumns.IsDirectory, \
+                                  (filetype is FileType.DIRECTORY) , -1);
+                    except e:Error
+                        print "Could not get file info for %s", uri
+            
+                    
+    
+     
+    def ActivateUri (path : TreePath)
+        iter : TreeIter
+        is_dir : bool = false
+        
+        store.get_iter (out iter, path)
+        uri : weak string
+        store.get (iter, ResultColumns.Uri, out uri);
+        store.get (iter, ResultColumns.IsDirectory, out is_dir);
+        
+        OpenUri (uri, is_dir)
+
+            
+    
+		
+
+    
diff --git a/src/tracker-search-tool/tracker-search-tool.gs b/src/tracker-search-tool/tracker-search-tool.gs
new file mode 100644
index 0000000..c37cb67
--- /dev/null
+++ b/src/tracker-search-tool/tracker-search-tool.gs
@@ -0,0 +1,66 @@
+[indent=4]
+
+uses
+    Gtk
+
+[CCode (cname = "TRACKER_UI_DIR")]
+const  extern static  UIDIR : string
+    
+[CCode (cname = "SRCDIR")]
+const  extern static  SRCDIR : string
+
+init  
+    Gtk.init (ref args)
+    
+    var builder = new Builder ()
+        
+    try 
+        builder.add_from_file (SRCDIR + "tst.ui")
+        
+    except e : GLib.Error 
+    
+        try
+            builder.add_from_file (UIDIR + "tst.ui")
+    
+        except e : GLib.Error 
+    
+            var msg = new MessageDialog (null, DialogFlags.MODAL, \
+                                         MessageType.ERROR, ButtonsType.OK, \
+                                        "Failed to load UI\n%s", e.message)
+            msg.run ()
+            Gtk.main_quit()
+    
+              
+    var window = builder.get_object ("window") as Window
+    window.destroy += Gtk.main_quit
+        
+    /* create tracker widgets */    
+        
+    var 
+        query = new TrackerQuery
+        entry = new TrackerSearchEntry ()
+        grid = new TrackerResultGrid ()
+        categories = new TrackerCategoryView ()
+        
+        entry_box = builder.get_object ("EntryBox") as Container
+        grid_box = builder.get_object ("GridBox") as Container
+        category_box = builder.get_object ("CategoryBox") as Container
+        
+        
+    query.Connect ()    
+    entry.Query = query 
+    entry_box.add (entry)
+    
+    grid.Query = query
+    grid_box.add (grid)
+    
+    categories.Query = query
+    category_box.add (categories)
+
+    window.show_all ()
+        
+    Gtk.main ()
+
+
+
+
diff --git a/src/tracker-search-tool/tracker-utils.gs b/src/tracker-search-tool/tracker-utils.gs
new file mode 100644
index 0000000..86ccc38
--- /dev/null
+++ b/src/tracker-search-tool/tracker-utils.gs
@@ -0,0 +1,76 @@
+[indent=4]
+
+uses
+    Gtk
+    
+    
+class TrackerUtils
+/* static methods only as this is a utility class that wont ever get substantiated */
+
+    def static OpenUri (uri : string, is_dir :bool) : bool
+        command : string
+        app_info : AppInfo
+        
+        var file = File.new_for_uri (uri)
+        
+        try
+            app_info = file.query_default_handler (null)
+        except e:Error
+            var msg = new MessageDialog (null, DialogFlags.MODAL, MessageType.ERROR, ButtonsType.OK, \
+                                         N_("Could not get application info for %s\nError: %s\n"), uri, e.message)
+            msg.run ();
+            return false    
+        
+        if is_dir is true  and app_info.get_executable() is "nautilus"
+            command = "nautilus --sm-disable --no-desktop --no-default-window '" + uri + "'"
+        else
+            command = app_info.get_executable () + " '" + uri + "'"
+                
+        try
+            Process.spawn_command_line_async (command)
+            return true
+        except e: Error
+            var msg = new MessageDialog (null, DialogFlags.MODAL, MessageType.ERROR, ButtonsType.OK, \
+                                         "Could not lauch %s\nError: %s\n", uri, e.message)
+            msg.run ();
+            return false
+
+
+    def static inline GetThemePixbufByName (icon_name : string, size : int, screen : Gdk.Screen) :  Gdk.Pixbuf
+    
+        var icon = new ThemedIcon (icon_name);  
+        
+        return GetThemeIconPixbuf (icon, size, screen)
+
+
+    def static GetThumbNail (info : FileInfo, thumb_size : int, icon_size : int, screen : Gdk.Screen) : Gdk.Pixbuf
+    
+        pixbuf : Gdk.Pixbuf = null
+    
+        var thumbpath = info.get_attribute_byte_string (FILE_ATTRIBUTE_THUMBNAIL_PATH)
+    
+        if thumbpath is not null
+            pixbuf = new Gdk.Pixbuf.from_file_at_size (thumbpath, thumb_size, thumb_size)
+            
+        if pixbuf is null
+            pixbuf = GetThemeIconPixbuf (info.get_icon (), icon_size, screen)    
+            
+        if pixbuf is null
+            pixbuf = GetThemePixbufByName ("text-x-generic", icon_size, screen)
+            
+        return pixbuf
+
+
+    def static GetThemeIconPixbuf (icon : Icon, size : int, screen : Gdk.Screen) : Gdk.Pixbuf
+    
+        icon_info : IconInfo
+    
+        var theme = IconTheme.get_for_screen (screen)
+        
+        icon_info = theme.lookup_by_gicon (icon, size, IconLookupFlags.USE_BUILTIN)
+
+        return icon_info.load_icon ()
+        
+    
+        
+        
diff --git a/src/tracker-search-tool/tst.ui b/src/tracker-search-tool/tst.ui
new file mode 100644
index 0000000..3d71f68
--- /dev/null
+++ b/src/tracker-search-tool/tst.ui
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="window">
+    <property name="title" translatable="yes">Tracker Search Tool</property>
+    <property name="window_position">center</property>
+    <property name="default_width">800</property>
+    <property name="default_height">600</property>
+    <child>
+      <object class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkHBox" id="SearchBox">
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">_Search:</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">8</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="EntryBox">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="padding">12</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="padding">12</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHPaned" id="hpaned1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="position">126</property>
+            <child>
+              <object class="GtkHBox" id="CategoryBox">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="resize">False</property>
+                <property name="shrink">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkVPaned" id="vpaned1">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="orientation">vertical</property>
+                <property name="position">600</property>
+                <property name="position_set">True</property>
+                <child>
+                  <object class="GtkVBox" id="GridBox">
+                    <property name="visible">True</property>
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <object class="GtkToolbar" id="toolbar1">
+                        <property name="visible">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="resize">True</property>
+                    <property name="shrink">True</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkVBox" id="DetailBox">
+                    <property name="visible">True</property>
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="resize">False</property>
+                    <property name="shrink">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="resize">True</property>
+                <property name="shrink">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <object class="GtkStatusbar" id="statusbar1">
+            <property name="visible">True</property>
+            <property name="spacing">2</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>



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