blob: c9f2df4d04b9ff6cc3a32a37289a36e2a2538158 [file] [log] [blame]
Guido van Rossum2e449671990-11-05 19:44:36 +00001# 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.
4
5import stdwin
6from stdwinevents import *
7
8from TransParent import ManageOneChild
9
10Error = 'WindowParent.Error' # Exception
11
12class WindowParent() = ManageOneChild():
13 #
14 def create(self, (title, size)):
15 self.title = title
16 self.size = size # (width, height)
17 self.child = 0 # i.e., no child yet
18 self.win = 0 # i.e., no window yet
19 self.itimer = 0
20 self.do_mouse = 0
21 self.do_timer = 0
22 return self
23 #
24 def need_mouse(self, child): self.do_mouse = 1
25 def no_mouse(self, child): self.do_mouse = 0
26 #
27 def need_timer(self, child): self.do_timer = 1
28 def no_timer(self, child): self.do_timer = 0
29 #
30 def realize(self):
31 if self.win:
32 raise Error, 'realize(): called twice'
33 if not self.child:
34 raise Error, 'realize(): no child'
35 size = self.child.minsize(self.beginmeasuring())
36 self.size = max(self.size[0], size[0]), \
37 max(self.size[1], size[1])
Guido van Rossumfc8e0d91990-12-26 15:34:48 +000038 #stdwin.setdefwinsize(self.size)
39 # XXX Compensate stdwin bug:
40 stdwin.setdefwinsize(self.size[0]+4, self.size[1]+2)
Guido van Rossum2e449671990-11-05 19:44:36 +000041 self.win = stdwin.open(self.title)
42 if self.itimer:
43 self.win.settimer(self.itimer)
44 bounds = (0, 0), self.win.getwinsize()
45 self.child.setbounds(bounds)
46 #
47 def beginmeasuring(self):
48 # Return something with which a child can measure text
49 if self.win:
50 return self.win.begindrawing()
51 else:
52 return stdwin
53 #
54 def begindrawing(self):
55 if self.win:
56 return self.win.begindrawing()
57 else:
58 raise Error, 'begindrawing(): not realized yet'
59 #
60 def change(self, area):
61 if self.win:
62 self.win.change(area)
63 #
64 def scroll(self, args):
65 if self.win:
66 self.win.scroll(args)
67 #
68 def settimer(self, itimer):
69 if self.win:
70 self.win.settimer(itimer)
71 else:
72 self.itimer = itimer
73 #
74 # Only call dispatch if we have a child
75 #
76 def dispatch(self, (type, win, detail)):
77 if win <> self.win:
78 return
79 elif type = WE_DRAW:
80 d = self.win.begindrawing()
81 self.child.draw(d, detail)
82 elif type = WE_MOUSE_DOWN:
83 if self.do_mouse: self.child.mouse_down(detail)
84 elif type = WE_MOUSE_MOVE:
85 if self.do_mouse: self.child.mouse_move(detail)
86 elif type = WE_MOUSE_UP:
87 if self.do_mouse: self.child.mouse_up(detail)
88 elif type = WE_TIMER:
89 if self.do_timer: self.child.timer()
90 elif type = WE_SIZE:
91 self.win.change((0, 0), (10000, 10000)) # XXX
92 bounds = (0, 0), self.win.getwinsize()
93 self.child.setbounds(bounds)
94 #