[z3-checkins] r15085 - in z3/zopejam/trunk/src: zcmledit zopejam

hathawsh at codespeak.net hathawsh at codespeak.net
Tue Jul 26 08:54:09 CEST 2005


Author: hathawsh
Date: Tue Jul 26 08:54:05 2005
New Revision: 15085

Modified:
   z3/zopejam/trunk/src/zcmledit/configfile.py
   z3/zopejam/trunk/src/zcmledit/directives.py
   z3/zopejam/trunk/src/zcmledit/project.py
   z3/zopejam/trunk/src/zopejam/main.py
   z3/zopejam/trunk/src/zopejam/propbook.py
   z3/zopejam/trunk/src/zopejam/resources.xrc
Log:
UI rearrangements:

- Moved the package list and include tabs into separate windows.

- Made the directive list panel reusable within the XRC file.  When 
the user opens other tabs, new instances of the panel will be created.

- Simplified the text in the property editing window and added popup 
links (though nothing pops up yet.)



Modified: z3/zopejam/trunk/src/zcmledit/configfile.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/configfile.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/configfile.py	Tue Jul 26 08:54:05 2005
@@ -95,10 +95,11 @@
 
         return t(element)
 
-    def getAbbreviatedFilename(self):
+    def getAbbreviatedFilename(self, trim_default=True):
+        """Returns an abbreviation of the configuration filename."""
         if self.package_name:
             basename = os.path.basename(self.filename)
-            if basename == 'configure.zcml':
+            if trim_default and basename == 'configure.zcml':
                 text = self.package_name
             else:
                 text = '%s "%s"' % (self.package_name, basename)

Modified: z3/zopejam/trunk/src/zcmledit/directives.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/directives.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/directives.py	Tue Jul 26 08:54:05 2005
@@ -171,6 +171,19 @@
         """
         return self.filenames
 
+    def getAbbreviatedFileSpec(self):
+        """Returns an abbreviation of the filename to include."""
+        f = self.files or self.file
+        abs_package = self.getAbsolutePackageName()
+        if abs_package:
+            if f == 'configure.zcml':
+                spec = abs_package
+            else:
+                spec = '%s "%s"' % (abs_package, f)
+        else:
+            spec = '"%s"' % f
+        return spec
+
 
 class DefinitionDirective(Directive):
     """A directive that defines other directives"""

Modified: z3/zopejam/trunk/src/zcmledit/project.py
==============================================================================
--- z3/zopejam/trunk/src/zcmledit/project.py	(original)
+++ z3/zopejam/trunk/src/zcmledit/project.py	Tue Jul 26 08:54:05 2005
@@ -163,7 +163,7 @@
         self.fields = {}
         for k, v in self.attributes.items():
             if IField.providedBy(v):
-                self.fields[k] = v
+                self.fields[k] = FieldInfo(self, k, v)
 
     def initBases(self, all_interfaces):
         """As part of construction, link with base InterfaceInfo objects."""
@@ -190,3 +190,11 @@
                     res[k] = v
         return res
 
+
+class FieldInfo:
+    """Contains info about a field in a schema."""
+
+    def __init__(self, schema_info, name, spec):
+        self.schema_info = schema_info
+        self.name = name
+        self.spec = spec

Modified: z3/zopejam/trunk/src/zopejam/main.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/main.py	(original)
+++ z3/zopejam/trunk/src/zopejam/main.py	Tue Jul 26 08:54:05 2005
@@ -63,7 +63,7 @@
         'undo', 'redo', 'cut', 'copy', 'paste', 'delete',
         'projectproperties',
         # Tools menu
-        'test', 'restart',
+        'test', 'package_view', 'include_view', 'restart',
         # Help menu
         'contents', 'about',
         ]
@@ -78,6 +78,7 @@
     def __init__(self, resources):
         self.resources = resources
         self.frame = resources.LoadFrame(None, 'jam_frame')
+        self.views = {}  # {object: view}
         menubar = resources.LoadMenuBarOnFrame(self.frame, 'jam_menubar')
         self.commands = CommandTable()
         self.commands.addFromFrame(
@@ -86,19 +87,35 @@
 
         self.small_palette_images = PaletteImageList(16, 16)
         self.tiny_palette_images = PaletteImageList(12, 12)
-        inctree = xrc.XRCCTRL(self.frame, 'structure_tree')
-        inctree.SetImageList(self.small_palette_images)
-        pkgtree = xrc.XRCCTRL(self.frame, 'package_tree')
-        pkgtree.SetImageList(self.small_palette_images)
 
-        # Replace the directive list with a DirectiveList instance
-        old_dir_list = xrc.XRCCTRL(self.frame, 'dir_list')
-        parent = old_dir_list.GetParent()
-        id = old_dir_list.GetId()
-        old_dir_list.Destroy()
-        self.dir_list = DirectiveList(self, parent, id)
-        self.dir_list.SetBackgroundColour(wx.WHITE)
-        parent.GetSizer().Add(self.dir_list, flag=wx.EXPAND)
+        f = self.frame.GetFont()
+        self.normal_font = wx.Font(
+            f.GetPointSize(),
+            f.GetFamily(),
+            f.GetStyle(),
+            wx.FONTWEIGHT_NORMAL)
+        self.normal_attr = wx.TextAttr(wx.BLACK)
+        self.normal_attr.SetFont(self.normal_font)
+
+        self.bold_font = wx.Font(
+            f.GetPointSize(),
+            f.GetFamily(),
+            f.GetStyle(),
+            wx.FONTWEIGHT_BOLD)
+        self.bold_attr = wx.TextAttr(wx.BLACK)
+        self.bold_attr.SetFont(self.bold_font)
+
+        f = self.frame.GetFont()
+        self.italic_font = wx.Font(
+            f.GetPointSize(),
+            f.GetFamily(),
+            wx.FONTSTYLE_ITALIC,
+            wx.FONTWEIGHT_NORMAL)
+        self.italic_attr = wx.TextAttr(wx.BLACK)
+        self.italic_attr.SetFont(self.italic_font)
+
+        self.fbook = FilesNotebook(
+            self, xrc.XRCCTRL(self.frame, 'files_notebook'))
 
         self.tip_frame = resources.LoadFrame(self.frame, 'tip_frame')
         self.tip_frame.Fit()
@@ -108,7 +125,7 @@
             wx.EVT_TIMER, lambda event: self.tip_frame.Hide())
 
         self.status_label = xrc.XRCCTRL(self.frame, 'status_label')
-        self.book = propbook.PropertiesNotebook(
+        self.pbook = propbook.PropertiesNotebook(
             self, xrc.XRCCTRL(self.frame, 'properties_notebook'))
 
         self.project = None
@@ -221,6 +238,7 @@
         for name in ('homelink', 'zopelink'):
             c = xrc.XRCCTRL(dlg, name)
             c.GetParent().SetCursor(wx.StockCursor(wx.CURSOR_HAND))
+            c.GetParent().SetBackgroundColour(dlg.GetBackgroundColour())
             def browse(event, url=c.GetLabel()):
                 open_browser_thread(url)
                 dlg.Close()
@@ -229,21 +247,38 @@
         dlg.Fit()
         dlg.ShowModal()
 
+    def show_view_frame(self, frame, view):
+        view.populate()
+        key = object()  # Use an object as a unique view identifier
+        def onClose(event, self=self, key=key):
+            del self.views[key]
+            event.Skip()
+        frame.Bind(wx.EVT_CLOSE, onClose)
+        self.views[key] = view
+        frame.Fit()
+        frame.Show()
+
+    def cmd_package_view(self, event):
+        frame = self.resources.LoadFrame(self.frame, 'package_frame')
+        view = PackageView(self, xrc.XRCCTRL(frame, 'tree'))
+        self.show_view_frame(frame, view)
+
+    def cmd_include_view(self, event):
+        frame = self.resources.LoadFrame(self.frame, 'include_frame')
+        view = IncludeView(self, xrc.XRCCTRL(frame, 'tree'))
+        self.show_view_frame(frame, view)
+
     def cmd_restart(self, event):
         global restarting
         restarting = True
         self.frame.Close()
 
     def populate(self):
-        # clear the package tree
-        pkgtree = xrc.XRCCTRL(self.frame, 'package_tree')
-        pkgtree.DeleteAllItems()
-
-        # clear the structure tree
-        structure = xrc.XRCCTRL(self.frame, 'structure_tree')
-        structure.DeleteAllItems()
+        self.populateAddMenu()
+        self.fbook.all.dir_list.populate()
 
-        # clear the add menu
+    def populateAddMenu(self):
+        # clear
         menubar = self.frame.GetMenuBar()
         addmenu = menubar.GetMenu(2)
         for item in addmenu.GetMenuItems():
@@ -252,67 +287,7 @@
         if self.project is None:
             return
 
-        images = self.small_palette_images
-        incroot = structure.AddRoot('')
-        todo = [(incroot, self.project.root_config)]
-
-        # populate the structure tree
-        while todo:
-            parent, cfg = todo.pop(0)
-
-            label = "%s" % os.path.basename(cfg.filename)
-            data = wx.TreeItemData(cfg)
-            image = images.get('zcmlfile', -1)
-            child = structure.AppendItem(parent, label, image=image, data=data)
-
-            for inc in cfg.includes:
-                data = wx.TreeItemData(inc)
-                f = inc.files or inc.file
-                abs_package = inc.getAbsolutePackageName()
-                if abs_package:
-                    if f == 'configure.zcml':
-                        label = abs_package
-                    else:
-                        label = '%s "%s"' % (abs_package, f)
-                else:
-                    label = '"%s"' % f
-
-                image_name = '%s_%s' % (
-                    inc.override and 'includeoverride' or 'include',
-                    inc.glob and 'glob' or 'one'
-                    )
-                image = images.get(image_name, -1)
-
-                gchild = structure.AppendItem(
-                    child, label, image=image, data=data)
-                for fn in inc.listFiles():
-                    cfg = self.project.files[fn]
-                    todo.append((gchild, cfg))
-
-        # expand the visible roots
-        child, cookie = structure.GetFirstChild(incroot)
-        while child:
-            structure.Expand(child)
-            child, cookie = structure.GetNextChild(incroot, cookie)
-
-        # populate pkgtree
-        pkgroot = pkgtree.AddRoot('')
-        items = self.project.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 '<base directory>', image=pkg_image)
-            filenames.sort()
-            for filename in filenames:
-                if package:
-                    label = os.path.basename(filename)
-                else:
-                    label = self.project.shortenPath(filename)
-                pkgtree.AppendItem(pkgid, label, image=file_image)
-
-        # prepare reverse_menu_ids
+        # create reverse_menu_ids from add_menu_ids
         reverse_menu_ids = {}
         for item_id, fullname in add_menu_ids.items():
             reverse_menu_ids[fullname] = item_id
@@ -337,7 +312,7 @@
                 options[key] = names
             names.append((localname, item_id))
 
-        # populate the add menu
+        # add the options to the add menu
         options = options.items()
         options.sort()
         for (label, ns), names in options:
@@ -347,8 +322,6 @@
                 m.Append(item_id, name)
             addmenu.AppendMenu(-1, label, m)
 
-        self.dir_list.populate()
-
 
     def onMenuHighlight(self, event):
         item_id = event.GetId()
@@ -382,30 +355,18 @@
 
         tip_text = xrc.XRCCTRL(self.tip_frame, "tip_text")
         tip_text.Clear()
-        f = tip_text.GetFont()
-        normal = wx.Font(
-            f.GetPointSize(),
-            f.GetFamily(),
-            f.GetStyle(),
-            wx.FONTWEIGHT_NORMAL)
-        bold = wx.Font(
-            f.GetPointSize(),
-            f.GetFamily(),
-            f.GetStyle(),
-            wx.FONTWEIGHT_BOLD)
-
-        tip_text.SetDefaultStyle(wx.TextAttr(wx.BLACK, font=bold))
+        
+        tip_text.SetDefaultStyle(self.bold_attr)
         tip_text.AppendText("%s:%s\n" % (label, localname))
-        tip_text.SetDefaultStyle(wx.TextAttr(body_color, font=normal))
+        tip_text.SetDefaultStyle(self.normal_attr)
         tip_text.AppendText("\n%s" % doc)
 
         self.tip_hide_timer.Stop()
         if not self.tip_frame.IsShown():
-            x, y = self.frame.GetPositionTuple()
-            w, h = self.frame.GetSizeTuple()
-            x += w - self.tip_frame.GetSizeTuple()[0]
-            y += 50
-            self.tip_frame.MoveXY(x, y)
+            frame_x, frame_y = self.frame.GetPositionTuple()
+            frame_w, frame_h = self.frame.GetSizeTuple()
+            tip_w, tip_h = self.tip_frame.GetSizeTuple()
+            self.tip_frame.MoveXY(frame_x + frame_w - tip_w, frame_y + 50)
             self.tip_frame.Show()
 
 
@@ -424,22 +385,37 @@
         return '\n'.join(res[1:]).strip()
 
 
-    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
-
-
     def selectDirectives(self, directives):
-        self.dir_list.selectDirectives(directives)
+        self.fbook.all.dir_list.selectDirectives(directives)
 
     def ensureDirectiveVisible(self, directive):
-        self.dir_list.ensureDirectiveVisible(directive)
+        self.fbook.all.dir_list.ensureDirectiveVisible(directive)
+
+
+class FilesNotebook:
+
+    def __init__(self, gui, notebook):
+        self.gui = gui
+        self.notebook = notebook
+        panel = self.gui.resources.LoadPanel(self.notebook, 'list_panel')
+        self.notebook.AddPage(panel, 'Project')
+        self.all = AllDirectivesView(self.gui, panel)
+        
+
+class AllDirectivesView:
+
+    def __init__(self, gui, panel):
+        self.gui = gui
+        self.panel = panel
+
+        self.filter = Filter(gui, xrc.XRCCTRL(panel, 'filter_panel'))
+        # Replace the directive list with a DirectiveList instance
+        old_dir_list = xrc.XRCCTRL(panel, 'dir_list')
+        parent = old_dir_list.GetParent()
+        id = old_dir_list.GetId()
+        old_dir_list.Destroy()
+        self.dir_list = DirectiveList(self.gui, parent, id)
+        parent.GetSizer().Add(self.dir_list, flag=wx.EXPAND)
 
 
 class DirectiveList(wx.ListCtrl, listctrl.ListCtrlAutoWidthMixin,
@@ -452,7 +428,6 @@
         self.directives = []  # list of directives, not reordered by sorting
         self.indexes = []  # list of directive indexes, reordered by sorting
 
-        self.filter = Filter(gui, xrc.XRCCTRL(self.gui.frame, 'filter_panel'))
         self.columns = columns.create_default_columns()
         self.SetImageList(self.gui.tiny_palette_images, wx.IMAGE_LIST_SMALL)
 
@@ -488,7 +463,7 @@
             index = self.indexes[item]
             selected.append(self.directives[index])
             item = self.GetNextSelected(item)
-        self.gui.book.populate(selected)
+        self.gui.pbook.populate(selected)
 
     def selectDirectives(self, selected):
         """Selects a specific set of directives.
@@ -510,7 +485,7 @@
                     self.SetItemState(i, flag, flag)
                 elif not want_sel and state:
                     self.SetItemState(i, 0, flag)
-            self.gui.book.populate(selected)
+            self.gui.pbook.populate(selected)
         finally:
             self.suppress_select_event = False
 
@@ -648,6 +623,81 @@
         evt.Skip()
 
 
+class PackageView:
+
+    def __init__(self, gui, tree):
+        self.gui = gui
+        self.tree = tree
+        self.tree.SetImageList(self.gui.small_palette_images)
+
+    def populate(self):
+        self.tree.DeleteAllItems()
+        if self.gui.project is None:
+            return
+
+        images = self.gui.small_palette_images
+        root = self.tree.AddRoot('')
+        items = self.gui.project.packages.items()
+        items.sort()
+        file_image = images.get('zcmlfile', -1)
+        pkg_image = images.get('package', -1)
+        for package, filenames in items:
+            pkgid = self.tree.AppendItem(
+                root, package or '<base directory>', image=pkg_image)
+            filenames.sort()
+            for filename in filenames:
+                if package:
+                    label = os.path.basename(filename)
+                else:
+                    label = self.gui.project.shortenPath(filename)
+                self.tree.AppendItem(pkgid, label, image=file_image)
+
+
+class IncludeView:
+
+    def __init__(self, gui, tree):
+        self.gui = gui
+        self.tree = tree
+        self.tree.SetImageList(self.gui.small_palette_images)
+
+    def populate(self):
+        self.tree.DeleteAllItems()
+        if self.gui.project is None:
+            return
+
+        images = self.gui.small_palette_images
+        root = self.tree.AddRoot('')
+        todo = [(root, self.gui.project.root_config)]
+        while todo:
+            parent, cfg = todo.pop(0)
+            label = "%s" % os.path.basename(cfg.filename)
+            data = wx.TreeItemData(cfg)
+            image = images.get('zcmlfile', -1)
+            child = self.tree.AppendItem(parent, label, image=image, data=data)
+
+            for inc in cfg.includes:
+                data = wx.TreeItemData(inc)
+                label = inc.getAbbreviatedFileSpec()
+                image_name = '%s_%s' % (
+                    inc.override and 'includeoverride' or 'include',
+                    inc.glob and 'glob' or 'one'
+                    )
+                image = images.get(image_name, -1)
+
+                gchild = self.tree.AppendItem(
+                    child, label, image=image, data=data)
+                for fn in inc.listFiles():
+                    cfg = self.gui.project.files[fn]
+                    todo.append((gchild, cfg))
+
+        # expand the visible roots
+        child, cookie = self.tree.GetFirstChild(root)
+        while child:
+            self.tree.Expand(child)
+            child, cookie = self.tree.GetNextChild(root, cookie)
+        
+
+
 class Filter:
     """The panel for controlling filtering"""
 

