home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / Alacarte / DialogHandler.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  16.3 KB  |  499 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import cgi
  6. import gmenu
  7. import gtk
  8. import gtk.glade as gtk
  9. import gobject
  10. import gettext
  11. gettext.bindtextdomain('alacarte')
  12. gettext.textdomain('alacarte')
  13. gtk.glade.bindtextdomain('alacarte')
  14. gtk.glade.textdomain('alacarte')
  15. _ = gettext.gettext
  16. from Alacarte import util
  17.  
  18. class DialogHandler:
  19.     editor = None
  20.     file_path = None
  21.     timer = None
  22.     in_revert = False
  23.     first_change = False
  24.     
  25.     def __init__(self, parent, editor, file_path):
  26.         self.parent = parent
  27.         self.editor = editor
  28.         self.file_path = file_path
  29.         self.command_completion = gtk.EntryCompletion()
  30.         self.command_completion.set_property('popup-completion', False)
  31.         self.command_completion.set_inline_completion(True)
  32.         self.completion_full = gtk.ListStore(str)
  33.         self.completion_used = gtk.ListStore(str)
  34.         self.command_completion.set_text_column(0)
  35.         paths = os.getenv('PATH')
  36.         for path in paths.split(os.pathsep):
  37.             if os.path.isdir(path):
  38.                 
  39.                 try:
  40.                     for name in os.listdir(path):
  41.                         f = os.path.join(path, name)
  42.                         if os.path.isfile(f):
  43.                             if os.access(f, os.X_OK):
  44.                                 self.completion_full.append([
  45.                                     name])
  46.                             
  47.                         os.access(f, os.X_OK)
  48.  
  49.                 continue
  50.         
  51.         self.command_completion.set_model(self.completion_used)
  52.  
  53.     
  54.     def showError(self, message):
  55.         dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, None)
  56.         dialog.set_title('')
  57.         dialog.set_size_request(400, -1)
  58.         dialog.set_markup('<b>' + cgi.escape(message) + '</b>')
  59.         dialog.run()
  60.         dialog.destroy()
  61.  
  62.     
  63.     def showCommandDialog(self, command_entry):
  64.         dialog = gtk.FileChooserDialog('Choose a Program', None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
  65.         if len(command_entry.get_text()) and '/' in command_entry.get_text():
  66.             dialog.set_current_folder(command_entry.get_text().rsplit('/', 1)[0])
  67.         else:
  68.             dialog.set_current_folder('/usr/bin/')
  69.         file_filter = gtk.FileFilter()
  70.         file_filter.add_mime_type('application/x-executable')
  71.         file_filter.add_mime_type('application/x-shellscript')
  72.         dialog.set_filter(file_filter)
  73.         dialog.show_all()
  74.         if dialog.run() == gtk.RESPONSE_OK:
  75.             command_entry.set_text(dialog.get_filename())
  76.         
  77.         dialog.destroy()
  78.  
  79.     
  80.     def showIconDialog(self, button):
  81.         dialog = gtk.FileChooserDialog('Choose an Icon', None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
  82.         if button.icon_path:
  83.             dialog.set_current_folder(button.icon_path.rsplit('/', 1)[0])
  84.         else:
  85.             dialog.set_current_folder('/usr/share/icons/')
  86.         preview = gtk.VBox()
  87.         preview.set_spacing(8)
  88.         preview.set_size_request(92, 92)
  89.         preview_text = gtk.Label('Preview')
  90.         preview.pack_start(preview_text, False, False)
  91.         preview_image = gtk.Image()
  92.         preview.pack_start(preview_image, False, False)
  93.         preview.show()
  94.         preview_text.show()
  95.         preview_image.show()
  96.         dialog.set_preview_widget(preview)
  97.         dialog.set_preview_widget_active(False)
  98.         dialog.set_use_preview_label(False)
  99.         dialog.connect('selection-changed', self.on_icon_dialog_selection_changed, preview_image)
  100.         file_filter = gtk.FileFilter()
  101.         file_filter.add_mime_type('image/png')
  102.         file_filter.add_mime_type('image/x-xpixmap')
  103.         file_filter.add_mime_type('image/svg+xml')
  104.         dialog.set_filter(file_filter)
  105.         dialog.show_all()
  106.         if dialog.run() == gtk.RESPONSE_OK:
  107.             button.remove(button.get_children()[0])
  108.             pixbuf = util.getIcon(dialog.get_filename())
  109.             button.icon_path = dialog.get_filename()
  110.             image = gtk.Image()
  111.             image.set_from_pixbuf(pixbuf)
  112.             image.show()
  113.             button.add(image)
  114.             dialog.destroy()
  115.             return True
  116.         
  117.         dialog.destroy()
  118.         return False
  119.  
  120.     
  121.     def on_icon_button_clicked(self, button):
  122.         self.showIconDialog(button)
  123.  
  124.     
  125.     def on_icon_dialog_selection_changed(self, dialog, image):
  126.         icon_file = dialog.get_preview_filename()
  127.         
  128.         try:
  129.             pixbuf = gtk.gdk.pixbuf_new_from_file(icon_file)
  130.         except:
  131.             dialog.set_preview_widget_active(False)
  132.             return None
  133.  
  134.         if pixbuf.get_width() > 64 or pixbuf.get_height() > 64:
  135.             pixbuf = pixbuf.scale_simple(32, 32, gtk.gdk.INTERP_HYPER)
  136.         
  137.         image.set_from_pixbuf(pixbuf)
  138.         dialog.set_preview_widget_active(True)
  139.  
  140.     
  141.     def newItemDialog(self):
  142.         self.tree = gtk.glade.XML(os.path.join(self.file_path, 'alacarte.glade'), 'newitemproperties')
  143.         signals = { }
  144.         for attr in dir(self):
  145.             signals[attr] = getattr(self, attr)
  146.         
  147.         self.tree.signal_autoconnect(signals)
  148.         
  149.         def responseChecker(response):
  150.             if response == gtk.RESPONSE_OK:
  151.                 if len(self.tree.get_widget('newitem_name_entry').get_text()) == 0:
  152.                     self.showError(_('A name is required.'))
  153.                     return False
  154.                 
  155.                 if len(self.tree.get_widget('newitem_command_entry').get_text()) == 0:
  156.                     self.showError(_('A command is required.'))
  157.                     return False
  158.                 
  159.                 return 'save'
  160.             
  161.             return True
  162.  
  163.         command_entry = self.tree.get_widget('newitem_command_entry')
  164.         command_entry.set_completion(self.command_completion)
  165.         icon_button = self.tree.get_widget('newitem_icon_button')
  166.         icon_button.remove(icon_button.get_children()[0])
  167.         label = gtk.Label('No Icon')
  168.         icon_button.add(label)
  169.         icon_button.icon_path = None
  170.         dialog = self.tree.get_widget('newitemproperties')
  171.         dialog.set_transient_for(self.parent)
  172.         dialog.show_all()
  173.         can_close = False
  174.         while can_close == False:
  175.             response = dialog.run()
  176.             can_close = responseChecker(response)
  177.         if can_close == 'save':
  178.             name_entry = self.tree.get_widget('newitem_name_entry')
  179.             comment_entry = self.tree.get_widget('newitem_comment_entry')
  180.             command_button = self.tree.get_widget('newitem_command_button')
  181.             term_check = self.tree.get_widget('newitem_terminal_check')
  182.             dialog.destroy()
  183.             return (icon_button.icon_path, name_entry.get_text(), comment_entry.get_text(), command_entry.get_text(), term_check.get_active())
  184.         
  185.         dialog.destroy()
  186.  
  187.     
  188.     def editItemDialog(self, item_row):
  189.         
  190.         def responseChecker(response):
  191.             if response == gtk.RESPONSE_REJECT:
  192.                 self.revertItem()
  193.                 return False
  194.             
  195.             if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT:
  196.                 if len(self.tree.get_widget('item_name_entry').get_text()) == 0:
  197.                     self.showError(_('A name is required.'))
  198.                     return False
  199.                 
  200.                 if len(self.tree.get_widget('item_command_entry').get_text()) == 0:
  201.                     self.showError(_('A command is required.'))
  202.                     return False
  203.                 
  204.                 return True
  205.             
  206.             return False
  207.  
  208.         self.in_dialog_setup = True
  209.         self.item_row = item_row
  210.         self.item = item_row[3]
  211.         self.item_parent = self.item.get_parent()
  212.         self.tree = gtk.glade.XML(os.path.join(self.file_path, 'alacarte.glade'), 'itemproperties')
  213.         signals = { }
  214.         for attr in dir(self):
  215.             signals[attr] = getattr(self, attr)
  216.         
  217.         self.tree.signal_autoconnect(signals)
  218.         dialog = self.tree.get_widget('itemproperties')
  219.         icon_button = self.tree.get_widget('item_icon_button')
  220.         name_entry = self.tree.get_widget('item_name_entry')
  221.         comment_entry = self.tree.get_widget('item_comment_entry')
  222.         command_entry = self.tree.get_widget('item_command_entry')
  223.         command_entry.set_completion(self.command_completion)
  224.         command_button = self.tree.get_widget('item_command_button')
  225.         term_check = self.tree.get_widget('item_terminal_check')
  226.         dialog.set_transient_for(self.parent)
  227.         icon_button.remove(icon_button.get_children()[0])
  228.         (pixbuf, path) = util.getIcon(self.item, True)
  229.         if pixbuf:
  230.             image = gtk.Image()
  231.             image.set_from_pixbuf(pixbuf)
  232.             icon_button.add(image)
  233.             icon_button.icon_path = path
  234.         else:
  235.             label = gtk.Label('No Icon')
  236.             icon_button.add(label)
  237.             icon_button.icon_path = None
  238.         name_entry.set_text(self.item.get_name())
  239.         if self.item.get_comment():
  240.             comment_entry.set_text(self.item.get_comment())
  241.         
  242.         if self.item.get_exec():
  243.             command_entry.set_text(self.item.get_exec())
  244.         
  245.         if self.item.get_launch_in_terminal():
  246.             term_check.set_active(True)
  247.         
  248.         dialog.show_all()
  249.         self.item_original_values = (icon_button.icon_path, name_entry.get_text(), comment_entry.get_text(), command_entry.get_text(), term_check.get_active())
  250.         self.in_dialog_setup = False
  251.         self.first_change = True
  252.         can_close = False
  253.         while can_close == False:
  254.             response = dialog.run()
  255.             can_close = responseChecker(response)
  256.         dialog.destroy()
  257.         self.first_change = False
  258.  
  259.     
  260.     def on_item_contents_changed(self, garbage):
  261.         self.item_row[1] = util.getIcon(self.tree.get_widget('item_icon_button').icon_path)
  262.         self.item_row[2] = self.tree.get_widget('item_name_entry').get_text()
  263.         if self.first_change:
  264.             self.saveItem(self.item_original_values, True)
  265.             self.first_change = False
  266.         
  267.         if self.in_revert:
  268.             self.in_revert = False
  269.             self.saveItemChanges()
  270.             return None
  271.         
  272.         if not self.in_dialog_setup:
  273.             self.tree.get_widget('item_revert_button').set_sensitive(True)
  274.             values = (self.tree.get_widget('item_icon_button').icon_path, self.tree.get_widget('item_name_entry').get_text(), self.tree.get_widget('item_comment_entry').get_text(), self.tree.get_widget('item_command_entry').get_text(), self.tree.get_widget('item_terminal_check').get_active())
  275.             self.saveItem(values)
  276.         
  277.  
  278.     
  279.     def on_item_icon_button_clicked(self, button):
  280.         if self.showIconDialog(button):
  281.             self.on_item_contents_changed(button)
  282.         
  283.  
  284.     
  285.     def on_item_command_entry_key_press_event(self, entry, event):
  286.         if event.keyval == gtk.keysyms.BackSpace:
  287.             return None
  288.         
  289.         if event.keyval == gtk.keysyms.Delete:
  290.             (start, end) = entry.get_selection_bounds()
  291.             entry.delete_text(start, end)
  292.         
  293.         if event.keyval == gtk.keysyms.Tab:
  294.             (start, end) = entry.get_selection_bounds()
  295.             if start != end and start != 1 and end == len(entry.get_text()):
  296.                 entry.select_region(end, end)
  297.                 entry.set_position(-1)
  298.                 return True
  299.             
  300.         elif len(entry.get_text()) == 2:
  301.             chars = entry.get_text()[:2]
  302.             self.completion_used.clear()
  303.             for item in self.completion_full:
  304.                 gobject.idle_add(self.compareCommands, item[0], chars)
  305.             
  306.         
  307.  
  308.     
  309.     def compareCommands(self, possible_command, typed_chars):
  310.         if possible_command[:2] == typed_chars:
  311.             self.completion_used.append((possible_command,))
  312.         
  313.         return False
  314.  
  315.     
  316.     def on_item_command_button_clicked(self, button):
  317.         self.showCommandDialog(self.tree.get_widget('item_command_entry'))
  318.  
  319.     
  320.     def on_newitem_command_button_clicked(self, button):
  321.         self.showCommandDialog(self.tree.get_widget('newitem_command_entry'))
  322.  
  323.     
  324.     def saveItem(self, values, final = False):
  325.         (pixbuf, path) = util.getIcon(self.item, True)
  326.         if path == values[0]:
  327.             self.editor.editItem(self.item, None, values[1], values[2], values[3], values[4], self.item_parent, final)
  328.         else:
  329.             self.editor.editItem(self.item, values[0], values[1], values[2], values[3], values[4], self.item_parent, final)
  330.  
  331.     
  332.     def revertItem(self):
  333.         self.in_revert = True
  334.         icon_button = self.tree.get_widget('item_icon_button')
  335.         icon_button.remove(icon_button.get_children()[0])
  336.         if self.item_original_values[0]:
  337.             image = gtk.Image()
  338.             pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.item_original_values[0], 24, 24)
  339.             image.set_from_pixbuf(pixbuf)
  340.             icon_button.add(image)
  341.             image.show()
  342.             icon_button.icon_path = self.item_original_values[0]
  343.         else:
  344.             label = gtk.Label('No Icon')
  345.             icon_button.add(label)
  346.         self.tree.get_widget('item_name_entry').set_text(self.item_original_values[1])
  347.         self.tree.get_widget('item_comment_entry').set_text(self.item_original_values[2])
  348.         self.tree.get_widget('item_command_entry').set_text(self.item_original_values[3])
  349.         self.tree.get_widget('item_terminal_check').set_active(self.item_original_values[4])
  350.         self.tree.get_widget('item_revert_button').set_sensitive(False)
  351.  
  352.     
  353.     def newMenuDialog(self):
  354.         tree = gtk.glade.XML(os.path.join(self.file_path, 'alacarte.glade'), 'newmenuproperties')
  355.         signals = { }
  356.         for attr in dir(self):
  357.             signals[attr] = getattr(self, attr)
  358.         
  359.         tree.signal_autoconnect(signals)
  360.         
  361.         def responseChecker(response):
  362.             if response == gtk.RESPONSE_OK:
  363.                 if len(tree.get_widget('newmenu_name_entry').get_text()) == 0:
  364.                     self.showError(_('A name is required.'))
  365.                     return False
  366.                 
  367.                 return 'save'
  368.             
  369.             return True
  370.  
  371.         dialog = tree.get_widget('newmenuproperties')
  372.         dialog.set_transient_for(self.parent)
  373.         icon_button = tree.get_widget('newmenu_icon_button')
  374.         icon_button.remove(icon_button.get_children()[0])
  375.         label = gtk.Label('No Icon')
  376.         icon_button.add(label)
  377.         icon_button.icon_path = None
  378.         dialog.show_all()
  379.         can_close = False
  380.         while can_close == False:
  381.             response = dialog.run()
  382.             can_close = responseChecker(response)
  383.         if can_close == 'save':
  384.             name_entry = tree.get_widget('newmenu_name_entry')
  385.             comment_entry = tree.get_widget('newmenu_comment_entry')
  386.             dialog.destroy()
  387.             return (icon_button.icon_path, name_entry.get_text(), comment_entry.get_text())
  388.         
  389.         dialog.destroy()
  390.  
  391.     
  392.     def editMenuDialog(self, menu_row):
  393.         
  394.         def responseChecker(response):
  395.             if response == gtk.RESPONSE_REJECT:
  396.                 self.revertMenu()
  397.                 return False
  398.             
  399.             if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT:
  400.                 if len(self.tree.get_widget('menu_name_entry').get_text()) == 0:
  401.                     self.showError(_('A name is required.'))
  402.                     return False
  403.                 
  404.                 return True
  405.             
  406.             return False
  407.  
  408.         self.in_dialog_setup = True
  409.         self.menu_row = menu_row
  410.         self.menu = menu_row[3]
  411.         self.tree = gtk.glade.XML(os.path.join(self.file_path, 'alacarte.glade'), 'menuproperties')
  412.         signals = { }
  413.         for attr in dir(self):
  414.             signals[attr] = getattr(self, attr)
  415.         
  416.         self.tree.signal_autoconnect(signals)
  417.         dialog = self.tree.get_widget('menuproperties')
  418.         icon_button = self.tree.get_widget('menu_icon_button')
  419.         name_entry = self.tree.get_widget('menu_name_entry')
  420.         comment_entry = self.tree.get_widget('menu_comment_entry')
  421.         dialog.set_transient_for(self.parent)
  422.         icon_button.remove(icon_button.get_children()[0])
  423.         (pixbuf, path) = util.getIcon(self.menu, True)
  424.         icon_button.icon_path = None
  425.         if pixbuf:
  426.             image = gtk.Image()
  427.             image.set_from_pixbuf(pixbuf)
  428.             icon_button.add(image)
  429.             icon_button.icon_path = path
  430.         else:
  431.             label = gtk.Label('No Icon')
  432.             icon_button.add(label)
  433.         name_entry.set_text(self.menu.get_name())
  434.         if self.menu.get_comment():
  435.             comment_entry.set_text(self.menu.get_comment())
  436.         
  437.         dialog.show_all()
  438.         self.menu_original_values = (icon_button.icon_path, name_entry.get_text(), comment_entry.get_text())
  439.         self.in_dialog_setup = False
  440.         self.first_change = True
  441.         can_close = False
  442.         while can_close == False:
  443.             response = dialog.run()
  444.             can_close = responseChecker(response)
  445.         dialog.destroy()
  446.  
  447.     
  448.     def on_menu_contents_changed(self, garbage):
  449.         self.menu_row[1] = util.getIcon(self.tree.get_widget('menu_icon_button').icon_path)
  450.         self.menu_row[2] = self.tree.get_widget('menu_name_entry').get_text()
  451.         if self.first_change:
  452.             self.saveMenu(self.menu_original_values, True)
  453.             self.first_change = False
  454.         
  455.         if self.in_revert:
  456.             self.in_revert = False
  457.             self.saveMenuChanges()
  458.             return None
  459.         
  460.         if not self.in_dialog_setup:
  461.             self.tree.get_widget('menu_revert_button').set_sensitive(True)
  462.             values = (self.tree.get_widget('menu_icon_button').icon_path, self.tree.get_widget('menu_name_entry').get_text(), self.tree.get_widget('menu_comment_entry').get_text())
  463.             self.saveMenu(values)
  464.         
  465.  
  466.     
  467.     def on_menu_icon_button_clicked(self, button):
  468.         if self.showIconDialog(button):
  469.             self.on_menu_contents_changed(button)
  470.         
  471.  
  472.     
  473.     def saveMenu(self, values, final = False):
  474.         (pixbuf, path) = util.getIcon(self.menu, True)
  475.         if path == values[0]:
  476.             self.editor.editMenu(self.menu, None, values[1], values[2], final)
  477.         else:
  478.             self.editor.editMenu(self.menu, values[0], values[1], values[2], final)
  479.  
  480.     
  481.     def revertMenu(self):
  482.         self.in_revert = True
  483.         icon_button = self.tree.get_widget('menu_icon_button')
  484.         icon_button.remove(icon_button.get_children()[0])
  485.         if self.menu_original_values[0]:
  486.             image = gtk.Image()
  487.             pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(self.menu_original_values[0], 24, 24)
  488.             image.set_from_pixbuf(pixbuf)
  489.             icon_button.add(image)
  490.             image.show()
  491.             icon_button.icon_path = self.menu_original_values[0]
  492.         else:
  493.             label = gtk.Label('No Icon')
  494.             icon_button.add(label)
  495.         self.tree.get_widget('menu_name_entry').set_text(self.menu_original_values[1])
  496.         self.tree.get_widget('menu_comment_entry').set_text(self.menu_original_values[2])
  497.  
  498.  
  499.