generate enums for pdf types

Review URL: https://codereview.chromium.org/16706007

git-svn-id: http://skia.googlecode.com/svn/trunk@9521 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/generate_code.py b/experimental/PdfViewer/generate_code.py
index 53316ea..d453cd2 100644
--- a/experimental/PdfViewer/generate_code.py
+++ b/experimental/PdfViewer/generate_code.py
@@ -88,6 +88,11 @@
     self.fName = name
     self.fBase = base
     
+    self.fEnumSubclasses = [] 
+    
+    self.fEnum = '!UNDEFINED'
+    self.fEnumEnd = '!UNDEFINED'
+    
   def required(self):
     field = PdfClassField(self, True)
     self.fFields.append(field)
@@ -108,14 +113,66 @@
 
 class PdfClassManager:
   def __init__(self):
-    self.fClasses = []
+    self.fClasses = {}
 
   def addClass(self, name, base=''):
     cls = PdfClass(name, base)
-    self.fClasses.append(cls)
+    self.fClasses[name] = cls
     return cls
   
+  def longName(self, name):
+    ret = ''
+    while name != '':
+      cls = self.fClasses[name]
+      ret = name + ret
+      name = cls.fBase
+      
+    return ret
+  
+  
+  def writeEnum(self, enum, enumToCls):
+    print('  ' + enum + ',')
+    cls = enumToCls[enum]
+    cls.fEnumSubclasses.sort()
+    
+    cnt = 0
+    for sub in cls.fEnumSubclasses:
+      self.writeEnum(cls.fEnumSubclasses[cnt], enumToCls)
+      cnt = cnt + 1
+      
+    if cnt != 0:
+       print('  ' + cls.fEnumEnd + ',')
+  
   def write(self):
+    # generate enum
+    enumsRoot = []
+
+    enumToCls = {}
+    
+    for name in self.fClasses:
+      cls = self.fClasses[name]
+      enum = self.longName(name)
+      cls.fEnum = 'k' + enum + '_PdfObjectType'
+      cls.fEnumEnd = 'k' + enum + '__End_PdfObjectType'
+            
+      if cls.fBase != '':
+        self.fClasses[cls.fBase].fEnumSubclasses.append(cls.fEnum)
+
+      if cls.fBase == '':
+        enumsRoot.append(cls.fEnum)
+       
+      enumToCls[cls.fEnum] = cls
+      
+    enumsRoot.sort()
+    
+    # write enums
+    print('enum PdfObjectType {')
+    for enum in enumsRoot:
+      self.writeEnum(enum, enumToCls)
+    print('};')
+      
+    # generate each class
+    # generate parser  
     return
 
 def generateCode():