#-------------------------------------------------------------------- # # PyGUI - TextField - Win32 # #-------------------------------------------------------------------- import win32con as wc, win32ui as ui from GUI import export from GUI.StdFonts import application_font from GUI.WinUtils import win_none from GUI.GTextFields import TextField as GTextField win_vpad = 5 win_style = wc.WS_VISIBLE | wc.WS_CLIPSIBLINGS | wc.ES_AUTOHSCROLL # | wc.WS_TABSTOP win_ex_style = wc.WS_EX_CLIENTEDGE win_multiline_style = wc.ES_MULTILINE | wc.ES_AUTOVSCROLL win_password_style = wc.ES_PASSWORD win_just_mask = wc.ES_LEFT | wc.ES_CENTER | wc.ES_RIGHT win_just_flags = { 'l': wc.ES_LEFT, 'c': wc.ES_CENTER, 'r': wc.ES_RIGHT, } class TextField(GTextField): _pass_key_events_to_platform = True def __init__(self, **kwds): font = kwds.setdefault('font', application_font) multiline = kwds.setdefault('multiline', False) password = kwds.pop('password', False) self._multiline = multiline self._password = password h = self._calc_height(font) flags = win_style if multiline: flags |= win_multiline_style if password: flags |= win_password_style win = ui.CreateEdit() # Border can get lost if we construct it with too big a rect, so # we set the initial size after creation. win.CreateWindow(flags, (0, 0, 0, 0), win_none, 0) win.ModifyStyleEx(0, win_ex_style) win.MoveWindow((0, 0, 100, h)) GTextField.__init__(self, _win = win, **kwds) def get_text(self): return self._win.GetWindowText().replace("\r\n", "\n") def set_text(self, x): self._win.SetWindowText(x.replace("\n", "\r\n")) def set_just(self, x): self._just = x try: flags = win_just_flags[x[:1]] except KeyError: raise ValueError("Invalid TextField justification %r" % x) self._win.ModifyFlags(win_just_mask, flags) def get_selection(self): sel = self._win.GetSel() if self._multiline: sel = self._win_adjust_sel(sel, -1) return sel def set_selection(self, sel): if self._multiline: sel = self._win_adjust_sel(sel, 1) self._win.SetSel(*sel) self.become_target() def _win_adjust_sel(self, sel, d): text = self._win.GetWindowText() if d > 0: text = text.replace("\r\n", "\n") nl = "\n" else: nl = "\r\n" def adj(x): return x + d * text.count(nl, 0, x) return map(adj, sel) def get_multiline(self): return self._multiline def get_password(self): return self._password def _tab_in(self): self.select_all() def key_down(self, event): #print "TextField.key_down" ### if event.char == "\t": self.pass_event_to_next_handler(event) else: GTextField.key_down(self, event) export(TextField)