blob: cc0add90018e9bd9e3b36034341297339783b86e [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.
Guido van Rossum117dbcb1991-04-07 13:37:05 +00004#
5# There is also some support for a standard main loop here.
Guido van Rossum2e449671990-11-05 19:44:36 +00006
7import stdwin
8from stdwinevents import *
9
10from TransParent import ManageOneChild
11
12Error = 'WindowParent.Error' # Exception
13
Guido van Rossum117dbcb1991-04-07 13:37:05 +000014WindowList = [] # List containing all windows
15
Guido van Rossum2e449671990-11-05 19:44:36 +000016class WindowParent() = ManageOneChild():
17 #
18 def create(self, (title, size)):
19 self.title = title
20 self.size = size # (width, height)
Guido van Rossum52cea431991-01-23 13:43:16 +000021 self._reset()
22 return self
23 #
24 def _reset(self):
25 self.child = 0
26 self.win = 0
Guido van Rossum2e449671990-11-05 19:44:36 +000027 self.itimer = 0
28 self.do_mouse = 0
Guido van Rossum117dbcb1991-04-07 13:37:05 +000029 self.do_keybd = 0
Guido van Rossum2e449671990-11-05 19:44:36 +000030 self.do_timer = 0
Guido van Rossum117dbcb1991-04-07 13:37:05 +000031 self.do_altdraw = 0
Guido van Rossum52cea431991-01-23 13:43:16 +000032 #
33 def destroy(self):
Guido van Rossum117dbcb1991-04-07 13:37:05 +000034 if self.win in WindowList:
35 import util
36 util.remove(self.win, WindowList)
Guido van Rossum52cea431991-01-23 13:43:16 +000037 if self.child: self.child.destroy()
38 self._reset()
Guido van Rossum2e449671990-11-05 19:44:36 +000039 #
40 def need_mouse(self, child): self.do_mouse = 1
41 def no_mouse(self, child): self.do_mouse = 0
42 #
Guido van Rossum117dbcb1991-04-07 13:37:05 +000043 def need_keybd(self, child): self.do_keybd = 1
44 def no_keybd(self, child): self.do_keybd = 0
45 #
Guido van Rossum2e449671990-11-05 19:44:36 +000046 def need_timer(self, child): self.do_timer = 1
47 def no_timer(self, child): self.do_timer = 0
48 #
Guido van Rossum117dbcb1991-04-07 13:37:05 +000049 def need_altdraw(self, child): self.do_altdraw = 1
50 def no_altdraw(self, child): self.do_altdraw = 0
51 #
Guido van Rossum2e449671990-11-05 19:44:36 +000052 def realize(self):
53 if self.win:
54 raise Error, 'realize(): called twice'
55 if not self.child:
56 raise Error, 'realize(): no child'
57 size = self.child.minsize(self.beginmeasuring())
58 self.size = max(self.size[0], size[0]), \
Guido van Rossum117dbcb1991-04-07 13:37:05 +000059 max(self.size[1], size[1])
60 # XXX stdwin.setdefwinsize(self.size)
Guido van Rossumfc8e0d91990-12-26 15:34:48 +000061 # XXX Compensate stdwin bug:
Guido van Rossum117dbcb1991-04-07 13:37:05 +000062 stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2))
Guido van Rossum2e449671990-11-05 19:44:36 +000063 self.win = stdwin.open(self.title)
Guido van Rossum117dbcb1991-04-07 13:37:05 +000064 self.win.setdocsize(self.size)
Guido van Rossum2e449671990-11-05 19:44:36 +000065 if self.itimer:
66 self.win.settimer(self.itimer)
67 bounds = (0, 0), self.win.getwinsize()
68 self.child.setbounds(bounds)
Guido van Rossum117dbcb1991-04-07 13:37:05 +000069 self.child.realize()
70 self.win.dispatch = self.dispatch
71 WindowList.append(self.win)
72 #
73 def fixup(self):
74 self.size = self.child.minsize(self.beginmeasuring())
75 self.win.setdocsize(self.size)
76 bounds = (0, 0), self.win.getwinsize()
77 self.child.setbounds(bounds)
Guido van Rossum2e449671990-11-05 19:44:36 +000078 #
79 def beginmeasuring(self):
80 # Return something with which a child can measure text
81 if self.win:
82 return self.win.begindrawing()
83 else:
84 return stdwin
85 #
86 def begindrawing(self):
87 if self.win:
88 return self.win.begindrawing()
89 else:
90 raise Error, 'begindrawing(): not realized yet'
91 #
Guido van Rossum117dbcb1991-04-07 13:37:05 +000092 def getwindow(self):
93 if self.win:
94 return self.win
95 else:
96 raise Error, 'getwindow(): not realized yet'
97 #
Guido van Rossum2e449671990-11-05 19:44:36 +000098 def change(self, area):
99 if self.win:
100 self.win.change(area)
101 #
102 def scroll(self, args):
103 if self.win:
104 self.win.scroll(args)
105 #
106 def settimer(self, itimer):
107 if self.win:
108 self.win.settimer(itimer)
109 else:
110 self.itimer = itimer
111 #
112 # Only call dispatch if we have a child
113 #
114 def dispatch(self, (type, win, detail)):
115 if win <> self.win:
116 return
117 elif type = WE_DRAW:
118 d = self.win.begindrawing()
119 self.child.draw(d, detail)
Guido van Rossum117dbcb1991-04-07 13:37:05 +0000120 del d
121 if self.do_altdraw: self.child.altdraw(detail)
Guido van Rossum2e449671990-11-05 19:44:36 +0000122 elif type = WE_MOUSE_DOWN:
123 if self.do_mouse: self.child.mouse_down(detail)
124 elif type = WE_MOUSE_MOVE:
125 if self.do_mouse: self.child.mouse_move(detail)
126 elif type = WE_MOUSE_UP:
127 if self.do_mouse: self.child.mouse_up(detail)
Guido van Rossum117dbcb1991-04-07 13:37:05 +0000128 elif type in (WE_CHAR, WE_COMMAND):
129 if self.do_keybd: self.child.keybd(type, detail)
Guido van Rossum2e449671990-11-05 19:44:36 +0000130 elif type = WE_TIMER:
131 if self.do_timer: self.child.timer()
132 elif type = WE_SIZE:
Guido van Rossum117dbcb1991-04-07 13:37:05 +0000133 self.fixup()
134 elif type = WE_CLOSE:
135 self.destroy()
Guido van Rossum2e449671990-11-05 19:44:36 +0000136 #
Guido van Rossum117dbcb1991-04-07 13:37:05 +0000137
138def MainLoop():
139 while WindowList:
140 Dispatch(stdwin.getevent())
141
142def Dispatch(event):
143 window = event[1]
144 if window in WindowList:
145 window.dispatch(event)
146 else:
147 stdwin.fleep()
148
149# Interface used by WindowSched:
150
151def CountWindows():
152 return len(WindowList)
153
154def AnyWindow():
155 if not WindowList:
156 return None
157 else:
158 return WindowList[0]