Modified: z3/zopejam/trunk/src/zopejam/propbook.py
==============================================================================
--- z3/zopejam/trunk/src/zopejam/propbook.py	(original)
+++ z3/zopejam/trunk/src/zopejam/propbook.py	Tue Jul 26 08:54:05 2005
@@ -5,6 +5,7 @@
 """Zope Jam properties notebook
 """
 
+import os
 import wx
 import wx.grid
 from wx import xrc
@@ -34,6 +35,9 @@
         self.source_page = wx.Panel(self.notebook)
         self.notebook.AddPage(self.source_page, "Source")
 
+        self.reports_page = wx.Panel(self.notebook)
+        self.notebook.AddPage(self.reports_page, "Reports")
+
     def populate(self, directives):
         self.pedit.populate(directives)
         self.pgrid.populate(directives)
@@ -78,7 +82,7 @@
             self.directive = None
             self.addLabel(
                 "More than one directive is selected.  "
-                "Use the grid tab to manage multiple directives.")
+                "Use the grid tab to edit multiple directives.")
         self.panel.Layout()
 
     def addLabel(self, text, error=False):
@@ -88,72 +92,89 @@
         self.panel.GetSizer().Add(label, flag=wx.EXPAND|wx.ALL, border=4)
 
     def addHeader(self):
