Add file properties dialog.
[guestfs-browser.git] / filetree.ml
index 7217c4e..f6ffa7b 100644 (file)
@@ -78,18 +78,6 @@ let root_key_of_registry_t (_, root_key, _, _) = root_key
  * (ie. GtkTreeView).
  *)
 class tree ?packing () =
-  let clear_tree = new GUtil.signal () in
-  let op_checksum_file = new GUtil.signal () in
-  let op_copy_regvalue = new GUtil.signal () in
-  let op_disk_usage = new GUtil.signal () in
-  let op_download_as_reg = new GUtil.signal () in
-  let op_download_dir_find0 = new GUtil.signal () in
-  let op_download_dir_tarball = new GUtil.signal () in
-  let op_download_file = new GUtil.signal () in
-  let op_file_information = new GUtil.signal () in
-  let op_inspection_dialog = new GUtil.signal () in
-  let op_view_file = new GUtil.signal () in
-
   let view = GTree.view ?packing () in
   (*view#set_rules_hint true;*)
   (*view#selection#set_mode `MULTIPLE; -- add this later *)
@@ -117,6 +105,20 @@ class tree ?packing () =
   (* Create the model. *)
   let model = GTree.tree_store cols in
 
+  (* Signals. *)
+  let clear_tree = new GUtil.signal () in
+  let op_checksum_file = new GUtil.signal () in
+  let op_copy_regvalue = new GUtil.signal () in
+  let op_disk_usage = new GUtil.signal () in
+  let op_download_as_reg = new GUtil.signal () in
+  let op_download_dir_find0 = new GUtil.signal () in
+  let op_download_dir_tarball = new GUtil.signal () in
+  let op_download_file = new GUtil.signal () in
+  let op_file_information = new GUtil.signal () in
+  let op_file_properties = new GUtil.signal () in
+  let op_inspection_dialog = new GUtil.signal () in
+  let op_view_file = new GUtil.signal () in
+
 object (self)
   inherit GTree.view view#as_tree_view
   inherit GUtil.ml_signals [clear_tree#disconnect;
@@ -128,9 +130,25 @@ object (self)
                             op_download_dir_tarball#disconnect;
                             op_download_file#disconnect;
                             op_file_information#disconnect;
+                            op_file_properties#disconnect;
                             op_inspection_dialog#disconnect;
                             op_view_file#disconnect]
 
+  (* Signals. *)
+  method clear_tree : callback:(unit -> unit) -> GtkSignal.id =
+    clear_tree#connect ~after
+  method op_checksum_file = op_checksum_file#connect ~after
+  method op_copy_regvalue = op_copy_regvalue#connect ~after
+  method op_disk_usage = op_disk_usage#connect ~after
+  method op_download_as_reg = op_download_as_reg#connect ~after
+  method op_download_dir_find0 = op_download_dir_find0#connect ~after
+  method op_download_dir_tarball = op_download_dir_tarball#connect ~after
+  method op_download_file = op_download_file#connect ~after
+  method op_file_information = op_file_information#connect ~after
+  method op_file_properties = op_file_properties#connect ~after
+  method op_inspection_dialog = op_inspection_dialog#connect ~after
+  method op_view_file = op_view_file#connect ~after
+
   initializer
     (* Open a context menu when a button is pressed. *)
     ignore (view#event#connect#button_press ~callback:self#button_press);
@@ -528,20 +546,6 @@ object (self)
         in
         loop []
 
-  (* Signals. *)
-  method clear_tree : callback:(unit -> unit) -> GtkSignal.id =
-    clear_tree#connect ~after
-  method op_checksum_file = op_checksum_file#connect ~after
-  method op_copy_regvalue = op_copy_regvalue#connect ~after
-  method op_disk_usage = op_disk_usage#connect ~after
-  method op_download_as_reg = op_download_as_reg#connect ~after
-  method op_download_dir_find0 = op_download_dir_find0#connect ~after
-  method op_download_dir_tarball = op_download_dir_tarball#connect ~after
-  method op_download_file = op_download_file#connect ~after
-  method op_file_information = op_file_information#connect ~after
-  method op_inspection_dialog = op_inspection_dialog#connect ~after
-  method op_view_file = op_view_file#connect ~after
-
   (* Handle mouse button press on the selected row.  This opens the
    * pop-up context menu.
    * http://scentric.net/tutorial/sec-selections-context-menus.html
@@ -633,6 +637,10 @@ object (self)
       let item = factory#add_item "Download ..." in
       ignore (item#connect#activate
                 ~callback:(fun () -> op_download_file#call path));
+      ignore (factory#add_separator ());
+      let item = factory#add_item "Properties ..." in
+      ignore (item#connect#activate
+                ~callback:(fun () -> op_file_properties#call path))
 
     and add_directory_items path =
       let item = factory#add_item "Directory information" in
@@ -655,6 +663,10 @@ object (self)
       let item = factory#add_item "Download list of filenames ..." in
       ignore (item#connect#activate
                 ~callback:(fun () -> op_download_dir_find0#call path));
+      ignore (factory#add_separator ());
+      let item = factory#add_item "Properties ..." in
+      ignore (item#connect#activate
+                ~callback:(fun () -> op_file_properties#call path))
 
     and add_top_os_items os path =
       let item = factory#add_item "Operating system information ..." in
@@ -800,6 +812,13 @@ object (self)
     | { content=RegKey _ }, _ -> assert false
     | { content=RegValue _ }, _ -> assert false
 
+  method get_direntry row =
+    let hdata = self#get_hdata row in
+    match hdata with
+    | { content=Directory direntry}
+    | { content=File direntry}      -> direntry
+    | _ -> assert false
+
   (* Search up to the top of the tree from a registry key.
    *
    * The path up the tree will always look something like: