[z3-checkins] r13429 - in z3/zopejam/trunk/src: zcmledit zopejam zopejam/icons/palette zopejam/icons/palette/16x16

hathawsh at codespeak.net hathawsh at codespeak.net
Wed Jun 15 09:00:54 CEST 2005


Author: hathawsh
Date: Wed Jun 15 09:00:46 2005
New Revision: 13429

Added:
   z3/zopejam/trunk/src/zopejam/icons/palette/
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include.xcf   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include_glob.png   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include_one.png   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/includeoverride_glob.png   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/includeoverride_one.png   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/package.png   (contents, props changed)
   z3/zopejam/trunk/src/zopejam/icons/palette/16x16/zcmlfile.png   (contents, props changed)
Modified:
   z3/zopejam/trunk/src/zcmledit/include.py
   z3/zopejam/trunk/src/zopejam/main.py
   z3/zopejam/trunk/src/zopejam/resources.xrc
Log:
Load a complete configuration into the tree widgets.


Modified: z3/zopejam/trunk/src/zcmledit/include.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/include.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/include.py	Wed Jun 15 09:00:46 2005
@@ -19,17 +19,20 @@
     """
 
     def __init__(self, element, pythonpath):
-        files = element.data.get('files')
-        file = element.data.get('file')
-        package = element.data.get('package')
+        self.element = element
+        ns, localname = element.name
+        self.override = (localname == 'includeOverrides')
+        self.files = element.data.get('files')
+        self.file = element.data.get('file')
+        self.package = element.data.get('package')
 
-        if files and file:
+        if self.files and self.file:
             raise ValueError("Must specify only one of file or files")
-        if not files and not file:
-            file = 'configure.zcml'
+        if not self.files and not self.file:
+            self.file = 'configure.zcml'
 
         # figure out the absolute package name, which may be None.
-        if not package:
+        if not self.package:
             try:
                 abs_package = element.getAbsolutePackageName()
             except NoPackageError:
@@ -38,17 +41,17 @@
                 # referring to a file relative to the file containing
                 # the include directive.
                 abs_package = None
-        elif package.startswith('.'):
+        elif self.package.startswith('.'):
             # Turn the relative package name into an absolute package
             # name.  In this case, the directive did specify a
             # package, so complain if there is no absolute package
             # name in this context.
             parent = element.getAbsolutePackageName()
-            abs_package = join_package(parent, package)
+            abs_package = join_package(parent, self.package)
         else:
-            abs_package = package
+            abs_package = self.package
 
-        fn = os.path.normpath(files or file)
+        fn = os.path.normpath(self.files or self.file)
         if not os.path.isabs(fn):
             # convert to an absolute path
             if abs_package:
@@ -60,7 +63,7 @@
 
         self.abs_package = abs_package
         self.filename = fn
-        self.glob = bool(files)
+        self.glob = bool(self.files)
 
     def getAbsolutePackageName(self):
         """Returns the package name that included files belong to.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include.xcf
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include_glob.png
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/include_one.png
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/includeoverride_glob.png
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/includeoverride_one.png
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/package.png
==============================================================================
Binary file. No diff available.

Added: z3/zopejam/trunk/src/zopejam/icons/palette/16x16/zcmlfile.png
==============================================================================
Binary file. No diff available.

Modified: z3/zopejam/trunk/src/zopejam/main.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/main.py	(original)
+++ z3/zopejam/trunk/src/zopejam/main.py	Wed Jun 15 09:00:46 2005
@@ -13,12 +13,48 @@
 import wx
 from wx import xrc
 
+from zcmledit.configfile import ConfigurationFile
+
 VERSION = '0.1'
 restarting = False
 
 here = os.path.abspath(os.path.dirname(__file__))
 
 