-        win_bg = self.win.GetBackgroundColour()
-        bg = wx.Colour(
-            win_bg.Red() * 9 / 10,
-            win_bg.Green() * 9 / 10,
-            win_bg.Blue() * 9 / 10)
-
-        sizer = wx.FlexGridSizer(rows=0, cols=2, vgap=4, hgap=4)
-        self.win.GetSizer().Add(sizer, flag=wx.EXPAND|wx.ALL, border=4)
-        sizer.AddGrowableCol(1)
-
-        label = wx.StaticText(self.win, -1, "Source File")
-        sizer.Add(label, flag=wx.ALIGN_CENTER_VERTICAL)
-
-        if self.directive.element is not None:
-            cfg = self.directive.element.config_file
-            fn = cfg.getAbbreviatedFilename()
-            if cfg.filename not in fn:
-                fn += '  -  %s' % cfg.filename
-        else:
-            fn = ''
-        ctrl = wx.TextCtrl(
-            self.win, -1, fn, style=wx.NO_BORDER|wx.TE_READONLY)
-        ctrl.SetBackgroundColour(bg)
-        sizer.Add(ctrl, flag=wx.EXPAND)
-
-        label = wx.StaticText(self.win, -1, "Directive")
-        sizer.Add(label, flag=wx.ALIGN_CENTER_VERTICAL)
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.win.GetSizer().Add(sizer, flag=wx.ALL, border=4)
 
         type_name = self.directive.getAbbreviatedTypeName()
-        full = self.directive.getTypeName()
-        if type_name != full:
-            type_name += '  -  %s' % full
-        ctrl = wx.TextCtrl(
-            self.win, -1, type_name, style=wx.NO_BORDER|wx.TE_READONLY)
-        ctrl.SetBackgroundColour(bg)
-        sizer.Add(ctrl, flag=wx.EXPAND)
-
+        def getTypePopup():
+            return 'about %s <a href="#">...</a>' % type_name
+        label = StaticTextWithPopup(self.win, -1, type_name, getTypePopup)
+        label.SetFont(self.gui.bold_font)
+        sizer.Add(label)
+
+        label = wx.StaticText(self.win, -1, ' in file ')
+        sizer.Add(label)
+
+        cfg = self.directive.element.config_file
+        fn = cfg.getAbbreviatedFilename(trim_default=False)
+        def getFilenamePopup():
+            return 'about %s <a href="#">...</a>' % fn
+        label = StaticTextWithPopup(self.win, -1, fn, getFilenamePopup)
+        label.SetFont(self.gui.bold_font)
+        sizer.Add(label)
+
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.win.GetSizer().Add(
+            sizer, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM, border=4)
+        lines = self.info.doc.lstrip().split('\n')
+        title_lines = []
+        for line in lines:
+            line = line.strip()
+            if not line:
+                break
+            title_lines.append(line)
+        title = ' '.join(title_lines)
+        def getSchemaPopup():
+            return 'about %s <a href="#">...</a>' % self.info.name
+        label = StaticTextWithPopup(self.win, -1, title, getSchemaPopup)
+        label.SetFont(self.gui.italic_font)
+        sizer.Add(label)
 
     def addFields(self):
-        sizer = wx.FlexGridSizer(rows=0, cols=4, vgap=4, hgap=8)
+        sizer = wx.FlexGridSizer(rows=0, cols=3, vgap=4, hgap=8)
         self.win.GetSizer().Add(sizer, flag=wx.EXPAND|wx.ALL, border=4)
-        sizer.AddGrowableCol(2)
+        sizer.AddGrowableCol(1, 1)
+        sizer.AddGrowableCol(2, 1)
 
         fields = self.info.getAllFields().items()
         # Show required fields first, then order by name
-        ordered = [(v.required and 1 or 2, k, v) for k, v in fields]
+        ordered = [(f.spec.required and 1 or 2, k, f) for k, f in fields]
         ordered.sort()
-        for sort_key, name, field in ordered:
+        required_color = wx.Colour(127, 0, 0)
+        data = self.directive.element.data
+        for sort_key, name, field_info in ordered:
+            field = field_info.spec
             xml_attr = name
             if xml_attr.endswith('_'):
                 xml_attr = xml_attr[:-1]
-            value = self.directive.element.data.get(xml_attr, '')
-
-            label = wx.StaticText(
-                self.win, -1, field.required and '*' or '')
-            sizer.Add(label)
 
