root/trunk/ide/ClassDesignerPemForm.py

Revision 4388, 9.1 kB (checked in by ed, 3 months ago)

Updated for the name change from dFoldPanelBar to dSlidePanelControl.

Began implementing suppport for dSlidePanelControl in the Class Designer.

  • Property svn:eol-style set to native
Line 
1 # -*- coding: utf-8 -*-
2 import dabo
3 from dabo.dLocalize import _
4 import dabo.dEvents as dEvents
5 from ClassDesignerPropSheet import PropSheet
6 from ClassDesignerTreeSheet import TreeSheet
7 from ClassDesignerMethodSheet import MethodSheet
8 from ClassDesignerObjectPropertySheet import ObjectPropertySheet
9 from ClassDesignerComponents import LayoutPanel
10 from ClassDesignerComponents import LayoutSpacerPanel
11 from ClassDesignerComponents import LayoutSizer
12 from ClassDesignerComponents import LayoutGridSizer
13 import ClassDesignerMenu
14
15 if __name__ == "__main__":
16     dabo.ui.loadUI("wx")
17
18
19 class PemForm(dabo.ui.dForm):
20     """This form contains the PropSheet, the MethodSheet, and
21     the Object Tree.
22     """
23     def afterSetMenuBar(self):
24         self.ShowStatusBar = False
25         ClassDesignerMenu.mkDesignerMenu(self)
26
27
28     def onMenuOpen(self, evt):
29         self.Controller.menuUpdate(evt, self.MenuBar)
30
31
32     def afterInit(self):
33         self._defaultLeft = 610
34         self._defaultTop = 50
35         self._defaultWidth = 370
36         self._defaultHeight = 580
37
38         self.Caption = _("Object Info")
39         pnl = dabo.ui.dPanel(self)
40         self.Sizer.append1x(pnl)
41         sz = pnl.Sizer = dabo.ui.dSizer("v")
42
43         txt = dabo.ui.dTextBox(pnl, ReadOnly=True, RegID="txtObj")
44         hsz = dabo.ui.dSizer("h")
45         hsz.append1x(txt)
46         self.treeBtn = dabo.ui.dToggleButton(pnl, Height=txt.Height,
47                 Width=txt.Height, Caption="", Picture="downTriangleBlack",
48                 DownPicture="upTriangleBlack")
49         self.treeBtn.bindEvent(dEvents.Hit, self.onToggleTree)
50         hsz.append(self.treeBtn)
51
52         brdr = 10
53         sz.appendSpacer(brdr)
54         sz.DefaultBorderLeft = sz.DefaultBorderRight = True
55         sz.DefaultBorder = brdr
56         sz.append(hsz, "x")
57         sz.appendSpacer(5)
58        
59         self.mainPager = mp = dabo.ui.dPageFrameNoTabs(pnl, PageClass=dabo.ui.dPanel)
60         mp.PageCount=2
61         mp.bindEvent(dEvents.PageChanged, self.onMainPageChanged)
62         sz.append1x(mp)
63         sz.appendSpacer(brdr)
64         self.pemPage = pp = mp.Pages[0]
65         self.treePage = tp = mp.Pages[1]
66         psz = pp.Sizer = dabo.ui.dSizer("v")
67         tsz = tp.Sizer = dabo.ui.dSizer("v")
68
69         dabo.ui.dSlidePanelControl(pp, SingleClick=True, Singleton=True,
70                 CollapseToBottom=True, RegID="mainContainer")
71         psz.append1x(self.mainContainer)
72         # This helps restore the sash position on the prop grid page
73         self._propSashPct = 80
74         # Bind to panel changes
75         self.mainContainer.bindEvent(dEvents.SlidePanelChange, self.onPanelChange)
76         dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Properties"), RegID="propPage",
77                 CaptionForeColor="blue")
78         dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Methods"), RegID="methodPage",
79                 CaptionForeColor="blue")
80         dabo.ui.dSlidePanel(self.mainContainer, Caption=_("Custom Properties"), RegID="objPropPage",
81                 CaptionForeColor="blue")
82
83         # Add the PropSheet
84         ps = PropSheet(self.propPage, RegID="_propSheet")
85         self.propPage.Sizer = dabo.ui.dSizer("v")
86         self.propPage.Sizer.appendSpacer(self.propPage.CaptionHeight)
87         self.propPage.Sizer.append1x(ps)
88        
89         # Create the MethodSheet
90         ms = MethodSheet(self.methodPage, RegID="_methodSheet")
91         self.methodPage.Sizer = dabo.ui.dSizer("v")
92         self.methodPage.Sizer.appendSpacer(self.methodPage.CaptionHeight)
93         self.methodPage.Sizer.append1x(ms)
94         self._methodList = ms.MethodList
95        
96         # Create the tree
97         self._tree = TreeSheet(tp)
98         tp.Sizer.append1x(self._tree, border=10)
99        
100         # Create the Object Properties sheet
101         ops = ObjectPropertySheet(self.objPropPage, RegID="_objPropSheet")
102         self.objPropPage.Sizer = dabo.ui.dSizer("v")
103         self.objPropPage.Sizer.appendSpacer(self.methodPage.CaptionHeight)
104         self.objPropPage.Sizer.append1x(ops)
105        
106         mp.SelectedPage = pp
107        
108         ps.Controller = ms.Controller = self._tree.Controller = ops.Controller = self.Controller
109         self.layout()
110         dabo.ui.callAfter(self.mainContainer.expand, self.propPage)
111
112    
113     def onToggleTree(self, evt):
114         self.mainPager.nextPage()
115        
116    
117     def onMainPageChanged(self, evt):
118         self.treeBtn.Value = self.mainPager.SelectedPage is self.treePage
119    
120
121     def hideTree(self):
122         self.mainPager.SelectedPage = self.pemPage
123        
124        
125     def onPanelChange(self, evt):
126         if evt.panel is self.propPage:
127             try:
128                 if evt.expanded:
129                     dabo.ui.setAfter(self._propSheet.mainSplit, "SashPercent", self._propSheet._sashPct)
130             except:
131                 # Probably isn't constructed yet
132                 pass
133
134
135     def onResize(self, evt):
136         try:
137             dabo.ui.callAfter(self.mainContainer.refresh)
138         except:
139             # 'mainContainer' might not be defined yet, so ignore
140             pass
141            
142        
143     def showPropPage(self):
144         self.mainPager.SelectedPage = self.pemPage
145         self.refresh()
146         self.propPage.Expanded = True
147         self.bringToFront()
148
149        
150     def showTreePage(self):
151         self.mainPager.SelectedPage = self.treePage
152         self.bringToFront()
153
154        
155     def showMethodsPage(self):
156         self.mainPager.SelectedPage = self.pemPage
157         self.methodPage.Expanded = True
158         self.bringToFront()
159    
160    
161     def select(self, obj):
162         """Called when the selected object changes. 'obj' will
163         be a list containing either a single object or multiple
164         objects. We then need to update the components of this
165         form appropriately.
166         """
167         mult = len(obj) > 1
168         if len(obj) == 0:
169             lbl = _(" -none- ")
170             ob = None
171         else:
172             ob = obj[0]
173             # If the selected object is an empty sizer slot, the way that this
174             # is passed along is a tuple containing the sizer item and its sizer,
175             # since there is no way to determine the sizer given the SizerItem.
176             isSpacer = isinstance(ob, LayoutSpacerPanel)
177             isSlot = isinstance(ob, LayoutPanel) and not isSpacer
178             isSizer = isinstance(ob, dabo.ui.dSizerMixin)
179             isColumn = isinstance(ob, dabo.ui.dColumn)
180             isNode = isinstance(ob, dabo.ui.dTreeView.getBaseNodeClass())
181             if isSlot or isSpacer:
182                 szItem = ob.ControllingSizerItem
183                 sz = ob.ControllingSizer
184             if isSizer:
185                 sz = ob
186             obRest = obj[1:]
187             # Determine the 'name' to display
188             if mult:
189                 lbl = _(" -multiple- ")
190             else:
191                 if isSlot or isSizer:
192                     ornt = sz.Orientation[0].lower()
193                     if ornt == "h":
194                         lbl = _("Horizontal")
195                     elif ornt == "v":
196                         lbl = _("Vertical")
197                     else:
198                         lbl = _("Grid")
199                     if isSlot:
200                         lbl += _(" Sizer Slot")
201                         if ornt in ("r", "c"):
202                             lbl += ": (%s, %s)" % sz.getGridPos(ob)
203                     else:
204                         if isinstance(ob, dabo.ui.dBorderSizer):
205                             lbl += _(" BorderSizer")
206                         else:
207                             lbl += _(" Sizer")
208                 elif isSpacer:
209                     spc = ob.Spacing
210                     if isinstance(sz, dabo.ui.dSizer):
211                         # We want the first position for vertical; second for horiz.
212                         isHoriz = sz.Orientation[0].lower() == "h"
213                         typ = (_("Vertical"), _("Horizontal"))[isHoriz]
214                     else:
215                         # Grid spacer; use both
216                         typ = _("Grid")
217                     lbl = "%s Spacer - (%s)" % (typ, spc)
218                 elif isColumn:
219                     lbl = "Column %s ('%s')" % (ob.Parent.Columns.index(ob)+1, ob.Caption)
220                 elif isNode:
221                     lbl = "TreeNode: ('%s')" % (ob.Caption)
222                 else:
223                     if hasattr(ob, "Name"):
224                         lbl = ob.Name
225                     else:
226                         lbl = str(ob.__class__)
227         self.txtObj.Value = lbl
228         self.PropSheet.select(obj)
229         self.MethodList.clear()
230         self._objPropSheet.select(obj)
231
232         if ob is not None:
233             # Get the events
234             evts = ob.DesignerEvents
235             # Get the dict of all events that have method code defined for them.
236             obEvtCode = self.Controller.getCodeForObject(ob)
237             codeEvents = nonCodeEvents = []
238             if obEvtCode is not None:
239                 codeEvents = obEvtCode.keys()
240             nonCodeEvents = [ev for ev in evts
241                     if ev not in codeEvents]
242             # Add the events with code first
243             for evt in codeEvents:
244                 newItem = self.MethodList.append(evt)
245                 self.MethodList.setItemBackColor(newItem, "lightblue")
246                
247             for evt in nonCodeEvents:
248                 newItem = self.MethodList.append(evt)
249                 self.MethodList.setItemBackColor(newItem, "lightgrey")
250         self.refresh()
251         self.layout()
252        
253
254     def _getController(self):
255         try:
256             return self._controller
257         except AttributeError:
258             self._controller = self.Application
259             return self._controller
260
261     def _setController(self, val):
262         if self._constructed():
263             self._controller = val
264         else:
265             self._properties["Controller"] = val
266
267
268     def _getMethodList(self):
269         return self._methodList
270
271     def _setMethodList(self, val):
272         self._methodList = val
273
274
275     def _getMethodSheet(self):
276         return self._methodSheet
277
278     def _setMethodSheet(self, val):
279         self._methodSheet = val
280
281
282     def _getObjectPropertySheet(self):
283         return self._objPropSheet
284
285     def _setObjectPropertySheet(self, val):
286         self._objPropSheet = val
287
288
289     def _getPropSheet(self):
290         return self._propSheet
291
292     def _setPropSheet(self, val):
293         self._propSheet = val
294
295
296     def _getTree(self):
297         return self._tree
298
299     def _setTree(self, val):
300         self._tree = val
301
302
303     Controller = property(_getController, _setController, None,
304             _("Object to which this one reports events  (object (varies))"))
305
306     MethodList = property(_getMethodList, _setMethodList, None,
307             _("""List control containing all available methods for the
308             selected object  (dListControl)"""))
309    
310     MethodSheet = property(_getMethodSheet, _setMethodSheet, None,
311             _("Reference to the panel containing the MethodList  (MethodSheet)"))
312    
313     ObjectPropertySheet = property(_getObjectPropertySheet,
314             _setObjectPropertySheet, None, _("""Reference to the panel
315             containing the ObjectPropertySheet  (ObjectPropertySheet)"""))
316    
317     Tree = property(_getTree, _setTree, None,
318             _("Reference to the contained object tree  (TreeSheet)"))
319
320     PropSheet = property(_getPropSheet, _setPropSheet, None,
321             _("Reference to the contained prop sheet  (PropSheet)"))
Note: See TracBrowser for help on using the browser.