# # # patch "mtn-browse" # from [7999e26f88f712dcb691cdd8f5a37119f30b7f37] # to [5614bde862182fcdb857be110eefe99653960567] # # patch "mtn-browse.glade" # from [fbb380a8bad310c2daae4203616e19a112384c29] # to [a8aaa0db486372c57d0fefd51525db57d2e3a8d9] # ============================================================ --- mtn-browse 7999e26f88f712dcb691cdd8f5a37119f30b7f37 +++ mtn-browse 5614bde862182fcdb857be110eefe99653960567 @@ -75,6 +75,7 @@ use constant REVISION => 0x20; use constant DISPLAY_OF_FILE => 0x08; use constant FILE => 0x10; use constant REVISION => 0x20; +use constant REVISION_LIST => 0x02; # Constants used to represent the different state changes. Read this as # `what has just been changed' => `what needs to be updated'. @@ -86,17 +87,24 @@ use constant FILE_CHANGED => | DISPLAY_OF_FILE); use constant DISPLAY_OF_FILE_CHANGED => 0x00; use constant FILE_CHANGED => (DISPLAY_OF_FILE); +use constant NEW_FIND => 0xff; use constant REVISION_CHANGED => (DIRECTORY | DIRECTORY_VIEW | FILE | DISPLAY_OF_FILE); # Constants for the columns within the manifest ListStore widget. -use constant RLS_ICON_COLUMN => 0; -use constant RLS_NAME_COLUMN => 1; -use constant RLS_DATE_COLUMN => 2; -use constant RLS_AUTHOR_COLUMN => 3; -use constant RLS_MANIFEST_ENTRY_COLUMN => 4; +use constant MLS_ICON_COLUMN => 0; +use constant MLS_NAME_COLUMN => 1; +use constant MLS_DATE_COLUMN => 2; +use constant MLS_AUTHOR_COLUMN => 3; +use constant MLS_MANIFEST_ENTRY_COLUMN => 4; +# Constants for the columns within the details ListStore widget. + +use constant DLS_ICON_COLUMN => 0; +use constant DLS_NAME_COLUMN => 1; +use constant DLS_VALUE_COLUMN => 2; + # Text viewable application mime types. my @text_viewable_app_mime_types = @@ -154,6 +162,10 @@ my @browsers; my @browsers; +# The advanced find management record. + +my $advanced_find; + # The tooltips widget. my $tooltips; @@ -162,10 +174,14 @@ my $tooltips; # Private routines. +sub advanced_find($); +sub advanced_find_button_clicked_cb($$); sub combo_changed_cb($$); sub combo_key_release_event_cb($$$); +sub create_advanced_find_window(); sub delete_event_cb($$$); sub destroy_event_cb($$;$); +sub directory_up_button_clicked_cb($$); sub get_completion($$$$;$); sub get_dir_contents($$$); sub get_revision_ids($$); @@ -178,6 +194,7 @@ sub sigchld_handler(); sub set_label_value($$); sub setup_sigchld_handler($); sub sigchld_handler(); +sub update_advanced_find_state($$); sub update_browser_state($$); # ############################################################################## @@ -201,6 +218,7 @@ sub update_browser_state($$); Monotone::AutomateStdio->register_error_handler("both", \&mtn_error_handler); setup_sigchld_handler(\&sigchld_handler); + $tooltips = Gtk2::Tooltips->new(); push(@browsers, new_browser_instance()); # Hand control over to Gtk2. @@ -235,8 +253,7 @@ sub new_browser_instance() sub new_browser_instance() { - my(@branch_list, - $browser, + my($browser, $font, $renderer, $tv_column, @@ -244,7 +261,9 @@ sub new_browser_instance() $browser = {}; $browser->{mtn} = Monotone::AutomateStdio->new(); - $browser->{glade} = Gtk2::GladeXML->new("../mtn-browse.glade"); + # $browser->{glade} = Gtk2::GladeXML->new("../mtn-browse.glade"); + $browser->{glade} = + Gtk2::GladeXML->new("../mtn-browse.glade", "main_window"); # Flag to stop recursive calling of callbacks. @@ -264,14 +283,14 @@ sub new_browser_instance() }, $browser); - # Initialise tooltips. + # Link in the update handler for the browser. - $tooltips = Gtk2::Tooltips->new(); + $browser->{update_handler} = \&update_browser_state; # Get the widgets that we are interested in. - $browser->{main_window} = $browser->{glade}->get_widget("main_window"); - $browser->{main_appbar} = $browser->{glade}->get_widget("main_appbar"); + $browser->{window} = $browser->{glade}->get_widget("main_window"); + $browser->{appbar} = $browser->{glade}->get_widget("appbar"); $browser->{branch_combo} = $browser->{glade}->get_widget("branch_comboboxentry"); $browser->{revision_combo} = @@ -337,8 +356,8 @@ sub new_browser_instance() # Move the pane separator to a sensible position. - $div = $browser->{glade}->get_widget("browser_hpaned"); - $div->set_position(300); + # $div = $browser->{glade}->get_widget("browser_hpaned"); + # $div->set_position(300); # Setup the comboboxes. @@ -354,7 +373,7 @@ sub new_browser_instance() $browser->{revision_combo}->set_text_column(0); $browser->{revision_combo}->set_wrap_width(2); - # Setup the tree view file browser. + # Setup the tree view manifest file browser. $browser->{manifest_liststore} = Gtk2::ListStore->new("Glib::String", "Glib::String", @@ -367,10 +386,10 @@ sub new_browser_instance() $tv_column->set_resizable(FALSE); $tv_column->set_sizing("fixed"); $tv_column->set_fixed_width(25); - $tv_column->set_sort_column_id(RLS_ICON_COLUMN); + $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" => RLS_ICON_COLUMN); + $tv_column->set_attributes($renderer, "stock-id" => MLS_ICON_COLUMN); $browser->{manifest_treeview}->append_column($tv_column); $tv_column = Gtk2::TreeViewColumn->new(); @@ -378,35 +397,35 @@ sub new_browser_instance() $tv_column->set_resizable(TRUE); $tv_column->set_sizing("fixed"); $tv_column->set_fixed_width(180); - $tv_column->set_sort_column_id(RLS_NAME_COLUMN); + $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" => RLS_NAME_COLUMN); + $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(RLS_DATE_COLUMN); + $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" => RLS_DATE_COLUMN); + $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(RLS_AUTHOR_COLUMN); + $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" => RLS_AUTHOR_COLUMN); + $tv_column->set_attributes($renderer, "text" => MLS_AUTHOR_COLUMN); $browser->{manifest_treeview}->append_column($tv_column); - $browser->{manifest_treeview}->set_search_column(RLS_NAME_COLUMN); + $browser->{manifest_treeview}->set_search_column(MLS_NAME_COLUMN); - # $tv_column = $browser->{manifest_treeview}->get_column(RLS_DATE_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). @@ -426,9 +445,9 @@ sub new_browser_instance() add($browser->{file_view_sv}); $browser->{file_view_sv}->show_all(); - # Update the browser'a internal state. + # Update the browser's internal state. - update_browser_state($browser, DATABASE_CHANGED); + &{$browser->{update_handler}}($browser, DATABASE_CHANGED); return $browser; @@ -442,9 +461,9 @@ sub new_browser_instance() # a ComboBoxEntry by selecting an entry from its pulldown # list. # -# Data - $widget : The widget object that received the signal. -# $browser : The browser instance that is associated with -# this widget. +# Data - $widget : The widget object that received the signal. +# $instance : The window instance that is associated with +# this widget. # ############################################################################## @@ -453,30 +472,30 @@ sub combo_changed_cb($$) sub combo_changed_cb($$) { - my($widget, $browser) = @_; + my($widget, $instance) = @_; my ($change_state, $combo_details, $item, $value); - return if ($browser->{in_cb}); - local $browser->{in_cb} = 1; + return if ($instance->{in_cb}); + local $instance->{in_cb} = 1; - if ($widget == $browser->{branch_combo}) + if ($widget == $instance->{branch_combo}) { $change_state = BRANCH_CHANGED; - $combo_details = $browser->{branch_combo_details}; + $combo_details = $instance->{branch_combo_details}; } - elsif ($widget == $browser->{revision_combo}) + elsif ($widget == $instance->{revision_combo}) { $change_state = REVISION_CHANGED; - $combo_details = $browser->{revision_combo_details}; + $combo_details = $instance->{revision_combo_details}; } - elsif ($widget == $browser->{directory_combo}) + elsif ($widget == $instance->{directory_combo}) { $change_state = DIRECTORY_CHANGED; - $combo_details = $browser->{directory_combo_details}; + $combo_details = $instance->{directory_combo_details}; } else { @@ -497,8 +516,8 @@ sub combo_changed_cb($$) { $combo_details->{value} = $value; $combo_details->{completed} = 1; - $browser->{main_appbar}->clear_stack(); - update_browser_state($browser, $change_state); + $instance->{appbar}->clear_stack(); + &{$instance->{update_handler}}($instance, $change_state); last; } } @@ -516,7 +535,7 @@ sub combo_changed_cb($$) # Data - $widget : The widget object that received the signal. # $event : A Gtk2::Gdk::Event object describing the # event that has occurred. -# $browser : The browser instance that is associated with +# $instance : The window instance that is associated with # this widget. # Return Value : TRUE if the event has been handled and needs # no further handling, otherwise false if the @@ -530,7 +549,7 @@ sub combo_key_release_event_cb($$$) sub combo_key_release_event_cb($$$) { - my($widget, $event, $browser) = @_; + my($widget, $event, $instance) = @_; my ($change_state, $combo, @@ -544,28 +563,28 @@ sub combo_key_release_event_cb($$$) $old_value, $value); - return FALSE if ($browser->{in_cb}); - local $browser->{in_cb} = 1; + return FALSE if ($instance->{in_cb}); + local $instance->{in_cb} = 1; - if ($widget == $browser->{branch_combo}->child()) + if ($widget == $instance->{branch_combo}->child()) { - $combo = $browser->{branch_combo}; + $combo = $instance->{branch_combo}; $change_state = BRANCH_CHANGED; - $combo_details = $browser->{branch_combo_details}; + $combo_details = $instance->{branch_combo_details}; $name = "branch"; } - elsif ($widget == $browser->{revision_combo}->child()) + elsif ($widget == $instance->{revision_combo}->child()) { - $combo = $browser->{revision_combo}; + $combo = $instance->{revision_combo}; $change_state = REVISION_CHANGED; - $combo_details = $browser->{revision_combo_details}; + $combo_details = $instance->{revision_combo_details}; $name = "revision"; } - elsif ($widget == $browser->{directory_combo}->child()) + elsif ($widget == $instance->{directory_combo}->child()) { - $combo = $browser->{directory_combo}; + $combo = $instance->{directory_combo}; $change_state = DIRECTORY_CHANGED; - $combo_details = $browser->{directory_combo_details}; + $combo_details = $instance->{directory_combo_details}; $name = "directory"; } else @@ -601,11 +620,11 @@ sub combo_key_release_event_cb($$$) \$completed, $combo_details->{completion_cache})) { - $browser->{main_appbar}->clear_stack(); + $instance->{appbar}->clear_stack(); } else { - $browser->{main_appbar}-> + $instance->{appbar}-> push("Invalid " . $name . " name`" . $value . "'"); } $value = $completion; @@ -630,7 +649,7 @@ sub combo_key_release_event_cb($$$) # Update the browser state on a significant change. - update_browser_state($browser, $change_state) + &{$instance->{update_handler}}($instance, $change_state) if ($combo_details->{completed} != $old_completed || $combo_details->{value} ne $old_value); @@ -648,6 +667,34 @@ sub combo_key_release_event_cb($$$) # the tagged_checkbutton. # list. # +# Data - $widget : The widget object that received the signal. +# $instance : The window instance that is associated with +# this widget. +# +############################################################################## + + + +sub tagged_checkbutton_toggled_cb($$) +{ + + my($widget, $instance) = @_; + + return if ($instance->{in_cb}); + local $instance->{in_cb} = 1; + + $instance->{appbar}->clear_stack(); + &{$instance->{update_handler}}($instance, BRANCH_CHANGED); + +} +# +############################################################################## +# +# Routine - advanced_find_button_clicked_cb +# +# Description - Callback routine called when the user clicks on the up +# directory button. +# # Data - $widget : The widget object that received the signal. # $browser : The browser instance that is associated with # this widget. @@ -656,16 +703,18 @@ sub combo_key_release_event_cb($$$) -sub tagged_checkbutton_toggled_cb($$) +sub advanced_find_button_clicked_cb($$) { my($widget, $browser) = @_; + my($len, + $value); + return if ($browser->{in_cb}); local $browser->{in_cb} = 1; - $browser->{main_appbar}->clear_stack(); - update_browser_state($browser, BRANCH_CHANGED); + advanced_find($browser); } # @@ -684,7 +733,7 @@ sub tagged_checkbutton_toggled_cb($$) -sub directory_up_button_clicked_cb +sub directory_up_button_clicked_cb($$) { my($widget, $browser) = @_; @@ -730,8 +779,8 @@ sub directory_up_button_clicked_cb $browser->{directory_combo_details}->{last_typed_len} = $len; } $browser->{directory_combo}->child()->set_text($value); - $browser->{main_appbar}->clear_stack(); - update_browser_state($browser, DIRECTORY_CHANGED); + $browser->{appbar}->clear_stack(); + &{$browser->{update_handler}}($browser, DIRECTORY_CHANGED); } } @@ -740,13 +789,12 @@ sub directory_up_button_clicked_cb # # Routine - manifest_treeview_cursor_changed_cb # -# Description - Callback routine called when the user changes the value of -# a ComboBoxEntry by entering a character (key release -# event). +# Description - Callback routine called when the user selects an entry in +# the manifest treeview. # -# Data - $widget : The widget object that received the signal. -# $browser : The browser instance that is associated with -# this widget. +# Data - $widget : The widget object that received the signal. +# $browser : The browser instance that is associated with +# this widget. # ############################################################################## @@ -757,21 +805,50 @@ sub manifest_treeview_cursor_changed_cb( my($widget, $browser) = @_; + my($manifest_entry, + $short_name); + + return if ($browser->{in_cb}); + local $browser->{in_cb} = 1; + + # Get the manifest entry details for the item that was selected. + + $widget->get_selection()->selected_foreach + (sub + { + my($model, $path, $iter) = @_; + $short_name = $model->get($iter, MLS_NAME_COLUMN); + $manifest_entry = $model->get($iter, MLS_MANIFEST_ENTRY_COLUMN); + }); + + # If the item is a file then display its contents, otherwise if it is a + # directory then just ignore it. + + if ($manifest_entry->{type} eq "file") + { + $browser->{file_being_viewed} = {short_name => $short_name, + manifest_entry => $manifest_entry}; + $browser->{appbar}->clear_stack(); + &{$browser->{update_handler}}($browser, FILE_CHANGED); + } + } # ############################################################################## # # Routine - manifest_treeview_row_activated_cb # -# Description - Callback routine called when the user changes the value of -# a ComboBoxEntry by entering a character (key release -# event). +# Description - Callback routine called when the user double clicks on an +# entry in the manifest treeview. # -# Data - $widget : The widget object that received the signal. -# $event : A Gtk2::Gdk::Event object describing the -# event that has occurred. -# $browser : The browser instance that is associated with -# this widget. +# Data - $widget : The widget object that received the +# signal. +# $tree_path : A Gtk2::TreePath object for the +# selected item. +# $tree_view_column : A Gtk2::TreeViewColumn object for the +# selected item. +# $browser : The browser instance that is associated +# with this widget. # ############################################################################## @@ -782,8 +859,7 @@ sub manifest_treeview_row_activated_cb($ my($widget, $tree_path, $tree_view_column, $browser) = @_; - my(@list, - $manifest_entry, + my($manifest_entry, $short_name); return if ($browser->{in_cb}); @@ -795,12 +871,12 @@ sub manifest_treeview_row_activated_cb($ (sub { my($model, $path, $iter) = @_; - $short_name = $model->get($iter, RLS_NAME_COLUMN); - $manifest_entry = $model->get($iter, RLS_MANIFEST_ENTRY_COLUMN); + $short_name = $model->get($iter, MLS_NAME_COLUMN); + $manifest_entry = $model->get($iter, MLS_MANIFEST_ENTRY_COLUMN); }); - # If the item is a directory then change to it, if it is a file then - # display its contents. + # If the item is a directory then change to it, otherwise if it is a file + # then just ignore it. if ($manifest_entry->{type} eq "directory") { @@ -808,16 +884,9 @@ sub manifest_treeview_row_activated_cb($ $browser->{directory_combo_details}->{completed} = 1; $browser->{directory_combo}->child()-> set_text($manifest_entry->{name}); - $browser->{main_appbar}->clear_stack(); - update_browser_state($browser, DIRECTORY_CHANGED); + $browser->{appbar}->clear_stack(); + &{$browser->{update_handler}}($browser, DIRECTORY_CHANGED); } - else - { - $browser->{file_being_viewed} = {short_name => $short_name, - manifest_entry => $manifest_entry}; - $browser->{main_appbar}->clear_stack(); - update_browser_state($browser, FILE_CHANGED); - } } # @@ -886,6 +955,237 @@ sub destroy_event_cb($$;$) # ############################################################################## # +# Routine - advanced_find +# +# Description - This routine, if necessary, contructs the advanced find +# dialog window and then gets the user to select the revision +# they want. +# +# Data - $browser : The browser instance that started the +# advanced find. +# Return Value : A reference to the newly created browser +# instance record. +# +############################################################################## + + + +sub advanced_find($) +{ + + my($browser) = @_; + + $advanced_find = create_advanced_find_window() + unless (defined($advanced_find)); + + $advanced_find->{mtn} = $browser->{mtn}; + + # Update the window's internal state. + + { + local $advanced_find->{in_cb} = 1; + $advanced_find->{branch_combo_details}->{preset} = 1; + $advanced_find->{branch_combo_details}->{completed} = + $browser->{branch_combo_details}->{completed}; + $advanced_find->{branch_combo_details}->{value} = + $browser->{branch_combo_details}->{value}; + $advanced_find->{revision_combo_details}->{preset} = 1; + $advanced_find->{revision_combo_details}->{completed} = + $browser->{revision_combo_details}->{completed}; + $advanced_find->{revision_combo_details}->{value} = + $browser->{revision_combo_details}->{value}; + $advanced_find->{tagged_tick}-> + set_active($browser->{tagged_tick}->get_active()); + $advanced_find->{window}->set_transient_for($browser->{window}); + $advanced_find->{simple_query_radiobutton}->set_active(TRUE); + $advanced_find->{simple_frame}->set_sensitive(TRUE); + $advanced_find->{advanced_frame}->set_sensitive(FALSE); + $advanced_find->{ok_button}->set_sensitive(FALSE); + $advanced_find->{window}->show(); + &{$advanced_find->{update_handler}}($advanced_find, NEW_FIND); + } + + # Handle all events until the dialog is dismissed. + + $advanced_find->{done} = 0; + while (! $advanced_find->{done}) + { + Gtk2->main_iteration(); + } + + # Deal with the result. + + $advanced_find->{window}->hide(); + +} +# +############################################################################## +# +# Routine - create_advanced_find_window +# +# Description - This routine simply creates an advanced find dialog window. +# +# Data - Return Value : A reference to the newly created advanced +# find instance record. +# +############################################################################## + + + +sub create_advanced_find_window() +{ + + my(@branch_list, + $instance, + $renderer, + $tv_column); + + $instance = {}; + $instance->{glade} = + Gtk2::GladeXML->new("../mtn-browse.glade", "advanced_find_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); + + # Link in the update handler for the browser. + + $instance->{update_handler} = \&update_advanced_find_state; + + # Get the widgets that we are interested in. + + $instance->{window} = + $instance->{glade}->get_widget("advanced_find_window"); + $instance->{appbar} = $instance->{glade}->get_widget("appbar"); + $instance->{simple_query_radiobutton} = + $instance->{glade}->get_widget("simple_query_radiobutton"); + $instance->{simple_frame} = $instance->{glade}->get_widget("simple_frame"); + $instance->{advanced_frame} = + $instance->{glade}->get_widget("advanced_frame"); + $instance->{branch_combo} = + $instance->{glade}->get_widget("branch_comboboxentry"); + $instance->{revision_combo} = + $instance->{glade}->get_widget("revision_comboboxentry"); + $instance->{tagged_tick} = + $instance->{glade}->get_widget("tagged_checkbutton"); + $instance->{term_combo} = $instance->{glade}->get_widget("term_combobox"); + $instance->{date_dateedit} = + $instance->{glade}->get_widget("date_dateedit"); + $instance->{revisions_treeview} = + $instance->{glade}->get_widget("revisions_treeview"); + $instance->{details_treeview} = + $instance->{glade}->get_widget("details_treeview"); + $instance->{details_scrolledwindow} = + $instance->{glade}->get_widget("details_scrolledwindow"); + $instance->{selected_branch_label} = + $instance->{glade}->get_widget("selected_branch_value_label"); + $instance->{selected_revision_label} = + $instance->{glade}->get_widget("selected_revision_value_label"); + $instance->{ok_button} = $instance->{glade}->get_widget("ok_button"); + + # Setup the advanced find window deletion handlers. + + $instance->{window}->signal_connect + ("delete_event", sub { $_[2]->{done} = 1; return TRUE; }, $instance); + $instance->{glade}->get_widget("cancel_button")->signal_connect + ("clicked", sub { $_[1]->{done} = 1; }, $instance); + + # Setup the comboboxentry key release signal handlers. + + $instance->{branch_combo}->child()-> + signal_connect("key_release_event", + \&combo_key_release_event_cb, + $instance); + $instance->{revision_combo}->child()-> + signal_connect("key_release_event", + \&combo_key_release_event_cb, + $instance); + + # Setup the comboboxes. + + $instance->{branch_combo}->set_model(Gtk2::ListStore->new("Glib::String")); + $instance->{branch_combo}->set_text_column(0); + $instance->{branch_combo}->set_wrap_width(2); + $instance->{revision_combo}-> + set_model(Gtk2::ListStore->new("Glib::String")); + $instance->{revision_combo}->set_text_column(0); + $instance->{revision_combo}->set_wrap_width(2); + $instance->{term_combo}->set_active(0); + + # Setup the revisions list browser. + + $instance->{revisions_liststore} = Gtk2::ListStore->new("Glib::String"); + $instance->{revisions_treeview}-> + set_model($instance->{revisions_liststore}); + $tv_column = Gtk2::TreeViewColumn->new(); + $tv_column->set_resizable(TRUE); + $tv_column->set_sizing("grow-only"); + $tv_column->set_sort_column_id(0); + $renderer = Gtk2::CellRendererText->new(); + $tv_column->pack_start($renderer, FALSE); + $tv_column->set_attributes($renderer, "text" => 0); + $instance->{revisions_treeview}->append_column($tv_column); + $instance->{revisions_treeview}->set_search_column(0); + + # Setup the revision details viewer. + + $instance->{details_liststore} = Gtk2::ListStore->new("Glib::String", + "Glib::String", + "Glib::String"); + $instance->{details_treeview}->set_model($instance->{details_liststore}); + + $tv_column = Gtk2::TreeViewColumn->new(); + $tv_column->set_resizable(FALSE); + $tv_column->set_sizing("fixed"); + $tv_column->set_fixed_width(30); + $tv_column->set_sort_column_id(DLS_ICON_COLUMN); + $renderer = Gtk2::CellRendererPixbuf->new(); + $tv_column->pack_start($renderer, TRUE); + $tv_column->set_attributes($renderer, "stock-id" => DLS_ICON_COLUMN); + $instance->{details_treeview}->append_column($tv_column); + + $tv_column = Gtk2::TreeViewColumn->new(); + $tv_column->set_title("Cert Name"); + $tv_column->set_resizable(TRUE); + $tv_column->set_sizing("grow-only"); + $tv_column->set_sort_column_id(DLS_NAME_COLUMN); + $renderer = Gtk2::CellRendererText->new(); + $tv_column->pack_start($renderer, FALSE); + $tv_column->set_attributes($renderer, "text" => DLS_NAME_COLUMN); + $instance->{details_treeview}->append_column($tv_column); + + $tv_column = Gtk2::TreeViewColumn->new(); + $tv_column->set_title("Value"); + $tv_column->set_resizable(TRUE); + $tv_column->set_sizing("grow-only"); + $tv_column->set_sort_column_id(DLS_VALUE_COLUMN); + $renderer = Gtk2::CellRendererText->new(); + $tv_column->pack_start($renderer, FALSE); + $tv_column->set_attributes($renderer, "text" => DLS_VALUE_COLUMN); + $instance->{details_treeview}->append_column($tv_column); + + $instance->{details_treeview}->set_search_column(DLS_VALUE_COLUMN); + + return $instance; + +} +# +############################################################################## +# # Routine - update_browser_state # # Description - Given a value and a list, work out the largest unique @@ -905,7 +1205,7 @@ sub update_browser_state($$) my($browser, $changed) = @_; make_busy($browser, 1); - $browser->{main_appbar}->push(""); + $browser->{appbar}->push(""); gtk2_update(); # The list of available branches has changed. @@ -924,27 +1224,27 @@ sub update_browser_state($$) # Get the new list of branches. - $browser->{main_appbar}->set_status("Fetching branch list"); + $browser->{appbar}->set_status("Fetching branch list"); gtk2_update(); $browser->{mtn}->branches(address@hidden) if (defined($browser->{mtn})); $browser->{branch_combo_details}->{list} = address@hidden; # Update the branch list combobox. - $browser->{main_appbar}->set_status("Populating branch list"); + $browser->{appbar}->set_status("Populating branch list"); gtk2_update(); my $counter = 1; $browser->{branch_combo}->get_model()->clear(); foreach my $branch (@branch_list) { $browser->{branch_combo}->append_text($branch); - $browser->{main_appbar}->set_progress_percentage + $browser->{appbar}->set_progress_percentage ($counter ++ / scalar(@branch_list)); gtk2_update(); } $browser->{branch_combo}->child()->set_text(""); - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status(""); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status(""); gtk2_update(); } @@ -966,7 +1266,7 @@ sub update_browser_state($$) if ($browser->{branch_combo_details}->{completed}) { - $browser->{main_appbar}->set_status("Fetching revision list"); + $browser->{appbar}->set_status("Fetching revision list"); gtk2_update(); # Get either a list of tags or revision ids depending upon what the @@ -978,7 +1278,7 @@ sub update_browser_state($$) @list); $browser->{mtn}-> tags(address@hidden, $browser->{branch_combo_details}->{value}); - $browser->{main_appbar}->set_progress_percentage(0.5); + $browser->{appbar}->set_progress_percentage(0.5); gtk2_update(); foreach my $item (@list) { @@ -994,36 +1294,36 @@ sub update_browser_state($$) $browser->{mtn}-> select(address@hidden, "b:" . $browser->{branch_combo_details}->{value}); - $browser->{main_appbar}->set_progress_percentage(0.33); + $browser->{appbar}->set_progress_percentage(0.33); gtk2_update(); $browser->{mtn}->toposort(address@hidden, @revision_list); - $browser->{main_appbar}->set_progress_percentage(0.66); + $browser->{appbar}->set_progress_percentage(0.66); gtk2_update(); splice(@revision_list, 0, scalar(@revision_list) - 100); @revision_list = reverse(@revision_list); } - $browser->{main_appbar}->set_progress_percentage(1); + $browser->{appbar}->set_progress_percentage(1); gtk2_update(); } $browser->{revision_combo_details}->{list} = address@hidden; # Update the revision list combobox. - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status("Populating revision list"); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status("Populating revision list"); gtk2_update(); my $counter = 1; $browser->{revision_combo}->get_model()->clear(); foreach my $revision (@revision_list) { $browser->{revision_combo}->append_text($revision); - $browser->{main_appbar}->set_progress_percentage + $browser->{appbar}->set_progress_percentage ($counter ++ / scalar(@revision_list)); gtk2_update(); } $browser->{revision_combo}->child()->set_text(""); - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status(""); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status(""); gtk2_update(); } @@ -1052,7 +1352,7 @@ sub update_browser_state($$) # Get the new manifest. - $browser->{main_appbar}->set_status("Fetching manifest"); + $browser->{appbar}->set_status("Fetching manifest"); gtk2_update(); if ($browser->{revision_combo_details}->{completed}) { @@ -1073,11 +1373,7 @@ sub update_browser_state($$) $message .= "\n" . Glib::Markup::escape_text($item); } my $dialog = Gtk2::MessageDialog->new_with_markup - ($browser->{main_window}, - ["modal"], - "info", - "close", - $message); + ($browser->{window}, ["modal"], "info", "close", $message); $dialog->run(); $dialog->destroy(); $browser->{revision_combo_details}->{completed} = 0; @@ -1110,7 +1406,7 @@ sub update_browser_state($$) # Generate a simple list of directories for auto completion. - $browser->{main_appbar}->set_progress_percentage(0.5); + $browser->{appbar}->set_progress_percentage(0.5); gtk2_update(); foreach my $item (@manifest_list) { @@ -1118,26 +1414,26 @@ sub update_browser_state($$) if ($item->{type} eq "directory"); } $browser->{directory_combo_details}->{list} = address@hidden; - $browser->{main_appbar}->set_progress_percentage(1); + $browser->{appbar}->set_progress_percentage(1); gtk2_update(); # Update the directory list combobox. - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status("Populating directory list"); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status("Populating directory list"); gtk2_update(); my $counter = 1; $browser->{directory_combo}->get_model()->clear(); foreach my $item (@directory_list) { $browser->{directory_combo}->append_text($item); - $browser->{main_appbar}->set_progress_percentage + $browser->{appbar}->set_progress_percentage ($counter ++ / scalar(@directory_list)); gtk2_update(); } $browser->{directory_combo}->child()->set_text(""); - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status(""); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status(""); foreach my $widget (@{$browser->{revision_sensitive_group}}) { $widget-> @@ -1184,7 +1480,7 @@ sub update_browser_state($$) # Update the directory tree view. - $browser->{main_appbar}->set_status("Populating file details"); + $browser->{appbar}->set_status("Populating file details"); $counter = 1; $taking_our_time = 0; get_revision_ids($browser, address@hidden); @@ -1241,17 +1537,17 @@ sub update_browser_state($$) $browser->{manifest_liststore}-> set($browser->{manifest_liststore}->append(), - RLS_ICON_COLUMN, + MLS_ICON_COLUMN, ($item->{manifest_entry}->{type} eq "directory") ? "gtk-open" : "gtk-file", - RLS_NAME_COLUMN, $item->{name}, - RLS_DATE_COLUMN, $last_update, - RLS_AUTHOR_COLUMN, $author, - RLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); + MLS_NAME_COLUMN, $item->{name}, + MLS_DATE_COLUMN, $last_update, + MLS_AUTHOR_COLUMN, $author, + MLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); if ($taking_our_time) { - $browser->{main_appbar}->set_progress_percentage + $browser->{appbar}->set_progress_percentage ($counter / scalar(@directory_entry_list)); gtk2_update(); } @@ -1262,8 +1558,8 @@ sub update_browser_state($$) $browser->{manifest_treeview}->scroll_to_point(0, 0) if ($browser->{manifest_treeview}->realized()); - $browser->{main_appbar}->set_progress_percentage(0); - $browser->{main_appbar}->set_status(""); + $browser->{appbar}->set_progress_percentage(0); + $browser->{appbar}->set_status(""); gtk2_update(); } @@ -1466,13 +1762,536 @@ sub update_browser_state($$) { } - $browser->{main_appbar}->pop(); + $browser->{appbar}->pop(); make_busy($browser, 0); } # ############################################################################## # +# Routine - update_advanced_find_state +# +# Description - Given a value and a list, work out the largest unique +# match. Used for auto completion. +# +# Data - $advanced_find : The advanced find dialog window instance +# that is to have its state updated. +# $changed : What the user has changed. +# +############################################################################## + + + +sub update_advanced_find_state($$) +{ + + my($advanced_find, $changed) = @_; + + make_busy($advanced_find, 1); + $advanced_find->{appbar}->push(""); + gtk2_update(); + + # The list of available branches has changed. + + if ($changed & BRANCH) + { + + my @branch_list; + + # Reset the branch selection. + + $advanced_find->{branch_combo_details}->{completion_cache} = {}; + if (! $advanced_find->{branch_combo_details}->{preset}) + { + $advanced_find->{branch_combo_details}->{completed} = 0; + $advanced_find->{branch_combo_details}->{value} = ""; + } + $advanced_find->{branch_combo_details}->{preset} = 0; + + # Get the new list of branches. + + $advanced_find->{appbar}->set_status("Fetching branch list"); + gtk2_update(); + $advanced_find->{mtn}->branches(address@hidden) + if (defined($advanced_find->{mtn})); + $advanced_find->{branch_combo_details}->{list} = address@hidden; + + # Update the branch list combobox. + + $advanced_find->{appbar}->set_status("Populating branch list"); + gtk2_update(); + my $counter = 1; + $advanced_find->{branch_combo}->get_model()->clear(); + foreach my $branch (@branch_list) + { + $advanced_find->{branch_combo}->append_text($branch); + $advanced_find->{appbar}->set_progress_percentage + ($counter ++ / scalar(@branch_list)); + gtk2_update(); + } + $advanced_find->{branch_combo}->child()-> + set_text($advanced_find->{branch_combo_details}->{value}); + $advanced_find->{appbar}->set_progress_percentage(0); + $advanced_find->{appbar}->set_status(""); + gtk2_update(); + + } + + # The list of available revisions has changed. + + if ($changed & REVISION) + { + + my @revision_list; + + # Reset the revision selection. + + $advanced_find->{revision_combo_details}->{completion_cache} = {}; + if (! $advanced_find->{revision_combo_details}->{preset}) + { + $advanced_find->{revision_combo_details}->{completed} = 0; + $advanced_find->{revision_combo_details}->{value} = ""; + } + $advanced_find->{revision_combo_details}->{preset} = 0; + set_label_value($advanced_find->{selected_branch_label}, ""); + + # Get the new list of revisions. + + if ($advanced_find->{branch_combo_details}->{completed}) + { + $advanced_find->{appbar}->set_status("Fetching revision list"); + gtk2_update(); + + # Get either a list of tags or revision ids depending upon what the + # user has chosen. + + if ($advanced_find->{tagged_tick}->get_active()) + { + my(%dup_list, + @list); + $advanced_find->{mtn}-> + tags(address@hidden, + $advanced_find->{branch_combo_details}->{value}); + $advanced_find->{appbar}->set_progress_percentage(0.5); + gtk2_update(); + foreach my $item (@list) + { + if (! exists($dup_list{$item->{tag}})) + { + push(@revision_list, $item->{tag}); + $dup_list{$item->{tag}} = 1; + } + } + } + else + { + $advanced_find->{mtn}-> + select(address@hidden, + "b:" . $advanced_find->{branch_combo_details}-> + {value}); + $advanced_find->{appbar}->set_progress_percentage(0.33); + gtk2_update(); + $advanced_find->{mtn}->toposort(address@hidden, + @revision_list); + $advanced_find->{appbar}->set_progress_percentage(0.66); + gtk2_update(); + splice(@revision_list, 0, scalar(@revision_list) - 100); + @revision_list = reverse(@revision_list); + } + set_label_value($advanced_find->{selected_branch_label}, + $advanced_find->{branch_combo_details}->{value}); + $advanced_find->{appbar}->set_progress_percentage(1); + gtk2_update(); + } + $advanced_find->{revision_combo_details}->{list} = address@hidden; + + # Update the revision list combobox. + + $advanced_find->{appbar}->set_progress_percentage(0); + $advanced_find->{appbar}->set_status("Populating revision list"); + gtk2_update(); + my $counter = 1; + $advanced_find->{revision_combo}->get_model()->clear(); + foreach my $revision (@revision_list) + { + $advanced_find->{revision_combo}->append_text($revision); + $advanced_find->{appbar}->set_progress_percentage + ($counter ++ / scalar(@revision_list)); + gtk2_update(); + } + $advanced_find->{revision_combo}->child()-> + set_text($advanced_find->{revision_combo_details}->{value}); + $advanced_find->{appbar}->set_progress_percentage(0); + $advanced_find->{appbar}->set_status(""); + gtk2_update(); + + } + + # The list of displayed revisions has changed. + + if ($changed & REVISION_LIST) + { + + my($counter, + @revision_ids); + + # Reset the revisions tree view. + + $advanced_find->{revisions_liststore}->clear(); + + # Get the list of matching revisions. + + $advanced_find->{appbar}->set_status("Finding revisions"); + gtk2_update(); + if ($advanced_find->{revision_combo_details}->{completed}) + { + get_revision_ids($advanced_find, address@hidden); + } + + # Update the revisions tree view. + + $advanced_find->{appbar}->set_status("Populating revision details"); + $counter = 1; + foreach my $item (@revision_ids) + { + $advanced_find->{revisions_liststore}-> + set($advanced_find->{revisions_liststore}->append(), + 0, $item); + $advanced_find->{appbar}->set_progress_percentage + ($counter ++ / scalar(@revision_ids)); + gtk2_update(); + } + $advanced_find->{revisions_treeview}->scroll_to_point(0, 0) + if ($advanced_find->{revisions_treeview}->realized()); + + $advanced_find->{appbar}->set_progress_percentage(0); + $advanced_find->{appbar}->set_status(""); + gtk2_update(); + + } + + # The list of displayed revisions has changed. + + if ($changed && 1 == 0) + { + + my($author, + @certs_list, + $counter, + @directory_entry_list, + $last_update, + @revision_ids, + @revision_list, + $taking_our_time); + + # Reset the manifest tree view. + + $advanced_find->{revisions_liststore}->clear(); + + # Get the contents of the new directory. + + if ($advanced_find->{directory_combo_details}->{completed} + || $advanced_find->{directory_combo_details}->{value} eq "") + { + get_dir_contents($advanced_find->{directory_combo_details}->{value}, + $advanced_find->{manifest}, + address@hidden); + } + + # Disable the directory up button if we are already at the top level, + # otherwise make sure it is enabled. + + $advanced_find->{directory_up_button}->set_sensitive + (($advanced_find->{directory_combo_details}->{value} eq "") + ? FALSE : TRUE); + + # Update the directory tree view. + + $advanced_find->{appbar}->set_status("Populating file details"); + $counter = 1; + $taking_our_time = 0; + get_revision_ids($advanced_find, address@hidden); + foreach my $item (@directory_entry_list) + { + + # Get the latest modification time and the author if the entry is a + # file (caching the result in the manifest for future reference if + # we have to work it out). + + if ($item->{manifest_entry}->{type} eq "file") + { + if (! exists($item->{manifest_entry}->{author})) + { + $taking_our_time = 1; + $advanced_find->{mtn}->get_content_changed + (address@hidden, + $revision_ids[0], + $item->{manifest_entry}->{name}); + $item->{manifest_entry}->{last_changed_revision} = + $revision_list[0]; + $advanced_find->{mtn}->certs(address@hidden, $revision_list[0]); + $author = $last_update = ""; + foreach my $cert (@certs_list) + { + if ($cert->{name} eq "author") + { + $author = $cert->{value}; + $item->{manifest_entry}->{author} = $author; + } + if ($cert->{name} eq "date") + { + $last_update = $cert->{value}; + $last_update =~ s/T/ /o; + $item->{manifest_entry}->{last_update} = + $last_update; + } + last if ($author ne "" && $last_update ne ""); + } + } + else + { + $author = $item->{manifest_entry}->{author}; + $last_update = $item->{manifest_entry}->{last_update}; + } + } + else + { + $author = ""; + $last_update = ""; + } + + # Put the entry into the liststore. + + $advanced_find->{manifest_liststore}-> + set($advanced_find->{manifest_liststore}->append(), + MLS_ICON_COLUMN, + ($item->{manifest_entry}->{type} eq "directory") + ? "gtk-open" : "gtk-file", + MLS_NAME_COLUMN, $item->{name}, + MLS_DATE_COLUMN, $last_update, + MLS_AUTHOR_COLUMN, $author, + MLS_MANIFEST_ENTRY_COLUMN, $item->{manifest_entry}); + + if ($taking_our_time) + { + $advanced_find->{appbar}->set_progress_percentage + ($counter / scalar(@directory_entry_list)); + gtk2_update(); + } + ++ $counter; + + } + + $advanced_find->{manifest_treeview}->scroll_to_point(0, 0) + if ($advanced_find->{manifest_treeview}->realized()); + + $advanced_find->{appbar}->set_progress_percentage(0); + $advanced_find->{appbar}->set_status(""); + gtk2_update(); + + } + + # The displayed file contents has changed. + + if ($changed & DISPLAY_OF_FILE && 1 == 0) + { + + # Load up the selected file's contents into the file viewer. + + if (exists($advanced_find->{file_being_viewed}->{manifest_entry})) + { + my $manifest_entry; + $manifest_entry = + $advanced_find->{file_being_viewed}->{manifest_entry}; + if ($advanced_find->{file_id_label}->get_text() + ne $manifest_entry->{file_id}) + { + + my($contents, + $lang, + $mime_type, + $scrolled_window); + + # Reset the file view buffer. + + $advanced_find->{file_button_vbox}->set_sensitive(TRUE); + foreach my $widget (@{$advanced_find->{text_file_sensitive_group}}) + { + $widget->set_sensitive(FALSE); + } + $advanced_find->{file_view_svbuffer}->set_text(""); + $advanced_find->{file_view_svbuffer}->set("highlight", FALSE); + + # Get contents. + + $manifest_entry = + $advanced_find->{file_being_viewed}->{manifest_entry}; + $advanced_find->{mtn}->get_file(\$contents, + $manifest_entry->{file_id}); + + # Try and work out the mime type, first based on contents and + # then based on the file name extension. + + if (! defined($mime_type = + Gnome2::VFS->get_mime_type_for_data($contents)) + || $mime_type eq "text/plain") + { + my $name = $advanced_find->{file_being_viewed}->{short_name}; + foreach my $item (@text_mime_types) + { + if ($name =~ m/$item->{pattern}/) + { + $mime_type = $item->{type}; + last; + } + } + } + + # Override some mis-identified types. + + $mime_type = "image/svg+xml" + if ($mime_type eq "text/xml" + && $advanced_find->{file_being_viewed}->{short_name} + =~ m/.*\.svg$/o); + + # If it's image data then attempt to render it. + + if ($mime_type =~ m/^image\/.+$/o) + { + eval + { + my $loader = Gtk2::Gdk::PixbufLoader->new(); + $loader->write($contents); + $loader->close(); + $advanced_find->{file_view_svbuffer}->insert_pixbuf + ($advanced_find->{file_view_svbuffer}->get_start_iter(), + $loader->get_pixbuf()); + }; + $advanced_find->{file_view_svbuffer}-> + set_text("<" . $mime_type . ">\n") if ($@ ne ""); + } + else + { + + my $ok_to_render = 0; + + # Attempt to syntax highlight the file if it looks safe. + + if ($mime_type =~ m/^application\/.+$/o) + { + my $part; + ($part) = ($mime_type =~ m/^application\/(.+)$/o); + foreach my $item (@text_viewable_app_mime_types) + { + if ($part eq $item) + { + $ok_to_render = 1; + last; + } + } + } + + if ($mime_type =~ m/^text\/.+$/o || $ok_to_render) + { + if (defined($lang = $advanced_find->{file_view_svlangmgr}-> + get_language_from_mime_type($mime_type))) + { + $advanced_find->{file_view_svbuffer}-> + set("highlight", TRUE); + $advanced_find->{file_view_svbuffer}-> + set_language($lang); + } + + # Load in the contents. + + $advanced_find->{file_view_svbuffer}->set_text($contents); + foreach my $widget + (@{$advanced_find->{text_file_sensitive_group}}) + { + $widget->set_sensitive(TRUE); + } + } + else + { + $advanced_find->{file_view_svbuffer}-> + set("highlight", FALSE); + $advanced_find->{file_view_svbuffer}-> + set_text("<" . $mime_type . ">\n"); + } + + } + + # Scroll back up to the top left. + + if ($advanced_find->{file_view_scrolledwindow}->realized()) + { + $advanced_find->{file_view_scrolledwindow}-> + get_vadjustment()->set_value(0); + $advanced_find->{file_view_scrolledwindow}-> + get_hadjustment()->set_value(0); + } + + # Update the file details labels. + + if (! exists($manifest_entry->{last_changed_revision})) + { + my(@certs_list, + @revision_ids, + @revision_list); + get_revision_ids($advanced_find, address@hidden); + $advanced_find->{mtn}-> + get_content_changed(address@hidden, + $revision_ids[0], + $manifest_entry->{name}); + $manifest_entry->{last_changed_revision} = + $revision_list[0]; + $advanced_find->{mtn}->certs(address@hidden, $revision_list[0]); + foreach my $cert (@certs_list) + { + if ($cert->{name} eq "date") + { + my $last_update; + $last_update = $cert->{value}; + $last_update =~ s/T/ /o; + $manifest_entry->{last_update} = $last_update; + last; + } + } + } + set_label_value($advanced_find->{file_name_label}, + $manifest_entry->{name}); + set_label_value($advanced_find->{file_id_label}, + $manifest_entry->{file_id}); + set_label_value($advanced_find->{last_update_label}, + $manifest_entry->{last_update}); + set_label_value($advanced_find->{file_revision_id_label}, + $manifest_entry->{last_changed_revision}); + } + } + else + { + + # Reset the file view buffer. + + $advanced_find->{file_button_vbox}->set_sensitive(FALSE); + $advanced_find->{file_view_svbuffer}->set_text(""); + $advanced_find->{file_view_svbuffer}->set("highlight", FALSE); + set_label_value($advanced_find->{file_name_label}, ""); + set_label_value($advanced_find->{file_id_label}, ""); + set_label_value($advanced_find->{last_update_label}, ""); + set_label_value($advanced_find->{file_revision_id_label}, ""); + + } + + } + + $advanced_find->{appbar}->pop(); + make_busy($advanced_find, 0); + +} +# +############################################################################## +# # Routine - get_completion # # Description - Given a value and a list, work out the largest unique @@ -1802,7 +2621,7 @@ sub setup_sigchld_handler($) # Description - This routine returns the currently selected revision id, # whether this is specified via a tag or as a revision id. # -# Data - $browser : The browser instance. +# Data - $instance : The window instance. # $revision_ids : The list of selected revision ids. Normally # the list will have at most one element but # may contain more if the tag isn't unique on @@ -1815,19 +2634,19 @@ sub get_revision_ids($$) sub get_revision_ids($$) { - my($browser, $revision_ids) = @_; + my($instance, $revision_ids) = @_; @$revision_ids=(); - return unless ($browser->{revision_combo_details}->{completed}); - if ($browser->{tagged_tick}->get_active()) + return unless ($instance->{revision_combo_details}->{completed}); + if ($instance->{tagged_tick}->get_active()) { - $browser->{mtn}-> + $instance->{mtn}-> select($revision_ids, - "t:" . $browser->{revision_combo_details}->{value}); + "t:" . $instance->{revision_combo_details}->{value}); } else { - push(@$revision_ids, $browser->{revision_combo_details}->{value}); + push(@$revision_ids, $instance->{revision_combo_details}->{value}); } } @@ -1838,10 +2657,10 @@ sub get_revision_ids($$) # # Description - This routine simply makes the main window busy or active. # -# Data - $browser : The browser instance. -# $busy : True if the browser is to be made busy, -# otherwise false if the browser is to be made -# active. +# Data - $instance : The window instance. +# $busy : True if the window is to be made busy, +# otherwise false if the window is to be made +# active. # ############################################################################## @@ -1850,14 +2669,14 @@ sub make_busy($$) sub make_busy($$) { - my($browser, $busy) = @_; + my($instance, $busy) = @_; # Create and store the cursors if we haven't done so already. - if (! exists($browser->{busy_cursor})) + if (! exists($instance->{busy_cursor})) { - $browser->{normal_cursor} = Gtk2::Gdk::Cursor->new("left-ptr"); - $browser->{busy_cursor} = Gtk2::Gdk::Cursor->new("watch"); + $instance->{normal_cursor} = Gtk2::Gdk::Cursor->new("left-ptr"); + $instance->{busy_cursor} = Gtk2::Gdk::Cursor->new("watch"); } # Do it. Make the application bar grab the input when the window is busy, @@ -1866,14 +2685,14 @@ sub make_busy($$) if ($busy) { - $browser->{main_window}->window()->set_cursor($browser->{busy_cursor}); - Gtk2->grab_add($browser->{main_appbar}); + $instance->{window}->window()->set_cursor($instance->{busy_cursor}); + Gtk2->grab_add($instance->{appbar}); } else { - $browser->{main_window}->window()-> - set_cursor($browser->{normal_cursor}); - Gtk2->grab_remove($browser->{main_appbar}); + $instance->{window}->window()-> + set_cursor($instance->{normal_cursor}); + Gtk2->grab_remove($instance->{appbar}); } } ============================================================ --- mtn-browse.glade fbb380a8bad310c2daae4203616e19a112384c29 +++ mtn-browse.glade a8aaa0db486372c57d0fefd51525db57d2e3a8d9 @@ -527,6 +527,7 @@ criteria for selecting a revisionTrue GTK_RELIEF_NORMAL True + @@ -636,7 +637,7 @@ with another revision True True - 0 + 300 @@ -882,7 +883,7 @@ with another revision Name of the file being displayed 1 1 - 0 0 277 10 249.3 277 + 0 0 127 10 114.3 127 0 0 17 10 15.3 17 @@ -944,7 +945,7 @@ with another revision Date of when file was last changed 1 1 - 0 0 277 10 249.3 277 + 0 0 127 10 114.3 127 0 0 17 10 15.3 17 @@ -1089,7 +1090,7 @@ updated with respect to this revision