-            label = wx.StaticText(self.win, -1, xml_attr)
-            sizer.Add(label)
+            if field.required:
+                s = '%s *' % xml_attr
+            else:
+                s = xml_attr
+            box = wx.CheckBox(self.win, -1, s)
+            if field.required:
+                box.SetForegroundColour(required_color)
+            if data.has_key(xml_attr):
+                box.SetValue(True)
+            sizer.Add(box, flag=wx.EXPAND|wx.ALIGN_CENTRE_VERTICAL)
 
+            value = data.get(xml_attr, '')
             edit = wx.TextCtrl(self.win, -1, value)
-            sizer.Add(edit, flag=wx.EXPAND)
+            sizer.Add(edit, flag=wx.EXPAND|wx.ALIGN_CENTRE_VERTICAL)
 
-            label = wx.StaticText(self.win, -1, field.title)
-            sizer.Add(label)
-            
+            def getFieldPopup():
+                return 'about %s <a href="#">...</a>' % name
+            label = StaticTextWithPopup(
+                self.win, -1, field.title, getFieldPopup)
+            label.SetFont(self.gui.italic_font)
+            lines = [field.title]
+            if field.description:
+                lines.append(self.gui.join_lines(field.description))
+            lines.append('(See %s.%s)' % (
+                field_info.schema_info.name, field_info.name))
+            label.SetToolTip(wx.ToolTip('\n\n'.join(lines)))
+            sizer.Add(label, flag=wx.ALIGN_CENTRE_VERTICAL)
 
 
 class PropertyGrid:
@@ -320,6 +341,13 @@
 
     def populate(self, directives):
         self.directives = directives
+        self.columns = [
+            columns.SourceFile(),
+            columns.DirectiveType(),
+            ]
+
+        # Add a column for every schema-defined attribute in any
+        # selected directive.
         ifaces = {}  # { name -> InterfaceInfo }
         for d in directives:
             t = d.getType()
@@ -333,10 +361,6 @@
             fields.update(info.fields)
         names = fields.keys()
         names.sort()
-        self.columns = [
-            columns.SourceFile(),
-            columns.DirectiveType(),
-            ]
         for name in names:
             self.columns.append(columns.SchemaAttribute(name))
 
@@ -368,3 +392,50 @@
         a = self.cell_attrs[flags]
         a.IncRef()
         return a
+
+
+class StaticTextWithPopup(wx.Panel):
+
+    def __init__(self, parent, id, text, get_popup_text,
+                 normal_color=wx.BLACK, hover_color=wx.BLUE):
+        wx.Panel.__init__(self, parent, id)
+        self.hovering = False
+        self.normal_color = normal_color
+        self.hover_color = hover_color
+        self.get_popup_text = get_popup_text
+
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        self.SetSizer(sizer)
+        self.ctrl = wx.StaticText(self, -1, text)
+        self.ctrl.SetForegroundColour(self.normal_color)
+        sizer.Add(self.ctrl, flag=wx.EXPAND)
+        self.Bind(wx.EVT_ENTER_WINDOW, self.onEnter)
+        self.Bind(wx.EVT_LEAVE_WINDOW, self.onLeave)
+        self.ctrl.Bind(wx.EVT_LEFT_DOWN, self.onLeftDown)
+        self.Bind(wx.EVT_PAINT, self.onPaint)
+        self.pen = wx.Pen(self.hover_color, style=wx.SHORT_DASH)
+
+    def SetFont(self, font):
+        self.ctrl.SetFont(font)
+
+    def onEnter(self, event):
+        self.hovering = True
+        self.ctrl.SetForegroundColour(self.hover_color)
+        self.Refresh()
+
+    def onLeave(self, event):
+        self.hovering = False
+        self.ctrl.SetForegroundColour(self.normal_color)
+        self.Refresh()
+
+    def onPaint(self, event):
+        dc = wx.PaintDC(self)
+        if self.hovering:
+            w, h = self.GetSizeTuple()
+            dc.SetPen(self.pen)
+            dc.DrawLine(0, h - 1, w, h - 1)
+
+    def onLeftDown(self, event):
+        #TODO
+        print self.get_popup_text()
+

Modified: z3/zopejam/trunk/src/zopejam/resources.xrc
==============================================================================
--- z3/zopejam/trunk/src/zopejam/resources.xrc	(original)
+++ z3/zopejam/trunk/src/zopejam/resources.xrc	Tue Jul 26 08:54:05 2005
@@ -100,6 +100,15 @@
         <bitmap>icons/menu/launch.png</bitmap>
       </object>
       <object class="separator"/>
+      <object class="wxMenuItem" name="package_view">
+        <label>&amp;Packages and files</label>
+        <bitmap>icons/palette/16x16/package.png</bitmap>
+      </object>
+      <object class="wxMenuItem" name="include_view">
+        <label>&amp;Include tree</label>
+        <bitmap>icons/palette/16x16/include_one.png</bitmap>
+      </object>
+      <object class="separator"/>
       <object class="wxMenuItem" name="restart">
         <label>&amp;Restart</label>
         <bitmap>icons/menu/bomb.png</bitmap>
