home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2546 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  17.2 KB  |  617 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __author__ = 'Adam Walker'
  5. __version__ = '0.11'
  6. import sys
  7. import os
  8. import shlex
  9. import stat
  10. import pprint
  11. import win32con
  12. import commctrl
  13. _controlMap = {
  14.     'DEFPUSHBUTTON': 128,
  15.     'PUSHBUTTON': 128,
  16.     'Button': 128,
  17.     'GROUPBOX': 128,
  18.     'Static': 130,
  19.     'CTEXT': 130,
  20.     'RTEXT': 130,
  21.     'LTEXT': 130,
  22.     'LISTBOX': 131,
  23.     'SCROLLBAR': 132,
  24.     'COMBOBOX': 133,
  25.     'EDITTEXT': 129,
  26.     'ICON': 130,
  27.     'RICHEDIT': 'RichEdit20A' }
  28. _addDefaults = {
  29.     'EDITTEXT': win32con.WS_BORDER | win32con.WS_TABSTOP,
  30.     'GROUPBOX': win32con.BS_GROUPBOX,
  31.     'LTEXT': win32con.SS_LEFT,
  32.     'DEFPUSHBUTTON': win32con.BS_DEFPUSHBUTTON | win32con.WS_TABSTOP,
  33.     'PUSHBUTTON': win32con.WS_TABSTOP,
  34.     'CTEXT': win32con.SS_CENTER,
  35.     'RTEXT': win32con.SS_RIGHT,
  36.     'ICON': win32con.SS_ICON }
  37. defaultControlStyle = win32con.WS_CHILD | win32con.WS_VISIBLE
  38. defaultControlStyleEx = 0
  39.  
  40. class DialogDef:
  41.     name = ''
  42.     id = 0
  43.     style = 0
  44.     styleEx = None
  45.     caption = ''
  46.     font = 'MS Sans Serif'
  47.     fontSize = 8
  48.     x = 0
  49.     y = 0
  50.     w = 0
  51.     h = 0
  52.     template = None
  53.     
  54.     def __init__(self, n, i):
  55.         self.name = n
  56.         self.id = i
  57.         self.styles = []
  58.         self.stylesEx = []
  59.         self.controls = []
  60.  
  61.     
  62.     def createDialogTemplate(self):
  63.         t = None
  64.         self.template = [
  65.             [
  66.                 self.caption,
  67.                 (self.x, self.y, self.w, self.h),
  68.                 self.style,
  69.                 self.styleEx,
  70.                 (self.fontSize, self.font)]]
  71.         for control in self.controls:
  72.             self.template.append(control.createDialogTemplate())
  73.         
  74.         return self.template
  75.  
  76.  
  77.  
  78. class ControlDef:
  79.     id = ''
  80.     controlType = ''
  81.     subType = ''
  82.     idNum = 0
  83.     style = defaultControlStyle
  84.     styleEx = defaultControlStyleEx
  85.     label = ''
  86.     x = 0
  87.     y = 0
  88.     w = 0
  89.     h = 0
  90.     
  91.     def __init__(self):
  92.         self.styles = []
  93.         self.stylesEx = []
  94.  
  95.     
  96.     def toString(self):
  97.         s = '<Control id:' + self.id + ' controlType:' + self.controlType + ' subType:' + self.subType + ' idNum:' + str(self.idNum) + ' style:' + str(self.style) + ' styles:' + str(self.styles) + ' label:' + self.label + ' x:' + str(self.x) + ' y:' + str(self.y) + ' w:' + str(self.w) + ' h:' + str(self.h) + '>'
  98.         return s
  99.  
  100.     
  101.     def createDialogTemplate(self):
  102.         ct = self.controlType
  103.         if 'CONTROL' == ct:
  104.             ct = self.subType
  105.         
  106.         if ct in _controlMap:
  107.             ct = _controlMap[ct]
  108.         
  109.         t = [
  110.             ct,
  111.             self.label,
  112.             self.idNum,
  113.             (self.x, self.y, self.w, self.h),
  114.             self.style,
  115.             self.styleEx]
  116.         return t
  117.  
  118.  
  119.  
  120. class StringDef:
  121.     
  122.     def __init__(self, id, idNum, value):
  123.         self.id = id
  124.         self.idNum = idNum
  125.         self.value = value
  126.  
  127.     
  128.     def __repr__(self):
  129.         return 'StringDef(%r, %r, %r)' % (self.id, self.idNum, self.value)
  130.  
  131.  
  132.  
  133. class RCParser:
  134.     next_id = 1001
  135.     dialogs = { }
  136.     _dialogs = { }
  137.     debugEnabled = False
  138.     token = ''
  139.     
  140.     def __init__(self):
  141.         self.ungot = False
  142.         self.ids = {
  143.             'IDC_STATIC': -1 }
  144.         self.names = {
  145.             -1: 'IDC_STATIC' }
  146.         self.bitmaps = { }
  147.         self.stringTable = { }
  148.         self.icons = { }
  149.  
  150.     
  151.     def debug(self, *args):
  152.         if self.debugEnabled:
  153.             print args
  154.         
  155.  
  156.     
  157.     def getToken(self):
  158.         if self.ungot:
  159.             self.ungot = False
  160.             self.debug('getToken returns (ungot):', self.token)
  161.             return self.token
  162.         self.token = self.lex.get_token()
  163.         self.debug('getToken returns:', self.token)
  164.         if self.token == '':
  165.             self.token = None
  166.         
  167.         return self.token
  168.  
  169.     
  170.     def ungetToken(self):
  171.         self.ungot = True
  172.  
  173.     
  174.     def getCheckToken(self, expected):
  175.         tok = self.getToken()
  176.         return tok
  177.  
  178.     
  179.     def getCommaToken(self):
  180.         return self.getCheckToken(',')
  181.  
  182.     
  183.     def currentNumberToken(self):
  184.         mult = 1
  185.         if self.token == '-':
  186.             mult = -1
  187.             self.getToken()
  188.         
  189.         return int(self.token) * mult
  190.  
  191.     
  192.     def currentQuotedString(self):
  193.         bits = [
  194.             self.token]
  195.         while None:
  196.             tok = self.getToken()
  197.             if not tok.startswith('"'):
  198.                 self.ungetToken()
  199.                 break
  200.             
  201.             continue
  202.             sval = ''.join(bits)[1:-1]
  203.             for i, o in (('""', '"'), ('\\r', '\r'), ('\\n', '\n'), ('\\t', '\t')):
  204.                 sval = sval.replace(i, o)
  205.             
  206.         return sval
  207.  
  208.     
  209.     def load(self, rcstream):
  210.         self.open(rcstream)
  211.         self.getToken()
  212.         while self.token != None:
  213.             self.parse()
  214.             self.getToken()
  215.  
  216.     
  217.     def open(self, rcstream):
  218.         self.lex = shlex.shlex(rcstream)
  219.         self.lex.commenters = '//#'
  220.  
  221.     
  222.     def parseH(self, file):
  223.         lex = shlex.shlex(file)
  224.         lex.commenters = '//'
  225.         token = ' '
  226.         while token is not None:
  227.             token = lex.get_token()
  228.             if token == '' or token is None:
  229.                 token = None
  230.                 continue
  231.             if token == 'define':
  232.                 n = lex.get_token()
  233.                 i = int(lex.get_token())
  234.                 self.ids[n] = i
  235.                 if self.names.has_key(i):
  236.                     pass
  237.                 else:
  238.                     self.names[i] = n
  239.                 if self.next_id <= i:
  240.                     self.next_id = i + 1
  241.                 
  242.             self.next_id <= i
  243.  
  244.     
  245.     def parse(self):
  246.         noid_parsers = {
  247.             'STRINGTABLE': self.parse_stringtable }
  248.         id_parsers = {
  249.             'DIALOG': self.parse_dialog,
  250.             'DIALOGEX': self.parse_dialog,
  251.             'BITMAP': self.parse_bitmap,
  252.             'ICON': self.parse_icon }
  253.         deep = 0
  254.         base_token = self.token
  255.         rp = noid_parsers.get(base_token)
  256.         if rp is not None:
  257.             rp()
  258.         else:
  259.             resource_id = self.token
  260.             self.getToken()
  261.             if self.token is None:
  262.                 return None
  263.             if 'BEGIN' == self.token:
  264.                 deep = 1
  265.                 while deep != 0 and self.token is not None:
  266.                     self.getToken()
  267.                     self.debug('Zooming over', self.token)
  268.                     if 'BEGIN' == self.token:
  269.                         deep += 1
  270.                         continue
  271.                     self.token is None
  272.                     if 'END' == self.token:
  273.                         deep -= 1
  274.                         continue
  275.             else:
  276.                 rp = id_parsers.get(self.token)
  277.                 if rp is not None:
  278.                     self.debug("Dispatching '%s'" % (self.token,))
  279.                     rp(resource_id)
  280.                 else:
  281.                     self.debug("Skipping top-level '%s'" % base_token)
  282.                     self.ungetToken()
  283.  
  284.     
  285.     def addId(self, id_name):
  286.         return id
  287.  
  288.     
  289.     def lang(self):
  290.         while self.token[0:4] == 'LANG' and self.token[0:7] == 'SUBLANG' or self.token == ',':
  291.             self.getToken()
  292.  
  293.     
  294.     def parse_textinclude(self, res_id):
  295.         while self.getToken() != 'BEGIN':
  296.             pass
  297.         while self.token == 'END':
  298.             break
  299.         s = self.getToken()
  300.         continue
  301.  
  302.     
  303.     def parse_stringtable(self):
  304.         while self.getToken() != 'BEGIN':
  305.             pass
  306.         while None:
  307.             if self.token == 'END':
  308.                 break
  309.             
  310.             sid = self.token
  311.             self.getToken()
  312.             sd = StringDef(sid, self.addId(sid), self.currentQuotedString())
  313.             self.stringTable[sid] = sd
  314.             continue
  315.             return None
  316.  
  317.     
  318.     def parse_bitmap(self, name):
  319.         return self.parse_bitmap_or_icon(name, self.bitmaps)
  320.  
  321.     
  322.     def parse_icon(self, name):
  323.         return self.parse_bitmap_or_icon(name, self.icons)
  324.  
  325.     
  326.     def parse_bitmap_or_icon(self, name, dic):
  327.         self.getToken()
  328.         while not self.token.startswith('"'):
  329.             self.getToken()
  330.         bmf = self.token[1:-1]
  331.         dic[name] = bmf
  332.  
  333.     
  334.     def parse_dialog(self, name):
  335.         dlg = DialogDef(name, self.addId(name))
  336.         self._dialogs[name] = dlg
  337.         extras = []
  338.         self.getToken()
  339.         while not self.token.isdigit():
  340.             self.debug('extra', self.token)
  341.             extras.append(self.token)
  342.             self.getToken()
  343.         dlg.x = int(self.token)
  344.         self.getCommaToken()
  345.         self.getToken()
  346.         dlg.y = int(self.token)
  347.         self.getCommaToken()
  348.         self.getToken()
  349.         dlg.w = int(self.token)
  350.         self.getCommaToken()
  351.         self.getToken()
  352.         dlg.h = int(self.token)
  353.         self.getToken()
  354.         while not self.token == None and self.token == '' or self.token == 'END':
  355.             if self.token == 'STYLE':
  356.                 self.dialogStyle(dlg)
  357.                 continue
  358.             if self.token == 'EXSTYLE':
  359.                 self.dialogExStyle(dlg)
  360.                 continue
  361.             if self.token == 'CAPTION':
  362.                 self.dialogCaption(dlg)
  363.                 continue
  364.             if self.token == 'FONT':
  365.                 self.dialogFont(dlg)
  366.                 continue
  367.             if self.token == 'BEGIN':
  368.                 self.controls(dlg)
  369.                 continue
  370.             break
  371.         self.dialogs[name] = dlg.createDialogTemplate()
  372.  
  373.     
  374.     def dialogStyle(self, dlg):
  375.         (dlg.style, dlg.styles) = self.styles([], win32con.DS_SETFONT)
  376.  
  377.     
  378.     def dialogExStyle(self, dlg):
  379.         self.getToken()
  380.         (dlg.styleEx, dlg.stylesEx) = self.styles([], 0)
  381.  
  382.     
  383.     def styles(self, defaults, defaultStyle):
  384.         list = defaults
  385.         style = defaultStyle
  386.         if 'STYLE' == self.token:
  387.             self.getToken()
  388.         
  389.         i = 0
  390.         Not = False
  391.         while (i % 2 == 1 or '|' == self.token or 'NOT' == self.token or i % 2 == 0) and not (self.token == None):
  392.             Not = False
  393.             if 'NOT' == self.token:
  394.                 Not = True
  395.                 self.getToken()
  396.             
  397.             i += 1
  398.             if self.token != '|':
  399.                 if self.token in win32con.__dict__:
  400.                     value = getattr(win32con, self.token)
  401.                 elif self.token in commctrl.__dict__:
  402.                     value = getattr(commctrl, self.token)
  403.                 else:
  404.                     value = 0
  405.                 if Not:
  406.                     list.append('NOT ' + self.token)
  407.                     self.debug('styles add Not', self.token, value)
  408.                     style &= ~value
  409.                 else:
  410.                     list.append(self.token)
  411.                     self.debug('styles add', self.token, value)
  412.                     style |= value
  413.             
  414.             self.getToken()
  415.         self.debug('style is ', style)
  416.         return (style, list)
  417.  
  418.     
  419.     def dialogCaption(self, dlg):
  420.         if 'CAPTION' == self.token:
  421.             self.getToken()
  422.         
  423.         self.token = self.token[1:-1]
  424.         self.debug('Caption is:', self.token)
  425.         dlg.caption = self.token
  426.         self.getToken()
  427.  
  428.     
  429.     def dialogFont(self, dlg):
  430.         if 'FONT' == self.token:
  431.             self.getToken()
  432.         
  433.         dlg.fontSize = int(self.token)
  434.         self.getCommaToken()
  435.         self.getToken()
  436.         dlg.font = self.token[1:-1]
  437.         self.getToken()
  438.         while 'BEGIN' != self.token:
  439.             self.getToken()
  440.  
  441.     
  442.     def controls(self, dlg):
  443.         if self.token == 'BEGIN':
  444.             self.getToken()
  445.         
  446.         without_text = [
  447.             'EDITTEXT',
  448.             'COMBOBOX',
  449.             'LISTBOX',
  450.             'SCROLLBAR']
  451.         while self.token != 'END':
  452.             control = ControlDef()
  453.             control.controlType = self.token
  454.             self.getToken()
  455.             if control.controlType not in without_text:
  456.                 if self.token[0:1] == '"':
  457.                     control.label = self.currentQuotedString()
  458.                 elif self.token == '-' or self.token.isdigit():
  459.                     control.label = str(self.currentNumberToken())
  460.                 else:
  461.                     control.label = str(self.addId(self.token))
  462.                 self.getCommaToken()
  463.                 self.getToken()
  464.             
  465.             if self.token == '-' or self.token.isdigit():
  466.                 control.id = self.currentNumberToken()
  467.                 control.idNum = control.id
  468.             else:
  469.                 control.id = self.token
  470.                 control.idNum = self.addId(control.id)
  471.             self.getCommaToken()
  472.             if control.controlType == 'CONTROL':
  473.                 self.getToken()
  474.                 control.subType = self.token[1:-1]
  475.                 thisDefaultStyle = defaultControlStyle | _addDefaults.get(control.subType, 0)
  476.                 self.getCommaToken()
  477.                 self.getToken()
  478.                 (control.style, control.styles) = self.styles([], thisDefaultStyle)
  479.             else:
  480.                 thisDefaultStyle = defaultControlStyle | _addDefaults.get(control.controlType, 0)
  481.                 control.style = thisDefaultStyle
  482.             control.x = int(self.getToken())
  483.             self.getCommaToken()
  484.             control.y = int(self.getToken())
  485.             self.getCommaToken()
  486.             control.w = int(self.getToken())
  487.             self.getCommaToken()
  488.             self.getToken()
  489.             control.h = int(self.token)
  490.             self.getToken()
  491.             if self.token == ',':
  492.                 self.getToken()
  493.                 (control.style, control.styles) = self.styles([], thisDefaultStyle)
  494.             
  495.             if self.token == ',':
  496.                 self.getToken()
  497.                 (control.styleEx, control.stylesEx) = self.styles([], defaultControlStyleEx)
  498.             
  499.             dlg.controls.append(control)
  500.  
  501.  
  502.  
  503. def ParseStreams(rc_file, h_file):
  504.     rcp = RCParser()
  505.     if h_file:
  506.         rcp.parseH(h_file)
  507.     
  508.     
  509.     try:
  510.         rcp.load(rc_file)
  511.     except:
  512.         lex = getattr(rcp, 'lex', None)
  513.         if lex:
  514.             print 'ERROR parsing dialogs at line', lex.lineno
  515.             print 'Next 10 tokens are:'
  516.             for i in range(10):
  517.                 print lex.get_token(),
  518.             
  519.             print 
  520.         
  521.         raise 
  522.  
  523.     return rcp
  524.  
  525.  
  526. def Parse(rc_name, h_name = None):
  527.     if h_name:
  528.         h_file = open(h_name, 'rU')
  529.     else:
  530.         h_name = rc_name[:-2] + 'h'
  531.         
  532.         try:
  533.             h_file = open(h_name, 'rU')
  534.         except IOError:
  535.             h_name = os.path.join(os.path.dirname(rc_name), 'resource.h')
  536.             
  537.             try:
  538.                 h_file = open(h_name, 'rU')
  539.             except IOError:
  540.                 h_file = None
  541.             except:
  542.                 None<EXCEPTION MATCH>IOError
  543.             
  544.  
  545.             None<EXCEPTION MATCH>IOError
  546.  
  547.     rc_file = open(rc_name, 'rU')
  548.     
  549.     try:
  550.         return ParseStreams(rc_file, h_file)
  551.     finally:
  552.         if h_file is not None:
  553.             h_file.close()
  554.         
  555.         rc_file.close()
  556.  
  557.     return rcp
  558.  
  559.  
  560. def GenerateFrozenResource(rc_name, output_name, h_name = None):
  561.     rcp = Parse(rc_name, h_name)
  562.     in_stat = os.stat(rc_name)
  563.     out = open(output_name, 'wt')
  564.     out.write('#%s\n' % output_name)
  565.     out.write('#This is a generated file. Please edit %s instead.\n' % rc_name)
  566.     out.write('__version__=%r\n' % __version__)
  567.     out.write('_rc_size_=%d\n_rc_mtime_=%d\n' % (in_stat[stat.ST_SIZE], in_stat[stat.ST_MTIME]))
  568.     out.write('class StringDef:\n')
  569.     out.write('\tdef __init__(self, id, idNum, value):\n')
  570.     out.write('\t\tself.id = id\n')
  571.     out.write('\t\tself.idNum = idNum\n')
  572.     out.write('\t\tself.value = value\n')
  573.     out.write('\tdef __repr__(self):\n')
  574.     out.write('\t\treturn "StringDef(%r, %r, %r)" % (self.id, self.idNum, self.value)\n')
  575.     out.write('class FakeParser:\n')
  576.     for name in ('dialogs', 'ids', 'names', 'bitmaps', 'icons', 'stringTable'):
  577.         out.write('\t%s = \\\n' % (name,))
  578.         pprint.pprint(getattr(rcp, name), out)
  579.         out.write('\n')
  580.     
  581.     out.write('def Parse(s):\n')
  582.     out.write('\treturn FakeParser()\n')
  583.     out.close()
  584.  
  585. if __name__ == '__main__':
  586.     if len(sys.argv) <= 1:
  587.         print __doc__
  588.         print 
  589.         print 'See test_win32rcparser.py, and the win32rcparser directory (both'
  590.         print "in the test suite) for an example of this module's usage."
  591.     else:
  592.         import pprint
  593.         filename = sys.argv[1]
  594.         if '-v' in sys.argv:
  595.             RCParser.debugEnabled = 1
  596.         
  597.         print "Dumping all resources in '%s'" % filename
  598.         resources = Parse(filename)
  599.         for id, ddef in resources.dialogs.items():
  600.             print 'Dialog %s (%d controls)' % (id, len(ddef))
  601.             pprint.pprint(ddef)
  602.             print 
  603.         
  604.         for id, sdef in resources.stringTable.items():
  605.             print 'String %s=%r' % (id, sdef.value)
  606.             print 
  607.         
  608.         for id, sdef in resources.bitmaps.items():
  609.             print 'Bitmap %s=%r' % (id, sdef)
  610.             print 
  611.         
  612.         for id, sdef in resources.icons.items():
  613.             print 'Icon %s=%r' % (id, sdef)
  614.             print 
  615.         
  616.  
  617.