File's unique id in database 1 1 - 0 0 283 10 254.7 283 + 0 0 133 10 119.7 133 0 0 17 10 15.3 17 @@ -1152,7 +1153,7 @@ file was last changed file was last changed 1 1 - 0 0 283 10 254.7 283 + 0 0 133 10 119.7 133 0 0 17 10 15.3 17 @@ -2001,7 +2002,7 @@ with another version - + True True True @@ -2014,4 +2015,1136 @@ with another version
+ + Advanced Find + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER_ON_PARENT + True + True + False + True + True + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + + + + True + False + 0 + + + + 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 + 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 + 0 + 0 + + + + True + + + + 0 + 1 + 0 + 1 + fill + + + + + 0 + True + True + + + + + + True + Revision within project to access + True + False + + + + True + 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 + 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 + + + + + + + + + + True + <b>Simply Query</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 + 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 + + + + + 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 +Tag +Separator + + + + + 0 + False + 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> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + False + True + + + + + + True + True + 300 + + + + 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 + False + True + + + + + + + + + + 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 + True + False + True + True + + + + + + + + + + True + <b>Details</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + True + True + + + + + 0 + True + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 0 + 0 + + + + 5 + True + True + 5 + + + + True + False + 5 + + + + 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 + + + + + 0 + False + False + + + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + 1 + 1 + 0 0 225 10 202.5 225 + 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 + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + True + False + 5 + + + + True + Id of the currently selected revision + True + False + + + + True + Revision Id: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + 1 + 1 + 0 0 200 10 180 200 + 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 + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + + + + True + <b>Current Selection</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + False + True + + + + + 0 + True + True + + + + + + True + + + 0 + False + True + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + False + 0 + + + + True + True + True + + + 0 + False + True + GTK_PACK_END + + + + + 0 + True + True + + + + + + 5 + True + True + 5 + + + + True + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + + + 0 + False + True + + + + + + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + + + 0 + False + True + + + + + 0 + False + True + + + + + 0 + False + True + + + + + +