1 # A 'WindowParent' is the only module that uses real stdwin functionality.
2 # It is the root of the tree.
3 # It should have exactly one child when realized.
5 # There is also an alternative interface to "mainloop" here.
8 from stdwinevents
import *
11 from TransParent
import ManageOneChild
13 Error
= 'WindowParent.Error' # Exception
15 class WindowParent(ManageOneChild
):
17 def create(self
, title
, size
):
19 self
.size
= size
# (width, height)
21 self
.close_hook
= WindowParent
.delayed_destroy
32 self
.pending_destroy
= 0
33 self
.close_hook
= None
37 mainloop
.unregister(self
.win
)
38 if self
.child
: self
.child
.destroy()
41 def delayed_destroy(self
):
42 # This interface to be used by 'Close' buttons etc.;
43 # destroying a window from within a button hook
44 # is not a good idea...
45 self
.pending_destroy
= 1
47 def close_trigger(self
):
48 if self
.close_hook
: self
.close_hook(self
)
50 def menu_trigger(self
, menu
, item
):
52 self
.menu_hook(self
, menu
, item
)
54 def need_mouse(self
, child
): self
.do_mouse
= 1
55 def no_mouse(self
, child
): self
.do_mouse
= 0
57 def need_keybd(self
, child
):
60 def no_keybd(self
, child
):
62 self
.child
.deactivate()
64 def need_timer(self
, child
): self
.do_timer
= 1
65 def no_timer(self
, child
): self
.do_timer
= 0
67 def need_altdraw(self
, child
): self
.do_altdraw
= 1
68 def no_altdraw(self
, child
): self
.do_altdraw
= 0
72 raise Error
, 'realize(): called twice'
74 raise Error
, 'realize(): no child'
75 # Compute suggested size
76 self
.size
= self
.child
.getminsize(self
.beginmeasuring(), \
78 save_defsize
= stdwin
.getdefwinsize()
79 scrwidth
, scrheight
= stdwin
.getscrsize()
80 width
, height
= self
.size
82 width
= scrwidth
* 2/3
83 if height
> scrheight
:
84 height
= scrheight
* 2/3
85 stdwin
.setdefwinsize(width
, height
)
86 self
.hbar
, self
.vbar
= stdwin
.getdefscrollbars()
87 self
.win
= stdwin
.open(self
.title
)
88 stdwin
.setdefwinsize(save_defsize
)
89 self
.win
.setdocsize(self
.size
)
91 self
.win
.settimer(self
.itimer
)
92 width
, height
= self
.win
.getwinsize()
97 self
.child
.setbounds(((0, 0), (width
, height
)))
99 self
.win
.dispatch
= self
.dispatch
100 mainloop
.register(self
.win
)
103 # XXX This could share code with realize() above
104 self
.size
= self
.child
.getminsize(self
.beginmeasuring(), \
105 self
.win
.getwinsize())
106 self
.win
.setdocsize(self
.size
)
107 width
, height
= self
.win
.getwinsize()
111 height
= self
.size
[1]
112 self
.child
.setbounds(((0, 0), (width
, height
)))
113 # Force a redraw of the entire window:
114 self
.win
.change((0, 0), self
.size
)
116 def beginmeasuring(self
):
117 # Return something with which a child can measure text
119 return self
.win
.begindrawing()
123 def begindrawing(self
):
125 return self
.win
.begindrawing()
127 raise Error
, 'begindrawing(): not realized yet'
133 raise Error
, 'getwindow(): not realized yet'
135 def change(self
, area
):
137 self
.win
.change(area
)
139 def scroll(self
, area
, vector
):
141 self
.win
.scroll(area
, vector
)
143 def settimer(self
, itimer
):
145 self
.win
.settimer(itimer
)
149 # Only call dispatch once we are realized
151 def dispatch(self
, (type, win
, detail
)):
153 d
= self
.win
.begindrawing()
154 self
.child
.draw(d
, detail
)
156 if self
.do_altdraw
: self
.child
.altdraw(detail
)
157 elif type == WE_MOUSE_DOWN
:
158 if self
.do_mouse
: self
.child
.mouse_down(detail
)
159 elif type == WE_MOUSE_MOVE
:
160 if self
.do_mouse
: self
.child
.mouse_move(detail
)
161 elif type == WE_MOUSE_UP
:
162 if self
.do_mouse
: self
.child
.mouse_up(detail
)
163 elif type in (WE_CHAR
, WE_COMMAND
):
164 if self
.do_keybd
: self
.child
.keybd(type, detail
)
165 elif type == WE_TIMER
:
166 if self
.do_timer
: self
.child
.timer()
167 elif type == WE_SIZE
:
169 elif type == WE_CLOSE
:
171 elif type == WE_MENU
:
172 self
.menu_trigger(detail
)
173 if self
.pending_destroy
:
181 mainloop
.dispatch(event
)
183 # Interface used by WindowSched:
186 return mainloop
.countwindows()
189 return mainloop
.anywindow()