+class Project:
+
+    def __init__(self, root_zcml, pythonpath=None):
+        self.root_zcml = root_zcml  # '/path/to/site.zcml'
+        self.base = os.path.dirname(root_zcml)
+        if pythonpath is None:
+            pythonpath = [os.path.join(self.base, 'src')]
+        self.pythonpath = pythonpath
+
+
+class PaletteImageList(wx.ImageList):
+
+    def __init__(self, w, h):
+        wx.ImageList.__init__(self, w, h)
+        self.indexes = {}
+        base = os.path.join(here, 'icons', 'palette', '%dx%d' % (w, h))
+        names = []
+        for name in os.listdir(base):
+            if name.lower().endswith('.png'):
+                names.append(name[:-4])
+        for name in names:
+            fn = os.path.join(base, '%s.png' % name)
+            image = wx.Image(fn)
+            bitmap = wx.BitmapFromImage(image)
+            index = self.Add(bitmap)
+            self.indexes[name] = index
+
+    def __getitem__(self, name):
+        return self.indexes[name]
+
+    def get(self, name, default=None):
+        return self.indexes.get(name, default)
+
+
 class JamGUI:
 
     _menuitem_names = [
@@ -50,16 +86,18 @@
         self.commands.addFromFrame(
             self.frame, self._menuitem_names, self._tool_names)
         self.commands.addCallbacks(self)
+
+        self.small_palette_images = PaletteImageList(16, 16)
+        inctree = xrc.XRCCTRL(self.frame, 'include_tree')
+        inctree.SetImageList(self.small_palette_images)
+        pkgtree = xrc.XRCCTRL(self.frame, 'package_tree')
+        pkgtree.SetImageList(self.small_palette_images)
+
         self.alldirs = DirectiveList(
             self, xrc.XRCCTRL(self.frame, 'directive_list_panel'))
+        self.project = None
         self.frame.Fit()
 
-        # No project is open
-        self.commands.newfile.disable()
-        self.commands.open.disable()
-        self.commands.projectproperties.disable()
-        self.commands.test.disable()
-
         # No files are open
         self.commands.save.disable()
         self.commands.saveas.disable()
@@ -80,6 +118,14 @@
         # The clipboard is empty
         self.commands.paste.disable()
 
+        self.update_commands_enabled()
+
+    def update_commands_enabled(self):
+        p = self.project is not None
+        self.commands.newfile.enable(p)
+        self.commands.open.enable(p)
+        self.commands.projectproperties.enable(p)
+        self.commands.test.enable(p)
 
     def cmd_default(self, event, name):
         wx.MessageDialog(
@@ -119,7 +165,10 @@
         cancel.Bind(wx.EVT_BUTTON, lambda event: dlg.EndModal(wx.ID_CANCEL))
 
         if dlg.ShowModal() == wx.ID_OK:
-            print 'now opening project', root_zcml.GetValue()
+            fn = os.path.abspath(root_zcml.GetValue())
+            self.project = Project(fn)
+            self.populate()
+            self.update_commands_enabled()
 
     def cmd_quit(self, event):
         self.frame.Close()
@@ -157,6 +206,89 @@
         restarting = True
         self.frame.Close()
 
+    def populate(self):
+        inctree = xrc.XRCCTRL(self.frame, 'include_tree')
+        inctree.DeleteAllItems()
+        pkgtree = xrc.XRCCTRL(self.frame, 'package_tree')
+        pkgtree.DeleteAllItems()
+        if self.project is None:
+            return
+
+        images = self.small_palette_images
+        packages = {}  # {package: [(filename, cfg)]}
+        incroot = inctree.AddRoot('')
+        root_config = ConfigurationFile(self.project.root_zcml)
+
+        todo = [(incroot, root_config)]
+        while todo:
+            parent, cfg = todo.pop(0)
+
+            filenames = packages.get(cfg.package_name or '')
+            if filenames is None:
+                filenames = []
+                packages[cfg.package_name or ''] = filenames
+            filenames.append((cfg.filename, cfg))
+            
+            cfg.load()
+            label = os.path.basename(cfg.filename)
+            data = wx.TreeItemData(cfg)
+            image = images.get('zcmlfile', -1)
+            child = inctree.AppendItem(parent, label, image=image, data=data)
+            for dir in cfg.root.flattened():
+                if dir.isIncludeDirective():
+                    resolver = dir.getIncludeResolver(self.project.pythonpath)
+                    data = wx.TreeItemData(resolver)
+                    f = resolver.files or resolver.file
+                    if resolver.abs_package:
+                        label = '[%s] %s' % (resolver.abs_package, f)
+                    else:
+                        label = f
+
+                    image_name = '%s_%s' % (
+                        resolver.override and 'includeoverride' or 'include',
+                        resolver.glob and 'glob' or 'one'
+                        )
+                    image = images.get(image_name, -1)
+
+                    gchild = inctree.AppendItem(
+                        child, label, image=image, data=data)
+                    for fn in resolver.listFiles():
+                        cfg = ConfigurationFile(
+                            fn, resolver.getAbsolutePackageName())
+                        todo.append((gchild, cfg))
+
+        # expand the visible roots
+        child, cookie = inctree.GetFirstChild(incroot)
+        while child:
+            inctree.Expand(child)
+            child, cookie = inctree.GetNextChild(incroot, cookie)
+
+        # populate pkgtree
+        pkgroot = pkgtree.AddRoot('')
+        items = packages.items()
+        items.sort()
+        file_image = images.get('zcmlfile', -1)
+        pkg_image = images.get('package', -1)
+        for package, filenames in items:
+            pkgid = pkgtree.AppendItem(
+                pkgroot, package or '[no package]', image=pkg_image)
+            filenames.sort()
+            for filename, cfg in filenames:
+                if package:
+                    label = os.path.basename(filename)
+                else:
+                    label = self.shortenPath(filename)
+                pkgtree.AppendItem(pkgid, label, image=file_image)
+
+    def shortenPath(self, p):
+        if self.project is None:
+            return p
+        base = self.project.base
+        if p.startswith(base):
+            len_base = len(base)
+            if len(p) > len_base and p[len_base] == os.sep:
+                return p[len_base + 1:]
+        return p
 
 class DirectiveList:
 

Modified: z3/zopejam/trunk/src/zopejam/resources.xrc
==============================================================================
--- z3/zopejam/trunk/src/zopejam/resources.xrc	(original)
+++ z3/zopejam/trunk/src/zopejam/resources.xrc	Wed Jun 15 09:00:46 2005
@@ -220,13 +220,13 @@
                   <object class="notebookpage">
                     <label>Includes</label>
                     <object class="wxTreeCtrl" name="include_tree">
-                      <style>wxSUNKEN_BORDER</style>
+                      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
                     </object>
                   </object>
                   <object class="notebookpage">
                     <label>Packages</label>
-                    <object class="wxTreeCtrl" name="file_tree">
-                      <style>wxSUNKEN_BORDER</style>
+                    <object class="wxTreeCtrl" name="package_tree">
+                      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
                     </object>
                   </object>
                 </object>
@@ -422,6 +422,7 @@
                       </object>
                     </object>
                   </object>
+                  <minsize>100</minsize>
                 </object>
                 <flag>wxLEFT|wxEXPAND</flag>
                 <border>1</border>
@@ -431,11 +432,11 @@
             </object>
           </object>
           <orientation>vertical</orientation>
-          <sashpos>250</sashpos>
-          <style></style>
+          <sashpos>350</sashpos>
+          <minsize>100</minsize>
         </object>
         <flag>wxEXPAND</flag>
-        <minsize>750, 550</minsize>
+        <minsize>950, 700</minsize>
       </object>
       <cols>1</cols>
       <growablerows>0</growablerows>


More information about the z3-checkins mailing list