1 |
# |
# |
|
# Copyright 2001 Free Software Foundation |
|
|
# |
|
2 |
# This file is part of GNU Enterprise. |
# This file is part of GNU Enterprise. |
3 |
# |
# |
4 |
# GNU Enterprise is free software; you can redistribute it |
# GNU Enterprise is free software; you can redistribute it |
16 |
# write to the Free Software Foundation, Inc., 59 Temple Place |
# write to the Free Software Foundation, Inc., 59 Temple Place |
17 |
# - Suite 330, Boston, MA 02111-1307, USA. |
# - Suite 330, Boston, MA 02111-1307, USA. |
18 |
# |
# |
19 |
|
# Copyright 2001-2002 Free Software Foundation |
20 |
|
# |
21 |
# FILE: |
# FILE: |
22 |
# TreeView.py |
# TreeView.py |
23 |
# |
# |
25 |
# |
# |
26 |
# NOTES: |
# NOTES: |
27 |
# |
# |
28 |
# TODO: all the SetItemImage lines in this file have been commented out as on win32 it was segfaulting |
# TODO: * all the SetItemImage lines in this file have been commented |
29 |
|
# out as on win32 it was segfaulting |
30 |
|
# * make TreeView more stable, at the moment it fires OnTreeItemSelected |
31 |
|
# events while beeing destroyed, which is causing segfaults on wxPy<2.3 |
32 |
|
# (wxPy 2.3 raises exceptions) when TreeView is not the first tool to |
33 |
|
# be removed |
34 |
|
|
35 |
import sys, os |
import sys, os |
36 |
from wxPython.wx import * |
from wxPython.wx import * |
37 |
from gnue.common import GDebug |
from gnue.common import GDebug, GTrigger |
38 |
from gnue.forms import GFForm, GFObjects, GFTrigger, GFLibrary |
from gnue.forms import GFForm, GFObjects, GFLibrary |
39 |
from PopupMenu import ObjectMenu |
from PopupMenu import ObjectMenu |
40 |
from Icons import treeIconMap, treeIconList |
from Icons import treeIconMap, treeIconList |
41 |
|
|
44 |
wxTreeCtrl.__init__(self, parent, wxNewId(), |
wxTreeCtrl.__init__(self, parent, wxNewId(), |
45 |
style=wxTR_HAS_BUTTONS|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT) |
style=wxTR_HAS_BUTTONS|wxTR_EDIT_LABELS|wxTR_HAS_VARIABLE_ROW_HEIGHT) |
46 |
self.instance = instance |
self.instance = instance |
47 |
self.form = form |
self.rootObject = form |
48 |
self.__handler = None |
self._handler = None |
49 |
|
|
50 |
self.SetImageList(treeIconList) |
self.SetImageList(treeIconList) |
51 |
|
|
53 |
EVT_TREE_END_LABEL_EDIT(self, self.GetId(), self.OnTreeLabelEditEnd) |
EVT_TREE_END_LABEL_EDIT(self, self.GetId(), self.OnTreeLabelEditEnd) |
54 |
EVT_TREE_SEL_CHANGED(self, self.GetId(), self.OnTreeItemSelected) |
EVT_TREE_SEL_CHANGED(self, self.GetId(), self.OnTreeItemSelected) |
55 |
|
|
56 |
self.form._treeItem = self.AddRoot("Form") |
self.rootObject._treeItem = self.AddRoot(self.rootDescr) |
|
self.form._treeItemFormProperties = \ |
|
|
self.AppendItem(self.form._treeItem, "Properties") |
|
|
self.SetItemImage(self.form._treeItemFormProperties, treeIconMap['properties']) |
|
|
self.form._treeItemImportedLibraries = \ |
|
|
self.AppendItem(self.form._treeItem, "Imported Libraries") |
|
|
self.SetItemImage(self.form._treeItemImportedLibraries, treeIconMap['import']) |
|
|
self.form._treeItemDataSources = \ |
|
|
self.AppendItem(self.form._treeItem, "Data Sources") |
|
|
self.SetItemImage(self.form._treeItemDataSources, treeIconMap['datasource']) |
|
|
self.form._treeItemNamedTriggers = \ |
|
|
self.AppendItem(self.form._treeItem, "Shared Triggers") |
|
|
self.SetItemImage(self.form._treeItemNamedTriggers, treeIconMap['trigger']) |
|
|
self.form._treeItemPageLayout = \ |
|
|
self.AppendItem(self.form._treeItem, "Page Layout") |
|
|
self.SetItemImage(self.form._treeItemPageLayout, treeIconMap['page']) |
|
|
|
|
|
self.SetPyData(self.form._treeItem, self.form) |
|
|
self.SetPyData(self.form._treeItemFormProperties, ObjectMenu(self.instance,None)) |
|
|
self.SetPyData(self.form._treeItemDataSources, ObjectMenu(self.instance,None)) |
|
|
self.SetPyData(self.form._treeItemNamedTriggers, ObjectMenu(self.instance,None)) |
|
|
self.SetPyData(self.form._treeItemPageLayout, ObjectMenu(self.instance,None)) |
|
|
|
|
|
form.walk(self.inventoryObject) |
|
57 |
|
|
58 |
EVT_RIGHT_DOWN(self, self.OnRightDown) |
EVT_RIGHT_DOWN(self, self.OnRightDown) |
59 |
EVT_LEFT_DCLICK(self, self.OnEditProperties) |
EVT_LEFT_DCLICK(self, self.OnEditProperties) |
60 |
|
|
61 |
|
def AppendItem(self, parent, description): |
|
def inventoryObject (self, object): |
|
|
if object != self.form: |
|
|
icon = 'properties' |
|
|
if isinstance(object, GFObjects.GFOptions) and \ |
|
|
object._parent == self.form: |
|
|
object._treeItem = self.form._treeItemFormProperties |
|
|
icon = 'properties' |
|
|
else: |
|
|
parentTreeItem = object._parent._treeItem |
|
|
if isinstance(object, GFTrigger.GFTrigger) and \ |
|
|
object.type == 'NAMED': |
|
|
parentTreeItem = self.form._treeItemNamedTriggers |
|
|
icon = 'trigger' |
|
|
elif isinstance(object, GFTrigger.GFTrigger): |
|
|
|
|
|
if not hasattr(object._parent,'_treeItemTrigger'): |
|
|
object._parent._treeItemTrigger = \ |
|
|
self.AppendItem(object._parent._treeItem, "Events") |
|
|
#self.SetItemImage(object._parent._treeItemTrigger, treeIconMap['trigger']) |
|
|
|
|
|
|
|
|
parentTreeItem = object._parent._treeItemTrigger |
|
|
icon = 'trigger' |
|
|
elif isinstance(object, GFObjects.GFDataSource) or \ |
|
|
isinstance(object, GFObjects.GFDatabase): |
|
|
parentTreeItem = self.form._treeItemDataSources |
|
|
icon = 'datasource' |
|
|
elif isinstance(object, GFObjects.GFPage) and \ |
|
|
object._parent == self.form: |
|
|
parentTreeItem = self.form._treeItemPageLayout |
|
|
icon = 'page' |
|
|
elif object._type in ('GFBlock',): |
|
|
icon = 'block' |
|
|
elif object._type in ('GFOption',): |
|
|
icon = 'properties' |
|
|
elif object._type in ('GFEntry',): |
|
|
icon = 'entry' |
|
|
elif len(object._type) >= 8 and \ |
|
|
object._type[:8] == 'GFImport': |
|
|
icon = 'import' |
|
|
elif object.findParentOfType('GFPage') != None: |
|
|
icon = 'pagewidget' |
|
|
|
|
|
|
|
|
object._treeItem = self.AppendItem(parentTreeItem, |
|
|
"%s" % object.getDescription()) |
|
|
self.SetPyData(object._treeItem, object) |
|
|
#self.SetItemImage(object._treeItem, treeIconMap[icon]) |
|
|
|
|
|
|
|
|
def AppendItem(self, parent, description): |
|
62 |
rv = wxTreeCtrl.AppendItem(self, parent, description) |
rv = wxTreeCtrl.AppendItem(self, parent, description) |
63 |
return rv |
return rv |
64 |
|
|
65 |
def onSetCurrentObject (self, object, handler): |
def onSetCurrentObject (self, object, handler): |
66 |
if object == None: |
if object == None: |
67 |
return |
return |
68 |
if handler != __name__: |
if handler != __name__: |
69 |
self.EnsureVisible(object._treeItem) |
self.EnsureVisible(object._treeItem) |
70 |
self.__handler = handler |
self._handler = handler |
71 |
self.SelectItem(object._treeItem) |
self.SelectItem(object._treeItem) |
72 |
self.__handler = None |
self._handler = None |
73 |
|
|
74 |
def onCreateObject (self, object, handler): |
def onCreateObject (self, object, handler): |
75 |
if object == None: |
if object == None: |
76 |
return |
return |
77 |
if handler != __name__: |
if handler != __name__: |
78 |
GDebug.printMesg(4,"Adding %s (%s)" % (object.name, object._type)) |
try: |
79 |
|
GDebug.printMesg(4,"Adding %s (%s)" % (object.name, object._type)) |
80 |
|
except: |
81 |
|
pass |
82 |
self.inventoryObject(object) |
self.inventoryObject(object) |
83 |
|
|
84 |
def onModifyObject (self, object, handler, modifications): |
def onModifyObject (self, object, handler, modifications): |
85 |
if object == None: |
if object == None: |
86 |
return |
return |
87 |
if handler != __name__: |
if handler != __name__: |
88 |
for modification in modifications: |
for modification in modifications: |
89 |
attribute, value = modification |
attribute, value = modification |
90 |
if attribute == 'name' and object != self.form: |
if attribute == 'name' and object != self.rootObject: |
91 |
self.SetItemText(object._treeItem, object.getDescription()) |
self.SetItemText(object._treeItem, object.getDescription()) |
92 |
|
|
93 |
def onDeleteObject (self, object, handler): |
def onDeleteObject (self, object, handler): |
94 |
if object == None: |
if object == None: |
95 |
return |
return |
96 |
if hasattr(object, '_treeItemTrigger'): |
if hasattr(object, '_treeItemTrigger'): |
97 |
self.Delete(object._treeItemTrigger) |
self.Delete(object._treeItemTrigger) |
98 |
if hasattr(object, '_treeItem'): |
if hasattr(object, '_treeItem'): |
99 |
if self.GetSelection() == object._treeItem: |
if self.GetSelection() == object._treeItem: |
100 |
self.SelectItem(self.GetItemParent(object._treeItem)) |
self.SelectItem(self.GetItemParent(object._treeItem)) |
101 |
self.Delete(object._treeItem) |
self.Delete(object._treeItem) |
102 |
self.Refresh() |
self.Refresh() |
103 |
|
|
104 |
def OnTreeLabelEdit(self, event): |
def OnTreeLabelEdit(self, event): |
105 |
event.Veto() |
event.Veto() |
106 |
|
|
107 |
def OnTreeLabelEditEnd(self, event): |
def OnTreeLabelEditEnd(self, event): |
108 |
pass |
pass |
109 |
|
|
110 |
def OnTreeItemSelected(self, event): |
def OnTreeItemSelected(self, event): |
111 |
if self.__handler == None: |
if self._handler == None: |
112 |
object = self.GetPyData(event.GetItem()) |
object = self.GetPyData(event.GetItem()) |
113 |
if object != None and not isinstance(object, ObjectMenu): |
if object != None and not isinstance(object, ObjectMenu): |
114 |
self.instance.onSetCurrentObject(object, __name__) |
self.instance.onSetCurrentObject(object, __name__) |
115 |
else: |
else: |
116 |
self.instance.onSetCurrentObject(None, __name__) |
self.instance.onSetCurrentObject(None, __name__) |
117 |
|
|
118 |
|
|
119 |
def OnRightDown(self, event): |
def OnRightDown(self, event): |
120 |
id, flags = self.HitTest(event.GetPosition()) |
id, flags = self.HitTest(event.GetPosition()) |
121 |
object = self.GetPyData(id) |
object = self.GetPyData(id) |
122 |
self.EnsureVisible(id) |
self.EnsureVisible(id) |
123 |
self.SelectItem(id) |
self.SelectItem(id) |
124 |
if isinstance(object, ObjectMenu): |
if isinstance(object, ObjectMenu): |
125 |
self.PopupMenu(object, event.GetPosition()) |
self.PopupMenu(object, event.GetPosition()) |
126 |
elif object != None: |
elif object != None: |
127 |
self.PopupMenu(object._popupMenu, event.GetPosition()) |
self.PopupMenu(object._popupMenu, event.GetPosition()) |
128 |
|
|
129 |
|
|