10118 PM Search UI adjustments to align with usability feedback
authorJohn Rice <john.rice@sun.com>
Fri, 17 Jul 2009 15:30:26 +0100
changeset 1232 5235f14e0e8f
parent 1231 f7b99e8118d2
child 1233 32a432cffc1e
10118 PM Search UI adjustments to align with usability feedback 10119 PM move Reload button to File menu
src/gui/Makefile
src/gui/data/icons/22x22/search_all.png
src/gui/data/packagemanager.glade
src/packagemanager.py
src/pkgdefs/SUNWipkg-gui/prototype
--- a/src/gui/Makefile	Thu Jul 16 19:21:13 2009 -0700
+++ b/src/gui/Makefile	Fri Jul 17 15:30:26 2009 +0100
@@ -123,8 +123,7 @@
    data/icons/16x16/status_notinstalled.png
 
 ICONS22 = \
-   data/icons/22x22/search.png \
-   data/icons/22x22/search_all.png
+   data/icons/22x22/search.png
 
 PYMODS = \
    modules/__init__.py \
Binary file src/gui/data/icons/22x22/search_all.png has changed
--- a/src/gui/data/packagemanager.glade	Thu Jul 16 19:21:13 2009 -0700
+++ b/src/gui/data/packagemanager.glade	Fri Jul 17 15:30:26 2009 +0100
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <glade-interface>
-  <!-- interface-requires gtk+ 2.12 -->
+  <!-- interface-requires gtk+ 2.16 -->
   <!-- interface-naming-policy toplevel-contextual -->
   <widget class="GtkWindow" id="mainwindow">
     <property name="width_request">750</property>
@@ -50,6 +50,20 @@
                       </widget>
                     </child>
                     <child>
+                      <widget class="GtkSeparatorMenuItem" id="separatormenuitem4">
+                        <property name="visible">True</property>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkMenuItem" id="file_reload">
+                        <property name="visible">True</property>
+                        <property name="tooltip" translatable="yes">Reload all package information</property>
+                        <property name="label" translatable="yes">_Reload</property>
+                        <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_reload_button_clicked" after="yes"/>
+                      </widget>
+                    </child>
+                    <child>
                       <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
                         <property name="visible">True</property>
                       </widget>
@@ -330,21 +344,6 @@
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
             <child>
-              <widget class="GtkToolButton" id="reloadbutton">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="tooltip" translatable="yes">Click to get list of newest packages.</property>
-                <property name="is_important">True</property>
-                <property name="label" translatable="yes">Reload</property>
-                <property name="icon">reload24x.png</property>
-                <signal name="clicked" handler="on_reload_button_clicked"/>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="homogeneous">True</property>
-              </packing>
-            </child>
-            <child>
               <widget class="GtkToolButton" id="update_all_button">
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
@@ -440,16 +439,44 @@
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkButton" id="set_search">
+                          <placeholder/>
+                        </child>
+                        <child>
+                          <widget class="GtkEntry" id="searchentry">
+                            <property name="width_request">177</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="tooltip" translatable="yes">Type text to search name and description of the package.</property>
+                            <property name="secondary_icon_stock">gtk-cancel</property>
+                            <property name="secondary_icon_activatable">True</property>
+                            <property name="secondary_icon_sensitive">True</property>
+                            <property name="secondary_icon_tooltip_text">Clear search text and results</property>
+                            <accessibility>
+                              <atkproperty name="AtkObject::accessible-name">Search</atkproperty>
+                            </accessibility>
+                            <signal name="changed" handler="on_searchentry_changed"/>
+                            <signal name="focus_out_event" handler="on_searchentry_focus_out_event"/>
+                            <signal name="icon_press" handler="on_clear_search_clicked"/>
+                            <signal name="activate" handler="on_searchentry_activate"/>
+                            <signal name="focus_in_event" handler="on_searchentry_focus_in_event"/>
+                          </widget>
+                          <packing>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="GtkButton" id="do_search">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">True</property>
+                            <property name="tooltip" translatable="yes">Search</property>
                             <property name="relief">none</property>
                             <property name="focus_on_click">False</property>
                             <property name="xalign">0</property>
                             <property name="yalign">0</property>
