Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 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. |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 4 | # |
| 5 | # There is also some support for a standard main loop here. |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 6 | |
| 7 | import stdwin |
| 8 | from stdwinevents import * |
| 9 | |
| 10 | from TransParent import ManageOneChild |
| 11 | |
| 12 | Error = 'WindowParent.Error' # Exception |
| 13 | |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 14 | WindowList = [] # List containing all windows |
| 15 | |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 16 | class WindowParent() = ManageOneChild(): |
| 17 | # |
| 18 | def create(self, (title, size)): |
| 19 | self.title = title |
| 20 | self.size = size # (width, height) |
Guido van Rossum | 52cea43 | 1991-01-23 13:43:16 +0000 | [diff] [blame] | 21 | self._reset() |
| 22 | return self |
| 23 | # |
| 24 | def _reset(self): |
| 25 | self.child = 0 |
| 26 | self.win = 0 |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 27 | self.itimer = 0 |
| 28 | self.do_mouse = 0 |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 29 | self.do_keybd = 0 |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 30 | self.do_timer = 0 |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 31 | self.do_altdraw = 0 |
Guido van Rossum | 52cea43 | 1991-01-23 13:43:16 +0000 | [diff] [blame] | 32 | # |
| 33 | def destroy(self): |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 34 | if self.win in WindowList: |
| 35 | import util |
| 36 | util.remove(self.win, WindowList) |
Guido van Rossum | 52cea43 | 1991-01-23 13:43:16 +0000 | [diff] [blame] | 37 | if self.child: self.child.destroy() |
| 38 | self._reset() |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 39 | # |
| 40 | def need_mouse(self, child): self.do_mouse = 1 |
| 41 | def no_mouse(self, child): self.do_mouse = 0 |
| 42 | # |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 43 | def need_keybd(self, child): self.do_keybd = 1 |
| 44 | def no_keybd(self, child): self.do_keybd = 0 |
| 45 | # |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 46 | def need_timer(self, child): self.do_timer = 1 |
| 47 | def no_timer(self, child): self.do_timer = 0 |
| 48 | # |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 49 | def need_altdraw(self, child): self.do_altdraw = 1 |
| 50 | def no_altdraw(self, child): self.do_altdraw = 0 |
| 51 | # |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 52 | 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 Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 59 | max(self.size[1], size[1]) |
| 60 | # XXX stdwin.setdefwinsize(self.size) |
Guido van Rossum | fc8e0d9 | 1990-12-26 15:34:48 +0000 | [diff] [blame] | 61 | # XXX Compensate stdwin bug: |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 62 | stdwin.setdefwinsize(self.size[0]+4, min(300, self.size[1]+2)) |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 63 | self.win = stdwin.open(self.title) |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 64 | self.win.setdocsize(self.size) |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 65 | if self.itimer: |
| 66 | self.win.settimer(self.itimer) |
| 67 | bounds = (0, 0), self.win.getwinsize() |
| 68 | self.child.setbounds(bounds) |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 69 | 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 Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 78 | # |
| 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 Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 92 | def getwindow(self): |
| 93 | if self.win: |
| 94 | return self.win |
| 95 | else: |
| 96 | raise Error, 'getwindow(): not realized yet' |
| 97 | # |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 98 | 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 Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 120 | del d |
| 121 | if self.do_altdraw: self.child.altdraw(detail) |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 122 | 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 Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 128 | elif type in (WE_CHAR, WE_COMMAND): |
| 129 | if self.do_keybd: self.child.keybd(type, detail) |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 130 | elif type = WE_TIMER: |
| 131 | if self.do_timer: self.child.timer() |
| 132 | elif type = WE_SIZE: |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 133 | self.fixup() |
| 134 | elif type = WE_CLOSE: |
| 135 | self.destroy() |
Guido van Rossum | 2e44967 | 1990-11-05 19:44:36 +0000 | [diff] [blame] | 136 | # |
Guido van Rossum | 117dbcb | 1991-04-07 13:37:05 +0000 | [diff] [blame] | 137 | |
| 138 | def MainLoop(): |
| 139 | while WindowList: |
| 140 | Dispatch(stdwin.getevent()) |
| 141 | |
| 142 | def 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 | |
| 151 | def CountWindows(): |
| 152 | return len(WindowList) |
| 153 | |
| 154 | def AnyWindow(): |
| 155 | if not WindowList: |
| 156 | return None |
| 157 | else: |
| 158 | return WindowList[0] |