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 / GMenuSimpleEditor / menufilewriter.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  5.3 KB  |  193 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import os
  5. import errno
  6. import pwd
  7. import gobject
  8. import menutreemodel
  9. DTD_DECLARATION = '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"\n "http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">\n\n'
  10.  
  11. class MenuFileWriterError(Exception):
  12.     pass
  13.  
  14.  
  15. def get_home_dir():
  16.     
  17.     try:
  18.         pw = pwd.getpwuid(os.getuid())
  19.         if pw.pw_dir:
  20.             return pw.pw_dir
  21.     except KeyError:
  22.         pass
  23.  
  24.     if os.environ.has_key('HOME'):
  25.         return os.environ['HOME']
  26.     else:
  27.         raise MenuFileWriterError(_('Cannot find home directory: not set in /etc/passwd and no value for $HOME in environment'))
  28.  
  29.  
  30. def get_user_menu_file_path(menu_file):
  31.     config_dir = None
  32.     if os.environ.has_key('XDG_CONFIG_HOME'):
  33.         config_dir = os.environ['XDG_CONFIG_HOME']
  34.     
  35.     if not config_dir:
  36.         config_dir = os.path.join(get_home_dir(), '.config')
  37.     
  38.     return os.path.join(config_dir, 'menus', menu_file)
  39.  
  40.  
  41. def write_file(filename, contents):
  42.     dir = os.path.dirname(filename)
  43.     
  44.     try:
  45.         os.makedirs(dir)
  46.     except os.error:
  47.         (err, str) = None
  48.         if err != errno.EEXIST:
  49.             raise 
  50.         
  51.     except:
  52.         err != errno.EEXIST
  53.  
  54.     temp = filename + '.new'
  55.     
  56.     try:
  57.         f = file(temp, 'w')
  58.     except:
  59.         temp = None
  60.         f = file(filename, 'w')
  61.  
  62.     
  63.     try:
  64.         f.write(contents)
  65.         f.close()
  66.     except:
  67.         if temp != None:
  68.             os.remove(temp)
  69.         
  70.         raise 
  71.  
  72.     if temp != None:
  73.         os.rename(temp, filename)
  74.     
  75.  
  76.  
  77. class MenuFileWriter:
  78.     
  79.     def __init__(self, menu_tree_model):
  80.         self.model = menu_tree_model
  81.         self.sync_idle_handlers = { }
  82.  
  83.     
  84.     def __del__(self):
  85.         for id, iter in self.sync_idle_handlers:
  86.             gobject.source_remove(id)
  87.         
  88.  
  89.     
  90.     def __append_menu(self, contents, indent, iter, system_menu_file = None):
  91.         has_changes = False
  92.         orig_contents = contents
  93.         contents += indent + '<Menu>\n'
  94.         contents += indent + '  <Name>%s</Name>\n' % self.model[iter][self.model.COLUMN_ID]
  95.         if system_menu_file:
  96.             contents += indent + '  <MergeFile type="parent">%s</MergeFile>\n' % system_menu_file
  97.         
  98.         includes = []
  99.         excludes = []
  100.         child_iter = self.model.iter_children(iter)
  101.         while child_iter:
  102.             if self.model[child_iter][self.model.COLUMN_IS_ENTRY]:
  103.                 desktop_file_id = self.model[child_iter][self.model.COLUMN_ID]
  104.                 system_visible = self.model[child_iter][self.model.COLUMN_SYSTEM_VISIBLE]
  105.                 user_visible = self.model[child_iter][self.model.COLUMN_USER_VISIBLE]
  106.                 if not system_visible and user_visible:
  107.                     includes.append(desktop_file_id)
  108.                 elif system_visible and not user_visible:
  109.                     excludes.append(desktop_file_id)
  110.                 
  111.             
  112.             child_iter = self.model.iter_next(child_iter)
  113.         if len(includes) > 0:
  114.             contents += indent + '  <Include>\n'
  115.             for desktop_file_id in includes:
  116.                 contents += indent + '    <Filename>%s</Filename>\n' % desktop_file_id
  117.             
  118.             contents += indent + '  </Include>\n'
  119.             has_changes = True
  120.         
  121.         if len(excludes) > 0:
  122.             contents += indent + '  <Exclude>\n'
  123.             for desktop_file_id in excludes:
  124.                 contents += indent + '    <Filename>%s</Filename>\n' % desktop_file_id
  125.             
  126.             contents += indent + '  </Exclude>\n'
  127.             has_changes = True
  128.         
  129.         child_iter = self.model.iter_children(iter)
  130.         while child_iter:
  131.             if not self.model[child_iter][self.model.COLUMN_IS_ENTRY]:
  132.                 (contents, subdir_has_changes) = self._MenuFileWriter__append_menu(contents, indent + '  ', child_iter)
  133.                 if not has_changes:
  134.                     has_changes = subdir_has_changes
  135.                 
  136.             
  137.             child_iter = self.model.iter_next(child_iter)
  138.         if has_changes:
  139.             return (contents + indent + '</Menu>\n', True)
  140.         else:
  141.             return (orig_contents, False)
  142.  
  143.     
  144.     def sync(self, iter):
  145.         menu_file = self.model[iter][self.model.COLUMN_MENU_FILE]
  146.         system_menu_file = menutreemodel.lookup_system_menu_file(menu_file)
  147.         (contents, has_changes) = self._MenuFileWriter__append_menu(DTD_DECLARATION, '', iter, system_menu_file)
  148.         if not has_changes:
  149.             
  150.             try:
  151.                 os.remove(get_user_menu_file_path(menu_file))
  152.             except:
  153.                 pass
  154.  
  155.             return None
  156.         
  157.         write_file(get_user_menu_file_path(menu_file), contents)
  158.  
  159.     
  160.     def __sync_idle_handler_func(self, iter):
  161.         self.sync(iter)
  162.         del self.sync_idle_handlers[iter]
  163.         return False
  164.  
  165.     
  166.     def queue_sync(self, iter):
  167.         
  168.         def find_menu_file_parent(model, iter):
  169.             if model[iter][model.COLUMN_MENU_FILE]:
  170.                 return iter
  171.             
  172.             parent_iter = model.iter_parent(iter)
  173.             if not parent_iter:
  174.                 return None
  175.             
  176.             return find_menu_file_parent(model, parent_iter)
  177.  
  178.         menu_file_iter = find_menu_file_parent(self.model, iter)
  179.         if not menu_file_iter:
  180.             return None
  181.         
  182.         menu_file_path = self.model.get_string_from_iter(menu_file_iter)
  183.         for iter in self.sync_idle_handlers:
  184.             path = self.model.get_string_from_iter(iter)
  185.             if path == menu_file_path:
  186.                 return None
  187.                 continue
  188.         
  189.         id = gobject.idle_add(self._MenuFileWriter__sync_idle_handler_func, menu_file_iter)
  190.         self.sync_idle_handlers[menu_file_iter] = id
  191.  
  192.  
  193.