-                            <signal name="button_press_event" handler="on_set_search_button_press_event"/>
-                            <signal name="clicked" handler="on_set_search_clicked"/>
+                            <signal name="button_press_event" handler="on_do_search_button_press_event"/>
+                            <signal name="clicked" handler="on_do_search_clicked"/>
                             <child>
                               <widget class="GtkHBox" id="hbox23">
                                 <property name="visible">True</property>
@@ -463,60 +490,6 @@
                                     <property name="position">0</property>
                                   </packing>
                                 </child>
-                                <child>
-                                  <widget class="GtkImage" id="search_image_arrow">
-                                    <property name="visible">True</property>
-                                    <property name="pixbuf">arrow.png</property>
-                                    <property name="icon-size">1</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                              </widget>
-                            </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkEntry" id="searchentry">
-                            <property name="width_request">177</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="tooltip" translatable="yes">Type text to search name and description of the package.</property>
-                            <accessibility>
-                              <atkproperty name="AtkObject::accessible-name">Search</atkproperty>
-                            </accessibility>
-                            <signal name="changed" handler="on_searchentry_changed"/>
-                            <signal name="focus_out_event" handler="on_searchentry_focus_out_event"/>
-                            <signal name="focus_in_event" handler="on_searchentry_focus_in_event"/>
-                            <signal name="activate" handler="on_searchentry_activate"/>
-                          </widget>
-                          <packing>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="clear_search">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="relief">none</property>
-                            <property name="focus_on_click">False</property>
-                            <property name="xalign">0</property>
-                            <property name="yalign">0</property>
-                            <signal name="clicked" handler="on_clear_search_clicked"/>
-                            <child>
-                              <widget class="GtkImage" id="clear_image">
-                                <property name="visible">True</property>
-                                <property name="stock">gtk-missing-image</property>
                               </widget>
                             </child>
                           </widget>
@@ -678,7 +651,7 @@
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="xalign">1</property>
                             <property name="yalign">0.60000002384185791</property>
-                            <property name="label" translatable="yes">&lt;i&gt;_Repository:&lt;/i&gt;</property>
+                            <property name="label" translatable="yes">Package _Source:</property>
                             <property name="use_markup">True</property>
                             <property name="use_underline">True</property>
                             <property name="justify">right</property>
--- a/src/packagemanager.py	Thu Jul 16 19:21:13 2009 -0700
+++ b/src/packagemanager.py	Fri Jul 17 15:30:26 2009 +0100
@@ -195,7 +195,6 @@
                         self.gconf_not_show_repos = ""
                 self.set_show_filter = 0
                 self.set_section = 0
-                self.current_search_option = 0
                 self.in_search_mode = False
 
                 global_settings.client_name = PKG_CLIENT_NAME
@@ -253,18 +252,6 @@
                 self.icon_theme = gtk.IconTheme()
                 icon_location = os.path.join(self.application_dir, ICON_LOCATION)
                 self.icon_theme.append_search_path(icon_location)
-                self.search_options = [
-                    ('ips-search',
-                    gui_misc.get_icon(self.icon_theme, 'search', 20),
-                    _("_Current Repository"),
-                    _("Search Current Repository")),
-                    ('ips-search-all',
-                    gui_misc.get_icon(self.icon_theme, 'search_all', 20),
-                    _("_All Repositories"),
-                    _("Search All Repositories"))
-                    ]
-                self.__register_iconsets(self.search_options)
-
                 self.installed_icon = gui_misc.get_icon(self.icon_theme,
                     'status_installed')
                 self.not_installed_icon = gui_misc.get_icon(self.icon_theme,
@@ -303,6 +290,8 @@
                 self.categories_treeview_initialized = False
                 self.category_list = None
                 self.repositories_list = None
+                self.repo_combobox_all_pubs_index = 0
+                self.repo_combobox_add_index = 0
                 self.pr = progress.NullProgressTracker()
                 self.pylintstub = None
                 self.release_notes_url = "http://www.opensolaris.org"
@@ -371,12 +360,17 @@
                 self.w_main_view_notebook = \
                     w_tree_main.get_widget("main_view_notebook")
                 self.w_searchentry = w_tree_main.get_widget("searchentry")
+                self.entry_embedded_icons_supported = True
+                try:
+                        self.w_searchentry.set_property("secondary-icon-stock", None)
+                except TypeError:
+                        self.entry_embedded_icons_supported = False
                 self.search_completion = gtk.ListStore(str)
                 self.w_installupdate_button = \
                     w_tree_main.get_widget("install_update_button")
                 self.w_remove_button = w_tree_main.get_widget("remove_button")
                 self.w_updateall_button = w_tree_main.get_widget("update_all_button")
-                self.w_reload_button = w_tree_main.get_widget("reloadbutton")
+                self.w_reload_menuitem = w_tree_main.get_widget("file_reload")
                 self.w_repository_combobox = w_tree_main.get_widget("repositorycombobox")
                 self.w_sections_combobox = w_tree_main.get_widget("sectionscombobox")
                 self.w_filter_combobox = w_tree_main.get_widget("filtercombobox")
@@ -405,28 +399,13 @@
                 self.w_progressbar.set_pulse_step(0.1)
                 self.w_progress_cancel = w_tree_progress.get_widget("progresscancel")
                 self.progress_canceled = False
-                self.w_clear_search_button = w_tree_main.get_widget("clear_search")
-                self.w_clear_search_button.set_sensitive(False)
-                clear_search_image = w_tree_main.get_widget("clear_image")
-                clear_search_image.set_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU)
                 self.saved_filter_combobox_active = self.initial_show_filter
                 self.search_image = w_tree_main.get_widget("search_image")
