# Text editing widget # NB: this always assumes fixed bounds. # For auto-growing TextEdit windows, different code would be needed. from stdwinevents import * class TextEdit: # def create(self, parent, (cols, rows)): parent.addchild(self) self.parent = parent self.cols = cols self.rows = rows self.text = '' # Creation of the editor is done in realize() self.editor = None self.dh = self.dv = 0 return self # def createboxed(self, parent, (cols, rows), (dh, dv)): self = self.create(parent, (cols, rows)) self.dh = max(0, dh) self.dv = max(0, dv) return self # def settext(self, text): self.editor.settext(text) # def gettext(self): return self.editor.gettext(text) # # Downcalls from parent to child # def destroy(self): del self.parent del self.editor del self.window # def getminsize(self, m, (width, height)): width = max(0, width - 2*self.dh) height = max(0, height - 2*self.dv) if width > 0 and self.editor: (left, top), (right, bottom) = self.editor.getrect() act_width, act_height = right - left, bottom - top if width >= act_width: width = width + 2*self.dh height = max(height, act_height) + 2*self.dv return width, height width = max(width, self.cols*m.textwidth('in')/2) + 2*self.dh height = max(height, self.rows*m.lineheight()) + 2*self.dv return width, height # def setbounds(self, bounds): self.bounds = bounds if self.editor: (left, top), (right, bottom) = bounds left = left + self.dh top = top + self.dv right = right - self.dh bottom = bottom - self.dv self.editor.move((left, top), (right, bottom)) if self.dh and self.dv: (left, top), (right, bottom) = bounds left = left + 1 top = top + 1 right = right - 1 bottom = bottom - 1 bounds = (left, top), (right, bottom) self.editor.setview(bounds) # def getbounds(self): return self.bounds # def realize(self): self.window = self.parent.getwindow() (left, top), (right, bottom) = self.bounds left = left + self.dh top = top + self.dv right = right - self.dh bottom = bottom - self.dv self.editor = \ self.window.textcreate((left, top), (right, bottom)) self.editor.setactive(0) bounds = self.bounds if self.dh and self.dv: (left, top), (right, bottom) = bounds left = left + 1 top = top + 1 right = right - 1 bottom = bottom - 1 bounds = (left, top), (right, bottom) self.editor.setview(bounds) self.editor.settext(self.text) self.parent.need_mouse(self) self.parent.need_keybd(self) self.parent.need_altdraw(self) # def draw(self, d, area): if self.dh and self.dv: d.box(self.bounds) # def altdraw(self, area): self.editor.draw(area) # # Event downcalls # def mouse_down(self, detail): x = self.editor.event(WE_MOUSE_DOWN, self.window, detail) # def mouse_move(self, detail): x = self.editor.event(WE_MOUSE_MOVE, self.window, detail) # def mouse_up(self, detail): x = self.editor.event(WE_MOUSE_UP, self.window, detail) # def keybd(self, type, detail): x = self.editor.event(type, self.window, detail) # def activate(self): self.editor.setfocus(0, 30000) self.editor.setactive(1) # def deactivate(self): self.editor.setactive(0) #