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

1#!/usr/bin/env python 

2# 

3import sys 

4import os 

5import time 

6import wx 

7 

8DEFAULT_HISTORYFILE = '.wxlarch_hist' 

9MAX_HISTORY = 5000 

10 

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) 

17 

18 self._val = value 

19 

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 

28 

29 if sys.platform == 'darwin': 

30 self.Bind(wx.EVT_KEY_UP, self.onChar) 

31 else: 

32 self.Bind(wx.EVT_CHAR, self.onChar) 

33 

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 

38 

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 

46 

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) 

52 

53 def onKillFocus(self, event=None): 

54 self.__GetMark() 

55 

56 

57 def onSetFocus(self, event=None): 

58 self.__SetMark() 

59 

60 

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

92 

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 

148 

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) 

153 

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) 

161 

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

169 

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

177 

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) 

185 

186 event.Skip()