| # 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) |
| # |