# # # 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 critia0 - + 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 critiaFalse + + + 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 critia0 - + 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 + + + + + +