Coverage for /Users/Newville/Codes/xraylarch/larch/wxlib/readlinetextctrl.py: 11%
150 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-09 10:08 -0600
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-09 10:08 -0600
1#!/usr/bin/env python
2#
3import sys
4import os
5import time
6import wx
8DEFAULT_HISTORYFILE = '.wxlarch_hist'
9MAX_HISTORY = 5000
11class ReadlineTextCtrl(wx.TextCtrl):
12 def __init__(self, parent=None, value='', size=(400,-1),
13 historyfile=None,
14 style=wx.ALIGN_LEFT|wx.TE_PROCESS_ENTER, **kws):
15 wx.TextCtrl.__init__(self, parent, -1, value=value,
16 size=size, style=style, **kws)
18 self._val = value
20 self.hist_file = historyfile
21 self.hist_buff = []
22 if self.hist_file is None:
23 self.hist_file= os.path.join(os.environ.get('HOME','.'),
24 DEFAULT_HISTORYFILE)
25 # self.LoadHistory()
26 self.hist_mark = len(self.hist_buff)
27 self.hist_sessionstart = self.hist_mark
29 if sys.platform == 'darwin':
30 self.Bind(wx.EVT_KEY_UP, self.onChar)
31 else:
32 self.Bind(wx.EVT_CHAR, self.onChar)
34 self.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
35 self.Bind(wx.EVT_KILL_FOCUS, self.onKillFocus)
36 self.__GetMark()
37 self.notebooks = None
39 def __GetMark(self, event=None):
40 " keep track of cursor position within text"
41 try:
42 self.__mark = min(wx.TextCtrl.GetSelection(self)[0],
43 len(wx.TextCtrl.GetValue(self).strip()))
44 except:
45 self.__mark = 0
47 def __SetMark(self, m=None):
48 "set position of mark"
49 if m is None:
50 m = self.__mark
51 self.SetSelection(m,m)
53 def onKillFocus(self, event=None):
54 self.__GetMark()
57 def onSetFocus(self, event=None):
58 self.__SetMark()
61 def onChar(self, event):
62 """ on Character event"""
63 key = event.GetKeyCode()
64 entry = wx.TextCtrl.GetValue(self).strip()
65 pos = wx.TextCtrl.GetSelection(self)
66 do_skip = True
67 ctrl = event.ControlDown()
68 # really, the order here is important:
69 # 1. return sends to ValidateEntry
70 if key == wx.WXK_RETURN and len(entry) > 0:
71 pass
72 # 2. other non-text characters are passed without change
73 if key == wx.WXK_UP:
74 self.hist_mark = max(0, self.hist_mark-1)
75 try:
76 self.SetValue(self.hist_buff[self.hist_mark])
77 except:
78 pass
79 self.SetInsertionPointEnd()
80 do_skip = False
81 elif key == wx.WXK_DOWN:
82 self.hist_mark += 1
83 if self.hist_mark >= len(self.hist_buff):
84 self.SetValue('')
85 else:
86 self.SetValue(self.hist_buff[self.hist_mark])
87 self.SetInsertionPointEnd()
88 elif key == wx.WXK_TAB:
89 if self.notebooks is not None:
90 self.notebooks.AdvanceSelection()
91 self.SetFocus()
93 elif key == wx.WXK_HOME or (ctrl and key == 1): # ctrl-a
94 self.SetInsertionPoint(0)
95 self.SetSelection(0,0)
96 do_skip = False
97 elif key == wx.WXK_END or (ctrl and key == 5):
98 self.SetInsertionPointEnd()
99 elif ctrl and key == 2: # b
100 mark = max(1, self.GetSelection()[1])
101 self.SetSelection(mark-1, mark-1)
102 elif ctrl and key== 3: # c
103 cb_txt = wx.TextDataObject()
104 wx.TheClipboard.Open()
105 if wx.TheClipboard.IsOpened():
106 cb_txt.SetData(str(entry))
107 wx.TheClipboard.SetData(cb_txt)
108 wx.TheClipboard.Close()
109 elif ctrl and key == 4: # d
110 mark = self.GetSelection()[1]
111 self.SetValue("%s%s" % (entry[:mark], entry[mark+1:]))
112 self.SetSelection(mark, mark)
113 do_skip = False
114 elif ctrl and key == 6: # f
115 mark = self.GetSelection()[1]
116 self.SetSelection(mark+1, mark+1)
117 elif ctrl and key == 8: # h
118 mark = self.GetSelection()[1]
119 self.SetValue("%s%s" % (entry[:mark-1], entry[mark:]))
120 self.SetSelection(mark-1, mark-1)
121 elif ctrl and key == 11: # k
122 mark = self.GetSelection()[1]
123 self.SetValue("%s" % (entry[:mark]))
124 self.SetSelection(mark, mark)
125 elif ctrl and key == 22: # v
126 cb_txt = wx.TextDataObject()
127 wx.TheClipboard.Open()
128 if wx.TheClipboard.IsOpened():
129 wx.TheClipboard.GetData(cb_txt)
130 wx.TheClipboard.Close()
131 try:
132 self.SetValue(str(cb_txt.GetText()))
133 except TypeError:
134 pass
135 do_skip = False
136 elif ctrl and key == 24: # x
137 cb_txt = wx.TextDataObject()
138 wx.TheClipboard.Open()
139 if wx.TheClipboard.IsOpened():
140 cb_txt.SetData(str(entry))
141 wx.TheClipboard.GetData(cb_txt)
142 wx.TheClipboard.Close()
143 self.SetValue('')
144 elif ctrl:
145 pass
146 self.Refresh()
147 return
149 def AddToHistory(self, text=''):
150 if len(text.strip()) > 0:
151 self.hist_buff.append(text)
152 self.hist_mark = len(self.hist_buff)
154 def SaveHistory(self, filename=None, session_only=False):
155 if filename is None:
156 filename = self.hist_file
157 try:
158 fout = open(filename,'w', encoding=sys.getdefaultencoding())
159 except IOError:
160 print( 'Cannot save history ', filename)
162 fout.write("# wxlarch history saved %s\n\n" % time.ctime())
163 start_entry = -MAX_HISTORY
164 if session_only:
165 start_entry = self.hist_sessionstart
166 fout.write('\n'.join(self.hist_buff[start_entry:]))
167 fout.write("\n")
168 fout.close()
170 def LoadHistory(self):
171 if os.path.exists(self.hist_file):
172 self.hist_buff = []
173 for txt in open(self.hist_file,'r').readlines():
174 stxt = txt.strip()
175 if len(stxt) > 0 and not stxt.startswith('#'):
176 self.hist_buff.append(txt[:-1])
178 def def_onText(self, event=None):
179 if event is None:
180 return
181 txt = event.GetString()
182 if len(txt.strip()) > 0:
183 self.hist_buff.append(txt)
184 self.hist_mark = len(self.hist_buff)
186 event.Skip()