-                self.search_button = w_tree_main.get_widget("set_search")
-                self.a11y_search_button = self.search_button.get_accessible()
-                self.is_search_all = False
-                self.searchmenu = gtk.Menu()
-                self.search_image.set_from_pixbuf(self.search_options[0][1])
-                self.a11y_search_button.set_description(self.search_options[0][3])
-                for stock_id, pixbuf, label, description in self.search_options:
-                        action = gtk.Action(stock_id, label, None, stock_id)
-                        action.connect('activate',
-                            self.__search_menu_item_activate)
-                        menu_item = action.create_menu_item()
-                        self.searchmenu.append(menu_item)
-                        self.pylintstub = description
-                        self.pylintstub = pixbuf
-                self.changing_search_option = False
-                self.saved_repository_combobox_active = -1
+                self.search_button = w_tree_main.get_widget("do_search")
+                self.is_all_publishers = False
+                self.search_image.set_from_pixbuf(gui_misc.get_icon(self.icon_theme,
+                    'search', 20))
+                self.saved_repository_combobox_active = 0
                 self.saved_sections_combobox_active = 0
                 self.saved_application_list = None
                 self.saved_application_list_filter = None
@@ -476,7 +455,7 @@
                                 "on_searchentry_focus_out_event": \
                                     self.__on_searchentry_focus_out,
                                 "on_searchentry_activate": \
-                                    self.__on_searchentry_activate,
+                                    self.__do_search,
                                 "on_sectionscombobox_changed": \
                                     self.__on_sectionscombobox_changed,
                                 "on_filtercombobox_changed": \
@@ -499,9 +478,9 @@
                                 "on_edit_cut_activate":self.__on_cut,
                                 "on_edit_search_activate":self.__on_edit_search_clicked,
                                 "on_clear_search_activate":self.__on_clear_search,
-                                "on_set_search_clicked":self.__on_set_search_clicked,
-                                "on_set_search_button_press_event":self.__on_set_search,
                                 "on_clear_search_clicked":self.__on_clear_search,
+                                "on_do_search_clicked":self.__do_search,
+                                "on_do_search_button_press_event":self.__do_search,
                                 "on_edit_select_all_activate":self.__on_select_all,
                                 "on_edit_select_updates_activate": \
                                     self.__on_select_updates,
@@ -606,10 +585,13 @@
                 text = entry.get_text()
                 if text:
                         if text not in [row[0] for row in self.search_completion]:
-                                if len(self.search_completion) == \
-                                        self.max_search_completion:
+                                len_search_completion = len(self.search_completion)
+                                if len_search_completion > 0 and \
+                                        len_search_completion >= \
+                                                self.max_search_completion:
                                         itr = self.search_completion.get_iter_first()
-                                        self.search_completion.remove(itr)
+                                        itr:
+                                                self.search_completion.remove(itr)
                                 self.search_completion.append([text])
                 return
                 
