cpython/Lib/lib-stdwin/WindowParent.py

190 lines
4.7 KiB
Python
Raw Normal View History

1990-11-05 15:44:36 -04:00
# A 'WindowParent' is the only module that uses real stdwin functionality.
# It is the root of the tree.
# It should have exactly one child when realized.
#
# There is also an alternative interface to "mainloop" here.
1990-11-05 15:44:36 -04:00
import stdwin
from stdwinevents import *
import mainloop
1990-11-05 15:44:36 -04:00
from TransParent import ManageOneChild
Error = 'WindowParent.Error' # Exception
1991-12-26 09:06:29 -04:00
class WindowParent(ManageOneChild):
1990-11-05 15:44:36 -04:00
#
def create(self, title, size):
1990-11-05 15:44:36 -04:00
self.title = title
self.size = size # (width, height)
1991-01-23 09:43:16 -04:00
self._reset()
self.close_hook = WindowParent.delayed_destroy
1991-01-23 09:43:16 -04:00
return self
#
def _reset(self):
1991-05-14 09:22:25 -03:00
self.child = None
self.win = None
1990-11-05 15:44:36 -04:00
self.itimer = 0
self.do_mouse = 0
self.do_keybd = 0
1990-11-05 15:44:36 -04:00
self.do_timer = 0
self.do_altdraw = 0
self.pending_destroy = 0
1991-05-14 09:22:25 -03:00
self.close_hook = None
self.menu_hook = None
1991-01-23 09:43:16 -04:00
#
def destroy(self):
mainloop.unregister(self.win)
1991-01-23 09:43:16 -04:00
if self.child: self.child.destroy()
self._reset()
1990-11-05 15:44:36 -04:00
#
def delayed_destroy(self):
# This interface to be used by 'Close' buttons etc.;
# destroying a window from within a button hook
# is not a good idea...
self.pending_destroy = 1
#
1991-05-14 09:22:25 -03:00
def close_trigger(self):
if self.close_hook: self.close_hook(self)
#
def menu_trigger(self, menu, item):
if self.menu_hook:
self.menu_hook(self, menu, item)
#
1990-11-05 15:44:36 -04:00
def need_mouse(self, child): self.do_mouse = 1
def no_mouse(self, child): self.do_mouse = 0
#
def need_keybd(self, child):
self.do_keybd = 1
self.child.activate()
def no_keybd(self, child):
self.do_keybd = 0
self.child.deactivate()
#
1990-11-05 15:44:36 -04:00
def need_timer(self, child): self.do_timer = 1
def no_timer(self, child): self.do_timer = 0
#
def need_altdraw(self, child): self.do_altdraw = 1
def no_altdraw(self, child): self.do_altdraw = 0
#
1990-11-05 15:44:36 -04:00
def realize(self):
if self.win:
raise Error, 'realize(): called twice'
if not self.child:
raise Error, 'realize(): no child'
# Compute suggested size
self.size = self.child.getminsize(self.beginmeasuring(), \
self.size)
save_defsize = stdwin.getdefwinsize()
scrwidth, scrheight = stdwin.getscrsize()
width, height = self.size
if width > scrwidth:
width = scrwidth * 2/3
if height > scrheight:
height = scrheight * 2/3
stdwin.setdefwinsize(width, height)
self.hbar, self.vbar = stdwin.getdefscrollbars()
1990-11-05 15:44:36 -04:00
self.win = stdwin.open(self.title)
stdwin.setdefwinsize(save_defsize)
self.win.setdocsize(self.size)
1990-11-05 15:44:36 -04:00
if self.itimer:
self.win.settimer(self.itimer)
width, height = self.win.getwinsize()
if self.hbar:
width = self.size[0]
if self.vbar:
height = self.size[1]
self.child.setbounds(((0, 0), (width, height)))
self.child.realize()
self.win.dispatch = self.dispatch
mainloop.register(self.win)
#
def fixup(self):
# XXX This could share code with realize() above
self.size = self.child.getminsize(self.beginmeasuring(), \
self.win.getwinsize())
self.win.setdocsize(self.size)
width, height = self.win.getwinsize()
if self.hbar:
width = self.size[0]
if self.vbar:
height = self.size[1]
self.child.setbounds(((0, 0), (width, height)))
1991-05-14 09:22:25 -03:00
# Force a redraw of the entire window:
self.win.change((0, 0), self.size)
1990-11-05 15:44:36 -04:00
#
def beginmeasuring(self):
# Return something with which a child can measure text
if self.win:
return self.win.begindrawing()
else:
return stdwin
#
def begindrawing(self):
if self.win:
return self.win.begindrawing()
else:
raise Error, 'begindrawing(): not realized yet'
#
def getwindow(self):
if self.win:
return self.win
else:
raise Error, 'getwindow(): not realized yet'
#
1990-11-05 15:44:36 -04:00
def change(self, area):
if self.win:
self.win.change(area)
#
def scroll(self, area, vector):
1990-11-05 15:44:36 -04:00
if self.win:
self.win.scroll(area, vector)
1990-11-05 15:44:36 -04:00
#
def settimer(self, itimer):
if self.win:
self.win.settimer(itimer)
else:
self.itimer = itimer
#
# Only call dispatch once we are realized
1990-11-05 15:44:36 -04:00
#
def dispatch(self, (type, win, detail)):
1992-01-01 15:35:13 -04:00
if type == WE_DRAW:
1990-11-05 15:44:36 -04:00
d = self.win.begindrawing()
self.child.draw(d, detail)
del d
if self.do_altdraw: self.child.altdraw(detail)
1992-01-01 15:35:13 -04:00
elif type == WE_MOUSE_DOWN:
1990-11-05 15:44:36 -04:00
if self.do_mouse: self.child.mouse_down(detail)
1992-01-01 15:35:13 -04:00
elif type == WE_MOUSE_MOVE:
1990-11-05 15:44:36 -04:00
if self.do_mouse: self.child.mouse_move(detail)
1992-01-01 15:35:13 -04:00
elif type == WE_MOUSE_UP:
1990-11-05 15:44:36 -04:00
if self.do_mouse: self.child.mouse_up(detail)
elif type in (WE_CHAR, WE_COMMAND):
if self.do_keybd: self.child.keybd(type, detail)
1992-01-01 15:35:13 -04:00
elif type == WE_TIMER:
1990-11-05 15:44:36 -04:00
if self.do_timer: self.child.timer()
1992-01-01 15:35:13 -04:00
elif type == WE_SIZE:
self.fixup()
1992-01-01 15:35:13 -04:00
elif type == WE_CLOSE:
1991-05-14 09:22:25 -03:00
self.close_trigger()
1992-01-01 15:35:13 -04:00
elif type == WE_MENU:
self.menu_trigger(detail)
if self.pending_destroy:
self.destroy()
1990-11-05 15:44:36 -04:00
#
def MainLoop():
mainloop.mainloop()
def Dispatch(event):
mainloop.dispatch(event)
# Interface used by WindowSched:
def CountWindows():
return mainloop.countwindows()
def AnyWindow():
return mainloop.anywindow()