home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / DistUpgrade / DistUpgradeViewKDE3.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  28.0 KB  |  676 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from qt import *
  5. from kdeui import *
  6. from kdecore import *
  7. from kio import KRun
  8. import sys
  9. import logging
  10. import time
  11. import subprocess
  12. import traceback
  13. import tempfile
  14. import apt
  15. import apt_pkg
  16. import os
  17. import shutil
  18. import pty
  19. from DistUpgradeApport import *
  20. from DistUpgradeController import DistUpgradeController
  21. from DistUpgradeView import DistUpgradeView, FuzzyTimeToStr, InstallProgress, FetchProgress
  22. from window_main import window_main
  23. from dialog_error import dialog_error
  24. from dialog_changes import dialog_changes
  25. from dialog_conffile import dialog_conffile
  26. from crashdialog import CrashDialog
  27. import pty
  28. import select
  29. import gettext
  30. from gettext import gettext as gett
  31.  
  32. def _(str):
  33.     return unicode(gett(str), 'UTF-8')
  34.  
  35.  
  36. def utf8(str):
  37.     if isinstance(str, unicode):
  38.         return str
  39.     return unicode(str, 'UTF-8')
  40.  
  41.  
  42. class DumbTerminal(QTextEdit):
  43.     ''' a very dumb terminal '''
  44.     
  45.     def __init__(self, installProgress, parent_frame):
  46.         ''' really dumb terminal with simple editing support '''
  47.         QTextEdit.__init__(self, '', '', parent_frame)
  48.         self.installProgress = installProgress
  49.         self.setFamily('Monospace')
  50.         self.setPointSize(8)
  51.         self.setWordWrap(QTextEdit.NoWrap)
  52.         self.setUndoDepth(0)
  53.         self.setUndoRedoEnabled(False)
  54.         self._block = False
  55.         self.connect(self, SIGNAL('cursorPositionChanged(int,int)'), self.onCursorPositionChanged)
  56.  
  57.     
  58.     def insertWithTermCodes(self, text):
  59.         ''' support basic terminal codes '''
  60.         display_text = ''
  61.         for c in text:
  62.             if c == chr(8):
  63.                 self.moveCursor(QTextEdit.MoveBackward, True)
  64.                 self.removeSelectedText()
  65.                 continue
  66.             if c == chr(13):
  67.                 continue
  68.             if c == chr(7):
  69.                 continue
  70.             display_text += c
  71.         
  72.         self.insert(display_text)
  73.  
  74.     
  75.     def keyPressEvent(self, ev):
  76.         ''' send (ascii) key events to the pty '''
  77.         if hasattr(self.installProgress, 'master_fd'):
  78.             os.write(self.installProgress.master_fd, chr(ev.ascii()))
  79.         
  80.  
  81.     
  82.     def onCursorPositionChanged(self, x, y):
  83.         ''' helper that ensures that the cursor is always at the end '''
  84.         if self._block:
  85.             return None
  86.         self._block = True
  87.         para = self.paragraphs() - 1
  88.         pos = self.paragraphLength(para)
  89.         self.setCursorPosition(para, pos)
  90.         self._block = False
  91.  
  92.  
  93.  
  94. class KDECdromProgressAdapter(apt.progress.CdromProgress):
  95.     ''' Report the cdrom add progress '''
  96.     
  97.     def __init__(self, parent):
  98.         self.status = parent.window_main.label_status
  99.         self.progressbar = parent.window_main.progressbar_cache
  100.         self.parent = parent
  101.  
  102.     
  103.     def update(self, text, step):
  104.         ''' update is called regularly so that the gui can be redrawn '''
  105.         if text:
  106.             self.status.setText(text)
  107.         
  108.         self.progressbar.setProgress(step / float(self.totalSteps))
  109.         KApplication.kApplication().processEvents()
  110.  
  111.     
  112.     def askCdromName(self):
  113.         return (False, '')
  114.  
  115.     
  116.     def changeCdrom(self):
  117.         return False
  118.  
  119.  
  120.  
  121. class KDEOpProgress(apt.progress.OpProgress):
  122.     ''' methods on the progress bar '''
  123.     
  124.     def __init__(self, progressbar, progressbar_label):
  125.         self.progressbar = progressbar
  126.         self.progressbar_label = progressbar_label
  127.  
  128.     
  129.     def update(self, percent):
  130.         self.progressbar.setProgress(percent)
  131.         KApplication.kApplication().processEvents()
  132.  
  133.     
  134.     def done(self):
  135.         self.progressbar_label.setText('')
  136.  
  137.  
  138.  
  139. class KDEFetchProgressAdapter(FetchProgress):
  140.     ''' methods for updating the progress bar while fetching packages '''
  141.     
  142.     def __init__(self, parent):
  143.         FetchProgress.__init__(self)
  144.         self.status = parent.window_main.label_status
  145.         self.progress = parent.window_main.progressbar_cache
  146.         self.parent = parent
  147.  
  148.     
  149.     def mediaChange(self, medium, drive):
  150.         msg = _("Please insert '%s' into the drive '%s'") % (medium, drive)
  151.         change = QMessageBox.question(self.parent.window_main, _('Media Change'), msg, QMessageBox.Ok, QMessageBox.Cancel)
  152.         if change == QMessageBox.Ok:
  153.             return True
  154.         return False
  155.  
  156.     
  157.     def start(self):
  158.         self.progress.setProgress(0)
  159.         self.status.show()
  160.  
  161.     
  162.     def stop(self):
  163.         self.parent.window_main.progress_text.setText('  ')
  164.         self.status.setText(_('Fetching is complete'))
  165.  
  166.     
  167.     def pulse(self):
  168.         """ we don't have a mainloop in this application, we just call processEvents here and elsewhere"""
  169.         FetchProgress.pulse(self)
  170.         self.progress.setProgress(self.percent)
  171.         currentItem = self.currentItems + 1
  172.         if currentItem > self.totalItems:
  173.             currentItem = self.totalItems
  174.         
  175.         if self.currentCPS > 0:
  176.             self.status.setText(_('Fetching file %li of %li at %sb/s') % (currentItem, self.totalItems, apt_pkg.SizeToStr(self.currentCPS)))
  177.             self.parent.window_main.progress_text.setText('<i>' + _('About %s remaining') % unicode(FuzzyTimeToStr(self.eta), 'utf-8') + '</i>')
  178.         else:
  179.             self.status.setText(_('Fetching file %li of %li') % (currentItem, self.totalItems))
  180.             self.parent.window_main.progress_text.setText('  ')
  181.         KApplication.kApplication().processEvents()
  182.         return True
  183.  
  184.  
  185.  
  186. class KDEInstallProgressAdapter(InstallProgress):
  187.     '''methods for updating the progress bar while installing packages'''
  188.     TIMEOUT_TERMINAL_ACTIVITY = 240
  189.     
  190.     def __init__(self, parent):
  191.         InstallProgress.__init__(self)
  192.         self._cache = None
  193.         self.label_status = parent.window_main.label_status
  194.         self.progress = parent.window_main.progressbar_cache
  195.         self.progress_text = parent.window_main.progress_text
  196.         self.parent = parent
  197.         
  198.         try:
  199.             self._terminal_log = open('/var/log/dist-upgrade/term.log', 'w')
  200.         except Exception:
  201.             e = None
  202.             logging.error("Can not open terminal log: '%s'" % e)
  203.             self._terminal_log = sys.stdout
  204.  
  205.         apt_pkg.Config.Set('DPkg::StopOnError', 'False')
  206.  
  207.     
  208.     def startUpdate(self):
  209.         InstallProgress.startUpdate(self)
  210.         self.finished = False
  211.         self.label_status.setText(_('Applying changes'))
  212.         self.progress.setProgress(0)
  213.         self.progress_text.setText(' ')
  214.         self.start_time = 0
  215.         self.time_ui = 0
  216.         self.last_activity = 0
  217.         self.parent.window_main.showTerminalButton.setEnabled(True)
  218.  
  219.     
  220.     def error(self, pkg, errormsg):
  221.         InstallProgress.error(self, pkg, errormsg)
  222.         logging.error("got an error from dpkg for pkg: '%s': '%s'" % (pkg, errormsg))
  223.         if gettext.dgettext('dpkg', 'dependency problems - leaving unconfigured') in errormsg:
  224.             return False
  225.         summary = _("Could not install '%s'") % pkg
  226.         msg = _("The upgrade will continue but the '%s' package may be in a not working state. Please consider submitting a bug report about it.") % pkg
  227.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  228.         dialogue = dialog_error(self.parent.window_main)
  229.         dialogue.label_error.setText(utf8(msg))
  230.         if errormsg != None:
  231.             dialogue.textview_error.setText(utf8(errormsg))
  232.             dialogue.textview_error.show()
  233.         else:
  234.             dialogue.textview_error.hide()
  235.         dialogue.connect(dialogue.button_bugreport, SIGNAL('clicked()'), self.parent.reportBug)
  236.         dialogue.exec_loop()
  237.  
  238.     
  239.     def conffile(self, current, new):
  240.         '''ask question in case conffile has been changed by user'''
  241.         logging.debug("got a conffile-prompt from dpkg for file: '%s'" % current)
  242.         start = time.time()
  243.         prim = _("Replace the customized configuration file\n'%s'?") % current
  244.         sec = _('You will lose any changes you have made to this configuration file if you choose to replace it with a newer version.')
  245.         markup = '<span weight="bold" size="larger">%s </span> \n\n%s' % (prim, sec)
  246.         self.confDialogue = dialog_conffile(self.parent.window_main)
  247.         self.confDialogue.label_conffile.setText(markup)
  248.         self.confDialogue.textview_conffile.hide()
  249.         self.confDialogue.connect(self.confDialogue.show_difference_button, SIGNAL('clicked()'), self.showConffile)
  250.         if os.path.exists('/usr/bin/diff'):
  251.             cmd = [
  252.                 '/usr/bin/diff',
  253.                 '-u',
  254.                 current,
  255.                 new]
  256.             diff = utf8(subprocess.Popen(cmd, stdout = subprocess.PIPE).communicate()[0])
  257.             self.confDialogue.textview_conffile.setText(diff)
  258.         else:
  259.             self.confDialogue.textview_conffile.setText(_("The 'diff' command was not found"))
  260.         result = self.confDialogue.exec_loop()
  261.         self.time_ui += time.time() - start
  262.         if result == QDialog.Accepted:
  263.             os.write(self.master_fd, 'y\n')
  264.         else:
  265.             os.write(self.master_fd, 'n\n')
  266.  
  267.     
  268.     def showConffile(self):
  269.         if self.confDialogue.textview_conffile.isVisible():
  270.             self.confDialogue.textview_conffile.hide()
  271.             self.confDialogue.show_difference_button.setText(_('Show Difference >>>'))
  272.         else:
  273.             self.confDialogue.textview_conffile.show()
  274.             self.confDialogue.show_difference_button.setText(_('<<< Hide Difference'))
  275.  
  276.     
  277.     def fork(self):
  278.         '''pty voodoo'''
  279.         (self.child_pid, self.master_fd) = pty.fork()
  280.         if self.child_pid == 0:
  281.             os.environ['TERM'] = 'dumb'
  282.             if not os.environ.has_key('DEBIAN_FRONTEND'):
  283.                 os.environ['DEBIAN_FRONTEND'] = 'kde'
  284.             
  285.             os.environ['APT_LISTCHANGES_FRONTEND'] = 'none'
  286.         
  287.         logging.debug(' fork pid is: %s' % self.child_pid)
  288.         return self.child_pid
  289.  
  290.     
  291.     def statusChange(self, pkg, percent, status):
  292.         '''update progress bar and label'''
  293.         if self.start_time == 0:
  294.             self.start_time = time.time()
  295.         
  296.         self.progress.setProgress(self.percent)
  297.         self.label_status.setText(unicode(status.strip(), 'UTF-8'))
  298.         if percent > 1:
  299.             self.last_activity = time.time()
  300.             self.activity_timeout_reported = False
  301.             delta = self.last_activity - self.start_time
  302.             delta -= self.time_ui
  303.             time_per_percent = float(delta) / percent
  304.             eta = (100 - self.percent) * time_per_percent
  305.             if eta > 61 and eta < 172800:
  306.                 self.progress_text.setText(_('About %s remaining') % FuzzyTimeToStr(eta))
  307.             else:
  308.                 self.progress_text.setText(' ')
  309.         
  310.  
  311.     
  312.     def finishUpdate(self):
  313.         self.label_status.setText('')
  314.  
  315.     
  316.     def updateInterface(self):
  317.         """
  318.         no mainloop in this application, just call processEvents lots here
  319.         it's also important to sleep for a minimum amount of time
  320.         """
  321.         while True:
  322.             
  323.             try:
  324.                 (rlist, wlist, xlist) = select.select([
  325.                     self.master_fd], [], [], 0)
  326.                 if len(rlist) > 0:
  327.                     line = os.read(self.master_fd, 255)
  328.                     self._terminal_log.write(line)
  329.                     self.parent.terminal_text.insertWithTermCodes(utf8(line))
  330.             continue
  331.             except Exception:
  332.                 e = None
  333.                 print e
  334.                 logging.debug("error reading from self.master_fd '%s'" % e)
  335.                 break
  336.                 continue
  337.             
  338.  
  339.             None<EXCEPTION MATCH>Exception
  340.         
  341.         try:
  342.             InstallProgress.updateInterface(self)
  343.         except ValueError:
  344.             e = None
  345.             logging.error("got ValueError from InstallProgress.updateInterface. Line was '%s' (%s)" % (self.read, e))
  346.             self.read = ''
  347.  
  348.         if self.last_activity > 0 and self.last_activity + self.TIMEOUT_TERMINAL_ACTIVITY < time.time():
  349.             if not self.activity_timeout_reported:
  350.                 
  351.                 try:
  352.                     logging.warning('no activity on terminal for %s seconds (%s)' % (self.TIMEOUT_TERMINAL_ACTIVITY, self.label_status.text()))
  353.                 except UnicodeEncodeError:
  354.                     logging.warning('no activity on terminal for %s seconds' % self.TIMEOUT_TERMINAL_ACTIVITY)
  355.  
  356.                 self.activity_timeout_reported = True
  357.             
  358.             self.parent.window_main.konsole_frame.show()
  359.         
  360.         KApplication.kApplication().processEvents()
  361.         time.sleep(0.02)
  362.  
  363.     
  364.     def waitChild(self):
  365.         while True:
  366.             self.updateInterface()
  367.             (pid, res) = os.waitpid(self.child_pid, os.WNOHANG)
  368.             if pid == self.child_pid:
  369.                 break
  370.                 continue
  371.         return os.WEXITSTATUS(res)
  372.  
  373.  
  374.  
  375. class UpgraderMainWindow(window_main):
  376.     
  377.     def setParent(self, parentRef):
  378.         self.parent = parentRef
  379.  
  380.     
  381.     def closeEvent(self, event):
  382.         close = self.parent.on_window_main_delete_event()
  383.         if close:
  384.             event.accept()
  385.         
  386.  
  387.  
  388.  
  389. class DistUpgradeViewKDE(DistUpgradeView):
  390.     '''KDE frontend of the distUpgrade tool'''
  391.     
  392.     def __init__(self, datadir = None, logdir = None):
  393.         if not datadir:
  394.             localedir = os.path.join(os.getcwd(), 'mo')
  395.         else:
  396.             localedir = '/usr/share/locale/update-manager'
  397.         
  398.         try:
  399.             gettext.bindtextdomain('update-manager', localedir)
  400.             gettext.textdomain('update-manager')
  401.         except Exception:
  402.             e = None
  403.             logging.warning('Error setting locales (%s)' % e)
  404.  
  405.         about = KAboutData('adept_manager', 'Upgrader', '0.1', 'Dist Upgrade Tool for Kubuntu', KAboutData.License_GPL, '(c) 2007 Canonical Ltd', 'http://wiki.kubuntu.org/KubuntuUpdateManager', 'jriddell@ubuntu.com')
  406.         about.addAuthor('Jonathan Riddell', None, 'jriddell@ubuntu.com')
  407.         about.addAuthor('Michael Vogt', None, 'michael.vogt@ubuntu.com')
  408.         KCmdLineArgs.init([
  409.             './dist-upgrade.py'], about)
  410.         self.app = KApplication()
  411.         self.window_main = UpgraderMainWindow()
  412.         self.window_main.setParent(self)
  413.         self.window_main.show()
  414.         self.prev_step = 0
  415.         self._opCacheProgress = KDEOpProgress(self.window_main.progressbar_cache, self.window_main.progress_text)
  416.         self._fetchProgress = KDEFetchProgressAdapter(self)
  417.         self._cdromProgress = KDECdromProgressAdapter(self)
  418.         self._installProgress = KDEInstallProgressAdapter(self)
  419.         sys.excepthook = self._handleException
  420.         self.app.connect(self.window_main.showTerminalButton, SIGNAL('clicked()'), self.showTerminal)
  421.         copyXauth = tempfile.mktemp('', 'adept')
  422.         if 'XAUTHORITY' in os.environ and os.environ['XAUTHORITY'] != copyXauth:
  423.             shutil.copy(os.environ['XAUTHORITY'], copyXauth)
  424.             os.environ['XAUTHORITY'] = copyXauth
  425.         
  426.         subprocess.call([
  427.             'killall',
  428.             'adept_manager'])
  429.         subprocess.call([
  430.             'killall',
  431.             'adept_updater'])
  432.         gettext.bindtextdomain('update-manager', localedir)
  433.         gettext.textdomain('update-manager')
  434.         self.translate_widget_children()
  435.         self.window_main.label_title.setText(self.window_main.label_title.text().replace('Ubuntu', 'Kubuntu'))
  436.         self.window_main.konsole_frame.hide()
  437.         self.konsole_frame_layout = QHBoxLayout(self.window_main.konsole_frame)
  438.         self.window_main.konsole_frame.setMinimumSize(600, 400)
  439.         self.terminal_text = DumbTerminal(self._installProgress, self.window_main.konsole_frame)
  440.         self.konsole_frame_layout.addWidget(self.terminal_text)
  441.         self.terminal_text.show()
  442.         QTimer.singleShot(10, self.exitMainLoop)
  443.         self.app.exec_loop()
  444.  
  445.     
  446.     def exitMainLoop(self):
  447.         self.app.exit()
  448.  
  449.     
  450.     def translate_widget_children(self, parentWidget = None):
  451.         if parentWidget == None:
  452.             parentWidget = self.window_main
  453.         
  454.         if parentWidget.children() != None:
  455.             for widget in parentWidget.children():
  456.                 self.translate_widget(widget)
  457.                 self.translate_widget_children(widget)
  458.             
  459.         
  460.  
  461.     
  462.     def translate_widget(self, widget):
  463.         if isinstance(widget, QLabel) or isinstance(widget, QPushButton):
  464.             if str(widget.text()) != '':
  465.                 widget.setText(_(str(widget.text())))
  466.             
  467.         
  468.  
  469.     
  470.     def _handleException(self, exctype, excvalue, exctb):
  471.         '''Crash handler.'''
  472.         if issubclass(exctype, KeyboardInterrupt) or issubclass(exctype, SystemExit):
  473.             return None
  474.         lines = traceback.format_exception(exctype, excvalue, exctb)
  475.         logging.error('not handled exception in KDE frontend:\n%s' % '\n'.join(lines))
  476.         apport_crash(exctype, excvalue, exctb)
  477.         if not run_apport():
  478.             tbtext = ''.join(traceback.format_exception(exctype, excvalue, exctb))
  479.             dialog = CrashDialog(self.window_main)
  480.             dialog.connect(dialog.beastie_url, SIGNAL('leftClickedURL(const QString&)'), self.openURL)
  481.             dialog.crash_detail.setText(tbtext)
  482.             dialog.exec_loop()
  483.         
  484.         sys.exit(1)
  485.  
  486.     
  487.     def openURL(self, url):
  488.         '''start konqueror'''
  489.         KRun.runURL(KURL(url), 'text/html')
  490.  
  491.     
  492.     def reportBug(self):
  493.         '''start konqueror'''
  494.         KRun.runURL(KURL('https://launchpad.net/distros/ubuntu/+source/update-manager/+filebug'), 'text/html')
  495.  
  496.     
  497.     def showTerminal(self):
  498.         if self.window_main.konsole_frame.isVisible():
  499.             self.window_main.konsole_frame.hide()
  500.             self.window_main.showTerminalButton.setText(_('Show Terminal >>>'))
  501.         else:
  502.             self.window_main.konsole_frame.show()
  503.             self.window_main.showTerminalButton.setText(_('<<< Hide Terminal'))
  504.         self.window_main.resize(self.window_main.sizeHint())
  505.  
  506.     
  507.     def getFetchProgress(self):
  508.         return self._fetchProgress
  509.  
  510.     
  511.     def getInstallProgress(self, cache):
  512.         self._installProgress._cache = cache
  513.         return self._installProgress
  514.  
  515.     
  516.     def getOpCacheProgress(self):
  517.         return self._opCacheProgress
  518.  
  519.     
  520.     def getCdromProgress(self):
  521.         return self._cdromProgress
  522.  
  523.     
  524.     def updateStatus(self, msg):
  525.         print 'updateStatus: ' + msg
  526.         self.window_main.label_status.setText(unicode(msg, 'UTF-8'))
  527.  
  528.     
  529.     def hideStep(self, step):
  530.         image = getattr(self.window_main, 'image_step%i' % step)
  531.         label = getattr(self.window_main, 'label_step%i' % step)
  532.         image.hide()
  533.         label.hide()
  534.  
  535.     
  536.     def abort(self):
  537.         step = self.prev_step
  538.         if step > 0:
  539.             image = getattr(self.window_main, 'image_step%i' % step)
  540.             iconLoader = KIconLoader()
  541.             cancelIcon = iconLoader.loadIcon('cancel', KIcon.Small)
  542.             image.setPixmap(cancelIcon)
  543.             image.show()
  544.         
  545.  
  546.     
  547.     def setStep(self, step):
  548.         iconLoader = KIconLoader()
  549.         if self.prev_step:
  550.             image = getattr(self.window_main, 'image_step%i' % self.prev_step)
  551.             label = getattr(self.window_main, 'label_step%i' % self.prev_step)
  552.             okIcon = iconLoader.loadIcon('ok', KIcon.Small)
  553.             image.setPixmap(okIcon)
  554.             image.show()
  555.         
  556.         self.prev_step = step
  557.         image = getattr(self.window_main, 'image_step%i' % step)
  558.         label = getattr(self.window_main, 'label_step%i' % step)
  559.         arrowIcon = iconLoader.loadIcon('1rightarrow', KIcon.Small)
  560.         image.setPixmap(arrowIcon)
  561.         image.show()
  562.         label.setText('<b>' + label.text() + '</b>')
  563.  
  564.     
  565.     def information(self, summary, msg, extended_msg = None):
  566.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  567.         dialogue = dialog_error(self.window_main)
  568.         dialogue.label_error.setText(utf8(msg))
  569.         if extended_msg != None:
  570.             dialogue.textview_error.setText(utf8(extended_msg))
  571.             dialogue.textview_error.show()
  572.         else:
  573.             dialogue.textview_error.hide()
  574.         dialogue.button_bugreport.hide()
  575.         dialogue.setCaption('Information')
  576.         iconLoader = KIconLoader()
  577.         messageIcon = iconLoader.loadIcon('messagebox_info', KIcon.Panel)
  578.         dialogue.image.setPixmap(messageIcon)
  579.         dialogue.exec_loop()
  580.  
  581.     
  582.     def error(self, summary, msg, extended_msg = None):
  583.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  584.         dialogue = dialog_error(self.window_main)
  585.         dialogue.label_error.setText(utf8(msg))
  586.         if extended_msg != None:
  587.             dialogue.textview_error.setText(utf8(extended_msg))
  588.             dialogue.textview_error.show()
  589.         else:
  590.             dialogue.textview_error.hide()
  591.         dialogue.button_close.show()
  592.         self.app.connect(dialogue.button_bugreport, SIGNAL('clicked()'), self.reportBug)
  593.         dialogue.exec_loop()
  594.         return False
  595.  
  596.     
  597.     def confirmChanges(self, summary, changes, downloadSize, actions = None, removal_bold = True):
  598.         '''show the changes dialogue'''
  599.         DistUpgradeView.confirmChanges(self, summary, changes, downloadSize)
  600.         msg = unicode(self.confirmChangesMessage, 'UTF-8')
  601.         self.changesDialogue = dialog_changes(self.window_main)
  602.         self.changesDialogue.treeview_details.hide()
  603.         self.changesDialogue.connect(self.changesDialogue.show_details_button, SIGNAL('clicked()'), self.showChangesDialogueDetails)
  604.         self.translate_widget_children(self.changesDialogue)
  605.         self.changesDialogue.show_details_button.setText(_('Details') + ' >>>')
  606.         self.changesDialogue.resize(self.changesDialogue.sizeHint())
  607.         if actions != None:
  608.             cancel = actions[0].replace('_', '')
  609.             self.changesDialogue.button_cancel_changes.setText(cancel)
  610.             confirm = actions[1].replace('_', '')
  611.             self.changesDialogue.button_confirm_changes.setText(confirm)
  612.         
  613.         summaryText = unicode('<big><b>%s</b></big>' % summary, 'UTF-8')
  614.         self.changesDialogue.label_summary.setText(summaryText)
  615.         self.changesDialogue.label_changes.setText(msg)
  616.         self.changesDialogue.treeview_details.clear()
  617.         self.changesDialogue.treeview_details.setColumnText(0, 'Packages')
  618.         for rm in self.toRemove:
  619.             self.changesDialogue.treeview_details.insertItem(QListViewItem(self.changesDialogue.treeview_details, _('Remove %s') % rm))
  620.         
  621.         for inst in self.toInstall:
  622.             self.changesDialogue.treeview_details.insertItem(QListViewItem(self.changesDialogue.treeview_details, _('Install %s') % inst))
  623.         
  624.         for up in self.toUpgrade:
  625.             self.changesDialogue.treeview_details.insertItem(QListViewItem(self.changesDialogue.treeview_details, _('Upgrade %s') % up))
  626.         
  627.         res = self.changesDialogue.exec_loop()
  628.         if res == QDialog.Accepted:
  629.             return True
  630.         return False
  631.  
  632.     
  633.     def showChangesDialogueDetails(self):
  634.         if self.changesDialogue.treeview_details.isVisible():
  635.             self.changesDialogue.treeview_details.hide()
  636.             self.changesDialogue.show_details_button.setText(_('Details') + ' >>>')
  637.         else:
  638.             self.changesDialogue.treeview_details.show()
  639.             self.changesDialogue.show_details_button.setText('<<< ' + _('Details'))
  640.         self.changesDialogue.resize(self.changesDialogue.sizeHint())
  641.  
  642.     
  643.     def askYesNoQuestion(self, summary, msg, default = 'No'):
  644.         restart = QMessageBox.question(self.window_main, unicode(summary, 'UTF-8'), unicode('<font>') + unicode(msg, 'UTF-8'), QMessageBox.Yes, QMessageBox.No)
  645.         if restart == QMessageBox.Yes:
  646.             return True
  647.         return False
  648.  
  649.     
  650.     def processEvents(self):
  651.         KApplication.kApplication().processEvents()
  652.  
  653.     
  654.     def on_window_main_delete_event(self):
  655.         text = _('<b><big>Cancel the running upgrade?</big></b>\n\nThe system could be in an unusable state if you cancel the upgrade. You are strongly advised to resume the upgrade.')
  656.         text = text.replace('\n', '<br />')
  657.         cancel = QMessageBox.warning(self.window_main, _('Cancel Upgrade?'), text, QMessageBox.Yes, QMessageBox.No)
  658.         if cancel == QMessageBox.Yes:
  659.             return True
  660.         return False
  661.  
  662.  
  663. if __name__ == '__main__':
  664.     view = DistUpgradeViewKDE()
  665.     cache = apt.Cache()
  666.     for pkg in sys.argv[1:]:
  667.         if cache[pkg].isInstalled and not (cache[pkg].isUpgradable):
  668.             cache[pkg].markDelete(purge = True)
  669.         else:
  670.             cache[pkg].markInstall()
  671.     
  672.     cache.commit(view._fetchProgress, view._installProgress)
  673.     while True:
  674.         KApplication.kApplication().processEvents()
  675.  
  676.