[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>&Packages and files</label>
+ <bitmap>icons/palette/16x16/package.png</bitmap>
+ </object>
+ <object class="wxMenuItem" name="include_view">
+ <label>&Include tree</label>
+ <bitmap>icons/palette/16x16/include_one.png</bitmap>
+ </object>
+ <object class="separator"/>
<object class="wxMenuItem" name="restart">
<label>&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