@@ -682,49 +664,10 @@
                         self.pylintstub = description
                 factory.add_default()
 
-        def __set_search_option(self, i):
-                # The value i is the index in the table search_options
-                # of the current choice.
-                # Index 0 corresponds to Current Repository.
-                # We assume that anything else is search all.
-                # This may need to be revisited if more search options are
-                # added.
-                if i == self.current_search_option:
+        def __set_all_publishers_mode(self):
+                if self.is_all_publishers:
                         return
-                self.current_search_option = i
-                self.changing_search_option = True
-                is_search_all = (i != 0)
-                self.__update_repository_combobox_for_search(is_search_all)
-                if is_search_all:
-                        self.__setup_before_search_all_mode()
-                else:
-                        self.__restore_setup_for_browse()
-                self.changing_search_option = False
-
-        def __update_repository_combobox_for_search(self, is_search_all):
-                if is_search_all:
-                        self.saved_repository_combobox_active = \
-                            self.w_repository_combobox.get_active()
-                self.__disconnect_repository_model()
-                if is_search_all:
-                        self.repositories_list.prepend(
-                            [-1, _("All Repositories Search Results"), ])
-                else:
-                        self.repositories_list.remove(
-                            self.repositories_list.get_iter_first())
-                self.w_repository_combobox.set_model(self.repositories_list)
-
-        def __search_menu_item_activate(self, widget):
-                name = widget.get_name()
-                i = 0
-                for stock_id, pixbuf, label, description in self.search_options:
-                        if stock_id == name:
-                                self.__set_search_option(i)
-                                self.search_image.set_from_pixbuf(pixbuf)
-                                self.a11y_search_button.set_description(description)
-                                break
-                        i += 1
-                        self.pylintstub = label
+                self.__setup_before_all_publishers_mode()
 
         def __setup_startpage(self, show_startpage):
                 self.opener = urllib.FancyURLopener()
@@ -1076,7 +1019,7 @@
                 column.connect_after('clicked',
                     self.__application_treeview_column_sorted, None)
                 self.w_application_treeview.append_column(column)
