# # # patch "AdvancedFind.pm" # from [d62fc3a65a6f7c361800185d8907280fefe0dd75] # to [ec8d93ce749bdd731367afb9c9de6e84229b759c] # # patch "Annotate.pm" # from [96f269e7203303f964dfb0fd024a3f6b55104591] # to [a8457486cdc3bd7165083242cc481c26fdd45270] # # patch "ChangeLog.pm" # from [1bc50a48e82d47e18f69a426dcf068ecfa9cbb78] # to [004a61a71b3a465a2c7e03be259d50882bff05e5] # # patch "FindFiles.pm" # from [1f4661fa7ac0fc844818a0fb9762dddbbcf8d0ec] # to [a7435609a35bff3fe384b3f145b58021b70c8dfa] # # patch "FindText.pm" # from [6b84fd52375956b82047faa0b453a36646b8f75b] # to [8e704f3b0b00cd3234c13a446365d83146432f5e] # # patch "History.pm" # from [3d555a25521e72193dd2e8bdfd63ddb61c8edc8b] # to [f639c00b18bd36a1fc701e1ef76765f950a7fdfb] # # patch "mtn-browse" # from [53961484ff210d65a9a82866523ac6ee68a85448] # to [ec2ce0ce464b32c43dcc3dbffab5b864d4861485] # # patch "mtn-browse.glade" # from [91f78642431d06166c66500947afe38933877de6] # to [841280e4818281fa8c95a48f847de33d1c74d0aa] # ============================================================ --- AdvancedFind.pm d62fc3a65a6f7c361800185d8907280fefe0dd75 +++ AdvancedFind.pm ec8d93ce749bdd731367afb9c9de6e84229b759c @@ -773,6 +773,8 @@ sub update_advanced_find_state($$) } ++ $counter; } + $advanced_find->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $advanced_find->{branch_comboboxentry}->child()-> set_text($advanced_find->{branch_combo_details}->{value}); $advanced_find->{appbar}->set_progress_percentage(0); @@ -835,6 +837,8 @@ sub update_advanced_find_state($$) } ++ $counter; } + $advanced_find->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $advanced_find->{revision_comboboxentry}->child()-> set_text($advanced_find->{revision_combo_details}->{value}); $advanced_find->{appbar}->set_progress_percentage(0); @@ -969,11 +973,12 @@ sub update_advanced_find_state($$) ++ $counter; last if ($advanced_find->{stop}); } + $advanced_find->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $advanced_find->{stop_button}->set_sensitive(FALSE); $advanced_find->{stop} = 0; $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(""); $wm->update_gui(); ============================================================ --- Annotate.pm 96f269e7203303f964dfb0fd024a3f6b55104591 +++ Annotate.pm a8457486cdc3bd7165083242cc481c26fdd45270 @@ -169,6 +169,8 @@ sub display_annotation($$$) } } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); # Delete the trailing newline. @@ -246,6 +248,7 @@ sub get_annotation_window() my($widget, $event, $instance) = @_; return TRUE if ($instance->{in_cb}); local $instance->{in_cb} = 1; + hide_find_text($instance->{annotation_textview}); $widget->hide(); $instance->{annotation_buffer}->set_text(""); return TRUE; ============================================================ --- ChangeLog.pm 1bc50a48e82d47e18f69a426dcf068ecfa9cbb78 +++ ChangeLog.pm 004a61a71b3a465a2c7e03be259d50882bff05e5 @@ -376,6 +376,7 @@ sub get_change_log_window() my($widget, $event, $instance) = @_; return TRUE if ($instance->{in_cb}); local $instance->{in_cb} = 1; + hide_find_text($instance->{changelog_textview}); $widget->hide(); $instance->{changelog_buffer}->set_text(""); return TRUE; ============================================================ --- FindFiles.pm 1f4661fa7ac0fc844818a0fb9762dddbbcf8d0ec +++ FindFiles.pm a7435609a35bff3fe384b3f145b58021b70c8dfa @@ -618,6 +618,8 @@ sub search_files_button_clicked_cb($$) } ++ $counter; } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $instance->{stop_button}->set_sensitive(FALSE); $instance->{stop} = 0; ============================================================ --- FindText.pm 6b84fd52375956b82047faa0b453a36646b8f75b +++ FindText.pm 8e704f3b0b00cd3234c13a446365d83146432f5e @@ -55,8 +55,10 @@ my $window_type = "find_text_window"; # Public routines. -sub disable_find_text($$); +sub enable_find_text($$); sub find_text($$); +sub find_text_textview_key_press_event_cb($$$); +sub find_text_textview_populate_popup_cb($$$); sub hide_find_text($); sub reset_find_text($); @@ -125,44 +127,44 @@ sub reset_find_text($) # ############################################################################## # -# Routine - disable_find_text +# Routine - enable_find_text # -# Description - Disables or enables the find text window associated with +# Description - Enables or disables the find text window associated with # the specified textview widget. # # Data - $text_view : The textview widget to which the find text # window is associated. -# $disable : True if the window is to be disabled, -# otherwise false if it is to be enabled. +# $disable : True if the window is to be enabled, +# otherwise false if it is to be disabled. # ############################################################################## -sub disable_find_text($$) +sub enable_find_text($$) { - my($text_view, $disable) = @_; + my($text_view, $enable) = @_; my $instance; - # Simply disable/enable the found find text window. + # Simply enable/disable the found find text window. if (defined($instance = find_current_window($text_view))) { - if ($disable) + if ($enable) { - $instance->{main_vbox}->set_sensitive(FALSE); - $instance->{find_button}->set_sensitive(FALSE); - } - else - { $instance->{main_vbox}->set_sensitive(TRUE); $instance->{find_button}->set_sensitive ((length($instance->{find_comboboxentry}->child()->get_text()) > 0) ? TRUE : FALSE); } + else + { + $instance->{main_vbox}->set_sensitive(FALSE); + $instance->{find_button}->set_sensitive(FALSE); + } } } @@ -197,6 +199,116 @@ sub hide_find_text($) # ############################################################################## # +# Routine - find_text_textview_populate_popup_cb +# +# Description - Callback routine called when the user right clicks on any +# textview window. +# +# Data - $widget : The widget object that received the signal. +# $menu : The Gtk2::Menu widget that is to be updated. +# $instance : The window instance that is associated with +# this widget. +# +############################################################################## + + + +sub find_text_textview_populate_popup_cb($$$) +{ + + my($widget, $menu, $instance) = @_; + + return if ($instance->{in_cb}); + local $instance->{in_cb} = 1; + + my($menu_item, + $separator); + + # Add a `Find' option to the right-click menu that displays the find text + # dialog. + + $menu_item = Gtk2::MenuItem->new("_Find"); + $menu_item->signal_connect + ("activate", + sub { + my($widget, $details) = @_; + return if ($details->{instance}->{in_cb}); + local $details->{instance}->{in_cb} = 1; + find_text($details->{instance}->{window}, + $details->{textview_widget}); + }, + {instance => $instance, + textview_widget => $widget}); + $menu_item->show(); + $separator = Gtk2::SeparatorMenuItem->new(); + $separator->show(); + $menu->append($separator); + $menu->append($menu_item); + +} +# +############################################################################## +# +# Routine - find_text_textview_key_press_event_cb +# +# Description - Callback routine called when the user presses a key inside +# a textview window. +# +# Data - $widget : The widget object that received the signal. +# $event : A Gtk2::Gdk::Event object describing the +# event that has occurred. +# $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 +# event should carry on through the remaining +# event handling. +# +############################################################################## + + + +sub find_text_textview_key_press_event_cb($$$) +{ + + my($widget, $event, $instance) = @_; + + return FALSE if ($instance->{in_cb}); + local $instance->{in_cb} = 1; + + my($consumed_modifiers, + $keymap, + $keyval, + $state); + + # Ignore the state of the caps-lock key. + + $state = $event->state() - "lock_mask"; + + # Work out what the key is having taken into account any modifier keys + # (except caps-lock). + + $keymap = + Gtk2::Gdk::Keymap->get_for_display(Gtk2::Gdk::Display->get_default()); + ($keyval, $consumed_modifiers) = + ($keymap->translate_keyboard_state + ($event->hardware_keycode(), $state, $event->group()))[0, 3]; + + # We are only interested in Ctrl-f. + + if (defined($keyval) && $keyval == $Gtk2::Gdk::Keysyms{f} + && ($state - $consumed_modifiers) == "control_mask") + { + find_text($instance->{window}, $widget); + return TRUE; + } + + return FALSE; + +} +# +############################################################################## +# # Routine - find_button_clicked_cb # # Description - Callback routine called when the user clicks on the find @@ -225,12 +337,66 @@ sub find_button_clicked_cb($$) $forward, $found, $line, + $match_len, $rect, $search_term, - $start_iter); + $start_iter, + $use_regexp); + # Get the search parameters. + $search_term = $instance->{find_comboboxentry}->child()->get_text(); + $case_sensitive = $instance->{case_sensitive_checkbutton}->get_active(); + $forward = ! $instance->{search_backwards_checkbutton}->get_active(); + $use_regexp = $instance->{regular_expression_checkbutton}->get_active(); + # Precompile the regular expression based upon the search term. When the + # user themselves is using regular expressions then check for errors. Also + # use the bytes pragma as $search_term could potentially be used against + # binary data. + + { + use bytes; + if ($use_regexp) + { + eval + { + if ($case_sensitive) + { + $expr = qr/$search_term/; + } + else + { + $expr = qr/$search_term/i; + } + }; + if ($@ ne "") + { + my $dialog = Gtk2::MessageDialog->new + ($instance->{window}, + ["modal"], + "warning", + "close", + __x("`{pattern}' is an invalid\ncontent search pattern.", + pattern => $search_term)); + $dialog->run(); + $dialog->destroy(); + return; + } + } + else + { + if ($case_sensitive) + { + $expr = qr/\Q$search_term\E/; + } + else + { + $expr = qr/\Q$search_term\E/i; + } + } + } + # Store the search term in the history. $found = 0; @@ -255,11 +421,6 @@ sub find_button_clicked_cb($$) } } - # Get the search parameters. - - $case_sensitive = $instance->{case_sensitive_checkbutton}->get_active(); - $forward = ! $instance->{search_backwards_checkbutton}->get_active(); - # Work out where to start searching from. $rect = $instance->{text_view}->get_visible_rect(); @@ -330,17 +491,6 @@ sub find_button_clicked_cb($$) } - # Precompile the regular expression based upon the search term. - - if ($case_sensitive) - { - $expr = qr/\Q$search_term\E/; - } - else - { - $expr = qr/\Q$search_term\E/i; - } - # Search for the text. $found = 0; @@ -351,20 +501,25 @@ sub find_button_clicked_cb($$) $instance->{text_buffer}->get_text($start_iter, $end_iter, TRUE); if ($forward) { - $pos = pos($line) if ($found = scalar($line =~ m/$expr/g)); + if ($found = scalar($line =~ m/$expr/g)) + { + $pos = pos($line); + $match_len = length($&); + } } else { while ($line =~ m/$expr/g) { $pos = pos($line); + $match_len = length($&); $found = 1; } } if ($found) { $instance->{match_offset_start} = - $start_iter->get_offset() + $pos - length($search_term); + $start_iter->get_offset() + $pos - $match_len; $instance->{match_offset_end} = $start_iter->get_offset() + $pos; $done = 1; } @@ -533,6 +688,7 @@ sub get_find_text_window($$) "find_comboboxentry", "case_sensitive_checkbutton", "search_backwards_checkbutton", + "regular_expression_checkbutton", "find_button") { $instance->{$widget} = $instance->{glade}->get_widget($widget); @@ -594,7 +750,7 @@ sub get_find_text_window($$) ((length($instance->{find_comboboxentry}->child()->get_text()) > 0) ? TRUE : FALSE); - # Store the associated textview and text buffer. + # Store the associated textview and textbuffer. $instance->{text_view} = $text_view; $instance->{text_buffer} = $instance->{text_view}->get_buffer(); @@ -604,6 +760,11 @@ sub get_find_text_window($$) $instance->{window}->set_transient_for($parent); $instance->{window}->show_all(); + # Make sure that the find comboboxentry has the focus. + + $instance->{find_comboboxentry}->child()->grab_focus(); + $instance->{find_comboboxentry}->child()->set_position(-1); + # If necessary, register the window for management. $wm->manage($instance, $window_type, $instance->{window}) if ($new); ============================================================ --- History.pm 3d555a25521e72193dd2e8bdfd63ddb61c8edc8b +++ History.pm f639c00b18bd36a1fc701e1ef76765f950a7fdfb @@ -131,7 +131,6 @@ sub display_revision_change_history($$$) # Get the list of file change revisions. Remember to include the current # revision in the history. - $instance->{appbar}->set_progress_percentage(0); $instance->{appbar}->set_status(__("Fetching revision list")); $wm->update_gui(); $history_hash{$revision_id} = 1; @@ -139,12 +138,15 @@ sub display_revision_change_history($$$) # Sort the list. + $instance->{appbar}->set_progress_percentage(0.5); $instance->{appbar}->set_status(__("Sorting revision list")); $wm->update_gui(); $instance->{history} = []; $instance->{mtn}->toposort($instance->{history}, keys(%history_hash)); %history_hash = (); @{$instance->{history}} = reverse(@{$instance->{history}}); + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); # Display the file's history. @@ -263,6 +265,8 @@ sub display_revision_change_history($$$) } } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $instance->{stop_button}->set_sensitive(FALSE); set_label_value($instance->{numbers_value_label}, $counter) @@ -333,7 +337,6 @@ sub display_file_change_history($$$) # 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); $wm->update_gui(); @@ -345,12 +348,15 @@ sub display_file_change_history($$$) # Sort the list. + $instance->{appbar}->set_progress_percentage(0.5); $instance->{appbar}->set_status(__("Sorting revision list")); $wm->update_gui(); $instance->{history} = []; $instance->{mtn}->toposort($instance->{history}, keys(%history_hash)); %history_hash = (); @{$instance->{history}} = reverse(@{$instance->{history}}); + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); # Display the file's history. @@ -463,6 +469,8 @@ sub display_file_change_history($$$) ++ $counter; } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); # Make sure we are at the top. @@ -1030,6 +1038,9 @@ sub compare_revisions($$$;$) } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); + $instance->{stop_button}->set_sensitive(FALSE); # Delete the trailing newline. @@ -1062,9 +1073,15 @@ sub compare_revisions($$$;$) CLS_LINE_NR_COLUMN, $file->{line_nr}, CLS_FILE_ID_1_COLUMN, $file->{file_id_1}, CLS_FILE_ID_2_COLUMN, $file->{file_id_2}); - $instance->{appbar}->set_progress_percentage($i ++ / scalar(@files)); - $wm->update_gui(); + if (($i % 10) == 0) + { + $instance->{appbar}->set_progress_percentage($i / scalar(@files)); + $wm->update_gui(); + } + ++ $i; } + $instance->{appbar}->set_progress_percentage(1); + $wm->update_gui(); if (defined($file_name)) { $instance->{file_comparison_combobox}->set_active(1); @@ -1404,6 +1421,7 @@ sub get_history_window() my($widget, $event, $instance) = @_; return TRUE if ($instance->{in_cb}); local $instance->{in_cb} = 1; + hide_find_text($instance->{history_textview}); $widget->hide(); $instance->{history_buffer}->set_text(""); $instance->{mtn} = undef; @@ -1612,6 +1630,7 @@ sub get_revision_comparison_window() my($widget, $event, $instance) = @_; return TRUE if ($instance->{in_cb}); local $instance->{in_cb} = 1; + hide_find_text($instance->{comparison_textview}); $widget->hide(); $instance->{file_comparison_combobox}->get_model()->clear(); $instance->{comparison_buffer}->set_text(""); ============================================================ --- mtn-browse 53961484ff210d65a9a82866523ac6ee68a85448 +++ mtn-browse ec2ce0ce464b32c43dcc3dbffab5b864d4861485 @@ -63,6 +63,7 @@ use Gtk2 -init; use Gnome2; use Gnome2::VFS -init; use Gtk2 -init; +use Gtk2::Gdk::Keysyms; use Gtk2::GladeXML; use Gtk2::Helper; use Gtk2::Pango; @@ -123,6 +124,7 @@ sub display_file($$); sub determine_mime_type($$$$); sub directory_up_button_clicked_cb($$); sub display_file($$); +sub enable_find_text_dialog($$); sub file_change_history_button_clicked_cb($$); sub find_files_button_clicked_cb($$); sub get_browser_window(;$$$$$); @@ -1571,6 +1573,17 @@ sub get_browser_window(;$$$$$) $browser->{file_view_sv}->set_cursor_visible(FALSE); $browser->{file_view_sv}->set_editable(FALSE); $browser->{file_view_scrolledwindow}->add($browser->{file_view_sv}); + $browser->{file_view_sv_populate_popup_handler} = + $browser->{file_view_sv}->signal_connect + ("populate_popup", + \&find_text_textview_populate_popup_cb, + $browser); + $browser->{file_view_sv_key_press_handler} = + $browser->{file_view_sv}->signal_connect + ("key_press_event", + \&find_text_textview_key_press_event_cb, + $browser); + $browser->{file_view_sv_enabled_find_text} = 1; $browser->{file_view_sv}->show_all(); local $browser->{in_cb} = 1; @@ -1779,6 +1792,8 @@ sub update_browser_state($$) } ++ $counter; } + $browser->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $browser->{branch_comboboxentry}->child()-> set_text($browser->{branch_combo_details}->{value}); $browser->{appbar}->set_progress_percentage(0); @@ -1840,6 +1855,8 @@ sub update_browser_state($$) } ++ $counter; } + $browser->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $browser->{revision_comboboxentry}->child()-> set_text($browser->{revision_combo_details}->{value}); $browser->{appbar}->set_progress_percentage(0); @@ -1966,6 +1983,8 @@ sub update_browser_state($$) } ++ $counter; } + $browser->{appbar}->set_progress_percentage(1); + $wm->update_gui(); $browser->{directory_comboboxentry}->child()-> set_text($browser->{directory_combo_details}->{value}); $browser->{appbar}->set_progress_percentage(0); @@ -2091,6 +2110,11 @@ sub update_browser_state($$) ++ $counter; } + if ($taking_our_time) + { + $browser->{appbar}->set_progress_percentage(1); + $wm->update_gui(); + } $browser->{manifest_browser_treeview}->scroll_to_point(0, 0) if ($browser->{manifest_browser_treeview}->realized()); @@ -2132,7 +2156,7 @@ sub update_browser_state($$) $widget->set_sensitive(FALSE); } reset_find_text($browser->{file_view_sv}); - disable_find_text($browser->{file_view_sv}, 1); + enable_find_text_dialog($browser, 0); # Display the selected file's contents. @@ -2149,7 +2173,7 @@ sub update_browser_state($$) { $widget->set_sensitive(TRUE); } - disable_find_text($browser->{file_view_sv}, 0); + enable_find_text_dialog($browser, 1); } # Update the file details labels. @@ -2194,7 +2218,7 @@ sub update_browser_state($$) set_label_value($browser->{file_id_value_label}, ""); set_label_value($browser->{last_update_value_label}, ""); set_label_value($browser->{file_revision_id_value_label}, ""); - disable_find_text($browser->{file_view_sv}, 1); + enable_find_text_dialog($browser, 0); } @@ -2433,6 +2457,53 @@ sub determine_mime_type($$$$) # ############################################################################## # +# Routine - enable_find_text_dialog +# +# Description - Enable or disable any find text dialog associated with the +# specified browser instance. +# +# Data - $browser : The browser instance that is to have any +# associated find text dialog enabled or disabled. +# $enable : True if the find text dialog is to be enabled, +# otherwise false if it is to be disabled. +# +############################################################################## + + + +sub enable_find_text_dialog($$) +{ + + my($browser, $enable) = @_; + + enable_find_text($browser->{file_view_sv}, $enable); + if ($enable) + { + if (! $browser->{file_view_sv_enabled_find_text}) + { + $browser->{file_view_sv}->signal_handler_unblock + ($browser->{file_view_sv_populate_popup_handler}); + $browser->{file_view_sv}->signal_handler_unblock + ($browser->{file_view_sv_key_press_handler}); + $browser->{file_view_sv_enabled_find_text} = 1; + } + } + else + { + if ($browser->{file_view_sv_enabled_find_text}) + { + $browser->{file_view_sv}->signal_handler_block + ($browser->{file_view_sv_populate_popup_handler}); + $browser->{file_view_sv}->signal_handler_block + ($browser->{file_view_sv_key_press_handler}); + $browser->{file_view_sv_enabled_find_text} = 0; + } + } + +} +# +############################################################################## +# # Routine - mtn_error_handler # # Description - This routine is called when ever there is a problem with ============================================================ --- mtn-browse.glade 91f78642431d06166c66500947afe38933877de6 +++ mtn-browse.glade 841280e4818281fa8c95a48f847de33d1c74d0aa @@ -3325,6 +3325,8 @@ Tag 0 0 + + @@ -3436,6 +3438,8 @@ Tag 0 0 + + @@ -4201,6 +4205,8 @@ selected file in an external viewer0 0 + + @@ -4396,6 +4402,8 @@ selected file in an external viewer0 0 + + @@ -4552,7 +4560,6 @@ to be searched for - 300 True @@ -4617,6 +4624,27 @@ of the search False + + + + True + Use regular expression +search patterns + True + Regular expression + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + False + False + + 0 @@ -8349,8 +8377,8 @@ MB Name of the file being displayed 1 1 - 0 0 188 10 169.199996948 188 - 0 0 17 10 15.3000001907 17 + 0 0 188 10 169.2 188 + 0 0 17 10 15.3 17 @@ -8411,8 +8439,8 @@ MB Date of when file was last changed 1 1 - 0 0 188 10 169.199996948 188 - 0 0 17 10 15.3000001907 17 + 0 0 188 10 169.2 188 + 0 0 17 10 15.3 17 @@ -8556,8 +8584,8 @@ updated with respect to this revision

File's unique id in database 1 1 - 0 0 192 10 172.800003052 192 - 0 0 17 10 15.3000001907 17 + 0 0 192 10 172.8 192 + 0 0 17 10 15.3 17 @@ -8619,8 +8647,8 @@ file was last changed file was last changed 1 1 - 0 0 192 10 172.800003052 192 - 0 0 17 10 15.3000001907 17 + 0 0 192 10 172.8 192 + 0 0 17 10 15.3 17