src/modules/gui/installupdate.py
changeset 2991 75e616731cc3
parent 2990 2cc6693a7d83
child 2992 e48a94cff862
--- a/src/modules/gui/installupdate.py	Fri Sep 27 11:21:00 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1654 +0,0 @@
-#!/usr/bin/python
-#
-# CDDL HEADER START
-#
-# The contents of this file are subject to the terms of the
-# Common Development and Distribution License (the "License").
-# You may not use this file except in compliance with the License.
-#
-# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
-# or http://www.opensolaris.org/os/licensing.
-# See the License for the specific language governing permissions
-# and limitations under the License.
-#
-# When distributing Covered Code, include this CDDL HEADER in each
-# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
-# If applicable, add the following below this CDDL HEADER, with the
-# fields enclosed by brackets "[]" replaced with your own identifying
-# information: Portions Copyright [yyyy] [name of copyright owner]
-#
-# CDDL HEADER END
-#
-# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
-#
-
-DEFAULT_CONFIRMATION_WIDTH = 550        # Width & height of single confirmation
-DEFAULT_CONFIRMATION_HEIGHT = 200       # frame. The confirmation dialog may
-                                        # consist of frames for packages to be 
-                                        # installed, removed or updated.
-DISPLAY_DELAY = 200                     # Delay before updating GUI when 
-                                        # displaying download or phase info
-RESET_PACKAGE_DELAY = 2000              # Delay before label text is reset
-                                        # Also used to reset window text during install
-DIALOG_DEFAULT_WIDTH = 450              # Default Width of Progress Dialog
-DIALOG_EXPANDED_DETAILS_HEIGHT = 462    # Height of Progress Dialog when Details expanded
-DIALOG_INSTALL_COLLAPSED_HEIGHT = 242   # Heights of progress dialog when Details
-                                        # collapsed for install, remove and done stages
-DIALOG_REMOVE_COLLAPSED_HEIGHT = 220
-DIALOG_DONE_COLLAPSED_HEIGHT = 126
-
-DIALOG_UM_EXTRA_HEIGHT = 60             # Extra height needed when in UM mode
-DIALOG_RELEASE_NOTE_OFFSET = 34         # Additional space required if displaying
-                                        # Release notes link below Details
-import errno
-import os
-import sys
-import time
-import pango
-import datetime
-import traceback
-from gettext import ngettext
-from threading import Thread
-from threading import Condition
-try:
-        import gobject
-        import gtk
-        import pygtk
-        pygtk.require("2.0")
-except ImportError:
-        sys.exit(1)
-
-import pkg.gui.progress as progress
-import pkg.misc as misc
-import pkg.client.api as api
-import pkg.client.api_errors as api_errors
-import pkg.gui.beadmin as beadm
-import pkg.gui.uarenamebe as uarenamebe
-import pkg.gui.misc as gui_misc
-import pkg.gui.enumerations as enumerations
-import pkg.gui.pmgconf as pmgconf
-from pkg.client import global_settings
-
-logger = global_settings.logger
-debug = False
-
-class InstallUpdate(progress.GuiProgressTracker):
-        def __init__(self, list_of_packages, parent, image_directory,
-            action = -1, parent_name = "", pkg_list = None, main_window = None,
-            icon_confirm_dialog = None, title = None, web_install = False,
-            confirmation_list = None, show_confirmation = False, api_lock = None,
-            gconf = None, facets = None):
-                if action == -1:
-                        return
-                self.gconf = gconf
-                progress.GuiProgressTracker.__init__(self, indent=True)
-                if self.gconf == None:
-                        self.gconf = pmgconf.PMGConf()
-                self.retry = False
-                self.web_install = web_install
-                self.web_updates_list = None
-                self.web_install_all_installed = False
-                self.parent = parent
-                self.api_lock = api_lock
-                self.facets = facets
-                self.api_o = gui_misc.get_api_object(image_directory,
-                    self, main_window)
-                if self.api_o == None:
-                        return
-                self.parent_name = parent_name
-                self.confirmation_list = confirmation_list
-                if confirmation_list == None:
-                        self.confirmation_list = []
-                self.show_confirmation = show_confirmation
-                if main_window == None:
-                        self.top_level = True
-                else:
-                        self.top_level = False
-                self.ipkg_ipkgui_list = pkg_list
-                self.icon_confirm_dialog = icon_confirm_dialog
-                self.title = title
-                self.w_main_window = main_window
-                if self.icon_confirm_dialog == None and self.w_main_window != None:
-                        self.icon_confirm_dialog = self.w_main_window.get_icon()
-
-                gladefile = os.path.join(self.parent.application_dir,
-                    "usr/share/package-manager/packagemanager.ui")
-                builder = gtk.Builder()
-                builder.add_from_file(gladefile)
-                self.w_dialog = builder.get_object("createplandialog")
-                self.original_title = None
-                if self.w_main_window:
-                        self.original_title = self.w_main_window.get_title()
-                if self.top_level:
-                        globals()["DIALOG_INSTALL_COLLAPSED_HEIGHT"] = \
-                                DIALOG_INSTALL_COLLAPSED_HEIGHT + DIALOG_UM_EXTRA_HEIGHT
-                        globals()["DIALOG_DONE_COLLAPSED_HEIGHT"] = \
-                                DIALOG_DONE_COLLAPSED_HEIGHT + DIALOG_UM_EXTRA_HEIGHT
-                        self.w_dialog.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
-                        self.w_dialog.set_icon(self.icon_confirm_dialog)
-                        self.w_main_window = self.w_dialog
-                        self.original_title = _("Update Manager")
-                        w_icon_um = builder.get_object("icon_um")
-                        w_icon_um.set_from_pixbuf(self.icon_confirm_dialog)
-                else:
-                        um_vbox = builder.get_object("um_title_vbox")
-                        um_vbox.set_property("visible", False)
-
-                self.license_cv = Condition()
-                self.list_of_packages = list_of_packages
-                self.accept_license_done = False
-                self.action = action
-                self.canceling = False
-                self.current_stage_name = None
-                self.ip = None
-                self.ips_update = False
-                self.operations_done = False
-                self.operations_done_ex = False
-                self.prev_ind_phase = None
-                self.reboot_needed = False
-                self.uarenamebe_o = None
-                self.label_text = None
-                self.prev_pkg = None
-                self.prev_prog = -1
-                self.prog = 0
-                self.progress_stop_timer_running = False
-                self.pylint_stub = None
-                self.reset_id = 0
-                self.reset_window_id = 0
-                self.display_download_id = 0
-                self.update_progress_id = 0
-                self.stages = {
-                          1:[_("Preparing..."), _("Preparation")],
-                          2:[_("Downloading..."), _("Download")],
-                          3:[_("Installing..."), _("Install")],
-                         }
-                self.current_stage_label_done = self.stages[1][1]
-                self.stop_progress_bouncing = False
-                self.stopped_bouncing_progress = True
-                self.update_list = {}
-
-                self.w_confirm_dialog = builder.get_object("confirmdialog")
-                self.w_install_expander = \
-                    builder.get_object("install_expander")
-                self.w_install_frame = \
-                    builder.get_object("install_frame")
-                self.w_install_treeview = \
-                    builder.get_object("install_treeview")
-                self.w_update_expander = \
-                    builder.get_object("update_expander")
-                self.w_update_frame = \
-                    builder.get_object("update_frame")
-                self.w_update_treeview = \
-                    builder.get_object("update_treeview")
-                self.w_remove_expander = \
-                    builder.get_object("remove_expander")
-                self.w_remove_frame = \
-                    builder.get_object("frame3")
-                self.w_remove_treeview = \
-                    builder.get_object("remove_treeview")
-                self.w_confirm_ok_button =  \
-                    builder.get_object("confirm_ok_button")
-                self.w_confirm_cancel_button =  \
-                    builder.get_object("confirm_cancel_button")
-                self.w_confirm_label =  \
-                    builder.get_object("confirmdialog_confirm_label")
-                self.w_confirm_donotshow =  \
-                    builder.get_object("confirm_donotshow")
-
-                self.w_confirm_dialog.set_icon(self.icon_confirm_dialog)
-                gui_misc.set_modal_and_transient(self.w_confirm_dialog,
-                    self.w_main_window)
-
-                self.w_expander = builder.get_object("details_expander")
-                self.w_cancel_button = builder.get_object("cancelcreateplan")
-                self.w_help_button = builder.get_object("helpcreateplan")
-                if self.top_level:
-                        self.w_help_button.set_property("visible", True)
-                else:
-                        self.w_help_button.set_property("visible", False)
-
-                self.w_close_button = builder.get_object("closecreateplan")
-                self.w_release_notes = builder.get_object("release_notes")
-                self.w_release_notes_link = \
-                    builder.get_object("ua_release_notes_button")
-                self.w_progressbar = builder.get_object("createplanprogress")
-                self.w_details_textview = builder.get_object("createplantextview")
-
-                self.w_stage2 = builder.get_object("stage2")
-                self.w_stages_box = builder.get_object("stages_box")
-                self.w_stage1_label = builder.get_object("label_stage1")
-                self.w_stage1_icon = builder.get_object("icon_stage1")
-                self.w_stage2_label = builder.get_object("label_stage2")
-                self.w_stage2_icon = builder.get_object("icon_stage2")
-                self.w_stage3_label = builder.get_object("label_stage3")
-                self.w_stage3_icon = builder.get_object("icon_stage3")
-                self.w_stages_label = builder.get_object("label_stages")
-                self.w_stages_icon = builder.get_object("icon_stages")
-                self.current_stage_label = self.w_stage1_label
-                self.current_stage_icon = self.w_stage1_icon
-
-                self.w_stages_label.set_line_wrap(True)
-                self.w_stages_label.set_size_request(DIALOG_DEFAULT_WIDTH - 20, -1)
-                
-                self.done_icon = gui_misc.get_icon(
-                    self.parent.icon_theme, "progress_checkmark")
-                blank_icon = gui_misc.get_icon(
-                    self.parent.icon_theme, "progress_blank")
-
-                checkmark_icon = gui_misc.get_icon(
-                    self.parent.icon_theme, "pm-check", 24)
-
-                self.w_stages_icon.set_from_pixbuf(checkmark_icon)
-                
-                self.w_stage1_icon.set_from_pixbuf(blank_icon)
-                self.w_stage2_icon.set_from_pixbuf(blank_icon)
-                self.w_stage3_icon.set_from_pixbuf(blank_icon)
-
-                proceed_txt = _("_Proceed")
-                gui_misc.change_stockbutton_label(self.w_confirm_ok_button, proceed_txt)
-
-                infobuffer = self.w_details_textview.get_buffer()
-                infobuffer.create_tag("bold", weight=pango.WEIGHT_BOLD)
-                infobuffer.create_tag("level1", left_margin=30, right_margin=10)
-                infobuffer.create_tag("level2", left_margin=50, right_margin=10)
-
-                self.w_progressbar.set_pulse_step(0.02)
-                self.w_release_notes.hide()
-
-                self.w_license_dialog = builder.get_object("license_dialog")
-                self.w_license_label = builder.get_object("instruction_label")
-                self.w_license_text = builder.get_object("textview1")
-                self.w_license_accept_checkbutton = \
-                    builder.get_object("license_accept_checkbutton")
-                self.w_license_accept_button = \
-                    builder.get_object("license_accept_button")
-                self.w_license_reject_button = \
-                    builder.get_object("license_reject_button")
-                self.accept_text = gui_misc.get_stockbutton_label_label(
-                    self.w_license_accept_button)
-                gui_misc.change_stockbutton_label(self.w_license_reject_button,
-                    _("_Reject"))
-                self.current_license_no = 0
-                self.packages_with_license = None
-                self.packages_with_license_result = []
-                self.n_licenses = 0
-                self.dlg_expanded_details_h = DIALOG_EXPANDED_DETAILS_HEIGHT
-                self.dlg_width = DIALOG_DEFAULT_WIDTH
-                self.dlg_install_collapsed_h = DIALOG_INSTALL_COLLAPSED_HEIGHT
-                self.dlg_remove_collapsed_h = DIALOG_REMOVE_COLLAPSED_HEIGHT
-                self.dlg_done_collapsed_h = DIALOG_DONE_COLLAPSED_HEIGHT
-
-                self.__setup_signals()
-                if not self.top_level:
-                        gui_misc.set_modal_and_transient(self.w_dialog,
-                            self.w_main_window)
-                self.w_license_dialog.set_icon(self.icon_confirm_dialog)
-                gui_misc.set_modal_and_transient(self.w_license_dialog,
-                    self.w_dialog)
-                self.__start_action()
-                self.__setup_createplan_dlg_sizes()
-
-        def __setup_signals(self):
-                signals_table = [
-                    (self.w_cancel_button, "clicked",
-                     self.__on_cancelcreateplan_clicked),
-                    (self.w_close_button, "clicked",
-                     self.__on_closecreateplan_clicked),
-                    (self.w_dialog, "delete_event",
-                     self.__on_createplandialog_delete),
-                    (self.w_expander, "activate",
-                     self.__on_details_expander_activate),
-                    (self.w_help_button, "clicked",
-                     self.__on_help_button_clicked),
-
-                    (self.w_license_reject_button, "clicked",
-                     self.__on_license_reject_button_clicked),
-                    (self.w_license_accept_button, "clicked",
-                     self.__on_license_accept_button_clicked),
-                    (self.w_license_accept_checkbutton, "toggled",
-                     self.__on_license_accept_checkbutton_toggled),
-                    (self.w_license_dialog, "delete_event", 
-                     self.__on_license_dialog_delete),
-
-                    (self.w_confirm_dialog, "delete_event", 
-                     self.__on_confirmdialog_delete_event),
-                    (self.w_confirm_donotshow, "toggled",
-                     self.__on_confirm_donotshow_toggled),
-                    (self.w_confirm_cancel_button, "clicked",
-                     self.__on_confirm_cancel_button_clicked),
-                    (self.w_confirm_ok_button, "clicked",
-                     self.__on_confirm_ok_button_clicked),
-                     ]
-                for widget, signal_name, callback in signals_table:
-                        widget.connect(signal_name, callback)
-
-        def __setup_createplan_dlg_sizes(self):
-                # If window manager is absent, _NET_WORKAREA property would not be set,
-                # therefore use gtk.gdk.screen_width and gtk.gdk.screen_height
-                # to get the effective screen space available
-                root_win = gtk.gdk.get_default_root_window()
-                net_workarea_prop = gtk.gdk.atom_intern('_NET_WORKAREA')
-                if net_workarea_prop:
-                        sw, sh = root_win.property_get(net_workarea_prop)[2][2:4]
-                else:
-                        sw = gtk.gdk.screen_width()
-                        sh = gtk.gdk.screen_height()
-
-                sw -= 28 # Default width of Panel accounts for bottom or side System Panel
-                sh -= 28
-                scale = gui_misc.get_scale(self.w_details_textview)
-
-                if DIALOG_EXPANDED_DETAILS_HEIGHT * scale <= sh:
-                        self.dlg_expanded_details_h = \
-                                (int) (DIALOG_EXPANDED_DETAILS_HEIGHT * scale)
-                        self.dlg_install_collapsed_h = \
-                                (int) (DIALOG_INSTALL_COLLAPSED_HEIGHT * scale)
-                        self.dlg_remove_collapsed_h = \
-                                (int) (DIALOG_REMOVE_COLLAPSED_HEIGHT * scale)
-                        self.dlg_done_collapsed_h = \
-                                (int) (DIALOG_DONE_COLLAPSED_HEIGHT * scale)
-                else:
-                        self.dlg_expanded_details_h = sh
-                        if DIALOG_INSTALL_COLLAPSED_HEIGHT * scale <= sh:
-                                self.dlg_install_collapsed_h = \
-                                        (int) (DIALOG_INSTALL_COLLAPSED_HEIGHT * scale)
-                                self.dlg_remove_collapsed_h = \
-                                        (int) (DIALOG_REMOVE_COLLAPSED_HEIGHT * scale)
-                                self.dlg_done_collapsed_h = \
-                                        (int) (DIALOG_DONE_COLLAPSED_HEIGHT * scale)
-                        else:
-                                self.dlg_install_collapsed_h = sh
-                                if DIALOG_REMOVE_COLLAPSED_HEIGHT * scale <= sh:
-                                        self.dlg_remove_collapsed_h = (int) \
-                                                (DIALOG_REMOVE_COLLAPSED_HEIGHT * scale)
-                                        self.dlg_done_collapsed_h = (int) \
-                                                (DIALOG_DONE_COLLAPSED_HEIGHT * scale)
-                                else:
-                                        self.dlg_remove_collapsed_h = sh
-                                        if DIALOG_DONE_COLLAPSED_HEIGHT * scale <= sh:
-                                                self.dlg_done_collapsed_h = (int) \
-                                                        (DIALOG_DONE_COLLAPSED_HEIGHT * \
-                                                        scale)
-                                        else:
-                                                self.dlg_done_collapsed_h = sh
-
-                if DIALOG_DEFAULT_WIDTH * scale <= sw:
-                        self.dlg_width = \
-                                (int) (DIALOG_DEFAULT_WIDTH * scale)
-                else:
-                        self.dlg_width = sw
-
-                if debug:
-                        print "CreatePlan Dialog Sizes: window", sw, sh, scale, " dlg ", \
-                                self.dlg_width, self.dlg_expanded_details_h, " coll ", \
-                                self.dlg_install_collapsed_h, \
-                                self.dlg_remove_collapsed_h, self.dlg_done_collapsed_h
-
-                if self.gconf.details_expanded:
-                        self.__set_dialog_size(self.dlg_width,
-                            self.dlg_expanded_details_h)
-                else:
-                        if not (self.w_stage2.flags() & gtk.VISIBLE):
-                                self.__set_dialog_size(self.dlg_width,
-                                        self.dlg_remove_collapsed_h)
-                        else:
-                                self.__set_dialog_size(self.dlg_width,
-                                        self.dlg_install_collapsed_h)
-
-        def __start_action(self):
-                if self.action == enumerations.REMOVE:
-                        # For the remove, we are not showing the download stage
-                        self.stages[3] = [_("Removing..."), _("Remove")]
-                        self.w_stage3_label.set_text(self.stages[3][1])
-                        self.w_stage2.hide()
-                        self.w_dialog.set_title(_("Remove"))
-
-                        if self.show_confirmation and len(self.confirmation_list) > 0:
-                                self.w_confirm_dialog.set_title(_("Remove Confirmation"))
-                                pkgs_no = len(self.confirmation_list)
-                                remove_text = ngettext(
-                                    "Review the package to be removed",
-                                    "Review the packages to be removed", pkgs_no)
-                                self.w_confirm_label.set_markup("<b>"+remove_text+"</b>")
-
-                                self.w_install_expander.hide()
-                                self.w_update_expander.hide()
-                                if not self.retry:
-                                        self.__init_confirmation_tree_view(
-                                            self.w_remove_treeview)
-                                liststore = gtk.ListStore(str, str, str)
-                                for sel_pkg in self.confirmation_list:
-                                        liststore.append(
-                                            [sel_pkg[enumerations.CONFIRM_NAME],
-                                            sel_pkg[enumerations.CONFIRM_PUB],
-                                            sel_pkg[enumerations.CONFIRM_DESC]])
-                                liststore.set_default_sort_func(lambda *args: -1) 
-                                liststore.set_sort_column_id(0, gtk.SORT_ASCENDING)
-                                self.w_remove_treeview.set_model(liststore)
-                                self.w_remove_expander.set_expanded(True)
-                                self.w_confirm_ok_button.grab_focus()
-                                self.w_confirm_dialog.show()
-                        else:
-                                self.__proceed_with_stages()
-                elif self.action == enumerations.IMAGE_UPDATE:
-                        if not self.top_level:
-                                self.w_dialog.set_title(_("Updates"))
-                        self.__proceed_with_stages()
-                elif self.action == enumerations.UPDATE_FACETS:
-                        if not self.top_level:
-                                self.w_dialog.set_title(
-                                    _("Update Optional Components"))
-                        self.__proceed_with_stages()
-                else:
-                        if self.title != None:
-                                self.w_dialog.set_title(self.title)
-                        else:
-                                self.w_dialog.set_title(_("Install/Update"))
-
-                        if self.show_confirmation and len(self.confirmation_list) > 0:
-                                self.w_remove_expander.hide()
-                                to_install = gtk.ListStore(str, str, str)
-                                to_update = gtk.ListStore(str, str, str)
-                                for cpk in self.confirmation_list:
-                                        if cpk[enumerations.CONFIRM_STATUS] == \
-                                            api.PackageInfo.UPGRADABLE:
-                                                to_update.append(
-                                                    [cpk[enumerations.CONFIRM_NAME], 
-                                                    cpk[enumerations.CONFIRM_PUB],
-                                                    cpk[enumerations.CONFIRM_DESC]])
-                                        else:
-                                                to_install.append(
-                                                    [cpk[enumerations.CONFIRM_NAME],
-                                                    cpk[enumerations.CONFIRM_PUB],
-                                                    cpk[enumerations.CONFIRM_DESC]])
-
-                                operation_txt = _("Install/Update Confirmation")
-                                install_text = ngettext(
-                                    "Review the package to be Installed/Updated",
-                                    "Review the packages to be Installed/Updated",
-                                     len(self.confirmation_list))
-
-                                if len(to_install) == 0:
-                                        operation_txt = _("Updates Confirmation")
-                                        install_text = ngettext(
-                                            "Review the package to be Updated",
-                                            "Review the packages to be Updated",
-                                            len(to_update))
-
-                                if len(to_update) == 0:
-                                        operation_txt = _("Install Confirmation")
-                                        install_text = ngettext(
-                                            "Review the package to be Installed",
-                                            "Review the packages to be Installed",
-                                            len(to_install))
-
-                                self.w_confirm_dialog.set_title(operation_txt)
-                                self.w_confirm_label.set_markup("<b>"+install_text+"</b>")
-
-                                if len(to_install) > 0:
-                                        self.__init_confirmation_tree_view(
-                                            self.w_install_treeview)
-                                        to_install.set_default_sort_func(lambda *args: -1)
-                                        to_install.set_sort_column_id(0,
-                                            gtk.SORT_ASCENDING)
-                                        self.w_install_treeview.set_model(to_install)
-                                        self.w_install_expander.set_expanded(True)
-                                else:
-                                        self.w_install_expander.hide()
-                                if len(to_update) > 0:
-                                        self.__init_confirmation_tree_view(
-                                            self.w_update_treeview)
-                                        to_update.set_default_sort_func(lambda *args: -1) 
-                                        to_update.set_sort_column_id(0,
-                                            gtk.SORT_ASCENDING)
-                                        self.w_update_treeview.set_model(to_update)
-                                        self.w_update_expander.set_expanded(True)
-                                else:
-                                        self.w_update_expander.hide()
-                                self.w_confirm_ok_button.grab_focus()
-                                self.w_confirm_dialog.show()
-                        else:
-                                self.__proceed_with_stages()
-
-        @staticmethod
-        def __init_confirmation_tree_view(treeview):
-                name_renderer = gtk.CellRendererText()
-                name_renderer.set_property("ellipsize", pango.ELLIPSIZE_END)
-                column = gtk.TreeViewColumn(_('Name'), name_renderer,
-                    text = enumerations.CONFIRM_NAME)
-                column.set_resizable(True)
-                column.set_min_width(150)
-                column.set_sort_column_id(0)
-                column.set_sort_indicator(True)
-                treeview.append_column(column)
-                publisher_renderer = gtk.CellRendererText()
-                column = gtk.TreeViewColumn(_('Publisher'), publisher_renderer,
-                    text = enumerations.CONFIRM_PUB)
-                column.set_resizable(True)
-                column.set_sort_column_id(1)
-                column.set_sort_indicator(True)
-                treeview.append_column(column)
-                summary_renderer = gtk.CellRendererText()
-                summary_renderer.set_property("ellipsize", pango.ELLIPSIZE_END)
-                column = gtk.TreeViewColumn(_('Summary'), summary_renderer,
-                    text = enumerations.CONFIRM_DESC)
-                column.set_resizable(True)
-                column.set_sort_column_id(2)
-                column.set_sort_indicator(True)
-                treeview.append_column(column)
-
-        def __on_confirm_donotshow_toggled(self, widget):
-                if self.action == enumerations.REMOVE:
-                        self.gconf.set_show_remove(not self.gconf.show_remove)
-                elif self.action == enumerations.IMAGE_UPDATE:
-                        self.gconf.set_show_image_update(not self.gconf.show_image_update)
-                elif self.action == enumerations.INSTALL_UPDATE:
-                        self.gconf.set_show_install(not self.gconf.show_install)
-
-        def __on_confirm_ok_button_clicked(self, widget):
-                if self.action == enumerations.INSTALL_UPDATE or \
-                    self.action == enumerations.REMOVE:
-                        self.__on_confirm_cancel_button_clicked(None)
-                        if self.top_level:
-                                self.w_main_window = self.w_dialog
-                        self.__proceed_with_stages()
-                else:
-                        self.w_expander.set_expanded(self.gconf.details_expanded)
-                        self.w_dialog.show()
-                        self.__on_confirm_cancel_button_clicked(None)
-                        self.__proceed_with_stages(continue_operation = True)
-
-        def __on_confirmdialog_delete_event(self, widget, event):
-                self.__on_confirm_cancel_button_clicked(widget)
-                return True
-
-        def __on_confirm_cancel_button_clicked(self, widget):
-                self.w_confirm_dialog.hide()
-                if widget: # User clicked cancel, widget != None
-                     if self.top_level:
-                         gobject.idle_add(self.parent.install_terminated)
-                     else:
-                         self.w_dialog.hide()
-
-        def __on_createplandialog_delete(self, widget, event):
-                self.__on_cancelcreateplan_clicked(None)
-                return True
-
-        def __set_dialog_size(self, w, h):
-                self.w_dialog.set_size_request(w, h)
-                self.w_dialog.resize(w, h)
-
-        def __on_details_expander_activate(self, widget):
-                collapsed = self.w_expander.get_expanded()
-                if collapsed:
-                        if not (self.w_stages_box.flags() & gtk.VISIBLE):
-                                self.__set_dialog_size(self.dlg_width,
-                                        self.dlg_done_collapsed_h)
-                        elif not (self.w_stage2.flags() & gtk.VISIBLE):
-                                self.__set_dialog_size(self.dlg_width,
-                                        self.dlg_remove_collapsed_h)
-                        else:
-                                self.__set_dialog_size(self.dlg_width,
-                                        self.dlg_install_collapsed_h)
-                else:
-                        self.__set_dialog_size(self.dlg_width,
-                            self.dlg_expanded_details_h)
-
-                self.gconf.set_details_expanded(not self.gconf.details_expanded)
-
-        def __on_cancelcreateplan_clicked(self, widget):
-                '''Handler for signal send by cancel button, which user might press
-                during evaluation stage - while the dialog is creating plan'''
-                if self.api_o.can_be_canceled() and self.operations_done_ex == False:
-                        self.canceling = True
-                        Thread(target = self.api_o.cancel, args = ()).start()
-                        cancel_txt = _("Canceling...")
-                        txt = "<b>" + self.current_stage_label_done + " - " \
-                            + cancel_txt + "</b>"
-                        gobject.idle_add(self.current_stage_label.set_markup, txt)
-                        gobject.idle_add(self.current_stage_icon.set_from_stock,
-                            gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU)
-                        gobject.idle_add(self.w_stages_label.set_markup, cancel_txt)
-                        self.w_cancel_button.set_sensitive(False)
-                        if self.top_level:
-                                gobject.idle_add(self.parent.install_terminated)
-                if self.operations_done or self.operations_done_ex:
-                        self.w_dialog.hide()
-                        if self.web_install:
-                                if self.operations_done_ex == False and \
-                                        not self.web_install_all_installed:
-                                        gobject.idle_add(self.parent.update_package_list,
-                                            None)
-                                else:
-                                        gobject.idle_add(self.parent.update_package_list,
-                                            self.web_updates_list)
-                                return
-                        if self.top_level:
-                                gobject.idle_add(self.parent.install_terminated)
-                        gobject.idle_add(self.parent.update_package_list, None)
-
-        def __on_closecreateplan_clicked(self, widget):
-                self.w_close_button.hide()
-                self.w_dialog.hide()
-                buf = self.w_details_textview.get_buffer()
-                buf.set_text("")
-                self.w_expander.set_expanded(False)
-                self.__start_action()
-                self.retry = False
-                return
-
-        def __on_help_button_clicked(self, widget):
-                if self.top_level:
-                        gui_misc.display_help("using_um")
-                elif self.action == enumerations.INSTALL_UPDATE:
-                        gui_misc.display_help("install-pkg")
-                elif self.action == enumerations.REMOVE:
-                        gui_misc.display_help("remove-pkg")
-                else:
-                        gui_misc.display_help("update-pkg")
-
-        def __ipkg_ipkgui_uptodate(self):
-                if self.ipkg_ipkgui_list == None:
-                        return True
-                for pd in self.api_o.gen_plan_install(self.ipkg_ipkgui_list):
-                        continue
-                upgrade_needed = not self.api_o.planned_nothingtodo(
-                    li_ignore_all=True)
-                return not upgrade_needed
-
-        def __proceed_with_stages(self, continue_operation = False):
-                if continue_operation == False:
-                        self.__start_stage_one()
-                        self.w_expander.set_expanded(self.gconf.details_expanded)
-                        self.w_dialog.show()
-                Thread(target = self.__proceed_with_stages_thread_ex,
-                    args = (continue_operation, )).start()
-
-        def __proceed_with_stages_thread_ex(self, continue_operation = False):
-                if self.api_lock:
-                        self.api_lock.acquire()
-                self.__proceed_with_stages_thread_ex_with_lock(continue_operation)
-                gui_misc.release_lock(self.api_lock)
-
-        def __proceed_with_stages_thread_ex_with_lock(self, continue_operation = False):
-                try:
-                        try:
-                                if self.action == enumerations.IMAGE_UPDATE and \
-                                    continue_operation == False:
-                                        self.__start_substage(
-                                            _("Ensuring %s is up to date...") %
-                                            self.parent_name,
-                                            bounce_progress=True)
-                                        self.set_purpose(self.PURPOSE_PKG_UPDATE_CHK)
-                                        solaris_image = True
-                                        ips_uptodate = True
-                                        notfound = self.__installed_fmris_from_args(
-                                            [gui_misc.package_name["SUNWipkg"],
-                                            gui_misc.package_name["SUNWcs"]])
-                                        if notfound:
-                                                solaris_image = False
-                                        if solaris_image:
-                                                ips_uptodate = \
-                                                    self.__ipkg_ipkgui_uptodate()
-                                        self.set_purpose(self.PURPOSE_NORMAL)
-                                        if not ips_uptodate:
-                                                # Do the stuff with installing
-                                                # pkg pkg-gui and restart in the
-                                                # special mode
-                                                self.ips_update = True
-                                                self.__proceed_with_ipkg_thread()
-                                                return
-                                        self.update_details_text(_("%s "
-                                            "is up to date.\n") % \
-                                            self.parent_name, "level1")         
-                                        gobject.idle_add(
-                                            self.__create_uarenamebe_o)
-                                        self.api_o.reset()
-                                if continue_operation == False:
-                                        self.__proceed_with_stages_thread()
-                                else:
-                                        self.__continue_with_stages_thread()
-                        except (MemoryError, EnvironmentError), __e:
-                                if isinstance(__e, EnvironmentError) and \
-                                    __e.errno != errno.ENOMEM:
-                                        raise
-                                msg = misc.out_of_memory()
-                                self.__g_error_stage(msg)
-                                return
-                        except RuntimeError, ex:
-                                msg = str(ex)
-                                if msg == "cannot release un-aquired lock":
-                                        logger.error(msg)
-                                else:
-                                        self.__g_error_stage(msg)
-                                        return
-                except api_errors.InventoryException, e:
-                        msg = _("Inventory exception:\n")
-                        if e.illegal:
-                                for i in e.illegal:
-                                        msg += "\tpkg:\t" + i +"\n"
-                        else:
-                                msg = "%s" % e
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.CatalogRefreshException, e:
-                        res = gui_misc.get_catalogrefresh_exception_msg(e)
-                        self.__g_error_stage(res[0])
-                        return
-                except api_errors.TransportError, ex:
-                        msg = _("Please check the network "
-                            "connection.\nIs the repository accessible?\n\n"
-                            "%s") % str(ex)
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.InvalidDepotResponseException, e:
-                        msg = _("\nUnable to contact a valid package depot. "
-                            "Please check your network settings and "
-                            "attempt to contact the server using a web "
-                            "browser.\n\n%s") % str(e)
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.IpkgOutOfDateException:
-                        msg = _("pkg(5) appears to be out of "
-                            "date and should be updated.\n"
-                            "Please update %s package") % (
-                            gui_misc.package_name["SUNWipkg"])
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.NonLeafPackageException, nlpe:
-                        msg = _("Cannot remove:\n\t%s\n"
-                                "Due to the following packages that "
-                                "depend on it:\n") % nlpe.fmri.get_name()
-                        for pkg_a in nlpe.dependents:
-                                msg += "\t" + pkg_a.get_name() + "\n"
-
-                        stem = nlpe.fmri.get_pkg_stem()
-                        self.list_of_packages.remove(stem)
-                        if self.confirmation_list:
-                                for item in self.confirmation_list:
-                                        if item[enumerations.CONFIRM_STEM] == stem:
-                                                self.confirmation_list.remove(item)
-                                                break 
-                        if len(self.list_of_packages) > 0:
-                                if self.w_close_button.get_use_stock():
-                                        label = gui_misc.get_stockbutton_label_label(
-                                            self.w_close_button)
-                                else:
-                                        label = self.w_close_button.get_label()
-                                label = label.replace("_", "")
-                                msg += "\n"
-                                msg += _("Press %(button)s "
-                                    "button to continue removal without"
-                                    "\n\t%(package)s\n") % \
-                                    {"button": label,
-                                     "package": nlpe.fmri.get_name()}
-                                self.retry = True
-                                self.w_close_button.show()
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.ProblematicPermissionsIndexException, err:
-                        msg = str(err)
-                        msg += _("\nFailure to consistently execute pkg "
-                            "commands when running %s as a privileged user is "
-                            "often a source of this problem.") % self.parent_name
-                        msg += _("\nTo rebuild index, please execute the "
-                            "following command as a privileged user:")
-                        msg += _("\n\tpkg rebuild-index")
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.CorruptedIndexException:
-                        msg = _("There was an error during installation. The search "
-                            "index is corrupted. You might want try to fix this "
-                            "problem by executing the following command as a "
-                            "privileged user:\n"
-                            "\tpkg rebuild-index")
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.ImageUpdateOnLiveImageException:
-                        msg = _("This is a Live Image. The install "
-                            "operation can't be performed.")
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.RebootNeededOnLiveImageException:
-                        msg = _("The requested operation would affect files that cannot "
-                        "be modified in the Live Image.\n"
-                        "Please retry this operation on an alternate boot environment.")
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.PlanMissingException:
-                        msg = _("There was an error during installation.\n"
-                            "The Plan of the operation is missing and the operation "
-                            "can't be finished. You might want try to fix this "
-                            "problem by restarting %s\n") % self.parent_name
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.ImageplanStateException:
-                        msg = _("There was an error during installation.\n"
-                            "The State of the image is incorrect and the operation "
-                            "can't be finished. You might want try to fix this "
-                            "problem by restarting %s\n") % self.parent_name
-                        self.__g_error_stage(msg)
-                        return
-                except api_errors.CanceledException:
-                        gobject.idle_add(self.__do_cancel)
-                        self.stop_bouncing_progress()
-                        return
-                except api_errors.BENamingNotSupported:
-                        msg = _("Specifying BE Name not supported.\n")
-                        self.__g_error_stage(msg)
-                        return
-                # We do want to prompt user to load BE admin if there is
-                # not enough disk space. This error can either come as an
-                # error within API exception, see bug #7642 or as a standalone
-                # error, that is why we need to check for both situations.
-                except EnvironmentError, uex:
-                        if uex.errno in (errno.EDQUOT, errno.ENOSPC):
-                                self.__handle_nospace_error()
-                        else:
-                                self.__handle_error()
-                        return
-                except api_errors.HistoryStoreException, uex:
-                        if (isinstance(uex.error, EnvironmentError) and
-                           uex.error.errno in (errno.EDQUOT, errno.ENOSPC)):
-                                self.__handle_nospace_error()
-                        else:
-                                self.__handle_error()
-                        return
-                except api_errors.ApiException, ex:
-                        msg = str(ex)
-                        self.__g_error_stage(msg)
-                        return
-                except Exception:
-                        self.__handle_error()
-                        return
-
-        def __reset_window_title(self):
-                if self.reset_window_id:
-                        gobject.source_remove(self.reset_window_id)
-                        self.reset_window_id = 0
-                if self.w_main_window:
-                        self.w_main_window.set_title(self.original_title)
-
-        def __do_cancel(self):
-                self.__do_dialog_hide()
-
-        def __do_dialog_hide(self):
-                self.w_dialog.hide()
-                self.__reset_window_title()
-    
-        def __create_uarenamebe_o(self):
-                if self.uarenamebe_o == None:
-                        self.uarenamebe_o = \
-                            uarenamebe.RenameBeAfterUpdateAll(
-                            self.parent, self.icon_confirm_dialog,
-                            self.w_main_window)
-
-        def __handle_nospace_error(self):
-                gobject.idle_add(self.__prompt_to_load_beadm)
-                gobject.idle_add(self.__do_dialog_hide)
-                self.stop_bouncing_progress()
-
-        def __handle_error(self):
-                traceback_lines = traceback.format_exc().splitlines()
-                traceback_str = ""
-                for line in traceback_lines:
-                        traceback_str += line + "\n"
-                self.__g_exception_stage(traceback_str)
-                sys.exc_clear()
-
-        def __proceed_with_ipkg_thread(self):
-                self.__start_substage(_("Updating %s") % self.parent_name,
-                    bounce_progress=True)
-                self.__afterplan_information()
-                self.prev_pkg = None
-                self.__start_substage(_("Downloading..."), bounce_progress=False)
-                self.api_o.prepare()
-                self.__start_substage(_("Executing..."), bounce_progress=False)
-                gobject.idle_add(self.w_cancel_button.set_sensitive, False)
-                try:
-                        self.api_o.execute_plan()
-                except api_errors.WrapSuccessfulIndexingException:
-                        pass
-                except api_errors.WrapIndexingException, wex:
-                        err = _("\n\nDespite the error while indexing, the "
-                                    "image-update, install, or uninstall has completed "
-                                    "successfuly.")
-                        err = err.replace("\n\n", "")
-                        err += "\n" + str(wex)
-                        logger.error(err)
-                        
-                gobject.idle_add(self.__operations_done)
-
-        def __proceed_with_stages_thread(self):
-                self.__start_substage(None)
-                self.label_text = _("Gathering package information, please wait...")
-                self.update_label_text(self.label_text)
-                self.update_details_text(
-                    _("Gathering package information") + "\n", "level1")
-
-                stuff_todo = self.__plan_stage()
-                if stuff_todo:
-
-                        if (self.action == enumerations.IMAGE_UPDATE and
-                            self.show_confirmation):
-                                gobject.idle_add(self.__show_image_update_confirmation)
-                        else:
-                                self.__continue_with_stages_thread()
-                else:
-                        if self.web_install:
-                                gobject.idle_add(self.__operations_done,
-                                    _("All packages already installed."))
-                                return
-
-                        if self.action == enumerations.INSTALL_UPDATE:
-                                done_text = _("No updates necessary")
-                        elif self.action == enumerations.IMAGE_UPDATE:
-                                done_text = _("No updates available")
-                        elif self.action == enumerations.UPDATE_FACETS:
-                                done_text = _("All features already installed")
-                        gobject.idle_add(self.__operations_done, done_text)
-
-        def __show_image_update_confirmation(self):
-                dic_to_update = {}
-                dic_to_install = {}
-                dic_to_remove = {}
-                to_update = gtk.ListStore(str, str, str)
-                to_install = gtk.ListStore(str, str, str)
-                to_remove = gtk.ListStore(str, str, str)
-
-
-                plan_desc = self.api_o.describe()
-                if plan_desc == None:
-                        return
-                plan = plan_desc.get_changes()
-
-                for pkg_plan in plan:
-                        orig = pkg_plan[0]
-                        dest = pkg_plan[1]
-                        if orig and dest:
-                                dic_to_update[dest.pkg_stem] = [dest.publisher, None] 
-                        elif not orig and dest:
-                                dic_to_install[dest.pkg_stem] = [dest.publisher, None] 
-                        elif orig and not dest:
-                                dic_to_remove[orig.pkg_stem] = [orig.publisher, None] 
-
-                self.__update_summaries(dic_to_update, dic_to_install, dic_to_remove)
-
-                self.__dic_to_liststore(dic_to_update, to_update)
-                self.__dic_to_liststore(dic_to_install, to_install)
-                self.__dic_to_liststore(dic_to_remove, to_remove)
-
-                len_to_update = len(to_update)
-                len_to_install = len(to_install)
-                len_to_remove = len(to_remove)
-
-                if len_to_update == 0 and len_to_install == 0 and len_to_remove == 0:
-                        # Never show an empty confirmation dialog just proceed
-                        self.__on_confirm_ok_button_clicked(None)
-                        return
-
-                self.__resize_confirm_frames(len_to_update,
-                    len_to_install, len_to_remove)
-
-                if len_to_update > 0:
-                        self.__init_confirmation_tree_view(
-                            self.w_update_treeview)
-                        to_update.set_default_sort_func(lambda *args: -1) 
-                        to_update.set_sort_column_id(0, gtk.SORT_ASCENDING)
-                        self.w_update_treeview.set_model(to_update)
-                        self.w_update_expander.set_expanded(True)
-                else:
-                        self.w_update_expander.hide()
-
-                if len_to_install > 0:
-                        self.__init_confirmation_tree_view(
-                            self.w_install_treeview)
-                        to_install.set_default_sort_func(lambda *args: -1) 
-                        to_install.set_sort_column_id(0, gtk.SORT_ASCENDING)
-                        self.w_install_treeview.set_model(to_install)
-                        self.w_install_expander.set_expanded(True)
-                else:
-                        self.w_install_expander.hide()
-
-                if len_to_remove > 0:
-                        self.__init_confirmation_tree_view(
-                            self.w_remove_treeview)
-                        to_remove.set_default_sort_func(lambda *args: -1) 
-                        to_remove.set_sort_column_id(0, gtk.SORT_ASCENDING)
-                        self.w_remove_treeview.set_model(to_remove)
-                        self.w_remove_expander.set_expanded(True)
-                else:
-                        self.w_remove_expander.hide()
-
-                no_pkgs = len(to_update) + len(to_install) + len(to_remove)
-                operation_txt = _("Updates Confirmation")
-                install_text = ngettext(
-                    "Review the package which will be affected by Updates",
-                    "Review the packages which will be affected by Updates", no_pkgs)
-
-                self.w_confirm_dialog.set_title(operation_txt)
-                self.w_confirm_label.set_markup("<b>"+install_text+"</b>")
-
-                self.w_confirm_ok_button.grab_focus()
-                self.__start_substage(None,
-                            bounce_progress=False)
-                if not self.top_level:
-                        self.__reset_window_title()
-                self.w_confirm_dialog.show()
-
-
-        def __resize_confirm_frames(self, len_to_update, len_to_install, len_to_remove):
-                calculated_height = DEFAULT_CONFIRMATION_HEIGHT
-
-                if len_to_update > 0 and len_to_remove > 0 and len_to_install > 0:
-                        calculated_height = (calculated_height/4)*2
-                elif (len_to_update > 0 and len_to_remove > 0) or (len_to_update > 0 and
-                    len_to_install > 0) or (len_to_remove > 0 and len_to_install > 0):
-                        calculated_height = (calculated_height/3)*2
-
-                self.w_install_frame.set_size_request(DEFAULT_CONFIRMATION_WIDTH,
-                    calculated_height)
-                self.w_update_frame.set_size_request(DEFAULT_CONFIRMATION_WIDTH,
-                    calculated_height)
-                self.w_remove_frame.set_size_request(DEFAULT_CONFIRMATION_WIDTH,
-                    calculated_height)
-
-        @staticmethod
-        def __dic_to_liststore(dic, liststore):
-                for entry in dic:
-                        liststore.append([entry, dic[entry][0], dic[entry][1]])
-
-        def __handle_licenses(self):
-                self.packages_with_license = \
-                    self.__get_packages_for_license_check()
-                self.n_licenses = len(self.packages_with_license)
-                if self.n_licenses > 0:
-                        gobject.idle_add(self.__do_ask_license)
-                        self.license_cv.acquire()
-                        while not self.accept_license_done:
-                                self.license_cv.wait()
-                        gui_misc.release_lock(self.license_cv)
-                        self.__do_accept_licenses()
-                return
-
-        def __continue_with_stages_thread(self):
-                self.__afterplan_information()
-                self.prev_pkg = None
-                self.__handle_licenses()
-
-                # The api.prepare() mostly is downloading the files so we are
-                # Not showing this stage in the main stage dialog. If download
-                # is necessary, then we are showing it in the details view
-                if not self.action == enumerations.REMOVE:
-                        self.__start_stage_two()
-                        self.__start_substage(None,
-                            bounce_progress=False)
-                try:
-                        self.api_o.prepare()
-                except api_errors.PlanLicenseErrors:
-                        gobject.idle_add(self.__do_dialog_hide)
-                        if self.top_level:
-                                gobject.idle_add(self.parent.install_terminated)
-                        self.stop_bouncing_progress()
-                        return
-                self.__start_stage_three()
-                self.__start_substage(None,
-                    bounce_progress=False)
-                gobject.idle_add(self.w_cancel_button.set_sensitive, False)
-                try:
-                        self.api_o.execute_plan()
-                except api_errors.WrapSuccessfulIndexingException:
-                        pass
-                except api_errors.WrapIndexingException, wex:
-                        err = _("\n\nDespite the error while indexing, the "
-                                    "image-update, install, or uninstall has completed "
-                                    "successfuly.")
-                        err = err.replace("\n\n", "")
-                        err += "\n" + str(wex)
-                        logger.error(err)
-                        
-                gobject.idle_add(self.__operations_done)
-
-        def __start_stage_one(self):
-                self.__start_stage(self.stages.get(1), self.w_stage1_label,
-                    self.w_stage1_icon)
-                self.update_details_text(self.stages.get(1)[0]+"\n", "bold")
-
-        def __start_stage_two(self):
-                # End previous stage
-                self.__end_stage()
-                self.__start_stage(self.stages.get(2), self.w_stage2_label,
-                    self.w_stage2_icon)
-                self.update_details_text(self.stages.get(2)[0]+"\n", "bold")
-
-        def __start_stage_three(self):
-                self.__end_stage()
-                self.__start_stage(self.stages.get(3),  self.w_stage3_label,
-                    self.w_stage3_icon)
-                self.update_details_text(self.stages.get(3)[0]+"\n", "bold")
-
-        def __do_start_stage(self, stage_text, current_stage_label, current_stage_icon):
-                self.current_stage_label = current_stage_label
-                self.current_stage_icon = current_stage_icon
-                self.current_stage_label_done = stage_text[1]
-                if self.w_main_window:
-                        new_title = stage_text[0]
-                        self.w_main_window.set_title(new_title)
-                self.current_stage_label.set_markup("<b>"+stage_text[0]+"</b>")
-                self.current_stage_icon.set_from_stock(gtk.STOCK_GO_FORWARD,
-                    gtk.ICON_SIZE_MENU)
-
-        def __start_stage(self, stage_text, current_stage_label, current_stage_icon):
-                gobject.idle_add(self.__do_start_stage, stage_text, current_stage_label,
-                    current_stage_icon)
-
-        def __do_end_stage(self):
-                self.current_stage_label.set_text(self.current_stage_label_done)
-                self.current_stage_icon.set_from_pixbuf(self.done_icon)
-                self.__reset_window_title()
-
-        def __end_stage(self):
-                gobject.idle_add(self.__do_end_stage)
-
-        def __g_error_stage(self, msg):
-                if msg == None or len(msg) == 0:
-                        msg = _("No further information available")
-                self.operations_done = True
-                self.operations_done_ex = True
-                self.stop_bouncing_progress()
-                self.update_details_text(_("\nError:\n"), "bold")
-                self.update_details_text("%s" % msg, "level1")
-                self.update_details_text("\n")
-                txt = "<b>" + self.current_stage_label_done + _(" - Failed </b>")
-                gobject.idle_add(self.__g_error_stage_setup, txt)
-                gobject.idle_add(self.w_dialog.queue_draw)
-
-        def __g_error_stage_setup(self, txt):
-                self.__reset_window_title()
-                if self.action == enumerations.IMAGE_UPDATE:
-                        info_url = misc.get_release_notes_url()
-                        if info_url and len(info_url) == 0:
-                                info_url = gui_misc.RELEASE_URL
-                        self.w_release_notes.show()
-                        self.w_release_notes_link.set_uri(info_url)
-                        self.dlg_expanded_details_h += DIALOG_RELEASE_NOTE_OFFSET * 2
-                        self.dlg_install_collapsed_h += DIALOG_RELEASE_NOTE_OFFSET
-                        self.dlg_remove_collapsed_h += DIALOG_RELEASE_NOTE_OFFSET
-
-                self.current_stage_label.set_markup(txt)
-                self.current_stage_icon.set_from_stock(gtk.STOCK_DIALOG_ERROR,
-                    gtk.ICON_SIZE_MENU)
-                self.w_expander.set_expanded(True)
-                self.w_cancel_button.set_sensitive(True)
-                self.__set_dialog_size(self.dlg_width, self.dlg_expanded_details_h)
-
-        def __g_exception_stage(self, tracebk):
-                self.__reset_window_title()
-                self.operations_done = True
-                self.operations_done_ex = True
-                self.stop_bouncing_progress()
-                if self.action == enumerations.IMAGE_UPDATE:
-                        info_url = misc.get_release_notes_url()
-                        if info_url and len(info_url) == 0:
-                                info_url = gui_misc.RELEASE_URL
-                        self.w_release_notes.show()
-                        self.w_release_notes_link.set_uri(info_url)
-                txt = "<b>" + self.current_stage_label_done + _(" - Failed </b>")
-                gobject.idle_add(self.current_stage_label.set_markup, txt)
-                gobject.idle_add(self.current_stage_icon.set_from_stock,
-                    gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_MENU)
-                msg_2 = misc.get_traceback_message()
-                msg_2 = msg_2.replace("\n", " ").lstrip()
-                msg_1 = _("An unknown error occurred in the %s stage.\n\n")\
-                    % self.current_stage_name + msg_2
-                self.update_details_text(_("\nError:\n"), "bold")
-                self.update_details_text("%s\n\n" % msg_1, "level1")
-                if tracebk:
-                        msg = _("Exception traceback:\n")
-                        self.update_details_text("%s" % msg,
-                            "bold","level1")
-                        self.update_details_text("%s\n" % tracebk, "level2")
-                else:
-                        msg = _("No further information available")
-                        self.update_details_text("%s\n" % msg, "level2")
-                publisher_header = _("List of configured publishers:")
-                self.update_details_text("%s" % publisher_header,
-                    "bold","level1")
-                publisher_str = gui_misc.get_publishers_for_output(self.api_o)
-                self.update_details_text("%s\n" % publisher_str,
-                    "level2")
-                gobject.idle_add(self.w_expander.set_expanded, True)
-                gobject.idle_add(self.w_cancel_button.set_sensitive, True)
-
-        def __start_substage(self, text, bounce_progress=True):
-                if text:
-                        self.update_label_text(text)
-                        self.update_details_text(text + "\n", "level1")
-                if bounce_progress:
-                        if self.stopped_bouncing_progress:
-                                self.start_bouncing_progress()
-                else:
-                        self.stop_bouncing_progress()
-
-        def update_label_text(self, markup_text):
-                gobject.idle_add(self.__stages_label_set_markup, markup_text)
-
-        def __stages_label_set_markup(self, markup_text):
-                if not self.canceling == True:
-                        self.w_stages_label.set_markup(markup_text)
-
-        def start_bouncing_progress(self):
-                self.stop_progress_bouncing = False
-                self.stopped_bouncing_progress = False
-                Thread(target =
-                    self.__g_progressdialog_progress_pulse).start()
-
-        def __g_progressdialog_progress_pulse(self):
-                while not self.stop_progress_bouncing:
-                        gobject.idle_add(self.w_progressbar.pulse)
-                        time.sleep(0.1)
-                self.stopped_bouncing_progress = True
-                gobject.idle_add(self.w_progressbar.set_fraction, 0.0)
-
-        def is_progress_bouncing(self):
-                return not self.stopped_bouncing_progress
-
-        def stop_bouncing_progress(self):
-                if self.is_progress_bouncing():
-                        self.stop_progress_bouncing = True
-
-        def update_details_text(self, text, *tags):
-                gobject.idle_add(self.__update_details_text, text, *tags)
-
-        def __update_details_text(self, text, *tags):
-                buf = self.w_details_textview.get_buffer()
-                textiter = buf.get_end_iter()
-                if tags:
-                        buf.insert_with_tags_by_name(textiter, text, *tags)
-                else:
-                        buf.insert(textiter, text)
-                insert_mark = buf.get_insert()
-                self.w_details_textview.scroll_to_mark(insert_mark, 0.0)
-
-        def __update_window_title(self, display_string):
-                self.w_main_window.set_title(display_string)
-
-        def display_download_info(self):
-                self.update_progress(self.dl_bytes.items,
-                    self.dl_bytes.goalitems)
-                if self.w_main_window:
-                        progtimes100 = int(self.prog * 100)
-                        if progtimes100 != self.prev_prog:
-                                self.prev_prog = progtimes100
-                                display_string = "%d%% - %s" % (progtimes100,
-                                    self.stages[2][0])
-                                gobject.idle_add(self.__update_window_title,
-                                    display_string)
-
-                if self.display_download_id == 0:
-                        self.display_download_id = gobject.timeout_add( \
-                            DISPLAY_DELAY, self.__display_download_text)
-
-        def __display_download_text(self):
-                self.display_download_id = 0
-                size_a_str = misc.bytes_to_str(self.dl_bytes.items)
-                size_b_str = misc.bytes_to_str(self.dl_bytes.goalitems)
-                speed = self.dl_estimator.get_speed_estimate()
-                speed_str = "" if speed is None else \
-                    _("(%s)") % self.dl_estimator.format_speed(speed)
-
-                c = _("Downloaded %(current)s of %(total)s %(speed)s") % \
-                    {"current" : size_a_str,
-                    "total" : size_b_str,
-                    "speed" : speed_str}
-                self.__stages_label_set_markup(c)
-
-        def display_phase_info(self, phase_name, cur_n, goal_n):
-                self.update_progress(cur_n, goal_n)
-                if self.reset_window_id != 0:
-                        gobject.source_remove(self.reset_window_id)
-                        self.reset_window_id = 0
-                if self.w_main_window:
-                        progtimes100 = int(self.prog * 100)
-                        if progtimes100 != self.prev_prog:
-                                self.prev_prog = progtimes100
-                                display_string = _("%(cur)d of %(goal)d - %(name)s") % \
-                                    {"cur": cur_n, "goal": goal_n, \
-                                    "name": phase_name}
-                                gobject.idle_add(self.__update_window_title,
-                                    display_string)
-                                self.reset_window_id = gobject.timeout_add(
-                                        RESET_PACKAGE_DELAY,
-                                        self.__do_reset_window_text, phase_name)
-
-        def __do_reset_window_text(self, phase_name):
-                self.reset_window_id = 0
-                self.__update_window_title(phase_name)
-
-        def reset_label_text_after_delay(self):
-                if self.reset_id != 0:
-                        gobject.source_remove(self.reset_id)
-                self.reset_id = gobject.timeout_add(RESET_PACKAGE_DELAY,
-                    self.__do_reset_label_text)
-
-        def __do_reset_label_text(self):
-                self.reset_id = 0
-                if self.label_text:
-                        self.__stages_label_set_markup(self.label_text)
-
-        def __update_progress(self):
-                self.update_progress_id = 0
-                self.w_progressbar.set_fraction(self.prog)
-
-        def update_progress(self, current, total):
-                self.prog = float(current)/total
-                assert self.prog >= 0.0 and self.prog <= 1.0
-                if self.update_progress_id == 0:
-                        self.update_progress_id = gobject.timeout_add(DISPLAY_DELAY,
-                            self.__update_progress)
-
-        def __plan_stage(self):
-                '''Function which plans the image'''
-                if self.action == enumerations.INSTALL_UPDATE:
-                        for pd in self.api_o.gen_plan_install(
-                            self.list_of_packages, refresh_catalogs=False):
-                                continue
-                elif self.action == enumerations.REMOVE:
-                        for pd in self.api_o.gen_plan_uninstall(
-                            self.list_of_packages, noexecute=False):
-                                continue
-                elif self.action == enumerations.IMAGE_UPDATE:
-                        # we are passing force, since we already checked if the
-                        # packages are up to date.  Create BE if required
-                        for pd in self.api_o.gen_plan_update(
-                            refresh_catalogs=False, noexecute=False,
-                            force=True, be_name=None, new_be=None):
-                                continue
-                        self.pylint_stub = self.api_o.solaris_image()
-                else:
-                        assert self.action == enumerations.UPDATE_FACETS
-                        for pd in self.api_o.gen_plan_change_varcets(
-                            variants=None, facets=self.facets,
-                            noexecute=False, be_name=None, new_be=None):
-                                continue
-                return not self.api_o.planned_nothingtodo(li_ignore_all=True)
-
-        def __operations_done(self, alternate_done_txt = None):
-                self.__reset_window_title()
-                self.label_text = None
-                done_txt = _("Installation completed successfully")
-                if self.action == enumerations.REMOVE:
-                        done_txt = _("Packages removed successfully")
-                elif self.action == enumerations.IMAGE_UPDATE:
-                        done_txt = _("Packages updated successfully")
-                elif self.action == enumerations.UPDATE_FACETS:
-                        done_txt = _("Optional components updated successfully")
-                if alternate_done_txt != None:
-                        done_txt = alternate_done_txt
-                self.w_stages_box.hide()
-                self.w_stages_icon.show()
-                self.__stages_label_set_markup("<b>" + done_txt + "</b>")
-                self.__update_details_text("\n"+ done_txt, "bold")
-                self.w_cancel_button.set_sensitive(True)
-                self.w_cancel_button.set_label("gtk-close")
-                self.w_cancel_button.grab_focus()
-                self.w_progressbar.hide()
-                self.stop_bouncing_progress()
-                self.operations_done = True
-                if not self.gconf.details_expanded:
-                        self.__set_dialog_size(self.dlg_width, self.dlg_done_collapsed_h)
-                if self.parent != None:
-                        if not self.web_install and not self.ips_update \
-                            and not self.action == enumerations.IMAGE_UPDATE \
-                            and not self.action == enumerations.UPDATE_FACETS:
-                                self.parent.update_package_list(self.update_list)
-                        if self.web_install:
-                                if done_txt == \
-                                        _("All packages already installed.") or \
-                                        done_txt == \
-                                        _("Installation completed successfully"):
-                                        self.web_install_all_installed = True
-                                else:
-                                        self.web_install_all_installed = False
-                                self.web_updates_list = self.update_list
-                if self.ips_update:
-                        self.w_dialog.hide()
-                        self.parent.restart_after_ips_update()
-                elif self.action == enumerations.IMAGE_UPDATE or \
-                        self.action == enumerations.UPDATE_FACETS:
-                        if self.uarenamebe_o:
-                                be_rename_dialog = \
-                                    self.uarenamebe_o.show_rename_dialog(
-                                    self.update_list)
-                                if be_rename_dialog == True and not self.top_level:
-                                        self.w_dialog.hide()
-
-        def __prompt_to_load_beadm(self):
-                msgbox = gtk.MessageDialog(parent = self.w_main_window,
-                    buttons = gtk.BUTTONS_OK_CANCEL, flags = gtk.DIALOG_MODAL,
-                    type = gtk.MESSAGE_ERROR,
-                    message_format = _(
-                        "Not enough disk space, the selected action cannot "
-                        "be performed.\n\n"
-                        "Click OK to manage your existing BEs and free up disk space or "
-                        "Cancel to cancel the action."))
-                msgbox.set_title(_("Not Enough Disk Space"))
-                result = msgbox.run()
-                msgbox.destroy()
-                if result == gtk.RESPONSE_OK:
-                        beadm.Beadmin(self.parent)
-
-        def __afterplan_information(self):
-                install_iter = None
-                update_iter = None
-                remove_iter = None
-                plan_desc = self.api_o.describe()
-                if plan_desc == None:
-                        return
-                self.reboot_needed = plan_desc.reboot_needed
-                plan = plan_desc.get_changes()
-                self.update_details_text("\n")
-                for pkg_plan in plan:
-                        origin_fmri = pkg_plan[0]
-                        destination_fmri = pkg_plan[1]
-                        if origin_fmri and destination_fmri:
-                                if not update_iter:
-                                        update_iter = True
-                                        txt = _("Packages To Be Updated:\n")
-                                        self.update_details_text(txt, "bold")
-                                pkg_a = self.__get_pkgstr_from_pkginfo(destination_fmri)
-                                self.update_details_text(pkg_a+"\n", "level1")
-                        elif not origin_fmri and destination_fmri:
-                                if not install_iter:
-                                        install_iter = True
-                                        txt = _("Packages To Be Installed:\n")
-                                        self.update_details_text(txt, "bold")
-                                pkg_a = self.__get_pkgstr_from_pkginfo(destination_fmri)
-                                self.update_details_text(pkg_a+"\n", "level1")
-                        elif origin_fmri and not destination_fmri:
-                                if not remove_iter:
-                                        remove_iter = True
-                                        txt = _("Packages To Be Removed:\n")
-                                        self.update_details_text(txt, "bold")
-                                pkg_a = self.__get_pkgstr_from_pkginfo(origin_fmri)
-                                self.update_details_text(pkg_a+"\n", "level1")
-
-                v = plan_desc.get_varcets()
-                if v == None or len(v) == 0:
-                        self.update_details_text("\n")
-                        return
-                txt = _("Optional components\n")
-                self.update_details_text(txt, "bold")
-                txt = _("Number of facets set: %s\n" % (len(v)))
-                self.update_details_text(txt, "level1")
-                for x in v:
-                        self.update_details_text("%s\n" % x, "level1")
-                self.update_details_text("\n")
-
-        def __get_pkgstr_from_pkginfo(self, pkginfo):
-                dt_str = self.get_datetime(pkginfo.packaging_date)
-                if not dt_str:
-                        dt_str = ""
-                s_ver = pkginfo.version
-                s_bran = pkginfo.branch
-                pkg_name = pkginfo.pkg_stem
-                pkg_publisher = pkginfo.publisher
-                if not pkg_publisher in self.update_list:
-                        self.update_list[pkg_publisher] = []
-                pub_list = self.update_list.get(pkg_publisher)
-                if not pkg_name in pub_list:
-                        pub_list.append(pkg_name)
-                l_ver = 0
-                version_pref = ""
-                while l_ver < len(s_ver) -1:
-                        version_pref += "%d%s" % (s_ver[l_ver],".")
-                        l_ver += 1
-                version_pref += "%d%s" % (s_ver[l_ver],"-")
-                l_ver = 0
-                version_suf = ""
-                if s_bran != None:
-                        while l_ver < len(s_bran) -1:
-                                version_suf += "%d%s" % (s_bran[l_ver],".")
-                                l_ver += 1
-                        version_suf += "%d" % s_bran[l_ver]
-                pkg_version = version_pref + version_suf + dt_str
-                return pkg_name + "@" + pkg_version
-
-        def __update_summaries(self, to_update, to_install, to_remove):
-                pkgs_table = to_update.keys() + to_install.keys()
-                info = None
-                try:
-                        info = self.api_o.info(pkgs_table, False,
-                            frozenset([api.PackageInfo.SUMMARY,
-                            api.PackageInfo.IDENTITY]))
-                        info_r = self.api_o.info(to_remove.keys(), True,
-                            frozenset([api.PackageInfo.SUMMARY,
-                            api.PackageInfo.IDENTITY]))
-                        for info_s in (info.get(0) + info_r.get(0)):
-                                stem = info_s.pkg_stem
-                                if stem in to_update:
-                                        to_update[stem][1] = info_s.summary
-                                elif stem in to_install:
-                                        to_install[stem][1] = info_s.summary
-                                elif stem in to_remove:
-                                        to_remove[stem][1] = info_s.summary
-                except api_errors.ApiException, ex:
-                        err = str(ex)
-                        logger.error(err)
-                        gui_misc.notify_log_error(self.parent)
-
-        @staticmethod
-        def get_datetime(date_time):
-                '''Support function for getting date from the API.'''
-                date_tmp = None
-                try:
-                        date_tmp = time.strptime(date_time, "%a %b %d %H:%M:%S %Y")
-                except ValueError:
-                        return None
-                if date_tmp:
-                        date_tmp2 = datetime.datetime(*date_tmp[0:5])
-                        return date_tmp2.strftime(":%m%d")
-                return None
-
-        def __installed_fmris_from_args(self, args_f):
-                not_found = False
-                try:
-                        res = self.api_o.info(args_f, True,
-                            frozenset([api.PackageInfo.STATE]))
-                        if not res or len(res[0]) != len(args_f):
-                                not_found = True 
-                except api_errors.ApiException:
-                        not_found = True
-                return not_found
-
-        def __do_ask_license(self):
-                item = self.packages_with_license[self.current_license_no]
-                pfmri = item[0]
-                dest = item[2]
-                pkg_name = pfmri.get_name()
-                lic = dest.get_text()
-                if dest.must_accept:
-                        gui_misc.change_stockbutton_label(self.w_license_accept_button,
-                            _("A_ccept"))
-                        self.w_license_label.set_text(
-                            _("You must accept the terms of the license before "
-                            "downloading this package."))
-                        self.w_license_accept_checkbutton.show()
-                        self.w_license_reject_button.show()
-                        self.w_license_accept_checkbutton.grab_focus()
-                        self.w_license_accept_checkbutton.set_active(False)
-                        self.w_license_accept_button.set_sensitive(False)
-                else:
-                        if self.accept_text != None:
-                                gui_misc.change_stockbutton_label(
-                                    self.w_license_accept_button,
-                                     self.accept_text)
-                        self.w_license_label.set_text(
-                            _("You must view the terms of the license before "
-                            "downloading this package."))
-                        self.w_license_accept_checkbutton.hide()
-                        self.w_license_reject_button.hide()
-                        self.w_license_accept_button.set_sensitive(True)
-                        self.w_license_accept_button.grab_focus()
-                lic_buffer = self.w_license_text.get_buffer()
-                lic_buffer.set_text(lic)
-                title = _("%s License") % pkg_name
-                self.w_license_dialog.set_title(title)
-                self.w_license_dialog.show()
-                return
-
-        def __do_accept_licenses(self):
-                for item, accepted_value in self.packages_with_license_result:
-                        pfmri = item[0]
-                        dest = item[2]
-                        lic = dest.license
-                        self.api_o.set_plan_license_status(pfmri, lic, 
-                            displayed=True, accepted=accepted_value)
-
-        def __get_packages_for_license_check(self):
-                pkg_list = []
-                plan = self.api_o.describe()
-                for item in plan.get_licenses():
-                        dest = item[2]
-                        if dest.must_display or dest.must_accept:
-                                pkg_list.append(item)
-                return pkg_list
-
-        def __on_license_reject_button_clicked(self, widget):
-                self.packages_with_license_result.append(
-                    (self.packages_with_license[self.current_license_no],
-                    False))
-                self.w_license_dialog.hide()
-                self.license_cv.acquire()
-                self.accept_license_done = True
-                self.license_cv.notify()
-                gui_misc.release_lock(self.license_cv)
-
-        def __on_license_accept_button_clicked(self, widget):
-                result = None
-                item = self.packages_with_license[self.current_license_no]
-                dest = item[2]
-                if dest.must_accept:
-                        result = True
-                self.packages_with_license_result.append(
-                    (item, result))
-                self.w_license_dialog.hide()
-                self.current_license_no += 1
-                if self.current_license_no < self.n_licenses:
-                        gobject.idle_add(self.__do_ask_license)
-                else:
-                        self.license_cv.acquire()
-                        self.accept_license_done = True
-                        self.license_cv.notify()
-                        gui_misc.release_lock(self.license_cv)
-
-        def __on_license_dialog_delete(self, widget, event):
-                if self.w_license_reject_button.get_property('visible'):
-                        self.__on_license_reject_button_clicked(None)
-                else:
-                        self.__on_license_accept_button_clicked(None)
-                return True
-
-        def __on_license_accept_checkbutton_toggled(self, widget):
-                ret = self.w_license_accept_checkbutton.get_active()
-                self.w_license_accept_button.set_sensitive(ret)