-                if self.is_search_all:
+                if self.is_all_publishers:
                         repository_renderer = gtk.CellRendererText()
                         column = gtk.TreeViewColumn(_('Repository'),
                             repository_renderer,
@@ -1211,7 +1154,7 @@
                         self.category_list = category_list
                         self.category_list_filter = category_list_filter
                         self.w_categories_treeview.set_model(category_list_filter)
-                        if not self.is_search_all:
+                        if not self.is_all_publishers:
                                 category_list_filter.set_visible_func(
                                     self.category_filter)
                                 self.__set_categories_visibility(self.set_section)
@@ -1621,16 +1564,24 @@
 
         def __on_searchentry_changed(self, widget):
                 if widget.get_text_length() > 0:
-                        self.w_clear_search_button.set_sensitive(True)
+                        if self.entry_embedded_icons_supported:
+                                self.w_searchentry.set_property("secondary-icon-stock", 
+                                    gtk.STOCK_CANCEL)
+                                self.w_searchentry.set_property(
+                                   "secondary-icon-sensitive", True)
                         self.w_clear_search_menuitem.set_sensitive(True)
                 else:
-                        self.w_clear_search_button.set_sensitive(False)
+                        if self.entry_embedded_icons_supported:
+                                self.w_searchentry.set_property("secondary-icon-stock", 
+                                    None)
                         self.w_clear_search_menuitem.set_sensitive(False)
                 self.__enable_disable_entry_selection(widget)
 
         def __update_statusbar_for_search(self):
-                self.__update_statusbar_message(
-                    self.search_options[self.current_search_option][3])
+                if self.is_all_publishers:
+                        self.__update_statusbar_message(_("Search all sources"))
+                else:
+                        self.__update_statusbar_message(_("Search current source"))
 
         def __update_statusbar_message(self, message):
                 if self.statusbar_message_id > 0:
@@ -1638,12 +1589,11 @@
                         self.statusbar_message_id = 0
                 self.statusbar_message_id = self.w_main_statusbar.push(0, message)
 
-        def __setup_before_search_all_mode(self):
-                self.is_search_all = True
+        def __setup_before_all_publishers_mode(self):
+                self.is_all_publishers = True
                 self.w_infosearch_frame.hide()
 
                 self.__save_setup_before_search()
-                self.w_repository_combobox.set_active(0)
                 self.__clear_before_search()
                 self.__update_statusbar_for_search()
                 self.w_searchentry.grab_focus()
@@ -1662,7 +1612,7 @@
 
         def __restore_setup_for_browse(self):
                 self.in_search_mode = False
-                self.is_search_all = False
+                self.is_all_publishers = False
                 self.w_infosearch_frame.hide()
 
                 self.set_busy_cursor()
@@ -1695,16 +1645,17 @@
                         self.application_list_filter
                 self.saved_category_list = self.category_list
                 self.saved_section_list = self.section_list
-                if single_search:
-                        self.saved_repository_combobox_active = \
-                                self.w_repository_combobox.get_active()
-
-        def __do_search(self):
+
+                pub_index = self.w_repository_combobox.get_active()
+                if pub_index != self.repo_combobox_all_pubs_index and \
+                        pub_index != self.repo_combobox_add_index:
+                        self.saved_repository_combobox_active = pub_index
+
+        def __do_search(self, widget=None, ev=None):
                 self.search_start = 0
-                if self.changing_search_option or \
-                        self.w_searchentry.get_text_length() == 0:
+                if self.w_searchentry.get_text_length() == 0:
                         return
-                if not self.is_search_all:
+                if not self.is_all_publishers:
                         self.__save_setup_before_search(single_search=True)
                 self.__clear_before_search()
                 self.set_busy_cursor()
@@ -1712,12 +1663,8 @@
                         
                 self.w_infosearch_frame.hide()
                 self.__update_statusbar_message(_("Searching..."))
-                if not self.is_search_all:
-                        Thread(target = self.__do_api_search,
-                            args = (self.is_search_all, )).start()
-                else:
-                        Thread(target = self.__do_api_search,
-                            args = ()).start()
+                Thread(target = self.__do_api_search,
+                    args = (self.is_all_publishers, )).start()
 
         def __unselect_category(self):
                 selection = self.w_categories_treeview.get_selection()
@@ -1956,31 +1903,13 @@
                 self.w_searchentry.cut_clipboard()
                 self.w_paste_menuitem.set_sensitive(True)
 
-        def __popup_position_func(self, menu):
-                ''' Position popup menu immediately below search button'''
-                root = self.w_main_window.window.get_origin()
-                alloc = self.search_button.get_allocation()
-                return (root[0] + alloc.x, root[1] + alloc.y + alloc.height, False)
-
-        def __on_set_search(self, widget, event):
-                if  event.type == gtk.gdk.BUTTON_PRESS:
-                        self.searchmenu.popup(None, None, self.__popup_position_func,
-                            event.button, event.time)
-                        return True
-                return False
-
-        def __on_set_search_clicked(self, widget):
-                self.searchmenu.popup(None, None, self.__popup_position_func,
-                    0, 0)
-                return True
-
         def __on_edit_search_clicked(self, widget):
                 self.w_searchentry.grab_focus()
 
-        def __on_clear_search(self, widget):
+        def __on_clear_search(self, widget, icon_pos=0, event=None):
                 self.w_searchentry.delete_text(0, -1)
                 # Only clear out search results
-                if self.in_search_mode or self.is_search_all:
+                if self.in_search_mode or self.is_all_publishers:
                         self.__clear_before_search()
                         self.__update_statusbar_message(_("Search cleared"))
                 return
@@ -2197,9 +2126,6 @@
                 self.w_delete_menuitem.set_sensitive(False)
                 return False
 
-        def __on_searchentry_activate(self, widget):
-                self.__do_search()
-
         def __on_searchentry_selection(self, widget, pspec):
                 self.__enable_disable_entry_selection(widget)
 
@@ -2243,7 +2169,7 @@
                         self.w_filter_combobox.set_active(
                             self.saved_filter_combobox_active)
                 self.w_searchentry.delete_text(0, -1)
-                if self.in_search_mode or self.is_search_all:
+                if self.in_search_mode or self.is_all_publishers:
                         self.__unset_search(True)
                         if self.selected == 0:
                                 gobject.idle_add(self.__enable_disable_install_remove)
@@ -2262,19 +2188,19 @@
 
         def __on_category_selection_changed(self, selection, widget):
                 '''This function is for handling category selection changes'''
-                if self.in_setup or self.changing_search_option:
+                if self.in_setup:
                         return
                 model, itr = selection.get_selected()
                 if itr:
                         cat_path = model.get_string_from_iter(itr)
-                        if self.is_search_all:
+                        if self.is_all_publishers:
                                 selected_section = self.set_section
                         else:
                                 selected_section = self.w_sections_combobox.get_active()
                         section_row = self.section_list[selected_section]
                         section_row[enumerations.SECTION_SUBCATEGORY] = cat_path
 
-                if self.in_search_mode or self.is_search_all:
+                if self.in_search_mode or self.is_all_publishers:
                         return
                 
                 if self.saved_filter_combobox_active != None:
@@ -2319,7 +2245,7 @@
 
         def __on_filtercombobox_changed(self, widget):
                 '''On filter combobox changed'''
-                if self.in_setup or self.changing_search_option:
+                if self.in_setup:
                         return
                 active = self.w_filter_combobox.get_active()
                 if active != enumerations.FILTER_SELECTED:
@@ -2375,14 +2301,12 @@
                 '''On section combobox changed'''
                 if self.in_setup:
                         return
-                if self.changing_search_option:
-                        return
                 self.__set_main_view_package_list()
                 self.set_busy_cursor()
                 self.__set_first_category_text()
                 self.__set_categories_visibility(widget.get_active())
                 self.category_list_filter.refilter()
-                if self.in_search_mode or self.is_search_all:
+                if self.in_search_mode or self.is_all_publishers:
                         self.saved_sections_combobox_active = \
                             self.w_sections_combobox.get_active()
                         self.__unset_search(True)
@@ -2403,8 +2327,6 @@
 
         def __unset_search(self, same_repo):
                 self.w_infosearch_frame.hide()
-                self.changing_search_option = True
-                self.current_search_option = 0
                 selected_publisher = self.__get_selected_publisher()
                 if selected_publisher in self.selected_pkgs:
                         self.selected_pkgs.pop(selected_publisher)
@@ -2413,60 +2335,42 @@
                 if selected_publisher in self.to_remove:
                         self.to_remove.pop(selected_publisher)
                 self.__update_tooltips()
-                if self.is_search_all:
-                        self.__update_repository_combobox_for_search(False)
-                pixbuf = self.search_options[0][1]
-                self.search_image.set_from_pixbuf(pixbuf)
                 self.in_search_mode = False
-                self.is_search_all = False
+                self.is_all_publishers = False
                 if same_repo:
                         self.__restore_setup_for_browse()
-                self.changing_search_option = False
 
         def __on_repositorycombobox_changed(self, widget):
                 '''On repository combobox changed'''
-                if self.changing_search_option:
-                        return
-                self.changing_search_option = True
                 selected_publisher = self.__get_selected_publisher()
-                if self.is_search_all:
-                        same_repo = False
-                        index =  self.w_repository_combobox.get_active() - 1
-                        if index == -1:
-                                # We get here is we choose "Add ..." when
-                                # doing api search
-                                self.changing_search_option = False
+                index =  self.w_repository_combobox.get_active()
+                if self.is_all_publishers:
+                        if index == self.repo_combobox_all_pubs_index:
                                 return
-                        if not selected_publisher == _("Add..."):
-                                if self.saved_repository_combobox_active == index:
-                                        same_repo = True
-                                self.__unset_search(same_repo)
-                                self.w_repository_combobox.set_active(index)
+                        if index == self.repo_combobox_add_index:
+                                self.w_repository_combobox.set_active(
+                                    self.repo_combobox_all_pubs_index)
+                                self.__on_edit_repositories_activate(None)
+                                return
+                        same_repo = self.saved_repository_combobox_active == index
+                        self.__unset_search(same_repo)
                         if same_repo:
-                                self.changing_search_option = False
                                 return
+                        self.w_repository_combobox.set_active(index)
                         selected_publisher = self.__get_selected_publisher()
-                self.changing_search_option = False
                 if selected_publisher == self.last_visible_publisher:
-                # If we are coming back to the same repository, we do
-                # not want to setup publishers. This is the case when
-                # we are calling Add... then we are firing the event for
-                # Add... case and immediately coming back to the
-                # previously selected repository.
+                        return
+                if index == self.repo_combobox_all_pubs_index:
+                        self.__set_all_publishers_mode()
                         return
-                # Checking for Add... is fine enough, as the repository
-                # name cannot contain "..." in the name.
-                if selected_publisher == _("Add..."):
+                        
+                if index == self.repo_combobox_add_index:
                         index = -1
-                        if self.is_search_all:
-                                index = 0
-                        else:
-                                model = self.w_repository_combobox.get_model()
-                                for entry in model:
-                                        if entry[1] == self.last_visible_publisher:
-                                                index = entry[0]
-                                                break
-                        # We do not want to switch permanently to the Add...
+                        model = self.w_repository_combobox.get_model()
+                        for entry in model:
+                                if entry[1] == self.last_visible_publisher:
+                                        index = entry[0]
+                                        break
                         self.w_repository_combobox.set_active(index)
                         self.__on_edit_repositories_activate(None)
                         return
@@ -2497,6 +2401,8 @@
                 self.__unset_saved()
                 self.publisher_changed = True
                 self.last_visible_publisher = self.__get_selected_publisher()
+                self.saved_repository_combobox_active = \
+                        self.w_repository_combobox.get_active()   
                 gobject.idle_add(self.__init_tree_views, application_list,
                     category_list, section_list)
 
@@ -2673,7 +2579,7 @@
         def __on_reload(self, widget):
                 if self.description_thread_running:
                         self.cancelled = True
-                if self.in_search_mode or self.is_search_all:
+                if self.in_search_mode or self.is_all_publishers:
                         self.__unset_search(False)
                 self.__set_empty_details_panel()
                 self.in_setup = True
@@ -2772,7 +2678,13 @@
                         repositories_list.append([i, prefix, ])
                         enabled_repos.append(prefix)
                         i = i + 1
+                self.repo_combobox_all_pubs_index = i
+                repositories_list.append([self.repo_combobox_all_pubs_index, 
+                    _("All Sources (Search Only)"), ])
+                i = i + 1
                 repositories_list.append([-1, "", ])
+                i = i + 1
+                self.repo_combobox_add_index = i
                 repositories_list.append([-1, _("Add..."), ])
                 pkgs_to_remove = []
                 for repo_name in selected_repos:
@@ -2811,9 +2723,9 @@
 
         def __update_reload_button(self):
                 if self.user_rights:
-                        self.w_reload_button.set_sensitive(True)
+                        self.w_reload_menuitem.set_sensitive(True)
                 else:
-                        self.w_reload_button.set_sensitive(False)
+                        self.w_reload_menuitem.set_sensitive(False)
 
         def __add_pkg_stem_to_list(self, stem, status):
                 pub = self.__get_selected_publisher()
@@ -3598,7 +3510,7 @@
                         else:
                                 status_icon = self.not_installed_icon
                         marked = False
-                        if not self.is_search_all:
+                        if not self.is_all_publishers:
                                 pkgs = self.selected_pkgs.get(pkg_publisher)
                                 if pkgs != None:
                                         if pkg_stem in pkgs:
@@ -3966,7 +3878,7 @@
 
                 # In Search Mode
                 active = ""
-                if self.is_search_all:
+                if self.is_all_publishers:
                         if self.__doing_search():
                                 if self.search_all_pub_being_searched != None:
                                         active = "(" + \
--- a/src/pkgdefs/SUNWipkg-gui/prototype	Thu Jul 16 19:21:13 2009 -0700
+++ b/src/pkgdefs/SUNWipkg-gui/prototype	Fri Jul 17 15:30:26 2009 +0100
@@ -78,7 +78,6 @@
 d none usr/share/package-manager/icons/hicolor/22x22 755 root bin
 d none usr/share/package-manager/icons/hicolor/22x22/actions 755 root bin
 f none usr/share/package-manager/icons/hicolor/22x22/actions/search.png 444 root other
-f none usr/share/package-manager/icons/hicolor/22x22/actions/search_all.png 444 root other
 f none usr/share/package-manager/PM_app_48x.png 444 root bin
 f none usr/share/package-manager/PM_package_36x.png 444 root bin
 f none usr/share/package-manager/arrow.png 444 root bin