#
#
# patch "mtn-browse"
# from [ae1efebc4b7566b18bbb4bda9030e571fe7bd693]
# to [7faf3ef238c9a94a65ca075142ca202dbc820e52]
#
# patch "mtn-browse.glade"
# from [7473eb8e208f212a0d8ce2c779a33f11a05d6263]
# to [227b6396b82d3f5b1f254c912ddb2eafcd5e9d87]
#
============================================================
--- mtn-browse ae1efebc4b7566b18bbb4bda9030e571fe7bd693
+++ mtn-browse 7faf3ef238c9a94a65ca075142ca202dbc820e52
@@ -164,18 +164,23 @@ my @text_mime_types =
# A boolean to signal whether this process has received a SIGCHLD signal or
# not.
-# List of browser instances.
+# List of window instances.
-my @browsers;
+my @windows;
# The advanced find window management record.
my $advanced_find;
-# The pixmap for the application's icon.
+# Assorted pixmaps.
-my $app_icon;
+my($app_icon,
+ $line_image);
+# The busy cursor to use for the mouse.
+
+my $busy_cursor;
+
# The tooltips widget.
my $tooltips;
@@ -193,10 +198,14 @@ sub directory_up_button_clicked_cb($$);
sub delete_event_cb($$$);
sub destroy_event_cb($$;$);
sub directory_up_button_clicked_cb($$);
-sub display_change_log($);
+sub file_change_log_button_clicked_cb($$);
+sub file_history_button_clicked_cb($$);
sub generate_revision_report($$$$);
+sub get_change_log_window();
sub get_completion($$$$;$);
sub get_dir_contents($$$);
+sub get_file_history_helper($$$);
+sub get_file_history_window();
sub get_revision_ids($$);
sub gtk2_update();
sub make_busy($$);
@@ -211,7 +220,7 @@ sub simple_query_radiobutton_toggled_cb(
sub setup_sigchld_handler($);
sub sigchld_handler();
sub simple_query_radiobutton_toggled_cb($$);
-sub revision_information_button_clicked_cb($$);
+sub revision_change_log_button_clicked_cb($$);
sub term_combobox_changed_cb($$);
sub update_advanced_find_state($$);
sub update_browser_state($$);
@@ -239,7 +248,8 @@ sub update_browser_state($$);
setup_sigchld_handler(\&sigchld_handler);
$tooltips = Gtk2::Tooltips->new();
$app_icon = Gtk2::Gdk::Pixbuf->new_from_file("../mtn-browse.png");
- push(@browsers, new_browser_instance());
+ $line_image = Gtk2::Gdk::Pixbuf->new_from_file("../line.png");
+ new_browser_instance();
# Hand control over to Gtk2.
@@ -252,13 +262,13 @@ sub update_browser_state($$);
$advanced_find->{window}->destroy();
$advanced_find = undef;
}
- foreach my $browser (@browsers)
+ foreach my $window (@windows)
{
- $browser->{window}->destroy();
+ $window->{window}->destroy();
}
Gnome2::VFS->shutdown();
$SIG{CHLD} = "IGNORE";
- @browsers = ();
+ @windows = ();
exit(0);
@@ -266,228 +276,6 @@ sub update_browser_state($$);
#
##############################################################################
#
-# Routine - new_browser_instance
-#
-# Description - Construct a new browser instance record. This creates a new
-# main window, a new connection to Monotone and initialising
-# sensible defaults.
-#
-# Data - Return Value : A reference to the newly created browser
-# instance record.
-#
-##############################################################################
-
-
-
-sub new_browser_instance()
-{
-
- my($browser,
- $font,
- $image,
- $renderer,
- $tv_column,
- $div);
-
- $browser = {};
- $browser->{mtn} = Monotone::AutomateStdio->new();
- $browser->{glade} =
- Gtk2::GladeXML->new("../mtn-browse.glade", "main_window");
-
- # Flag to stop recursive calling of callbacks.
-
- $browser->{in_cb} = 0;
-
- # Connect Glade registered signal handlers.
-
- $browser->{glade}->signal_autoconnect
- (sub {
- my($callback_name, $widget, $signal_name, $signal_data,
- $connect_object, $after, $user_data) = @_;
- my $func = $after ? "signal_connect_after" : "signal_connect";
- $widget->$func($signal_name,
- $callback_name,
- $connect_object ? $connect_object : $user_data); },
- $browser);
-
- # Link in the update handler for the browser.
-
- $browser->{update_handler} = \&update_browser_state;
-
- # Get the widgets that we are interested in.
-
- $browser->{window} = $browser->{glade}->get_widget("main_window");
- $browser->{window}->set_icon($app_icon);
- $browser->{appbar} = $browser->{glade}->get_widget("appbar");
- $browser->{branch_combo} =
- $browser->{glade}->get_widget("branch_comboboxentry");
- $browser->{revision_combo} =
- $browser->{glade}->get_widget("revision_comboboxentry");
- $browser->{tagged_tick} =
- $browser->{glade}->get_widget("tagged_checkbutton");
- $browser->{directory_combo} =
- $browser->{glade}->get_widget("directory_comboboxentry");
- $browser->{directory_up_button} =
- $browser->{glade}->get_widget("directory_up_button");
- $browser->{manifest_treeview} =
- $browser->{glade}->get_widget("manifest_browser_treeview");
- $browser->{file_view_scrolledwindow} =
- $browser->{glade}->get_widget("file_view_scrolledwindow");
- $browser->{file_name_label} =
- $browser->{glade}->get_widget("file_name_value_label");
- $browser->{file_id_label} =
- $browser->{glade}->get_widget("file_id_value_label");
- $browser->{last_update_label} =
- $browser->{glade}->get_widget("last_update_value_label");
- $browser->{file_revision_id_label} =
- $browser->{glade}->get_widget("file_revision_id_value_label");
- $browser->{file_button_vbox} =
- $browser->{glade}->get_widget("file_button_vbox");
- $browser->{database_name_label} =
- $browser->{glade}->get_widget("database_name_value_label");
- $browser->{revision_id_label} =
- $browser->{glade}->get_widget("revision_id_value_label");
- $browser->{author_label} =
- $browser->{glade}->get_widget("author_value_label");
- $browser->{change_log_label} =
- $browser->{glade}->get_widget("change_log_value_label");
-
- # Setup button sensitivity groups.
-
- $browser->{text_file_sensitive_group} = ();
- foreach my $item ("search_text", "annotate", "file_compare")
- {
- push(@{$browser->{text_file_sensitive_group}},
- $browser->{glade}->get_widget($item . "_button"));
- }
- $browser->{revision_sensitive_group} = ();
- foreach my $item ("revision_information", "revision_compare")
- {
- push(@{$browser->{revision_sensitive_group}},
- $browser->{glade}->get_widget($item . "_button"));
- }
-
- # Setup the comboboxentry key release signal handlers.
-
- $browser->{branch_combo}->child()->
- signal_connect("key_release_event",
- \&combo_key_release_event_cb,
- $browser);
- $browser->{directory_combo}->child()->
- signal_connect("key_release_event",
- \&combo_key_release_event_cb,
- $browser);
- $browser->{revision_combo}->child()->
- signal_connect("key_release_event",
- \&combo_key_release_event_cb,
- $browser);
-
- # Move the pane separator to a sensible position.
-
- # $div = $browser->{glade}->get_widget("browser_hpaned");
- # $div->set_position(300);
-
- # Setup the comboboxes.
-
- $browser->{branch_combo}->set_model(Gtk2::ListStore->new("Glib::String"));
- $browser->{branch_combo}->set_text_column(0);
- $browser->{branch_combo}->set_wrap_width(2);
- $browser->{directory_combo}->
- set_model(Gtk2::ListStore->new("Glib::String"));
- $browser->{directory_combo}->set_text_column(0);
- $browser->{directory_combo}->set_wrap_width(2);
- $browser->{revision_combo}->
- set_model(Gtk2::ListStore->new("Glib::String"));
- $browser->{revision_combo}->set_text_column(0);
- $browser->{revision_combo}->set_wrap_width(2);
-
- # Setup the tree view manifest file browser.
-
- $browser->{manifest_liststore} = Gtk2::ListStore->new("Glib::String",
- "Glib::String",
- "Glib::String",
- "Glib::String",
- "Glib::Scalar");
- $browser->{manifest_treeview}->set_model($browser->{manifest_liststore});
-
- $tv_column = Gtk2::TreeViewColumn->new();
- $image = Gtk2::Image->new_from_stock("gtk-file", "menu");
- $image->show_all();
- $tv_column->set_widget($image);
- $tv_column->set_resizable(FALSE);
- $tv_column->set_sizing("fixed");
- $tv_column->set_fixed_width(25);
- $tv_column->set_sort_column_id(MLS_ICON_COLUMN);
- $renderer = Gtk2::CellRendererPixbuf->new();
- $tv_column->pack_start($renderer, TRUE);
- $tv_column->set_attributes($renderer, "stock-id" => MLS_ICON_COLUMN);
- $browser->{manifest_treeview}->append_column($tv_column);
-
- $tv_column = Gtk2::TreeViewColumn->new();
- $tv_column->set_title("File Name");
- $tv_column->set_resizable(TRUE);
- $tv_column->set_sizing("fixed");
- $tv_column->set_fixed_width(180);
- $tv_column->set_sort_column_id(MLS_NAME_COLUMN);
- $renderer = Gtk2::CellRendererText->new();
- $tv_column->pack_start($renderer, FALSE);
- $tv_column->set_attributes($renderer, "text" => MLS_NAME_COLUMN);
- $browser->{manifest_treeview}->append_column($tv_column);
-
- $tv_column = Gtk2::TreeViewColumn->new();
- $tv_column->set_title("Last Update");
- $tv_column->set_resizable(TRUE);
- $tv_column->set_sizing("grow-only");
- $tv_column->set_sort_column_id(MLS_DATE_COLUMN);
- $renderer = Gtk2::CellRendererText->new();
- $tv_column->pack_start($renderer, FALSE);
- $tv_column->set_attributes($renderer, "text" => MLS_DATE_COLUMN);
- $browser->{manifest_treeview}->append_column($tv_column);
-
- $tv_column = Gtk2::TreeViewColumn->new();
- $tv_column->set_title("Author");
- $tv_column->set_resizable(TRUE);
- $tv_column->set_sizing("grow-only");
- $tv_column->set_sort_column_id(MLS_AUTHOR_COLUMN);
- $renderer = Gtk2::CellRendererText->new();
- $tv_column->pack_start($renderer, FALSE);
- $tv_column->set_attributes($renderer, "text" => MLS_AUTHOR_COLUMN);
- $browser->{manifest_treeview}->append_column($tv_column);
-
- $browser->{manifest_treeview}->set_search_column(MLS_NAME_COLUMN);
-
- # $tv_column = $browser->{manifest_treeview}->get_column(MLS_DATE_COLUMN);
- # $browser->{manifest_treeview}->remove_column($tv_column);
-
- # Setup the file file viewer (with syntax highlighting).
-
- $browser->{file_view_svbuffer} = Gtk2::SourceView::Buffer->new(undef);
- $browser->{file_view_svbuffer}->set_max_undo_levels(0);
- $browser->{file_view_svbuffer}->begin_not_undoable_action();
- $browser->{file_view_svlangmgr} =
- Gtk2::SourceView::LanguagesManager->new();
- $browser->{file_view_sv} = Gtk2::SourceView::View->
- new_with_buffer($browser->{file_view_svbuffer});
- $font = Gtk2::Pango::FontDescription->from_string("monospace 10");
- $browser->{file_view_sv}->modify_font($font) if (defined($font));
- $browser->{file_view_sv}->set_cursor_visible(FALSE);
- $browser->{file_view_sv}->set_editable(FALSE);
- $browser->{glade}->get_widget("file_view_scrolledwindow")->
- add($browser->{file_view_sv});
- $browser->{file_view_sv}->show_all();
-
- # Update the browser's internal state.
-
- $browser->{branch_combo_details}->{preset} = 0;
- $browser->{revision_combo_details}->{preset} = 0;
- &{$browser->{update_handler}}($browser, DATABASE_CHANGED);
-
- return $browser;
-
-}
-#
-##############################################################################
-#
# Routine - combo_changed_cb
#
# Description - Callback routine called when the user changes the value of
@@ -795,10 +583,10 @@ sub advanced_find_button_clicked_cb($$)
#
##############################################################################
#
-# Routine - revision_information_button_clicked_cb
+# Routine - revision_change_log_button_clicked_cb
#
# Description - Callback routine called when the user clicks on the
-# revision information button.
+# revision change log button.
#
# Data - $widget : The widget object that received the signal.
# $browser : The browser instance that is associated with
@@ -808,16 +596,43 @@ sub advanced_find_button_clicked_cb($$)
-sub revision_information_button_clicked_cb($$)
+sub revision_change_log_button_clicked_cb($$)
{
my($widget, $browser) = @_;
+ my (@certs_list,
+ $instance,
+ @revision_details,
+ @revision_ids);
+
return if ($browser->{in_cb});
local $browser->{in_cb} = 1;
- display_change_log($browser);
+ $instance = get_change_log_window();
+ # Get the currently selected revision id.
+
+ get_revision_ids($browser, address@hidden);
+
+ # Put the details into the text view and display it.
+
+ $instance->{changelog_buffer}->set_text("");
+ $instance->{window}->set_title
+ ("Revision " . $browser->{revision_combo_details}->{value});
+ $browser->{mtn}->certs(address@hidden, $revision_ids[0]);
+ $browser->{mtn}->get_revision(address@hidden, $revision_ids[0]);
+ generate_revision_report($instance->{changelog_buffer},
+ $revision_ids[0],
+ address@hidden,
+ address@hidden);
+ if ($instance->{changelog_scrolledwindow}->realized())
+ {
+ $instance->{changelog_scrolledwindow}->get_vadjustment()->set_value(0);
+ $instance->{changelog_scrolledwindow}->get_hadjustment()->set_value(0);
+ }
+ $instance->{window}->show_all();
+
}
#
##############################################################################
@@ -889,6 +704,277 @@ sub directory_up_button_clicked_cb($$)
#
##############################################################################
#
+# Routine - file_change_log_button_clicked_cb
+#
+# Description - Callback routine called when the user clicks on the file
+# change log button.
+#
+# Data - $widget : The widget object that received the signal.
+# $browser : The browser instance that is associated with
+# this widget.
+#
+##############################################################################
+
+
+
+sub file_change_log_button_clicked_cb($$)
+{
+
+ my($widget, $browser) = @_;
+
+ my ($button,
+ @certs_list,
+ $counter,
+ $file_name,
+ %history_hash,
+ $instance,
+ @revision_ids);
+
+ return if ($browser->{in_cb});
+ local $browser->{in_cb} = 1;
+
+ $instance = get_file_history_window();
+ local $instance->{in_cb} = 1;
+
+ $instance->{mtn} = $browser->{mtn};
+ $instance->{file_name} =
+ $browser->{file_being_viewed}->{manifest_entry}->{name};
+ $instance->{first_revision_id} = "";
+ $instance->{second_revision_id} = "";
+ $instance->{window}->set_title
+ ("File History For " . $instance->{file_name});
+ $instance->{window}->show_all();
+
+ make_busy($instance, 1);
+ $instance->{appbar}->push("");
+ gtk2_update();
+
+ # Get the list of file change revisions. Remember that a warning is
+ # generated when one goes back beyond a file's addition revision, so
+ # temporarily disable the warning handler.
+
+ $instance->{appbar}->set_progress_percentage(0);
+ $instance->{appbar}->set_status("Fetching revision list");
+ $instance->{stop_button}->set_sensitive(TRUE);
+ gtk2_update();
+ Monotone::AutomateStdio->register_error_handler("warning", undef);
+ get_revision_ids($browser, address@hidden);
+ get_file_history_helper($instance, \%history_hash, $revision_ids[0]);
+ Monotone::AutomateStdio->register_error_handler
+ ("both", \&mtn_error_handler);
+ $instance->{stop_button}->set_sensitive(FALSE);
+
+ # Sort the list.
+
+ $instance->{appbar}->set_status("Sorting revision list");
+ gtk2_update();
+ $instance->{history} = [];
+ $instance->{mtn}->toposort($instance->{history}, keys(%history_hash));
+ %history_hash = ();
+ @{$instance->{history}} = reverse(@{$instance->{history}});
+
+ # Display the file's history.
+
+ $instance->{appbar}->set_progress_percentage(0);
+ $instance->{appbar}->set_status("Displaying file history");
+ gtk2_update();
+ $counter = 1;
+ $instance->{history_buffer}->set_text("");
+ for my $revision_id (@{$instance->{history}})
+ {
+
+ # Print out the revision summary.
+
+ $instance->{mtn}->certs(address@hidden, $revision_id);
+ generate_revision_report($instance->{history_buffer},
+ $revision_id,
+ address@hidden,
+ undef);
+ $instance->{history_buffer}->
+ insert($instance->{history_buffer}->get_end_iter(), "\n\n ");
+
+ # Add the buttons.
+
+ $button = Gtk2::Button->new("Select As File 1");
+ $button->signal_connect("clicked",
+ \&file_history_button_clicked_cb,
+ {instance => $instance,
+ revision_id => $revision_id,
+ button_type => "file-1"});
+ $tooltips->set_tip($button,
+ "Select this file revision for\n"
+ . "comparison as the first file");
+ $instance->{history_textview}->add_child_at_anchor
+ ($button,
+ $instance->{history_buffer}->
+ create_child_anchor($instance->{history_buffer}->
+ get_end_iter()));
+ $button->show_all();
+ $instance->{history_buffer}->
+ insert($instance->{history_buffer}->get_end_iter(), " ");
+
+ $button = Gtk2::Button->new("Select As File 2");
+ $button->signal_connect("clicked",
+ \&file_history_button_clicked_cb,
+ {instance => $instance,
+ revision_id => $revision_id,
+ button_type => "file-2"});
+ $tooltips->set_tip($button,
+ "Select this file revision for\n"
+ . "comparison as the second file");
+ $instance->{history_textview}->add_child_at_anchor
+ ($button,
+ $instance->{history_buffer}->
+ create_child_anchor($instance->{history_buffer}->
+ get_end_iter()));
+ $button->show_all();
+ $instance->{history_buffer}->
+ insert($instance->{history_buffer}->get_end_iter(), " ");
+
+ $button = Gtk2::Button->new("Full Revision Information");
+ $button->signal_connect("clicked",
+ \&file_history_button_clicked_cb,
+ {instance => $instance,
+ revision_id => $revision_id,
+ button_type => "revision-info"});
+ $tooltips->set_tip($button, "View the revision's change log");
+ $instance->{history_textview}->add_child_at_anchor
+ ($button,
+ $instance->{history_buffer}->
+ create_child_anchor($instance->{history_buffer}->
+ get_end_iter()));
+ $button->show_all();
+
+ # If we aren't at the end, print out the revision separator.
+
+ if ($counter < scalar(@{$instance->{history}}))
+ {
+ $instance->{history_buffer}->
+ insert($instance->{history_buffer}->get_end_iter(), "\n");
+ $instance->{history_buffer}->
+ insert_pixbuf($instance->{history_buffer}->get_end_iter(),
+ $line_image);
+ $instance->{history_buffer}->
+ insert($instance->{history_buffer}->get_end_iter(), "\n");
+ }
+
+ $instance->{appbar}->set_progress_percentage
+ ($counter ++ / scalar(@{$instance->{history}}));
+ gtk2_update();
+
+ }
+
+ # Make sure we are at the top.
+
+ $instance->{history_scrolledwindow}->get_vadjustment()->set_value(0);
+ $instance->{history_scrolledwindow}->get_hadjustment()->set_value(0);
+ $instance->{appbar}->set_progress_percentage(0);
+ $instance->{appbar}->set_status("");
+ gtk2_update();
+
+ $instance->{appbar}->pop();
+ make_busy($instance, 0);
+
+}
+#
+##############################################################################
+#
+# Routine - file_history_button_clicked_cb
+#
+# Description - Callback routine called when the user clicks on any of the
+# buttons displayed in a file's history list.
+#
+# Data - $widget : The widget object that received the signal.
+# $details : A reference to an anonymous hash containing the
+# window instance, revision and action that is
+# associated with this widget.
+#
+##############################################################################
+
+
+
+sub file_history_button_clicked_cb($$)
+{
+
+ my($widget, $details) = @_;
+
+ my($cl_instance,
+ $instance,
+ $revision_id);
+
+ $instance = $details->{instance};
+ $revision_id = $details->{revision_id};
+
+ return if ($instance->{in_cb});
+ local $instance->{in_cb} = 1;
+
+ if ($details->{button_type} eq "file-1"
+ || $details->{button_type} eq "file-2")
+ {
+ if ($details->{button_type} eq "file-1")
+ {
+ $instance->{first_revision_id} = $revision_id;
+ set_label_value($instance->{revision_id_1_label}, $revision_id);
+ if ($instance->{first_revision_id}
+ eq $instance->{second_revision_id})
+ {
+ $instance->{second_revision_id} = "";
+ set_label_value($instance->{revision_id_2_label}, "");
+ }
+ }
+ else
+ {
+ $instance->{second_revision_id} = $revision_id;
+ set_label_value($instance->{revision_id_2_label}, $revision_id);
+ if ($instance->{second_revision_id}
+ eq $instance->{first_revision_id})
+ {
+ $instance->{first_revision_id} = "";
+ set_label_value($instance->{revision_id_1_label}, "");
+ }
+ }
+ if ($instance->{first_revision_id} ne ""
+ && $instance->{second_revision_id} ne "")
+ {
+ $instance->{compare_button}->set_sensitive(TRUE);
+ }
+ else
+ {
+ $instance->{compare_button}->set_sensitive(FALSE);
+ }
+ }
+ else
+ {
+
+ my(@certs_list,
+ @revision_details);
+
+ # Display the full revision change log.
+
+ $cl_instance = get_change_log_window();
+ $cl_instance->{changelog_buffer}->set_text("");
+ $cl_instance->{window}->set_title("Revision " . $revision_id);
+ $instance->{mtn}->certs(address@hidden, $revision_id);
+ $instance->{mtn}->get_revision(address@hidden, $revision_id);
+ generate_revision_report($cl_instance->{changelog_buffer},
+ $revision_id,
+ address@hidden,
+ address@hidden);
+ if ($cl_instance->{changelog_scrolledwindow}->realized())
+ {
+ $cl_instance->{changelog_scrolledwindow}->get_vadjustment()->
+ set_value(0);
+ $cl_instance->{changelog_scrolledwindow}->get_hadjustment()->
+ set_value(0);
+ }
+ $cl_instance->{window}->show_all();
+
+ }
+
+}
+#
+##############################################################################
+#
# Routine - manifest_browser_treeview_cursor_changed_cb
#
# Description - Callback routine called when the user selects an entry in
@@ -1375,6 +1461,233 @@ sub destroy_event_cb($$;$)
#
##############################################################################
#
+# Routine - new_browser_instance
+#
+# Description - Construct a new browser instance record. This creates a new
+# main window, a new connection to Monotone and initialising
+# sensible defaults.
+#
+# Data - Return Value : A reference to the newly created browser
+# instance record.
+#
+##############################################################################
+
+
+
+sub new_browser_instance()
+{
+
+ my($browser,
+ $font,
+ $image,
+ $renderer,
+ $tv_column,
+ $div);
+
+ $browser = {};
+ $browser->{type} = "browser_window";
+ $browser->{mtn} = Monotone::AutomateStdio->new();
+ $browser->{glade} =
+ Gtk2::GladeXML->new("../mtn-browse.glade", "main_window");
+
+ # Flag to stop recursive calling of callbacks.
+
+ $browser->{in_cb} = 0;
+
+ # Connect Glade registered signal handlers.
+
+ $browser->{glade}->signal_autoconnect
+ (sub {
+ my($callback_name, $widget, $signal_name, $signal_data,
+ $connect_object, $after, $user_data) = @_;
+ my $func = $after ? "signal_connect_after" : "signal_connect";
+ $widget->$func($signal_name,
+ $callback_name,
+ $connect_object ? $connect_object : $user_data); },
+ $browser);
+
+ # Link in the update handler for the browser.
+
+ $browser->{update_handler} = \&update_browser_state;
+
+ # Get the widgets that we are interested in.
+
+ $browser->{window} = $browser->{glade}->get_widget("main_window");
+ $browser->{window}->set_icon($app_icon);
+ $browser->{appbar} = $browser->{glade}->get_widget("appbar");
+ $browser->{branch_combo} =
+ $browser->{glade}->get_widget("branch_comboboxentry");
+ $browser->{revision_combo} =
+ $browser->{glade}->get_widget("revision_comboboxentry");
+ $browser->{tagged_tick} =
+ $browser->{glade}->get_widget("tagged_checkbutton");
+ $browser->{directory_combo} =
+ $browser->{glade}->get_widget("directory_comboboxentry");
+ $browser->{directory_up_button} =
+ $browser->{glade}->get_widget("directory_up_button");
+ $browser->{manifest_treeview} =
+ $browser->{glade}->get_widget("manifest_browser_treeview");
+ $browser->{file_view_scrolledwindow} =
+ $browser->{glade}->get_widget("file_view_scrolledwindow");
+ $browser->{file_name_label} =
+ $browser->{glade}->get_widget("file_name_value_label");
+ $browser->{file_id_label} =
+ $browser->{glade}->get_widget("file_id_value_label");
+ $browser->{last_update_label} =
+ $browser->{glade}->get_widget("last_update_value_label");
+ $browser->{file_revision_id_label} =
+ $browser->{glade}->get_widget("file_revision_id_value_label");
+ $browser->{file_button_vbox} =
+ $browser->{glade}->get_widget("file_button_vbox");
+ $browser->{database_name_label} =
+ $browser->{glade}->get_widget("database_name_value_label");
+ $browser->{revision_id_label} =
+ $browser->{glade}->get_widget("revision_id_value_label");
+ $browser->{author_label} =
+ $browser->{glade}->get_widget("author_value_label");
+ $browser->{change_log_label} =
+ $browser->{glade}->get_widget("change_log_value_label");
+
+ # Setup button sensitivity groups.
+
+ $browser->{text_file_sensitive_group} = ();
+ foreach my $item ("search_text", "annotate")
+ {
+ push(@{$browser->{text_file_sensitive_group}},
+ $browser->{glade}->get_widget($item . "_button"));
+ }
+ $browser->{revision_sensitive_group} = ();
+ foreach my $item ("revision_change_log", "revision_compare")
+ {
+ push(@{$browser->{revision_sensitive_group}},
+ $browser->{glade}->get_widget($item . "_button"));
+ }
+
+ # Setup the comboboxentry key release signal handlers.
+
+ $browser->{branch_combo}->child()->
+ signal_connect("key_release_event",
+ \&combo_key_release_event_cb,
+ $browser);
+ $browser->{directory_combo}->child()->
+ signal_connect("key_release_event",
+ \&combo_key_release_event_cb,
+ $browser);
+ $browser->{revision_combo}->child()->
+ signal_connect("key_release_event",
+ \&combo_key_release_event_cb,
+ $browser);
+
+ # Move the pane separator to a sensible position.
+
+ # $div = $browser->{glade}->get_widget("browser_hpaned");
+ # $div->set_position(300);
+
+ # Setup the comboboxes.
+
+ $browser->{branch_combo}->set_model(Gtk2::ListStore->new("Glib::String"));
+ $browser->{branch_combo}->set_text_column(0);
+ $browser->{branch_combo}->set_wrap_width(2);
+ $browser->{directory_combo}->
+ set_model(Gtk2::ListStore->new("Glib::String"));
+ $browser->{directory_combo}->set_text_column(0);
+ $browser->{directory_combo}->set_wrap_width(2);
+ $browser->{revision_combo}->
+ set_model(Gtk2::ListStore->new("Glib::String"));
+ $browser->{revision_combo}->set_text_column(0);
+ $browser->{revision_combo}->set_wrap_width(2);
+
+ # Setup the tree view manifest file browser.
+
+ $browser->{manifest_liststore} = Gtk2::ListStore->new("Glib::String",
+ "Glib::String",
+ "Glib::String",
+ "Glib::String",
+ "Glib::Scalar");
+ $browser->{manifest_treeview}->set_model($browser->{manifest_liststore});
+
+ $tv_column = Gtk2::TreeViewColumn->new();
+ $image = Gtk2::Image->new_from_stock("gtk-file", "menu");
+ $image->show_all();
+ $tv_column->set_widget($image);
+ $tv_column->set_resizable(FALSE);
+ $tv_column->set_sizing("fixed");
+ $tv_column->set_fixed_width(25);
+ $tv_column->set_sort_column_id(MLS_ICON_COLUMN);
+ $renderer = Gtk2::CellRendererPixbuf->new();
+ $tv_column->pack_start($renderer, TRUE);
+ $tv_column->set_attributes($renderer, "stock-id" => MLS_ICON_COLUMN);
+ $browser->{manifest_treeview}->append_column($tv_column);
+
+ $tv_column = Gtk2::TreeViewColumn->new();
+ $tv_column->set_title("File Name");
+ $tv_column->set_resizable(TRUE);
+ $tv_column->set_sizing("fixed");
+ $tv_column->set_fixed_width(180);
+ $tv_column->set_sort_column_id(MLS_NAME_COLUMN);
+ $renderer = Gtk2::CellRendererText->new();
+ $tv_column->pack_start($renderer, FALSE);
+ $tv_column->set_attributes($renderer, "text" => MLS_NAME_COLUMN);
+ $browser->{manifest_treeview}->append_column($tv_column);
+
+ $tv_column = Gtk2::TreeViewColumn->new();
+ $tv_column->set_title("Last Update");
+ $tv_column->set_resizable(TRUE);
+ $tv_column->set_sizing("grow-only");
+ $tv_column->set_sort_column_id(MLS_DATE_COLUMN);
+ $renderer = Gtk2::CellRendererText->new();
+ $tv_column->pack_start($renderer, FALSE);
+ $tv_column->set_attributes($renderer, "text" => MLS_DATE_COLUMN);
+ $browser->{manifest_treeview}->append_column($tv_column);
+
+ $tv_column = Gtk2::TreeViewColumn->new();
+ $tv_column->set_title("Author");
+ $tv_column->set_resizable(TRUE);
+ $tv_column->set_sizing("grow-only");
+ $tv_column->set_sort_column_id(MLS_AUTHOR_COLUMN);
+ $renderer = Gtk2::CellRendererText->new();
+ $tv_column->pack_start($renderer, FALSE);
+ $tv_column->set_attributes($renderer, "text" => MLS_AUTHOR_COLUMN);
+ $browser->{manifest_treeview}->append_column($tv_column);
+
+ $browser->{manifest_treeview}->set_search_column(MLS_NAME_COLUMN);
+
+ # $tv_column = $browser->{manifest_treeview}->get_column(MLS_DATE_COLUMN);
+ # $browser->{manifest_treeview}->remove_column($tv_column);
+
+ # Setup the file file viewer (with syntax highlighting).
+
+ $browser->{file_view_svbuffer} = Gtk2::SourceView::Buffer->new(undef);
+ $browser->{file_view_svbuffer}->set_max_undo_levels(0);
+ $browser->{file_view_svbuffer}->begin_not_undoable_action();
+ $browser->{file_view_svlangmgr} =
+ Gtk2::SourceView::LanguagesManager->new();
+ $browser->{file_view_sv} = Gtk2::SourceView::View->
+ new_with_buffer($browser->{file_view_svbuffer});
+ $font = Gtk2::Pango::FontDescription->from_string("monospace 10");
+ $browser->{file_view_sv}->modify_font($font) if (defined($font));
+ $browser->{file_view_sv}->set_cursor_visible(FALSE);
+ $browser->{file_view_sv}->set_editable(FALSE);
+ $browser->{glade}->get_widget("file_view_scrolledwindow")->
+ add($browser->{file_view_sv});
+ $browser->{file_view_sv}->show_all();
+
+ $browser->{window}->show_all();
+
+ # Update the browser's internal state.
+
+ $browser->{branch_combo_details}->{preset} = 0;
+ $browser->{revision_combo_details}->{preset} = 0;
+ &{$browser->{update_handler}}($browser, DATABASE_CHANGED);
+
+ push(@windows, $browser);
+
+ return $browser;
+
+}
+#
+##############################################################################
+#
# Routine - advanced_find
#
# Description - Displays the advanced find dialog window and then gets the
@@ -1399,6 +1712,9 @@ sub advanced_find($$$)
my($browser, $revision_id, $branches) = @_;
+ my($height,
+ $width);
+
$advanced_find = create_advanced_find_window()
unless (defined($advanced_find));
@@ -1417,7 +1733,9 @@ sub advanced_find($$$)
$advanced_find->{revision_combo_details}->{preset} = 0;
$advanced_find->{appbar}->clear_stack();
&{$advanced_find->{update_handler}}($advanced_find, NEW_FIND);
- $advanced_find->{window}->show();
+ ($width, $height) = $advanced_find->{window}->get_default_size();
+ $advanced_find->{window}->resize($width, $height);
+ $advanced_find->{window}->show_all();
# Now actually update it with any preset values.
@@ -1640,94 +1958,282 @@ sub create_advanced_find_window()
#
##############################################################################
#
-# Routine - display_change_log
+# Routine - get_change_log_window
#
-# Description - Displays the change log dialog window for the specified
-# revision.
+# Description - Creates or prepares an existing a change log window for
+# use.
#
-# Data - $browser : The browser instance that started the
-# advanced find.
+# Data - Return Value : A reference to the newly created or unused
+# change log instance record.
#
##############################################################################
-sub display_change_log($)
+sub get_change_log_window()
{
- my($browser) = @_;
-
- my (@certs_list,
- $font,
+ my ($font,
+ $height,
$instance,
- @revision_details,
- @revision_ids);
+ $width);
- $instance = {};
- $instance->{glade} =
- Gtk2::GladeXML->new("../mtn-browse.glade", "changelog_window");
+ foreach my $window (@windows)
+ {
+ if ($window->{type} eq "change_log_window"
+ && ! $window->{window}->mapped())
+ {
+ $instance = $window;
+ last;
+ }
+ }
- # Connect Glade registered signal handlers.
+ # Create a new change log window if an unused one wasn't found, otherwise
+ # reuse an existing unused one.
- $instance->{glade}->signal_autoconnect
- (sub {
- my($callback_name, $widget, $signal_name, $signal_data,
- $connect_object, $after, $user_data) = @_;
- my $func = $after ? "signal_connect_after" : "signal_connect";
- $widget->$func($signal_name,
- $callback_name,
- $connect_object ? $connect_object : $user_data); },
- $instance);
+ if (! defined($instance))
+ {
+ $instance = {};
+ $instance->{type} = "change_log_window";
+ $instance->{glade} =
+ Gtk2::GladeXML->new("../mtn-browse.glade", "changelog_window");
- # Get the widgets that we are interested in.
+ # Flag to stop recursive calling of callbacks.
- $instance->{window} =
- $instance->{glade}->get_widget("changelog_window");
- $instance->{window}->set_icon($app_icon);
- $instance->{window}->set_title
- ("Revision " . $browser->{revision_combo_details}->{value});
- $instance->{changelog_textview} =
- $instance->{glade}->get_widget("changelog_textview");
- $instance->{changelog_scrolledwindow} =
- $instance->{glade}->get_widget("changelog_scrolledwindow");
+ $instance->{in_cb} = 0;
- # Setup the changelog window deletion handler.
+ # Connect Glade registered signal handlers.
- $instance->{window}->signal_connect
- ("delete_event", sub { $_[0]->destroy(); return TRUE; });
+ $instance->{glade}->signal_autoconnect
+ (sub {
+ my($callback_name, $widget, $signal_name, $signal_data,
+ $connect_object, $after, $user_data) = @_;
+ my $func = $after ? "signal_connect_after" : "signal_connect";
+ $widget->$func($signal_name,
+ $callback_name,
+ $connect_object ?
+ $connect_object : $user_data); },
+ $instance);
- # Setup the revision changelog viewer.
+ # Get the widgets that we are interested in.
- $instance->{changelog_buffer} =
- $instance->{changelog_textview}->get_buffer();
- create_format_tags($instance->{changelog_buffer});
- $font = Gtk2::Pango::FontDescription->from_string("monospace 10");
- $instance->{changelog_textview}->modify_font($font) if (defined($font));
+ $instance->{window} =
+ $instance->{glade}->get_widget("changelog_window");
+ $instance->{window}->set_icon($app_icon);
+ $instance->{changelog_textview} =
+ $instance->{glade}->get_widget("changelog_textview");
+ $instance->{changelog_scrolledwindow} =
+ $instance->{glade}->get_widget("changelog_scrolledwindow");
- # Get the currently selected revision id.
+ # Setup the changelog window deletion handler.
- get_revision_ids($browser, address@hidden);
+ $instance->{window}->signal_connect
+ ("delete_event",
+ sub { $_[0]->hide() unless ($_[2]->{in_cb}); return TRUE; },
+ $instance);
- # Put the details into the text view and display it.
+ # Setup the revision changelog viewer.
+ $instance->{changelog_buffer} =
+ $instance->{changelog_textview}->get_buffer();
+ create_format_tags($instance->{changelog_buffer});
+ $font = Gtk2::Pango::FontDescription->from_string("monospace 10");
+ $instance->{changelog_textview}->modify_font($font)
+ if (defined($font));
+
+ $instance->{grab_widget} = $instance->{window};
+
+ push(@windows, $instance);
+ }
+ else
+ {
+ ($width, $height) = $instance->{window}->get_default_size();
+ $instance->{window}->resize($width, $height);
+ }
+
+ # Empty out the contents.
+
$instance->{changelog_buffer}->set_text("");
- $browser->{mtn}->certs(address@hidden, $revision_ids[0]);
- $browser->{mtn}->get_revision(address@hidden, $revision_ids[0]);
- generate_revision_report($instance->{changelog_buffer},
- $revision_ids[0],
- address@hidden,
- address@hidden);
- if ($instance->{changelog_scrolledwindow}->realized())
+
+ return $instance;
+
+}
+#
+##############################################################################
+#
+# Routine - get_file_history_window
+#
+# Description - Creates or prepares an existing a change log window for
+# use.
+#
+# Data - Return Value : A reference to the newly created or unused
+# change log instance record.
+#
+##############################################################################
+
+
+
+sub get_file_history_window()
+{
+
+ my ($font,
+ $height,
+ $instance,
+ $width);
+
+ foreach my $window (@windows)
{
- $instance->{changelog_scrolledwindow}->get_vadjustment()->set_value(0);
- $instance->{changelog_scrolledwindow}->get_hadjustment()->set_value(0);
+ if ($window->{type} eq "file_history_window"
+ && ! $window->{window}->mapped())
+ {
+ $instance = $window;
+ last;
+ }
}
- $instance->{window}->show_all();
+ # Create a new file history window if an unused one wasn't found, otherwise
+ # reuse an existing unused one.
+
+ if (! defined($instance))
+ {
+ $instance = {};
+ $instance->{type} = "file_history_window";
+ $instance->{glade} =
+ Gtk2::GladeXML->new("../mtn-browse.glade", "file_history_window");
+
+ # Flag to stop recursive calling of callbacks.
+
+ $instance->{in_cb} = 0;
+
+ # Connect Glade registered signal handlers.
+
+ $instance->{glade}->signal_autoconnect
+ (sub {
+ my($callback_name, $widget, $signal_name, $signal_data,
+ $connect_object, $after, $user_data) = @_;
+ my $func = $after ? "signal_connect_after" : "signal_connect";
+ $widget->$func($signal_name,
+ $callback_name,
+ $connect_object ?
+ $connect_object : $user_data); },
+ $instance);
+
+ # Get the widgets that we are interested in.
+
+ $instance->{window} =
+ $instance->{glade}->get_widget("file_history_window");
+ $instance->{window}->set_icon($app_icon);
+ $instance->{appbar} = $instance->{glade}->get_widget("appbar");
+ $instance->{history_textview} =
+ $instance->{glade}->get_widget("history_textview");
+ $instance->{history_scrolledwindow} =
+ $instance->{glade}->get_widget("history_scrolledwindow");
+ $instance->{stop_button} =
+ $instance->{glade}->get_widget("stop_button");
+ $instance->{compare_button} =
+ $instance->{glade}->get_widget("compare_button");
+ $instance->{numbers_label} =
+ $instance->{glade}->get_widget("numbers_value_label");
+ $instance->{revision_id_1_label} =
+ $instance->{glade}->get_widget("revision_id_1_value_label");
+ $instance->{revision_id_2_label} =
+ $instance->{glade}->get_widget("revision_id_2_value_label");
+
+ # Setup the file history callbacks.
+
+ $instance->{window}->signal_connect
+ ("delete_event",
+ sub { $_[0]->hide() unless ($_[2]->{in_cb}); return TRUE; },
+ $instance);
+ $instance->{stop_button}->signal_connect
+ ("clicked", sub { $_[1]->{stop} = 1; }, $instance);
+
+ # Setup the file history viewer.
+
+ $instance->{history_buffer} =
+ $instance->{history_textview}->get_buffer();
+ create_format_tags($instance->{history_buffer});
+ $font = Gtk2::Pango::FontDescription->from_string("monospace 10");
+ $instance->{history_textview}->modify_font($font) if (defined($font));
+
+ # Make the stop button the grab widget when busy, this is so the user
+ # can interrupt the history gathering process.
+
+ $instance->{grab_widget} = $instance->{stop_button};
+
+ push(@windows, $instance);
+ }
+ else
+ {
+ ($width, $height) = $instance->{window}->get_default_size();
+ $instance->{window}->resize($width, $height);
+ $instance->{stop_button}->set_sensitive(FALSE);
+ $instance->{compare_button}->set_sensitive(FALSE);
+ set_label_value($instance->{numbers_label}, "");
+ set_label_value($instance->{revision_id_1_label}, "");
+ set_label_value($instance->{revision_id_2_label}, "");
+ }
+
+ $instance->{stop} = 0;
+
+ # Empty out the contents.
+
+ $instance->{history_buffer}->set_text("");
+
+ return $instance;
+
}
#
##############################################################################
#
+# Routine - get_file_history_helper
+#
+# Description - Recursive routine for getting the revisions in a file's
+# change history.
+#
+# Data - $instance : The file history window instance.
+# $hash : A reference to a hash that is to contain the
+# list of revision ids.
+# $revision_id : The revision id from where the search is to
+# commence.
+#
+##############################################################################
+
+
+
+sub get_file_history_helper($$$)
+{
+
+ my($instance, $hash, $revision_id) = @_;
+
+ my(@change_parents,
+ @parents);
+
+ return if ($instance->{stop});
+
+ $instance->{mtn}->get_content_changed(address@hidden,
+ $revision_id,
+ $instance->{file_name});
+ foreach my $revision (@change_parents)
+ {
+ if (! exists($hash->{$revision}))
+ {
+ $hash->{$revision} = 1;
+ set_label_value($instance->{numbers_label}, scalar(keys(%$hash)));
+ gtk2_update();
+ @parents = ();
+ $instance->{mtn}->parents(address@hidden, $revision);
+ foreach my $parent (@parents)
+ {
+ get_file_history_helper($instance, $hash, $parent);
+ }
+ }
+ }
+
+}
+#
+##############################################################################
+#
# Routine - update_browser_state
#
# Description - Update the display of the specified browser instance
@@ -2697,8 +3203,11 @@ sub update_advanced_find_state($$)
# on.
# $certs_list : A reference to a certs list as returned
# by $mtn->certs().
-# $revision_details : A reference to a revision details list
-# as returned by $mtn->get_revision().
+# $revision_details : Either a reference to a revision
+# details list as returned by
+# $mtn->get_revision() if a detailed
+# report is to be generated or undef if
+# the report is to just be a summary.
#
##############################################################################
@@ -2752,93 +3261,100 @@ sub generate_revision_report($$$$)
$text_buffer->insert_with_tags_by_name
($text_buffer->get_end_iter(), "\nChange Log:\n", "bold");
$text_buffer->insert($text_buffer->get_end_iter(),
- sprintf("%s\n", $change_log));
+ sprintf("%s", $change_log));
- # Revision details.
+ # The rest is only provided if it is a detailed report.
- $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
- "\nChanges Made:\n", "bold");
- foreach my $type (@types)
+ if (defined($revision_details))
{
- $revision_data{$type} = [];
- }
- foreach my $change (@$revision_details)
- {
- if ($change->{type} eq "add_dir")
+
+ # Revision details.
+
+ $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
+ "\n\nChanges Made:\n", "bold");
+ foreach my $type (@types)
{
- push(@{$revision_data{"Added"}}, $change->{name} . "/");
+ $revision_data{$type} = [];
}
- elsif ($change->{type} eq "add_file")
+ foreach my $change (@$revision_details)
{
- push(@{$revision_data{"Added"}}, $change->{name});
+ if ($change->{type} eq "add_dir")
+ {
+ push(@{$revision_data{"Added"}}, $change->{name} . "/");
+ }
+ elsif ($change->{type} eq "add_file")
+ {
+ push(@{$revision_data{"Added"}}, $change->{name});
+ }
+ elsif ($change->{type} eq "delete")
+ {
+ push(@{$revision_data{"Removed"}}, $change->{name});
+ }
+ elsif ($change->{type} eq "patch")
+ {
+ push(@{$revision_data{"Changed"}}, $change->{name});
+ }
+ elsif ($change->{type} eq "rename")
+ {
+ push(@{$revision_data{"Renamed"}},
+ $change->{from_name} . " -> " . $change->{to_name});
+ }
+ elsif ($change->{type} eq "clear")
+ {
+ push(@{$revision_data{"Attributes"}},
+ sprintf("%s: %s was cleared",
+ $change->{name},
+ $change->{attribute}));
+ }
+ elsif ($change->{type} eq "clear" || $change->{type} eq "set")
+ {
+ push(@{$revision_data{"Attributes"}},
+ sprintf("%s: %s = %s",
+ $change->{name},
+ $change->{attribute},
+ $change->{value}));
+ }
+ elsif ($change->{type} eq "old_revision")
+ {
+ push(@parent_revision_ids, $change->{revision_id});
+ }
+ elsif ($change->{type} eq "new_manifest")
+ {
+ $manifest_id = $change->{manifest_id};
+ }
}
- elsif ($change->{type} eq "delete")
+ foreach my $type (@types)
{
- push(@{$revision_data{"Removed"}}, $change->{name});
- }
- elsif ($change->{type} eq "patch")
- {
- push(@{$revision_data{"Changed"}}, $change->{name});
- }
- elsif ($change->{type} eq "rename")
- {
- push(@{$revision_data{"Renamed"}},
- $change->{from_name} . " -> " . $change->{to_name});
- }
- elsif ($change->{type} eq "clear")
- {
- push(@{$revision_data{"Attributes"}},
- sprintf("%s: %s was cleared",
- $change->{name},
- $change->{attribute}));
- }
- elsif ($change->{type} eq "clear" || $change->{type} eq "set")
- {
- push(@{$revision_data{"Attributes"}},
- sprintf("%s: %s = %s",
- $change->{name},
- $change->{attribute},
- $change->{value}));
- }
- elsif ($change->{type} eq "old_revision")
- {
- push(@parent_revision_ids, $change->{revision_id});
- }
- elsif ($change->{type} eq "new_manifest")
- {
- $manifest_id = $change->{manifest_id};
- }
- }
- foreach my $type (@types)
- {
- if (scalar(@{$revision_data{$type}}) > 0)
- {
- $text_buffer->insert_with_tags_by_name
- ($text_buffer->get_end_iter(),
- " " . $type . ":\n", "italics");
- %seen = ();
- @unique = sort(grep { ! $seen{$_} ++ }
- @{$revision_data{$type}});
- foreach my $line (@unique)
+ if (scalar(@{$revision_data{$type}}) > 0)
{
- $text_buffer->insert($text_buffer->get_end_iter(),
- "\t" . $line . "\n");
+ $text_buffer->insert_with_tags_by_name
+ ($text_buffer->get_end_iter(),
+ " " . $type . ":\n", "italics");
+ %seen = ();
+ @unique = sort(grep { ! $seen{$_} ++ }
+ @{$revision_data{$type}});
+ foreach my $line (@unique)
+ {
+ $text_buffer->insert($text_buffer->get_end_iter(),
+ "\t" . $line . "\n");
+ }
}
}
- }
- # Parent revision and manifest ids.
+ # Parent revision and manifest ids.
- $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
- "\nParent revision id(s):\t",
- "bold");
- $text_buffer->insert($text_buffer->get_end_iter(),
- join(" ", @parent_revision_ids) . "\n");
- $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
- "Manifest id:\t\t",
- "bold");
- $text_buffer->insert($text_buffer->get_end_iter(), $manifest_id);
+ $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
+ "\nParent revision id(s):\t",
+ "bold");
+ $text_buffer->insert($text_buffer->get_end_iter(),
+ join(" ", @parent_revision_ids) . "\n");
+ $text_buffer->insert_with_tags_by_name($text_buffer->get_end_iter(),
+ "Manifest id:\t\t",
+ "bold");
+ $text_buffer->insert($text_buffer->get_end_iter(), $manifest_id);
+ }
+
}
#
##############################################################################
@@ -3091,12 +3607,12 @@ sub sigchld_handler()
# If it is an mtn process then close down the relevant object so
# that it will automatically restart when needed.
- foreach my $browser (@browsers)
+ foreach my $window (@windows)
{
- if (exists($browser->{mtn})
- && $browser->{mtn}->get_pid() == $pid)
+ if (exists($window->{mtn})
+ && $window->{mtn}->get_pid() == $pid)
{
- $browser->{mtn}->closedown();
+ $window->{mtn}->closedown();
my $dialog = Gtk2::MessageDialog->new
(undef,
["modal"],
@@ -3221,10 +3737,8 @@ sub make_busy($$)
# Create and store the cursors if we haven't done so already.
- if (! exists($instance->{busy_cursor}))
- {
- $instance->{busy_cursor} = Gtk2::Gdk::Cursor->new("watch");
- }
+ $busy_cursor = Gtk2::Gdk::Cursor->new("watch")
+ unless (defined($busy_cursor));
# Do it. Make the application bar grab the input when the window is busy,
# that way we gobble up keyboard and mouse events that could muck up the
@@ -3232,13 +3746,33 @@ sub make_busy($$)
if ($busy)
{
- $instance->{window}->window()->set_cursor($instance->{busy_cursor});
- Gtk2->grab_add($instance->{appbar});
+ if (exists($instance->{grab_widget}))
+ {
+ Gtk2->grab_add($instance->{grab_widget});
+ }
+ else
+ {
+ Gtk2->grab_add($instance->{appbar});
+ }
+ foreach my $window (@windows)
+ {
+ $window->{window}->window()->set_cursor($busy_cursor);
+ }
}
else
{
- $instance->{window}->window()->set_cursor(undef);
- Gtk2->grab_remove($instance->{appbar});
+ if (exists($instance->{grab_widget}))
+ {
+ Gtk2->grab_remove($instance->{grab_widget});
+ }
+ else
+ {
+ Gtk2->grab_remove($instance->{appbar});
+ }
+ foreach my $window (@windows)
+ {
+ $window->{window}->window()->set_cursor(undef);
+ }
}
}
============================================================
--- mtn-browse.glade 7473eb8e208f212a0d8ce2c779a33f11a05d6263
+++ mtn-browse.glade 227b6396b82d3f5b1f254c912ddb2eafcd5e9d87
@@ -549,13 +549,13 @@ criteria for selecting a revision
-
+
True
View the revision's change log
True
GTK_RELIEF_NORMAL
True
-
+
@@ -1422,12 +1422,13 @@ into a viewer
-
+
True
View file's change log
True
GTK_RELIEF_NORMAL
True
+
@@ -1447,35 +1448,6 @@ into a viewer
False
-
-
-
- True
- Compare file contents
-with another version
-
- True
- GTK_RELIEF_NORMAL
- True
-
-
-
- True
- gnome-stock-multiple-file
- 4
- 0.5
- 0.5
- 0
- 0
-
-
-
-
- 0
- False
- False
-
-
0
@@ -2036,155 +2008,356 @@ with another version
0
-
+
+ 5
True
False
0
-
- 5
+
True
- False
- 0
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
-
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
-
+
+ 5
True
- 0.5
- 0.5
- 1
- 1
- 0
- 0
- 0
- 0
+ False
+ 5
-
- 5
+
True
+ Select Simple Query you you just want to manually
+select the branch and revision from drop down lists
+ True
+ Simple Query
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ Select Advanced Query if you want to
+specify very specific selection critia
+ True
+ Advanced Query
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+ simple_query_radiobutton
+
+
+ 0
+ False
+ False
+
+
+
+
+
+
+
+
+
+ True
+ <b>Mode</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 5
+ True
+ False
+ 5
+
+
+
+ True
+ Project branch to access
+ True
+ False
+
+
+
+ True
+ Branch:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.25
+ 0
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ 1
+ 1
False
- 5
+ 0
+ 0
-
+
True
- Select Simple Query you you just want to manually
-select the branch and revision from drop down lists
- True
- Simple Query
- True
- GTK_RELIEF_NORMAL
- True
- False
- False
- True
-
+
- 0
- False
- False
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+ 0
+ True
+ True
+
+
+
+
+ True
+ Revision within project to access
+ True
+ False
+
-
+
True
- Select Advanced Query if you want to
-specify very specific selection critia
- True
- Advanced Query
- True
- GTK_RELIEF_NORMAL
- True
- False
- False
- True
- simple_query_radiobutton
+ Revision:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.25
+ 0
+ 0
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ 1
+ 1
+ False
+ 0
+ 0
+
+
+
+ True
+
+
- 0
- False
- False
+ 0
+ 1
+ 0
+ 1
+ fill
+
+ 0
+ True
+ True
+
-
-
-
-
- True
- <b>Mode</b>
- False
- True
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
+
+
+ True
+ Select this if only those revisions
+that have been tagged on the
+current branch are to be listed
+ True
+ Tagged
+ True
+ GTK_RELIEF_NORMAL
+ True
+ False
+ False
+ True
+
+
+
+ 0
+ False
+ False
+
+
-
- label_item
-
+
+
+
+
+ True
+ <b>Simply Query</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
- 0
- False
- True
+ label_item
+
+
+ 0
+ False
+ True
+
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
-
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
-
+
+ 5
True
- 0.5
- 0.5
- 1
- 1
- 0
- 0
- 0
- 0
+ False
+ 5
-
- 5
+
True
False
5
-
+
True
- Project branch to access
+ Enter an advanced Monotone selection query -
+you can use the helper tools directly below this
+entry field if you cannot remember the syntax
True
False
-
+
True
- Branch:
+ Search Term:
False
False
GTK_JUSTIFY_LEFT
@@ -2205,7 +2378,7 @@ specify very specific selection critia
-
+
True
1
1
@@ -2214,9 +2387,8 @@ specify very specific selection critia
0
-
+
True
-
0
@@ -2235,23 +2407,21 @@ specify very specific selection critia
-
+
True
- Revision within project to access
- True
- False
+ Execute the query
+ True
+ GTK_RELIEF_NORMAL
+ True
+
-
+
True
- Revision:
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
+ gtk-execute
+ 4
0.5
- 0.25
+ 0.5
0
0
@@ -2263,10 +2433,103 @@ specify very specific selection critia
False
+
+
+ 0
+ True
+ True
+
+
+
+
+ True
+ False
+ 5
+
-
+
True
+ Enter the current selector into the query above
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+
+ True
+ gtk-go-up
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ False
+ False
+
+
+
+
+
+ True
+ The type of selector that is to be inserted above
+ True
+ False
+
+
+
+ True
+ Author
+Branch
+Cert
+Date (=)
+Date (<=)
+Date (>)
+Head Revision
+Identifier
+Parent
+Separator
+Tag
+
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+ True
+ Enter any arguments here
+ True
+ True
+ True
+ 0
+
+ True
+ *
+ False
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
1
1
False
@@ -2274,88 +2537,89 @@ specify very specific selection critia
0
-
+
True
-
+ Use this to specify the date for date based selectors
+ True
+ False
+
+
+
+ True
+ GNOME_DATE_EDIT_SHOW_TIME|GNOME_DATE_EDIT_24_HR
+ 7
+ 19
+
+
0
1
0
1
- fill
+
0
- True
- True
-
-
-
-
-
- True
- Select this if only those revisions
-that have been tagged on the
-current branch are to be listed
- True
- Tagged
- True
- GTK_RELIEF_NORMAL
- True
- False
- False
- True
-
-
-
- 0
False
False
+
+ 0
+ True
+ True
+
+
+
-
-
- True
- <b>Simply Query</b>
- False
- True
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
+
+
+ True
+ <b>Advanced Query</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
- 0
- False
- True
+ label_item
+
+
+ 0
+ False
+ True
+
+
+
+
+ True
+ True
+ 300
+
-
+
True
0
0.5
GTK_SHADOW_ETCHED_IN
-
+
True
0.5
0.5
@@ -2367,256 +2631,36 @@ current branch are to be listed0
-
+
5
True
- False
- 5
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
-
+
True
- False
- 5
-
-
-
- True
- Enter an advanced Monotone selection query -
-you can use the helper tools directly below this
-entry field if you cannot remember the syntax
- True
- False
-
-
-
- True
- Search Term:
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.25
- 0
- 0
-
-
-
-
- 0
- False
- False
-
-
-
-
-
- True
- 1
- 1
- False
- 0
- 0
-
-
-
- True
-
-
- 0
- 1
- 0
- 1
- fill
-
-
-
-
- 0
- True
- True
-
-
-
-
-
- True
- Execute the query
- True
- GTK_RELIEF_NORMAL
- True
-
-
-
-
- True
- gtk-execute
- 4
- 0.5
- 0.5
- 0
- 0
-
-
-
-
- 0
- False
- False
-
-
+ True
+ True
+ False
+ False
+ True
+
+
-
- 0
- True
- True
-
-
-
-
- True
- False
- 5
-
-
-
- True
- Enter the current selector into the query above
- True
- GTK_RELIEF_NORMAL
- True
-
-
-
-
- True
- gtk-go-up
- 4
- 0.5
- 0.5
- 0
- 0
-
-
-
-
- 0
- False
- False
-
-
-
-
-
- True
- The type of selector that is to be inserted above
- True
- False
-
-
-
- True
- Author
-Branch
-Cert
-Date (=)
-Date (<=)
-Date (>)
-Head Revision
-Identifier
-Parent
-Separator
-Tag
-
-
-
-
-
- 0
- False
- True
-
-
-
-
-
- True
- Enter any arguments here
- True
- True
- True
- 0
-
- True
- *
- False
-
-
- 0
- True
- True
-
-
-
-
-
- True
- 1
- 1
- False
- 0
- 0
-
-
-
- True
- Use this to specify the date for date based selectors
- True
- False
-
-
-
- True
- GNOME_DATE_EDIT_SHOW_TIME|GNOME_DATE_EDIT_24_HR
- 7
- 19
-
-
-
-
- 0
- 1
- 0
- 1
-
-
-
-
-
- 0
- False
- False
-
-
-
-
- 0
- True
- True
-
-
-
+
True
- <b>Advanced Query</b>
+ <b>Revisions</b>
False
True
GTK_JUSTIFY_LEFT
@@ -2633,298 +2677,213 @@ Tag
- 0
- False
- True
+ True
+ True
-
+
True
- True
- 300
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
-
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
-
+
+ 5
True
- 0.5
- 0.5
- 1
- 1
- 0
- 0
- 0
- 0
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
-
- 5
+
True
True
- GTK_POLICY_AUTOMATIC
- GTK_POLICY_AUTOMATIC
- GTK_SHADOW_IN
- GTK_CORNER_TOP_LEFT
-
-
-
- True
- True
- True
- False
- False
- True
-
-
-
-
+ False
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ GTK_WRAP_NONE
+ False
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
-
-
-
- True
- <b>Revisions</b>
- False
- True
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
-
- True
- True
-
-
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
-
-
-
- True
- 0.5
- 0.5
- 1
- 1
- 0
- 0
- 0
- 0
-
-
-
- 5
- True
- True
- GTK_POLICY_AUTOMATIC
- GTK_POLICY_AUTOMATIC
- GTK_SHADOW_IN
- GTK_CORNER_TOP_LEFT
-
-
-
- True
- True
- False
- False
- True
- GTK_JUSTIFY_LEFT
- GTK_WRAP_NONE
- False
- 0
- 0
- 0
- 0
- 0
- 0
-
-
-
-
-
-
-
-
-
-
- True
- <b>Details</b>
- False
- True
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
+ <b>Details</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
- True
- True
+ label_item
- 0
- True
- True
+ True
+ True
+
+
+ 0
+ True
+ True
+
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
-
+
True
- 0
- 0.5
- GTK_SHADOW_ETCHED_IN
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
-
+
+ 5
True
- 0.5
- 0.5
- 1
- 1
- 0
- 0
- 0
- 0
+ True
+ 5
-
- 5
+
True
- True
+ False
5
-
+
+ 0
+ 0
True
- False
- 5
+ Name of the currently selected branch
+ True
+ False
-
+
0
0
True
- Name of the currently selected branch
- True
- False
-
-
-
- 0
- 0
- True
- True
- Branch:
- False
- False
- GTK_JUSTIFY_LEFT
- False
- True
- 0
- 0.5
- 0
- 0
-
-
+ True
+ Branch:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
-
- 0
- False
- False
-
+
+
+ 0
+ False
+ False
+
+
+
+
+ True
+ True
+ GTK_POLICY_NEVER
+ GTK_POLICY_NEVER
+ GTK_SHADOW_NONE
+ GTK_CORNER_TOP_LEFT
+
-
+
True
- True
- GTK_POLICY_NEVER
- GTK_POLICY_NEVER
- GTK_SHADOW_NONE
- GTK_CORNER_TOP_LEFT
+ 1
+ 1
+ 0 0 310 10 279 310
+ 0 0 17 10 15.3 17
-
+
+ 0
+ 0
True
- 1
- 1
- 0 0 310 10 279 310
- 0 0 17 10 15.3 17
+ True
+ False
-
+
0
0
True
- True
- False
-
-
-
- 0
- 0
- True
- True
-
- False
- False
- GTK_JUSTIFY_LEFT
- False
- True
- 0
- 0.5
- 0
- 0
-
-
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
-
- 0
- 0
-
+
+ 0
+ 0
+
-
- 0
- True
- True
-
@@ -2933,100 +2892,100 @@ Tag
True
+
+
+ 0
+ True
+ True
+
+
+
+
+ True
+ False
+ 5
+
-
+
True
- False
- 5
+ Id of the currently selected revision
+ True
+ False
-
+
True
- Id of the currently selected revision
- True
- False
-
-
-
- True
- Revision Id:
- False
- False
- GTK_JUSTIFY_LEFT
- False
- False
- 0
- 0.5
- 0
- 0
-
-
+ Revision Id:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
-
- 0
- False
- False
-
+
+
+ 0
+ False
+ False
+
+
+
+
+ True
+ True
+ GTK_POLICY_NEVER
+ GTK_POLICY_NEVER
+ GTK_SHADOW_NONE
+ GTK_CORNER_TOP_LEFT
+
-
+
True
- True
- GTK_POLICY_NEVER
- GTK_POLICY_NEVER
- GTK_SHADOW_NONE
- GTK_CORNER_TOP_LEFT
+ 1
+ 1
+ 0 0 286 10 257.4 286
+ 0 0 17 10 15.3 17
-
+
+ 0
+ 0
True
- 1
- 1
- 0 0 286 10 257.4 286
- 0 0 17 10 15.3 17
+ True
+ False
-
+
0
0
True
- True
- False
-
-
-
- 0
- 0
- True
- True
-
- False
- False
- GTK_JUSTIFY_LEFT
- False
- True
- 0
- 0.5
- 0
- 0
-
-
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
-
- 0
- 0
-
+
+ 0
+ 0
+
-
- 0
- True
- True
-
@@ -3036,49 +2995,38 @@ Tag
+
+ 0
+ True
+ True
+
+
+
-
-
- True
- <b>Current Selection</b>
- False
- True
- GTK_JUSTIFY_LEFT
- False
- False
- 0.5
- 0.5
- 0
- 0
-
-
- label_item
-
-
+
+
+ True
+ <b>Current Selection</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
- 0
- False
- True
+ label_item
0
- True
- True
-
-
-
-
-
- True
-
-
- 0
False
True
@@ -3092,6 +3040,17 @@ Tag
+
+ True
+
+
+ 0
+ False
+ True
+
+
+
+
True
False
@@ -3150,6 +3109,7 @@ Tag
True
+ False
True
True
True
@@ -3274,4 +3234,600 @@ Tag
+
+ True
+
+ GTK_WINDOW_TOPLEVEL
+ GTK_WIN_POS_NONE
+ False
+ 550
+ 550
+ True
+ False
+ True
+ False
+ False
+ GDK_WINDOW_TYPE_HINT_NORMAL
+ GDK_GRAVITY_NORTH_WEST
+
+
+
+ True
+ False
+ 0
+
+
+
+ 5
+ True
+ False
+ 0
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 5
+ True
+ False
+ 5
+
+
+
+ True
+ True
+ GTK_POLICY_AUTOMATIC
+ GTK_POLICY_AUTOMATIC
+ GTK_SHADOW_IN
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ True
+ False
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ GTK_WRAP_NONE
+ False
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ False
+ 5
+
+
+
+ True
+ 1
+ 2
+ False
+ 0
+ 5
+
+
+
+ True
+ True
+ GTK_POLICY_NEVER
+ GTK_POLICY_NEVER
+ GTK_SHADOW_NONE
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ 1
+ 1
+ 0 0 327 10 294.3 327
+ 0 0 17 10 15.3 17
+
+
+
+ 0
+ 0
+ True
+ True
+ False
+
+
+
+ 0
+ 0
+ True
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ 1
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+ True
+ Number of revisions listed
+ True
+ False
+
+
+
+ True
+ Number Of Revisions:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+ fill
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ False
+ Stop gathering the file history
+ True
+ gtk-stop
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+ 0
+ False
+ False
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+
+
+
+
+ True
+ <b>File History</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ 0
+ 0.5
+ GTK_SHADOW_ETCHED_IN
+
+
+
+ True
+ 0.5
+ 0.5
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+
+
+
+ 5
+ True
+ False
+ 5
+
+
+
+ True
+ 2
+ 2
+ False
+ 0
+ 5
+
+
+
+ True
+ True
+ GTK_POLICY_NEVER
+ GTK_POLICY_NEVER
+ GTK_SHADOW_NONE
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ 1
+ 1
+ 0 0 368 10 331.2 368
+ 0 0 17 10 15.3 17
+
+
+
+ 0
+ 0
+ True
+ File id of the first file that is to be compared
+ True
+ False
+
+
+
+ 0
+ 0
+ True
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ 1
+ 2
+ 0
+ 1
+ fill
+
+
+
+
+
+ True
+ True
+ GTK_POLICY_NEVER
+ GTK_POLICY_NEVER
+ GTK_SHADOW_NONE
+ GTK_CORNER_TOP_LEFT
+
+
+
+ True
+ 1
+ 1
+ 0 0 368 10 331.2 368
+ 0 0 17 10 15.3 17
+
+
+
+ 0
+ 0
+ True
+ File id of the second file that is to be compared
+ True
+ False
+
+
+
+ 0
+ 0
+ True
+ True
+
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ True
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ 1
+ 2
+ 1
+ 2
+ fill
+
+
+
+
+
+ True
+ Revision id of the first selected
+file version that is to be compared
+ True
+ False
+
+
+
+ True
+ First Revision Id:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+ fill
+
+
+
+
+
+ True
+ Revision id of the second selected
+file version that is to be compared
+ True
+ False
+
+
+
+ True
+ Second Revision Id:
+ False
+ False
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 1
+ 2
+ fill
+ fill
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ 1
+ 1
+ False
+ 0
+ 5
+
+
+
+ True
+ False
+ Compare the two selected files
+ True
+ GTK_RELIEF_NORMAL
+ True
+
+
+
+ True
+ gnome-stock-multiple-file
+ 4
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+
+
+ 0
+ 1
+ 0
+ 1
+ fill
+
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+
+
+
+
+
+ True
+ <b>Compare</b>
+ False
+ True
+ GTK_JUSTIFY_LEFT
+ False
+ False
+ 0.5
+ 0.5
+ 0
+ 0
+
+
+ label_item
+
+
+
+
+ 0
+ False
+ True
+
+
+
+
+ 0
+ True
+ True
+
+
+
+
+
+ True
+ True
+ True
+
+
+ 0
+ False
+ True
+
+
+
+
+
+