@@ -200,97 +209,7 @@
               <growablerows>0</growablerows>
               <growablecols>0</growablecols>
               <object class="sizeritem">
-                <object class="wxNotebook" name="files_notebook">
-                  <object class="notebookpage">
-                    <label>Directives</label>
-                    <object class="wxPanel" name="">
-                      <object class="wxFlexGridSizer">
-                        <object class="sizeritem">
-                          <object class="wxFlexGridSizer">
-                            <cols>2</cols>
-                            <rows>2</rows>
-                            <object class="sizeritem">
-                              <object class="wxStaticText">
-                                <label>Filter:</label>
-                          </object>
-                              <flag>wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag>
-                              <border>4</border>
-                        </object>
-                            <object class="sizeritem">
-                              <object class="wxPanel" name="filter_panel">
-                                <object class="wxFlexGridSizer">
-                                  <cols>3</cols>
-                                  <object class="sizeritem">
-                                    <object class="wxStaticBitmap" name="filter_type">
-                                      <bitmap>icons/other/find.png</bitmap>
-                                </object>
-                                    <flag>wxALL|wxALIGN_CENTRE</flag>
-                                    <border>2</border>
-                              </object>
-                                  <object class="sizeritem">
-                                    <object class="wxTextCtrl" name="filter_expr">
-                                      <value>Entire Directive</value>
-                                      <style>wxTE_PROCESS_ENTER|wxNO_BORDER</style>
-                                </object>
-                                    <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag>
-                              </object>
-                                  <object class="sizeritem">
-                                    <object class="wxStaticBitmap" name="filter_clear">
-                                      <bitmap>icons/other/clear_left.png</bitmap>
-                                      <hidden>1</hidden>
-                                </object>
-                                    <flag>wxALL|wxALIGN_CENTRE</flag>
-                                    <border>2</border>
-                              </object>
-                                  <growablecols>1</growablecols>
-                                  <growablerows>0</growablerows>
-                                </object>
-                                <style>wxSUNKEN_BORDER</style>
-                                <bg>#FFFFFF</bg>
-                              </object>
-                              <flag>wxBOTTOM|wxRIGHT|wxEXPAND</flag>
-                              <border>1</border>
-                              <minsize>250, 22</minsize>
-                        </object>
-                          </object>
-                          <flag>wxALIGN_RIGHT</flag>
-                    </object>
-                        <cols>1</cols>
-                        <growablerows>1</growablerows>
-                        <growablecols>0</growablecols>
-                        <object class="sizeritem">
-                          <object class="wxPanel">
-                            <object class="wxFlexGridSizer">
-                              <cols>1</cols>
-                              <growablerows>0</growablerows>
-                              <growablecols>0</growablecols>
-                              <object class="sizeritem">
-                                <object class="wxListCtrl" name="dir_list">
-                                  <style>wxLC_REPORT | wxLC_VIRTUAL</style>
-                                  <bg>#FFFFFF</bg>
-                            </object>
-                                <flag>wxEXPAND</flag>
-                </object>
-                            </object>
-                          </object>
-                          <flag>wxEXPAND</flag>
-                        </object>
-                      </object>
-                    </object>
-              </object>
-                  <object class="notebookpage">
-                    <label>Packages</label>
-                    <object class="wxTreeCtrl" name="package_tree">
-                      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
-                    </object>
-                  </object>
-                  <object class="notebookpage">
-                    <label>Structure</label>
-                    <object class="wxTreeCtrl" name="structure_tree">
-                      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
-                    </object>
-                  </object>
-                </object>
+                <object class="wxNotebook" name="files_notebook"/>
                 <flag>wxBOTTOM|wxEXPAND</flag>
                 <border>1</border>
                       </object>
@@ -303,7 +222,7 @@
               <growablecols>0</growablecols>
               <object class="sizeritem">
                 <object class="wxNotebook" name="properties_notebook">
-                  <style></style>
+                  <style>wxNB_BOTTOM</style>
                 </object>
                 <flag>wxTOP|wxEXPAND</flag>
                 <border>1</border>
@@ -340,6 +259,112 @@
     </object>
     <centered>1</centered>
   </object>
