home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / computerjanitorapp / ui_gtk.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  13.6 KB  |  336 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import logging
  5. import os
  6. import sys
  7. import threading
  8. import time
  9. import traceback
  10. import computerjanitor
  11. import computerjanitorapp
  12. _ = computerjanitorapp.setup_gettext()
  13. import os
  14. GLADE = os.environ.get('COMPUTER_JANITOR_GLADE', '/usr/share/computer-janitor/ComputerJanitor.glade')
  15. NAME_COL = 0
  16. STATE_COL = 1
  17. CRUFT_COL = 2
  18.  
  19. class ListUpdater(threading.Thread):
  20.     
  21.     def __init__(self, ui):
  22.         threading.Thread.__init__(self)
  23.         self.ui = ui
  24.  
  25.     
  26.     def run(self):
  27.         crufts = self.find_cruft()
  28.         crufts = self.sort_cruft(crufts)
  29.         self.ui.do(self.ui.update_progressbar, '', 0)
  30.         self.ui.do(self.ui.update_cruft_list, crufts)
  31.  
  32.     
  33.     def plugin_find_cb(self, filename, index, count):
  34.         self.ui.do(self.ui.update_progressbar, _('Finding plugins'), float(index + 1) / count)
  35.  
  36.     
  37.     def find_cruft(self):
  38.         list = []
  39.         plugins = self.ui.pm.get_plugins(callback = self.plugin_find_cb)
  40.         for i in range(len(plugins)):
  41.             self.ui.do(self.ui.update_progressbar, _('Finding problems'), float(i + 1) / len(plugins))
  42.             for cruft in plugins[i].get_cruft():
  43.                 list.append(cruft)
  44.             
  45.         
  46.         return self.ui.app.remove_whitelisted(list)
  47.  
  48.     
  49.     def sort_cruft(self, crufts):
  50.         
  51.         def key(cruft):
  52.             name = cruft.get_name()
  53.             if isinstance(cruft, computerjanitor.PackageCruft):
  54.                 kind_class = 3
  55.             elif isinstance(cruft, computerjanitor.FileCruft):
  56.                 kind_class = 2
  57.             else:
  58.                 kind_class = 1
  59.             return (not self.ui.app.state.is_enabled(name), kind_class, name)
  60.  
  61.         list = [ (key(cruft), cruft) for cruft in crufts ]
  62.         list.sort()
  63.         return [ cruft for k, cruft in list ]
  64.  
  65.  
  66.  
  67. class Cleaner(threading.Thread):
  68.     
  69.     def __init__(self, ui, crufts, plugins):
  70.         threading.Thread.__init__(self)
  71.         self.ui = ui
  72.         self.crufts = crufts
  73.         self.plugins = plugins
  74.  
  75.     
  76.     def run(self):
  77.         for cruft in self.crufts:
  78.             self.ui.do(self.ui.pulse_progressbar, _('Cleaning up'))
  79.             name = cruft.get_name()
  80.             if self.ui.app.state.is_enabled(name):
  81.                 if self.ui.options.no_act:
  82.                     logging.info(_('Pretending to clean up: %s') % name)
  83.                 else:
  84.                     logging.info(_('Cleaning up: %s') % name)
  85.                     cruft.cleanup()
  86.             self.ui.options.no_act
  87.         
  88.         for plugin in self.plugins:
  89.             self.ui.do(self.ui.pulse_progressbar, _('Post-cleanup'))
  90.             if self.ui.options.no_act:
  91.                 logging.info(_('Pretending to post-cleanup: %s') % plugin)
  92.                 continue
  93.             logging.info(_('Post-cleanup: %s') % plugin)
  94.             error = None
  95.             
  96.             try:
  97.                 plugin.post_cleanup()
  98.             continue
  99.             except Exception:
  100.                 e = None
  101.                 logging.debug(unicode(traceback.format_exc()))
  102.                 self.ui.do(self.ui.idle_error_message, _('Could not clean up properly'), unicode(e))
  103.                 break
  104.                 continue
  105.             
  106.  
  107.         
  108.         self.ui.show_cruft()
  109.         self.ui.do(self.ui.button_cleanup.set_sensitive, True)
  110.  
  111.  
  112.  
  113. class GtkUserInterface(computerjanitorapp.UserInterface):
  114.     
  115.     def update_progressbar(self, msg, fraction):
  116.         self.progressbar.set_text(msg)
  117.         self.progressbar.set_fraction(fraction)
  118.  
  119.     
  120.     def pulse_progressbar(self, msg):
  121.         self.progressbar.set_text(msg)
  122.         self.progressbar.pulse()
  123.  
  124.     
  125.     def update_sensitive(self):
  126.         sensitive = False
  127.         iter = self.liststore.get_iter_first()
  128.         while not sensitive and iter:
  129.             sensitive = self.liststore.get_value(iter, STATE_COL)
  130.             iter = self.liststore.iter_next(iter)
  131.         self.button_cleanup.set_sensitive(sensitive)
  132.  
  133.     
  134.     def show_cruft(self, *args):
  135.         updater = ListUpdater(self)
  136.         updater.start()
  137.  
  138.     
  139.     def cleanup(self, *args):
  140.         self.button_cleanup.set_sensitive(False)
  141.         crufts = []
  142.         iter = self.liststore.get_iter_first()
  143.         while iter:
  144.             crufts.append(self.liststore.get_value(iter, CRUFT_COL))
  145.             iter = self.liststore.iter_next(iter)
  146.         packages = _[1]
  147.         msg = _('Really clean up?')
  148.         dialog = self.gtk.MessageDialog(parent = self.window_main, type = self.gtk.MESSAGE_WARNING, buttons = self.gtk.BUTTONS_YES_NO, message_format = msg)
  149.         dialog.format_secondary_markup(msg)
  150.         dialog.show_all()
  151.         response = dialog.run()
  152.         dialog.hide()
  153.         if response != self.gtk.RESPONSE_YES:
  154.             self.update_sensitive()
  155.             return None
  156.         cleaner = Cleaner(self, crufts, self.pm.get_plugins())
  157.         cleaner.start()
  158.  
  159.     
  160.     def close(self, *args):
  161.         self.gtk.main_quit()
  162.  
  163.     
  164.     def cruft_toggled(self, toggle, path):
  165.         iter = self.liststore.get_iter(path)
  166.         cruft = self.liststore.get_value(iter, CRUFT_COL)
  167.         cruft_name = cruft.get_name()
  168.         enabled = self.liststore.get_value(iter, STATE_COL)
  169.         enabled = not enabled
  170.         if enabled:
  171.             self.app.state.enable(cruft_name)
  172.         else:
  173.             self.app.state.disable(cruft_name)
  174.         self.app.state.save(self.options.state_file)
  175.         self.liststore.set_value(iter, STATE_COL, enabled)
  176.         self.update_sensitive()
  177.  
  178.     
  179.     def translate_description(self, cruft):
  180.         desc = cruft.get_description()
  181.         import computerjanitor
  182.         if isinstance(cruft, computerjanitor.PackageCruft):
  183.             (desc1, desc2) = desc.split('\n\n', 2)
  184.             if desc1 and desc2:
  185.                 desc = '%s\n\n%s' % (_(desc1), desc2)
  186.             
  187.         elif isinstance(cruft, computerjanitor.FileCruft):
  188.             if desc.endswith('\n'):
  189.                 desc = desc[:-1]
  190.             
  191.         
  192.         return desc
  193.  
  194.     
  195.     def cursor_changed(self, treeview):
  196.         selection = treeview.get_selection()
  197.         (model, rows) = selection.get_selected_rows()
  198.         if len(rows) == 1:
  199.             iter = model.get_iter(rows[0])
  200.             cruft = model.get_value(iter, CRUFT_COL)
  201.             desc = self.translate_description(cruft)
  202.             self.cruft_description.set_label(desc)
  203.             self.do(self.scroll_to_selection)
  204.         
  205.  
  206.     
  207.     def scroll_to_selection(self):
  208.         selection = self.treeview_cruft.get_selection()
  209.         (model, rows) = selection.get_selected_rows()
  210.         if len(rows) == 1:
  211.             iter = model.get_iter(rows[0])
  212.             path = model.get_path(iter)
  213.             self.treeview_cruft.scroll_to_cell(path)
  214.         
  215.  
  216.     
  217.     def mapped(self, *args):
  218.         if os.getuid() != 0:
  219.             dialog = self.error_dialog(_('Root access required.'), _('You must run computer-janitor-gtk as root. Sorry.'))
  220.             dialog.show()
  221.             dialog.run()
  222.             sys.exit(1)
  223.         
  224.         
  225.         try:
  226.             self.app.verify_apt_cache()
  227.         except computerjanitor.Exception:
  228.             e = None
  229.             logging.debug(unicode(traceback.format_exc()))
  230.             dialog = self.error_dialog(str(e))
  231.             dialog.show()
  232.             dialog.run()
  233.             sys.exit(1)
  234.  
  235.         self.show_cruft()
  236.         self.window_main.disconnect(self.mapped_id)
  237.  
  238.     
  239.     def format_name(self, cruft):
  240.         name = self.gobject.markup_escape_text(cruft.get_shortname())
  241.         if not cruft.get_prefix_description():
  242.             pass
  243.         desc = cruft.get_prefix()
  244.         desc = self.gobject.markup_escape_text(desc)
  245.         return '<b>%s</b> (%s)' % (name, desc)
  246.  
  247.     
  248.     def update_cruft_list(self, crufts):
  249.         self.liststore.clear()
  250.         self.cruft_description.set_text('')
  251.         for cruft in crufts:
  252.             dict = {
  253.                 NAME_COL: self.format_name(cruft),
  254.                 STATE_COL: self.app.state.is_enabled(cruft.get_name()),
  255.                 CRUFT_COL: cruft }
  256.             list = [ dict[i] for i in sorted(dict.keys()) ]
  257.             self.liststore.append(list)
  258.         
  259.         self.update_sensitive()
  260.  
  261.     
  262.     def error_dialog(self, msg, secondary_msg = None):
  263.         dialog = self.gtk.MessageDialog(parent = self.window_main, type = self.gtk.MESSAGE_ERROR, buttons = self.gtk.BUTTONS_OK, message_format = msg)
  264.         if secondary_msg:
  265.             dialog.format_secondary_text(secondary_msg)
  266.         
  267.         return dialog
  268.  
  269.     
  270.     def idle_error_message(self, msg, secondary_msg = None):
  271.         dialog = self.error_dialog(msg, secondary_msg)
  272.         dialog.connect('response', (lambda d = dialog: d.destroy()))
  273.         dialog.show()
  274.  
  275.     
  276.     def do(self, callable, *args):
  277.         
  278.         def helper():
  279.             callable(*args)
  280.             return False
  281.  
  282.         self.gobject.idle_add(helper)
  283.  
  284.     
  285.     def run(self, options, args):
  286.         import gtk
  287.         import gtk.glade as gtk
  288.         import gobject
  289.         locpath = os.environ.get('LOCPATH', '/usr/share/locale')
  290.         gtk.glade.bindtextdomain('computerjanitor', locpath)
  291.         gtk.glade.textdomain('computerjanitor')
  292.         self.options = options
  293.         self.gtk = gtk
  294.         self.gobject = gobject
  295.         self.app.state.load(options.state_file)
  296.         self.glade = gtk.glade.XML(GLADE)
  297.         self.window_main = self.glade.get_widget('window_main')
  298.         self.treeview_cruft = self.glade.get_widget('treeview_cruft')
  299.         self.cruft_description = self.glade.get_widget('cruft_description')
  300.         self.button_cleanup = self.glade.get_widget('button_cleanup')
  301.         self.mapped_done = False
  302.         todo = [
  303.             ('button_cleanup', 'clicked', self.cleanup, None),
  304.             ('button_close', 'clicked', self.close, None),
  305.             ('window_main', 'delete-event', self.close, None),
  306.             ('window_main', 'map-event', self.mapped, 'mapped_id'),
  307.             ('treeview_cruft', 'cursor-changed', self.cursor_changed, None)]
  308.         for widget_name, signal_name, callback, attr in todo:
  309.             widget = self.glade.get_widget(widget_name)
  310.             id = widget.connect(signal_name, callback)
  311.             if attr:
  312.                 setattr(self, attr, id)
  313.                 continue
  314.         
  315.         col = gtk.TreeViewColumn(_('Remove/fix?'))
  316.         cr = gtk.CellRendererToggle()
  317.         cr.connect('toggled', self.cruft_toggled)
  318.         col.pack_start(cr, expand = False)
  319.         col.add_attribute(cr, 'active', STATE_COL)
  320.         self.treeview_cruft.append_column(col)
  321.         self.treeview_cruft.set_headers_visible(True)
  322.         col = gtk.TreeViewColumn(_('Name'))
  323.         cr = gtk.CellRendererText()
  324.         col.pack_start(cr)
  325.         col.add_attribute(cr, 'markup', NAME_COL)
  326.         self.treeview_cruft.append_column(col)
  327.         self.liststore = gtk.ListStore(str, 'gboolean', object)
  328.         self.treeview_cruft.set_model(self.liststore)
  329.         self.progressbar = self.glade.get_widget('progressbar')
  330.         self.cruft_description.set_text(_('Computer Janitor %s') % computerjanitorapp.VERSION)
  331.         self.window_main.show()
  332.         gtk.gdk.threads_init()
  333.         gtk.main()
  334.  
  335.  
  336.