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 / DistUpgradeViewKDE.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  32.3 KB  |  797 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from PyQt4.QtCore import *
  5. from PyQt4.QtGui import *
  6. from PyQt4 import uic
  7. import sys
  8. import logging
  9. import time
  10. import subprocess
  11. import traceback
  12. import tempfile
  13. import apt
  14. import apt_pkg
  15. import os
  16. import shutil
  17. import pty
  18. from DistUpgradeApport import *
  19. from DistUpgradeController import DistUpgradeController
  20. from DistUpgradeView import DistUpgradeView, FuzzyTimeToStr, InstallProgress, FetchProgress
  21. import select
  22. import gettext
  23. from DistUpgradeGettext import gettext as gett
  24.  
  25. def _(str):
  26.     return unicode(gett(str), 'UTF-8')
  27.  
  28.  
  29. def utf8(str):
  30.     if isinstance(str, unicode):
  31.         return str
  32.     return unicode(str, 'UTF-8')
  33.  
  34.  
  35. def loadUi(file, parent):
  36.     if os.path.exists(file):
  37.         uic.loadUi(file, parent)
  38.     else:
  39.         print "error, can't find file: " + file
  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.setFontFamily('Monospace')
  50.         self.setFontPointSize(8)
  51.         self.setWordWrapMode(QTextOption.NoWrap)
  52.         self.setUndoRedoEnabled(False)
  53.         self.setOverwriteMode(True)
  54.         self._block = False
  55.  
  56.     
  57.     def fork(self):
  58.         '''pty voodoo'''
  59.         (self.child_pid, self.installProgress.master_fd) = pty.fork()
  60.         if self.child_pid == 0:
  61.             os.environ['TERM'] = 'dumb'
  62.         
  63.         return self.child_pid
  64.  
  65.     
  66.     def updateInterface(self):
  67.         (rlist, wlist, xlist) = select.select([
  68.             self.installProgress.master_fd], [], [], 0)
  69.         if len(rlist) > 0:
  70.             line = os.read(self.installProgress.master_fd, 255)
  71.             self.insertWithTermCodes(utf8(line))
  72.         
  73.         QApplication.processEvents()
  74.  
  75.     
  76.     def insertWithTermCodes(self, text):
  77.         ''' support basic terminal codes '''
  78.         display_text = ''
  79.         for c in text:
  80.             if ord(c) == 8:
  81.                 self.insertPlainText(display_text)
  82.                 self.textCursor().deletePreviousChar()
  83.                 display_text = ''
  84.                 continue
  85.             if c == chr(13):
  86.                 continue
  87.             if c == chr(7):
  88.                 continue
  89.             display_text += c
  90.         
  91.         self.insertPlainText(display_text)
  92.  
  93.     
  94.     def keyPressEvent(self, ev):
  95.         ''' send (ascii) key events to the pty '''
  96.         if not hasattr(self.installProgress, 'master_fd'):
  97.             return None
  98.         if ev.key() == Qt.Key_Backspace:
  99.             os.write(self.installProgress.master_fd, chr(8))
  100.             return None
  101.         if not ev.text():
  102.             return None
  103.         os.write(self.installProgress.master_fd, ev.text().toUtf8())
  104.  
  105.     
  106.     def onCursorPositionChanged(self):
  107.         ''' helper that ensures that the cursor is always at the end '''
  108.         if self._block:
  109.             return None
  110.         self._block = True
  111.         self.moveCursor(QTextCursor.End)
  112.         self._block = False
  113.  
  114.  
  115.  
  116. class KDECdromProgressAdapter(apt.progress.CdromProgress):
  117.     ''' Report the cdrom add progress '''
  118.     
  119.     def __init__(self, parent):
  120.         self.status = parent.window_main.label_status
  121.         self.progressbar = parent.window_main.progressbar_cache
  122.         self.parent = parent
  123.  
  124.     
  125.     def update(self, text, step):
  126.         ''' update is called regularly so that the gui can be redrawn '''
  127.         if text:
  128.             self.status.setText(text)
  129.         
  130.         self.progressbar.setValue(step / float(self.totalSteps))
  131.         QApplication.processEvents()
  132.  
  133.     
  134.     def askCdromName(self):
  135.         return (False, '')
  136.  
  137.     
  138.     def changeCdrom(self):
  139.         return False
  140.  
  141.  
  142.  
  143. class KDEOpProgress(apt.progress.OpProgress):
  144.     ''' methods on the progress bar '''
  145.     
  146.     def __init__(self, progressbar, progressbar_label):
  147.         self.progressbar = progressbar
  148.         self.progressbar_label = progressbar_label
  149.  
  150.     
  151.     def update(self, percent):
  152.         self.progressbar.setValue(percent)
  153.         QApplication.processEvents()
  154.  
  155.     
  156.     def done(self):
  157.         self.progressbar_label.setText('')
  158.  
  159.  
  160.  
  161. class KDEFetchProgressAdapter(FetchProgress):
  162.     ''' methods for updating the progress bar while fetching packages '''
  163.     
  164.     def __init__(self, parent):
  165.         FetchProgress.__init__(self)
  166.         self.status = parent.window_main.label_status
  167.         self.progress = parent.window_main.progressbar_cache
  168.         self.parent = parent
  169.  
  170.     
  171.     def mediaChange(self, medium, drive):
  172.         msg = _("Please insert '%s' into the drive '%s'") % (medium, drive)
  173.         change = QMessageBox.question(self.parent.window_main, _('Media Change'), msg, QMessageBox.Ok, QMessageBox.Cancel)
  174.         if change == QMessageBox.Ok:
  175.             return True
  176.         return False
  177.  
  178.     
  179.     def start(self):
  180.         self.progress.setValue(0)
  181.         self.status.show()
  182.  
  183.     
  184.     def stop(self):
  185.         self.parent.window_main.progress_text.setText('  ')
  186.         self.status.setText(_('Fetching is complete'))
  187.  
  188.     
  189.     def pulse(self):
  190.         """ we don't have a mainloop in this application, we just call processEvents here and elsewhere"""
  191.         FetchProgress.pulse(self)
  192.         self.progress.setValue(self.percent)
  193.         currentItem = self.currentItems + 1
  194.         if currentItem > self.totalItems:
  195.             currentItem = self.totalItems
  196.         
  197.         if self.currentCPS > 0:
  198.             self.status.setText(_('Fetching file %li of %li at %sB/s') % (currentItem, self.totalItems, apt_pkg.SizeToStr(self.currentCPS)))
  199.             self.parent.window_main.progress_text.setText('<i>' + _('About %s remaining') % unicode(FuzzyTimeToStr(self.eta), 'utf-8') + '</i>')
  200.         else:
  201.             self.status.setText(_('Fetching file %li of %li') % (currentItem, self.totalItems))
  202.             self.parent.window_main.progress_text.setText('  ')
  203.         QApplication.processEvents()
  204.         return True
  205.  
  206.  
  207.  
  208. class KDEInstallProgressAdapter(InstallProgress):
  209.     '''methods for updating the progress bar while installing packages'''
  210.     TIMEOUT_TERMINAL_ACTIVITY = 240
  211.     
  212.     def __init__(self, parent):
  213.         InstallProgress.__init__(self)
  214.         self._cache = None
  215.         self.label_status = parent.window_main.label_status
  216.         self.progress = parent.window_main.progressbar_cache
  217.         self.progress_text = parent.window_main.progress_text
  218.         self.parent = parent
  219.         
  220.         try:
  221.             self._terminal_log = open('/var/log/dist-upgrade/term.log', 'w')
  222.         except Exception:
  223.             e = None
  224.             logging.error("Can not open terminal log: '%s'" % e)
  225.             self._terminal_log = sys.stdout
  226.  
  227.         apt_pkg.Config.Set('DPkg::StopOnError', 'False')
  228.  
  229.     
  230.     def startUpdate(self):
  231.         InstallProgress.startUpdate(self)
  232.         self.finished = False
  233.         self.label_status.setText(_('Applying changes'))
  234.         self.progress.setValue(0)
  235.         self.progress_text.setText(' ')
  236.         self.start_time = 0
  237.         self.time_ui = 0
  238.         self.last_activity = 0
  239.         self.parent.window_main.showTerminalButton.setEnabled(True)
  240.  
  241.     
  242.     def error(self, pkg, errormsg):
  243.         InstallProgress.error(self, pkg, errormsg)
  244.         logging.error("got an error from dpkg for pkg: '%s': '%s'" % (pkg, errormsg))
  245.         if gettext.dgettext('dpkg', 'dependency problems - leaving unconfigured') in errormsg:
  246.             return False
  247.         summary = _("Could not install '%s'") % pkg
  248.         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
  249.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  250.         dialogue = QDialog(self.parent.window_main)
  251.         loadUi('dialog_error.ui', dialogue)
  252.         self.parent.translate_widget_children(dialogue)
  253.         dialogue.label_error.setText(utf8(msg))
  254.         if errormsg != None:
  255.             dialogue.textview_error.setText(utf8(errormsg))
  256.             dialogue.textview_error.show()
  257.         else:
  258.             dialogue.textview_error.hide()
  259.         dialogue.connect(dialogue.button_bugreport, SIGNAL('clicked()'), self.parent.reportBug)
  260.         dialogue.exec_()
  261.  
  262.     
  263.     def conffile(self, current, new):
  264.         '''ask question in case conffile has been changed by user'''
  265.         logging.debug("got a conffile-prompt from dpkg for file: '%s'" % current)
  266.         start = time.time()
  267.         prim = _("Replace the customized configuration file\n'%s'?") % current
  268.         sec = _('You will lose any changes you have made to this configuration file if you choose to replace it with a newer version.')
  269.         markup = '<span weight="bold" size="larger">%s </span> \n\n%s' % (prim, sec)
  270.         self.confDialogue = QDialog(self.parent.window_main)
  271.         loadUi('dialog_conffile.ui', self.confDialogue)
  272.         self.confDialogue.label_conffile.setText(markup)
  273.         self.confDialogue.textview_conffile.hide()
  274.         self.confDialogue.connect(self.confDialogue.show_difference_button, SIGNAL('clicked()'), self.showConffile)
  275.         if os.path.exists('/usr/bin/diff'):
  276.             cmd = [
  277.                 '/usr/bin/diff',
  278.                 '-u',
  279.                 current,
  280.                 new]
  281.             diff = utf8(subprocess.Popen(cmd, stdout = subprocess.PIPE).communicate()[0])
  282.             self.confDialogue.textview_conffile.setText(diff)
  283.         else:
  284.             self.confDialogue.textview_conffile.setText(_("The 'diff' command was not found"))
  285.         result = self.confDialogue.exec_()
  286.         self.time_ui += time.time() - start
  287.         if result == QDialog.Accepted:
  288.             os.write(self.master_fd, 'y\n')
  289.         else:
  290.             os.write(self.master_fd, 'n\n')
  291.  
  292.     
  293.     def showConffile(self):
  294.         if self.confDialogue.textview_conffile.isVisible():
  295.             self.confDialogue.textview_conffile.hide()
  296.             self.confDialogue.show_difference_button.setText(_('Show Difference >>>'))
  297.         else:
  298.             self.confDialogue.textview_conffile.show()
  299.             self.confDialogue.show_difference_button.setText(_('<<< Hide Difference'))
  300.  
  301.     
  302.     def fork(self):
  303.         '''pty voodoo'''
  304.         (self.child_pid, self.master_fd) = pty.fork()
  305.         if self.child_pid == 0:
  306.             os.environ['TERM'] = 'dumb'
  307.             if not os.environ.has_key('DEBIAN_FRONTEND') or os.environ['DEBIAN_FRONTEND'] == 'kde':
  308.                 os.environ['DEBIAN_FRONTEND'] = 'noninteractive'
  309.             
  310.             os.environ['APT_LISTCHANGES_FRONTEND'] = 'none'
  311.         
  312.         logging.debug(' fork pid is: %s' % self.child_pid)
  313.         return self.child_pid
  314.  
  315.     
  316.     def statusChange(self, pkg, percent, status):
  317.         '''update progress bar and label'''
  318.         if self.start_time == 0:
  319.             self.start_time = time.time()
  320.         
  321.         self.progress.setValue(self.percent)
  322.         self.label_status.setText(unicode(status.strip(), 'UTF-8'))
  323.         if percent > 1:
  324.             self.last_activity = time.time()
  325.             self.activity_timeout_reported = False
  326.             delta = self.last_activity - self.start_time
  327.             delta -= self.time_ui
  328.             time_per_percent = float(delta) / percent
  329.             eta = (100 - self.percent) * time_per_percent
  330.             if eta > 61 and eta < 172800:
  331.                 self.progress_text.setText(_('About %s remaining') % FuzzyTimeToStr(eta))
  332.             else:
  333.                 self.progress_text.setText(' ')
  334.         
  335.  
  336.     
  337.     def finishUpdate(self):
  338.         self.label_status.setText('')
  339.  
  340.     
  341.     def updateInterface(self):
  342.         """
  343.         no mainloop in this application, just call processEvents lots here
  344.         it's also important to sleep for a minimum amount of time
  345.         """
  346.         while True:
  347.             
  348.             try:
  349.                 (rlist, wlist, xlist) = select.select([
  350.                     self.master_fd], [], [], 0)
  351.                 if len(rlist) > 0:
  352.                     line = os.read(self.master_fd, 255)
  353.                     self._terminal_log.write(line)
  354.                     self.parent.terminal_text.insertWithTermCodes(utf8(line))
  355.             continue
  356.             except Exception:
  357.                 e = None
  358.                 print e
  359.                 logging.debug("error reading from self.master_fd '%s'" % e)
  360.                 break
  361.                 continue
  362.             
  363.  
  364.             None<EXCEPTION MATCH>Exception
  365.         
  366.         try:
  367.             InstallProgress.updateInterface(self)
  368.         except ValueError:
  369.             e = None
  370.             logging.error("got ValueError from InstallProgress.updateInterface. Line was '%s' (%s)" % (self.read, e))
  371.             self.read = ''
  372.  
  373.         if self.last_activity > 0 and self.last_activity + self.TIMEOUT_TERMINAL_ACTIVITY < time.time():
  374.             if not self.activity_timeout_reported:
  375.                 
  376.                 try:
  377.                     logging.warning('no activity on terminal for %s seconds (%s)' % (self.TIMEOUT_TERMINAL_ACTIVITY, self.label_status.text()))
  378.                 except UnicodeEncodeError:
  379.                     logging.warning('no activity on terminal for %s seconds' % self.TIMEOUT_TERMINAL_ACTIVITY)
  380.  
  381.                 self.activity_timeout_reported = True
  382.             
  383.             self.parent.window_main.konsole_frame.show()
  384.         
  385.         QApplication.processEvents()
  386.         time.sleep(0.02)
  387.  
  388.     
  389.     def waitChild(self):
  390.         while True:
  391.             self.updateInterface()
  392.             (pid, res) = os.waitpid(self.child_pid, os.WNOHANG)
  393.             if pid == self.child_pid:
  394.                 break
  395.                 continue
  396.         return os.WEXITSTATUS(res)
  397.  
  398.  
  399.  
  400. class UpgraderMainWindow(QWidget):
  401.     
  402.     def __init__(self):
  403.         QWidget.__init__(self)
  404.         loadUi('window_main.ui', self)
  405.  
  406.     
  407.     def setParent(self, parentRef):
  408.         self.parent = parentRef
  409.  
  410.     
  411.     def closeEvent(self, event):
  412.         close = self.parent.on_window_main_delete_event()
  413.         if close:
  414.             event.accept()
  415.         else:
  416.             event.ignore()
  417.  
  418.  
  419.  
  420. class DistUpgradeViewKDE(DistUpgradeView):
  421.     '''KDE frontend of the distUpgrade tool'''
  422.     
  423.     def __init__(self, datadir = None, logdir = None):
  424.         logger = logging.getLogger('PyQt4')
  425.         logger.setLevel(logging.INFO)
  426.         if not datadir:
  427.             localedir = os.path.join(os.getcwd(), 'mo')
  428.         else:
  429.             localedir = '/usr/share/locale/update-manager'
  430.         
  431.         try:
  432.             gettext.bindtextdomain('update-manager', localedir)
  433.             gettext.textdomain('update-manager')
  434.         except Exception:
  435.             e = None
  436.             logging.warning('Error setting locales (%s)' % e)
  437.  
  438.         self.app = QApplication([
  439.             'update-manager'])
  440.         if os.path.exists('/usr/share/icons/oxygen/48x48/apps/system-software-update.png'):
  441.             messageIcon = QPixmap('/usr/share/icons/oxygen/48x48/apps/system-software-update.png')
  442.         else:
  443.             messageIcon = QPixmap('/usr/share/icons/hicolor/48x48/apps/adept_manager.png')
  444.         self.app.setWindowIcon(QIcon(messageIcon))
  445.         self.window_main = UpgraderMainWindow()
  446.         self.window_main.setParent(self)
  447.         self.window_main.show()
  448.         self.prev_step = 0
  449.         self._opCacheProgress = KDEOpProgress(self.window_main.progressbar_cache, self.window_main.progress_text)
  450.         self._fetchProgress = KDEFetchProgressAdapter(self)
  451.         self._cdromProgress = KDECdromProgressAdapter(self)
  452.         self._installProgress = KDEInstallProgressAdapter(self)
  453.         sys.excepthook = self._handleException
  454.         self.window_main.showTerminalButton.setEnabled(False)
  455.         self.app.connect(self.window_main.showTerminalButton, SIGNAL('clicked()'), self.showTerminal)
  456.         copyXauth = tempfile.mktemp('', 'adept')
  457.         if 'XAUTHORITY' in os.environ and os.environ['XAUTHORITY'] != copyXauth:
  458.             shutil.copy(os.environ['XAUTHORITY'], copyXauth)
  459.             os.environ['XAUTHORITY'] = copyXauth
  460.         
  461.         subprocess.call([
  462.             'killall',
  463.             'adept_manager'])
  464.         subprocess.call([
  465.             'killall',
  466.             'adept_updater'])
  467.         gettext.bindtextdomain('update-manager', localedir)
  468.         gettext.textdomain('update-manager')
  469.         self.translate_widget_children()
  470.         self.window_main.label_title.setText(self.window_main.label_title.text().replace('Ubuntu', 'Kubuntu'))
  471.         self.window_main.konsole_frame.hide()
  472.         self.konsole_frame_layout = QHBoxLayout(self.window_main.konsole_frame)
  473.         self.window_main.konsole_frame.setMinimumSize(600, 400)
  474.         self.terminal_text = DumbTerminal(self._installProgress, self.window_main.konsole_frame)
  475.         self.konsole_frame_layout.addWidget(self.terminal_text)
  476.         self.terminal_text.show()
  477.         QTimer.singleShot(10, self.exitMainLoop)
  478.         self.app.exec_()
  479.  
  480.     
  481.     def exitMainLoop(self):
  482.         print 'exitMainLoop'
  483.         self.app.exit()
  484.  
  485.     
  486.     def translate_widget_children(self, parentWidget = None):
  487.         if parentWidget == None:
  488.             parentWidget = self.window_main
  489.         
  490.         if isinstance(parentWidget, QDialog) or isinstance(parentWidget, QWidget):
  491.             if str(parentWidget.windowTitle()) == 'Error':
  492.                 parentWidget.setWindowTitle(gettext.dgettext('kdelibs', 'Error'))
  493.             else:
  494.                 parentWidget.setWindowTitle(_(str(parentWidget.windowTitle())))
  495.         
  496.         if parentWidget.children() != None:
  497.             for widget in parentWidget.children():
  498.                 self.translate_widget(widget)
  499.                 self.translate_widget_children(widget)
  500.             
  501.         
  502.  
  503.     
  504.     def translate_widget(self, widget):
  505.         if isinstance(widget, QLabel) or isinstance(widget, QPushButton):
  506.             if str(widget.text()) == '&Cancel':
  507.                 widget.setText(unicode(gettext.dgettext('kdelibs', '&Cancel'), 'UTF-8'))
  508.             elif str(widget.text()) == '&Close':
  509.                 widget.setText(unicode(gettext.dgettext('kdelibs', '&Close'), 'UTF-8'))
  510.             elif str(widget.text()) != '':
  511.                 widget.setText(_(str(widget.text())).replace('_', '&'))
  512.             
  513.         
  514.  
  515.     
  516.     def _handleException(self, exctype, excvalue, exctb):
  517.         '''Crash handler.'''
  518.         if issubclass(exctype, KeyboardInterrupt) or issubclass(exctype, SystemExit):
  519.             return None
  520.         lines = traceback.format_exception(exctype, excvalue, exctb)
  521.         logging.error('not handled exception in KDE frontend:\n%s' % '\n'.join(lines))
  522.         apport_crash(exctype, excvalue, exctb)
  523.         if not run_apport():
  524.             tbtext = ''.join(traceback.format_exception(exctype, excvalue, exctb))
  525.             dialog = QDialog(self.window_main)
  526.             loadUi('dialog_error.ui', dialog)
  527.             self.translate_widget_children(self.dialog)
  528.             dialog.crash_detail.setText(tbtext)
  529.             dialog.exec_()
  530.         
  531.         sys.exit(1)
  532.  
  533.     
  534.     def openURL(self, url):
  535.         '''start konqueror'''
  536.         QDesktopServices.openUrl(QUrl(url))
  537.  
  538.     
  539.     def reportBug(self):
  540.         '''start konqueror'''
  541.         QDesktopServices.openUrl(QUrl('https://launchpad.net/ubuntu/+source/update-manager/+filebug'))
  542.  
  543.     
  544.     def showTerminal(self):
  545.         if self.window_main.konsole_frame.isVisible():
  546.             self.window_main.konsole_frame.hide()
  547.             self.window_main.showTerminalButton.setText(_('Show Terminal >>>'))
  548.         else:
  549.             self.window_main.konsole_frame.show()
  550.             self.window_main.showTerminalButton.setText(_('<<< Hide Terminal'))
  551.         self.window_main.resize(self.window_main.sizeHint())
  552.  
  553.     
  554.     def getFetchProgress(self):
  555.         return self._fetchProgress
  556.  
  557.     
  558.     def getInstallProgress(self, cache):
  559.         self._installProgress._cache = cache
  560.         return self._installProgress
  561.  
  562.     
  563.     def getOpCacheProgress(self):
  564.         return self._opCacheProgress
  565.  
  566.     
  567.     def getCdromProgress(self):
  568.         return self._cdromProgress
  569.  
  570.     
  571.     def updateStatus(self, msg):
  572.         self.window_main.label_status.setText(utf8(msg))
  573.  
  574.     
  575.     def hideStep(self, step):
  576.         image = getattr(self.window_main, 'image_step%i' % step)
  577.         label = getattr(self.window_main, 'label_step%i' % step)
  578.         image.hide()
  579.         label.hide()
  580.  
  581.     
  582.     def abort(self):
  583.         step = self.prev_step
  584.         if step > 0:
  585.             image = getattr(self.window_main, 'image_step%i' % step)
  586.             if os.path.exists('/usr/share/icons/oxygen/16x16/actions/dialog-cancel.png'):
  587.                 cancelIcon = QPixmap('/usr/share/icons/oxygen/16x16/actions/dialog-cancel.png')
  588.             elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/16x16/actions/dialog-cancel.png'):
  589.                 cancelIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/16x16/actions/dialog-cancel.png')
  590.             else:
  591.                 cancelIcon = QPixmap('/usr/share/icons/crystalsvg/16x16/actions/cancel.png')
  592.             image.setPixmap(cancelIcon)
  593.             image.show()
  594.         
  595.  
  596.     
  597.     def setStep(self, step):
  598.         if os.path.exists('/usr/share/icons/oxygen/16x16/actions/dialog-ok.png'):
  599.             okIcon = QPixmap('/usr/share/icons/oxygen/16x16/actions/dialog-ok.png')
  600.         elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/16x16/actions/dialog-ok.png'):
  601.             okIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/16x16/actions/dialog-ok.png')
  602.         else:
  603.             okIcon = QPixmap('/usr/share/icons/crystalsvg/16x16/actions/ok.png')
  604.         if os.path.exists('/usr/share/icons/oxygen/16x16/actions/arrow-right.png'):
  605.             arrowIcon = QPixmap('/usr/share/icons/oxygen/16x16/actions/arrow-right.png')
  606.         elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/16x16/actions/arrow-right.png'):
  607.             arrowIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/16x16/actions/arrow-right.png')
  608.         else:
  609.             arrowIcon = QPixmap('/usr/share/icons/crystalsvg/16x16/actions/1rightarrow.png')
  610.         if self.prev_step:
  611.             image = getattr(self.window_main, 'image_step%i' % self.prev_step)
  612.             label = getattr(self.window_main, 'label_step%i' % self.prev_step)
  613.             image.setPixmap(okIcon)
  614.             image.show()
  615.         
  616.         self.prev_step = step
  617.         image = getattr(self.window_main, 'image_step%i' % step)
  618.         label = getattr(self.window_main, 'label_step%i' % step)
  619.         image.setPixmap(arrowIcon)
  620.         image.show()
  621.         label.setText('<b>' + label.text() + '</b>')
  622.  
  623.     
  624.     def information(self, summary, msg, extended_msg = None):
  625.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  626.         dialogue = QDialog(self.window_main)
  627.         loadUi('dialog_error.ui', dialogue)
  628.         self.translate_widget_children(dialogue)
  629.         dialogue.label_error.setText(utf8(msg))
  630.         if extended_msg != None:
  631.             dialogue.textview_error.setText(utf8(extended_msg))
  632.             dialogue.textview_error.show()
  633.         else:
  634.             dialogue.textview_error.hide()
  635.         dialogue.button_bugreport.hide()
  636.         dialogue.setWindowTitle(_('Information'))
  637.         if os.path.exists('/usr/share/icons/oxygen/48x48/status/dialog-information.png'):
  638.             messageIcon = QPixmap('/usr/share/icons/oxygen/48x48/status/dialog-information.png')
  639.         elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-information.png'):
  640.             messageIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-information.png')
  641.         else:
  642.             messageIcon = QPixmap('/usr/share/icons/crystalsvg/32x32/actions/messagebox_info.png')
  643.         dialogue.image.setPixmap(messageIcon)
  644.         dialogue.exec_()
  645.  
  646.     
  647.     def error(self, summary, msg, extended_msg = None):
  648.         msg = '<big><b>%s</b></big><br />%s' % (summary, msg)
  649.         dialogue = QDialog(self.window_main)
  650.         loadUi('dialog_error.ui', dialogue)
  651.         self.translate_widget_children(dialogue)
  652.         dialogue.label_error.setText(utf8(msg))
  653.         if extended_msg != None:
  654.             dialogue.textview_error.setText(utf8(extended_msg))
  655.             dialogue.textview_error.show()
  656.         else:
  657.             dialogue.textview_error.hide()
  658.         dialogue.button_close.show()
  659.         self.app.connect(dialogue.button_bugreport, SIGNAL('clicked()'), self.reportBug)
  660.         if os.path.exists('/usr/share/icons/oxygen/48x48/status/dialog-error.png'):
  661.             messageIcon = QPixmap('/usr/share/icons/oxygen/48x48/status/dialog-error.png')
  662.         elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-error.png'):
  663.             messageIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-error.png')
  664.         else:
  665.             messageIcon = QPixmap('/usr/share/icons/crystalsvg/32x32/actions/messagebox_critical.png')
  666.         dialogue.image.setPixmap(messageIcon)
  667.         dialogue.exec_()
  668.         return False
  669.  
  670.     
  671.     def confirmChanges(self, summary, changes, downloadSize, actions = None, removal_bold = True):
  672.         '''show the changes dialogue'''
  673.         DistUpgradeView.confirmChanges(self, summary, changes, downloadSize)
  674.         msg = unicode(self.confirmChangesMessage, 'UTF-8')
  675.         self.changesDialogue = QDialog(self.window_main)
  676.         loadUi('dialog_changes.ui', self.changesDialogue)
  677.         self.changesDialogue.treeview_details.hide()
  678.         self.changesDialogue.connect(self.changesDialogue.show_details_button, SIGNAL('clicked()'), self.showChangesDialogueDetails)
  679.         self.translate_widget_children(self.changesDialogue)
  680.         self.changesDialogue.show_details_button.setText(_('Details') + ' >>>')
  681.         self.changesDialogue.resize(self.changesDialogue.sizeHint())
  682.         if os.path.exists('/usr/share/icons/oxygen/48x48/status/dialog-warning.png'):
  683.             warningIcon = QPixmap('/usr/share/icons/oxygen/48x48/status/dialog-warning.png')
  684.         elif os.path.exists('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-warning.png'):
  685.             warningIcon = QPixmap('/usr/lib/kde4/share/icons/oxygen/48x48/status/dialog-warning.png')
  686.         else:
  687.             warningIcon = QPixmap('/usr/share/icons/crystalsvg/32x32/actions/messagebox_warning.png')
  688.         self.changesDialogue.question_pixmap.setPixmap(warningIcon)
  689.         if actions != None:
  690.             cancel = actions[0].replace('_', '')
  691.             self.changesDialogue.button_cancel_changes.setText(cancel)
  692.             confirm = actions[1].replace('_', '')
  693.             self.changesDialogue.button_confirm_changes.setText(confirm)
  694.         
  695.         summaryText = unicode('<big><b>%s</b></big>' % summary, 'UTF-8')
  696.         self.changesDialogue.label_summary.setText(summaryText)
  697.         self.changesDialogue.label_changes.setText(msg)
  698.         self.changesDialogue.treeview_details.clear()
  699.         self.changesDialogue.treeview_details.setHeaderLabels([
  700.             'Packages'])
  701.         self.changesDialogue.treeview_details.header().hide()
  702.         for rm in self.toRemove:
  703.             self.changesDialogue.treeview_details.insertTopLevelItem(0, QTreeWidgetItem(self.changesDialogue.treeview_details, [
  704.                 _('Remove %s') % rm]))
  705.         
  706.         for inst in self.toInstall:
  707.             self.changesDialogue.treeview_details.insertTopLevelItem(0, QTreeWidgetItem(self.changesDialogue.treeview_details, [
  708.                 _('Install %s') % inst]))
  709.         
  710.         for up in self.toUpgrade:
  711.             self.changesDialogue.treeview_details.insertTopLevelItem(0, QTreeWidgetItem(self.changesDialogue.treeview_details, [
  712.                 _('Upgrade %s') % up]))
  713.         
  714.         res = self.changesDialogue.exec_()
  715.         if res == QDialog.Accepted:
  716.             return True
  717.         return False
  718.  
  719.     
  720.     def showChangesDialogueDetails(self):
  721.         if self.changesDialogue.treeview_details.isVisible():
  722.             self.changesDialogue.treeview_details.hide()
  723.             self.changesDialogue.show_details_button.setText(_('Details') + ' >>>')
  724.         else:
  725.             self.changesDialogue.treeview_details.show()
  726.             self.changesDialogue.show_details_button.setText('<<< ' + _('Details'))
  727.         self.changesDialogue.resize(self.changesDialogue.sizeHint())
  728.  
  729.     
  730.     def askYesNoQuestion(self, summary, msg, default = 'No'):
  731.         answer = QMessageBox.question(self.window_main, unicode(summary, 'UTF-8'), unicode('<font>') + unicode(msg, 'UTF-8'), QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
  732.         if answer == QMessageBox.Yes:
  733.             return True
  734.         return False
  735.  
  736.     
  737.     def confirmRestart(self):
  738.         messageBox = QMessageBox(QMessageBox.Question, _('Restart required'), _('<b><big>Restart the system to complete the upgrade</big></b>'), QMessageBox.NoButton, self.window_main)
  739.         yesButton = messageBox.addButton(QMessageBox.Yes)
  740.         noButton = messageBox.addButton(QMessageBox.No)
  741.         yesButton.setText(_('_Restart Now').replace('_', '&'))
  742.         noButton.setText(gettext.dgettext('kdelibs', '&Close'))
  743.         answer = messageBox.exec_()
  744.         if answer == QMessageBox.Yes:
  745.             return True
  746.         return False
  747.  
  748.     
  749.     def processEvents(self):
  750.         QApplication.processEvents()
  751.  
  752.     
  753.     def on_window_main_delete_event(self):
  754.         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.')
  755.         text = text.replace('\n', '<br />')
  756.         cancel = QMessageBox.warning(self.window_main, _('Cancel Upgrade?'), text, QMessageBox.Yes, QMessageBox.No)
  757.         if cancel == QMessageBox.Yes:
  758.             return True
  759.         return False
  760.  
  761.  
  762. if __name__ == '__main__':
  763.     view = DistUpgradeViewKDE()
  764.     view.askYesNoQuestion('input box test', 'bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar ')
  765.     if sys.argv[1] == '--test-term':
  766.         pid = view.terminal_text.fork()
  767.         if pid == 0:
  768.             subprocess.call([
  769.                 'bash'])
  770.             sys.exit()
  771.         
  772.         while True:
  773.             view.terminal_text.updateInterface()
  774.             QApplication.processEvents()
  775.             time.sleep(0.01)
  776.     
  777.     if sys.argv[1] == '--show-in-terminal':
  778.         for c in open(sys.argv[2]).read():
  779.             view.terminal_text.insertWithTermCodes(c)
  780.             QApplication.processEvents()
  781.             time.sleep(0.05)
  782.         
  783.         while True:
  784.             QApplication.processEvents()
  785.     
  786.     cache = apt.Cache()
  787.     for pkg in sys.argv[1:]:
  788.         if cache[pkg].isInstalled and not (cache[pkg].isUpgradable):
  789.             cache[pkg].markDelete(purge = True)
  790.         else:
  791.             cache[pkg].markInstall()
  792.     
  793.     cache.commit(view._fetchProgress, view._installProgress)
  794.     while True:
  795.         QApplication.processEvents()
  796.  
  797.