+  <object class="wxPanel" name="list_panel">
+    <object class="wxFlexGridSizer">
+      <object class="sizeritem">
+        <object class="wxFlexGridSizer">
+          <cols>2</cols>
+          <object class="sizeritem">
+            <object class="wxBoxSizer">
+              <orient>wxHORIZONTAL</orient>
+              <object class="sizeritem">
+                <object class="wxStaticText">
+                  <label>View:</label>
+                </object>
+                <flag>wxLEFT|wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag>
+                <border>4</border>
+              </object>
+              <object class="sizeritem">
+                <object class="wxChoice" name="view_choice">
+                  <content>
+                    <item>All</item>
+                    <item>Changed</item>
+                    <item>Errors</item>
+                  </content>
+                </object>
+                <flag>wxALIGN_CENTRE_VERTICAL</flag>
+              </object>
+            </object>
+          </object>
+          <object class="sizeritem">
+            <object class="wxBoxSizer">
+              <object class="sizeritem">
+                <object class="wxStaticText">
+                  <label>Filter:</label>
+                          </object>
+                <flag>wxLEFT|wxRIGHT|wxALIGN_CENTRE_VERTICAL</flag>
+                <border>4</border>
+                        </object>
+              <object class="sizeritem">
+                <object class="wxPanel" name="filter_panel">
+                  <object class="wxFlexGridSizer">
+                    <cols>3</cols>
+                    <object class="sizeritem">
+                      <object class="wxStaticBitmap" name="filter_type">
+                        <bitmap>icons/other/find.png</bitmap>
+                                </object>
+                      <flag>wxALL|wxALIGN_CENTRE</flag>
+                      <border>2</border>
+                              </object>
+                    <object class="sizeritem">
+                      <object class="wxTextCtrl" name="filter_expr">
+                        <value>Entire Directive</value>
+                        <style>wxTE_PROCESS_ENTER|wxNO_BORDER</style>
+                                </object>
+                      <flag>wxEXPAND|wxALIGN_CENTRE_VERTICAL</flag>
+                              </object>
+                    <object class="sizeritem">
+                      <object class="wxStaticBitmap" name="filter_clear">
+                        <bitmap>icons/other/clear_left.png</bitmap>
+                        <hidden>1</hidden>
+                                </object>
+                      <flag>wxALL|wxALIGN_CENTRE</flag>
+                      <border>2</border>
+                              </object>
+                    <growablecols>1</growablecols>
+                    <growablerows>0</growablerows>
+                  </object>
+                  <style>wxSUNKEN_BORDER</style>
+                  <bg>#FFFFFF</bg>
+                </object>
+                <flag>wxBOTTOM|wxRIGHT|wxEXPAND</flag>
+                <border>1</border>
+                <minsize>300, 22</minsize>
+                        </object>
+              <orient>wxHORIZONTAL</orient>
+            </object>
+            <flag>wxALIGN_RIGHT|wxALIGN_CENTRE_VERTICAL</flag>
+                    </object>
+          <growablecols>0</growablecols>
+          <growablecols>1</growablecols>
+        </object>
+        <flag>wxTOP|wxBOTTOM|wxEXPAND</flag>
+        <border>2</border>
+      </object>
+      <cols>1</cols>
+      <growablerows>1</growablerows>
+      <growablecols>0</growablecols>
+      <object class="sizeritem">
+        <object class="wxPanel">
+          <object class="wxFlexGridSizer">
+            <cols>1</cols>
+            <growablerows>0</growablerows>
+            <growablecols>0</growablecols>
+            <object class="sizeritem">
+              <object class="wxListCtrl" name="dir_list">
+                <style>wxLC_REPORT|wxNO_BORDER|wxLC_VIRTUAL</style>
+                <bg>#FFFFFF</bg>
+                            </object>
+              <flag>wxEXPAND</flag>
+                </object>
+          </object>
+          <style>wxSUNKEN_BORDER</style>
+        </object>
+        <flag>wxBOTTOM|wxEXPAND</flag>
+        <border>1</border>
+      </object>
+    </object>
+  </object>
   <object class="wxDialog" name="about_dialog">
     <title>About Zope Jam</title>
     <object class="wxBoxSizer">
@@ -424,7 +449,6 @@
       </object>
     </object>
     <centered>1</centered>
-    <bg>#FFFFFF</bg>
   </object>
   <object class="wxDialog" name="openproject_dialog">
     <title>Open Project</title>
@@ -714,7 +738,7 @@
             <cols>1</cols>
             <object class="sizeritem">
               <object class="wxTextCtrl" name="tip_text">
-                <value>abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef </value>
+                <value></value>
                 <style>wxTE_MULTILINE|wxNO_BORDER</style>
                 <bg>#FFFFC0</bg>
         </object>
@@ -767,4 +791,18 @@
       <accel>Ctrl+D</accel>
     </object>
   </object>
+  <object class="wxFrame" name="package_frame">
+    <title>Packages and Files</title>
+    <object class="wxTreeCtrl" name="tree">
+      <size>350, 500</size>
+      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
+    </object>
+  </object>
+  <object class="wxFrame" name="include_frame">
+    <title>Include Tree</title>
+    <object class="wxTreeCtrl" name="tree">
+      <size>350, 500</size>
+      <style>wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxSUNKEN_BORDER</style>
+    </object>
+  </object>
 </resource>


More information about the z3-checkins mailing list