Lines Matching refs:self

74     def __init__(self, flist=None, filename=None, key=None, root=None):
117 self.flist = flist
119 self.root = root
120 self.menubar = Menu(root)
121 self.top = top = window.ListedToplevel(root, menu=self.menubar)
123 self.tkinter_vars = flist.vars
124 #self.top.instance_dict makes flist.inversedict available to
126 self.top.instance_dict = flist.inversedict
128 self.tkinter_vars = {} # keys: Tkinter event names
130 self.top.instance_dict = {}
131 self.recent_files_path = idleConf.userdir and os.path.join(
134 self.prompt_last_line = '' # Override in PyShell
135 self.text_frame = text_frame = Frame(top)
136 self.vbar = vbar = Scrollbar(text_frame, name='vbar')
148 self.text = text = MultiCallCreator(Text)(text_frame, **text_options)
149 self.top.focused_widget = self.text
151 self.createmenubar()
152 self.apply_bindings()
154 self.top.protocol("WM_DELETE_WINDOW", self.close)
155 self.top.bind("<<close-window>>", self.close_event)
158 text.bind('<<close-window>>', self.close_event)
162 text.bind("<Control-Button-1>",self.right_menu_event)
163 text.bind("<2>", self.right_menu_event)
166 text.bind("<3>",self.right_menu_event)
171 text.bind('<Configure>', self.handle_winconfig)
172 text.bind("<<cut>>", self.cut)
173 text.bind("<<copy>>", self.copy)
174 text.bind("<<paste>>", self.paste)
175 text.bind("<<center-insert>>", self.center_insert_event)
176 text.bind("<<help>>", self.help_dialog)
177 text.bind("<<python-docs>>", self.python_docs)
178 text.bind("<<about-idle>>", self.about_dialog)
179 text.bind("<<open-config-dialog>>", self.config_dialog)
180 text.bind("<<open-module>>", self.open_module_event)
182 text.bind("<<select-all>>", self.select_all)
183 text.bind("<<remove-selection>>", self.remove_selection)
184 text.bind("<<find>>", self.find_event)
185 text.bind("<<find-again>>", self.find_again_event)
186 text.bind("<<find-in-files>>", self.find_in_files_event)
187 text.bind("<<find-selection>>", self.find_selection_event)
188 text.bind("<<replace>>", self.replace_event)
189 text.bind("<<goto-line>>", self.goto_line_event)
190 text.bind("<<smart-backspace>>",self.smart_backspace_event)
191 text.bind("<<newline-and-indent>>",self.newline_and_indent_event)
192 text.bind("<<smart-indent>>",self.smart_indent_event)
193 self.fregion = fregion = self.FormatRegion(self)
194 # self.fregion used in smart_indent_event to access indent_region.
201 indents = self.Indents(self)
204 text.bind("<Left>", self.move_at_edge_if_selection(0))
205 text.bind("<Right>", self.move_at_edge_if_selection(1))
206 text.bind("<<del-word-left>>", self.del_word_left)
207 text.bind("<<del-word-right>>", self.del_word_right)
208 text.bind("<<beginning-of-line>>", self.home_callback)
211 flist.inversedict[self] = key
213 flist.dict[key] = self
214 text.bind("<<open-new-window>>", self.new_callback)
215 text.bind("<<close-all-windows>>", self.flist.close_all_callback)
216 text.bind("<<open-class-browser>>", self.open_module_browser)
217 text.bind("<<open-path-browser>>", self.open_path_browser)
218 text.bind("<<open-turtle-demo>>", self.open_turtle_demo)
220 self.set_status_bar()
224 vbar['command'] = self.handle_yview
227 text['font'] = idleConf.GetFont(self.root, 'main', 'EditorWindow')
230 self.set_width()
243 self.usetabs = not usespaces
250 self.tabwidth = 8 # must remain 8 until Tk is fixed.
254 self.indentwidth = self.tabwidth
255 self.set_notabs_indentwidth()
260 idleConf.blink_off_time = self.text['insertofftime']
261 self.update_cursor_blink()
269 self.num_context_lines = 50, 500, 5000000
270 self.per = per = self.Percolator(text)
271 self.undo = undo = self.UndoDelegator()
275 undo.set_saved_change_hook(self.saved_change_hook)
277 self.io = io = self.IOBinding(self)
278 io.set_filename_change_hook(self.filename_change_hook)
279 self.good_load = False
280 self.set_indentation_params(False)
281 self.color = None # initialized below in self.ResetColorizer
282 self.code_context = None # optionally initialized later below
283 self.line_numbers = None # optionally initialized later below
287 self.good_load = True
288 is_py_src = self.ispythonsource(filename)
289 self.set_indentation_params(is_py_src)
292 self.good_load = True
294 self.ResetColorizer()
295 self.saved_change_hook()
296 self.update_recent_files_list()
297 self.load_extensions()
298 menu = self.menudict.get('window')
306 self.wmenu_end = end
307 window.register_callback(self.postwindowsmenu)
310 self.askinteger = simpledialog.askinteger
311 self.askyesno = messagebox.askyesno
312 self.showerror = messagebox.showerror
325 # (called from self.ResetColorizer()).
326 autocomplete = self.AutoComplete(self, self.user_input_insert_tags)
332 text.bind("<<expand-word>>", self.AutoExpand(self).expand_word_event)
334 self.FormatParagraph(self).format_paragraph_event)
335 parenmatch = self.ParenMatch(self)
338 scriptbinding = ScriptBinding(self)
342 text.bind("<<do-rstrip>>", self.Rstrip(self).do_rstrip)
343 self.ctip = ctip = self.Calltip(self)
348 text.bind("<<zoom-height>>", self.ZoomHeight(self).zoom_height_event)
349 if self.allow_code_context:
350 self.code_context = self.CodeContext(self)
352 self.code_context.toggle_code_context_event)
354 self.update_menu_state('options', '*ode*ontext', 'disabled')
355 if self.allow_line_numbers:
356 self.line_numbers = self.LineNumbers(self)
359 self.toggle_line_numbers_event()
360 text.bind("<<toggle-line-numbers>>", self.toggle_line_numbers_event)
362 self.update_menu_state('options', '*ine*umbers', 'disabled')
364 def handle_winconfig(self, event=None):
365 self.set_width()
367 def set_width(self):
368 text = self.text
378 self.width = pixel_width // zero_char_width
380 def new_callback(self, event):
381 dirname, basename = self.io.defaultfilename()
382 self.flist.new(dirname)
385 def home_callback(self, event):
389 if self.text.index("iomark") and \
390 self.text.compare("iomark", "<=", "insert lineend") and \
391 self.text.compare("insert linestart", "<=", "iomark"):
393 insertpt = int(self.text.index("iomark").split(".")[1])
395 line = self.text.get("insert linestart", "insert lineend")
401 lineat = int(self.text.index("insert").split('.')[1])
407 self.text.tag_remove("sel", "1.0", "end")
409 if not self.text.index("sel.first"):
411 self.text.mark_set("my_anchor", "insert")
413 if self.text.compare(self.text.index("sel.first"), "<",
414 self.text.index("insert")):
415 self.text.mark_set("my_anchor", "sel.first") # extend back
417 self.text.mark_set("my_anchor", "sel.last") # extend forward
418 first = self.text.index(dest)
419 last = self.text.index("my_anchor")
420 if self.text.compare(first,">",last):
422 self.text.tag_remove("sel", "1.0", "end")
423 self.text.tag_add("sel", first, last)
424 self.text.mark_set("insert", dest)
425 self.text.see("insert")
428 def set_status_bar(self):
429 self.status_bar = self.MultiStatusBar(self.top)
430 sep = Frame(self.top, height=1, borderwidth=1, background='grey75')
434 self.status_bar.set_label('_padding1', ' ', side=RIGHT)
435 self.status_bar.set_label('column', 'Col: ?', side=RIGHT)
436 self.status_bar.set_label('line', 'Ln: ?', side=RIGHT)
437 self.status_bar.pack(side=BOTTOM, fill=X)
439 self.text.bind("<<set-line-and-column>>", self.set_line_and_column)
440 self.text.event_add("<<set-line-and-column>>",
442 self.text.after_idle(self.set_line_and_column)
444 def set_line_and_column(self, event=None):
445 line, column = self.text.index(INSERT).split('.')
446 self.status_bar.set_label('column', 'Col: %s' % column)
447 self.status_bar.set_label('line', 'Ln: %s' % line)
451 * self.menubar - the always visible horizontal menu bar.
459 * self.menudict - map menu name to dropdown menu.
460 * self.recent_files_menu - 2nd level cascade in the file cascade.
461 * self.wmenu_end - set in __init__ (purpose unclear).
479 def createmenubar(self):
495 mbar = self.menubar
496 self.menudict = menudict = {}
497 for name, label in self.menu_specs:
499 postcommand = getattr(self, f'{name}_menu_postcommand', None)
508 self.fill_menus()
509 self.recent_files_menu = Menu(self.menubar, tearoff=0)
510 self.menudict['file'].insert_cascade(3, label='Recent Files',
512 menu=self.recent_files_menu)
513 self.base_helpmenu_length = self.menudict['help'].index(END)
514 self.reset_help_menu_entries()
516 def postwindowsmenu(self):
521 menu = self.menudict['window']
525 if end > self.wmenu_end:
526 menu.delete(self.wmenu_end+1, end)
529 def update_menu_label(self, menu, index, label):
531 menuitem = self.menudict[menu]
534 def update_menu_state(self, menu, index, state):
536 menuitem = self.menudict[menu]
539 def handle_yview(self, event, *args):
543 lines = (round(self.getlineno('end') * fraction) -
544 self.getlineno('@0,0'))
547 self.text.yview(event, *args)
552 def right_menu_event(self, event):
553 text = self.text
563 if not self.rmenu:
564 self.make_rmenu()
565 rmenu = self.rmenu
566 self.event = event
571 for item in self.rmenu_specs:
579 state = getattr(self, verify_state)()
584 self.text.config(cursor="ibeam")
592 def make_rmenu(self):
593 rmenu = Menu(self.text, tearoff=0)
594 for item in self.rmenu_specs:
597 def command(text=self.text, eventname=eventname):
602 self.rmenu = rmenu
604 def rmenu_check_cut(self):
605 return self.rmenu_check_copy()
607 def rmenu_check_copy(self):
609 indx = self.text.index('sel.first')
615 def rmenu_check_paste(self):
617 self.text.tk.call('tk::GetSelection', self.text, 'CLIPBOARD')
623 def about_dialog(self, event=None):
626 help_about.AboutDialog(self.top)
629 def config_dialog(self, event=None):
632 configdialog.ConfigDialog(self.top,'Settings')
635 def help_dialog(self, event=None):
638 if self.root:
639 parent = self.root
641 parent = self.top
645 def python_docs(self, event=None):
648 os.startfile(self.help_url)
651 message=str(why), parent=self.text)
653 webbrowser.open(self.help_url)
656 def cut(self,event):
657 self.text.event_generate("<<Cut>>")
660 def copy(self,event):
661 if not self.text.tag_ranges("sel"):
664 self.text.event_generate("<<Copy>>")
667 def paste(self,event):
668 self.text.event_generate("<<Paste>>")
669 self.text.see("insert")
672 def select_all(self, event=None):
673 self.text.tag_add("sel", "1.0", "end-1c")
674 self.text.mark_set("insert", "1.0")
675 self.text.see("insert")
678 def remove_selection(self, event=None):
679 self.text.tag_remove("sel", "1.0", "end")
680 self.text.see("insert")
683 def move_at_edge_if_selection(self, edge_index):
691 self_text_index = self.text.index
692 self_text_mark_set = self.text.mark_set
703 def del_word_left(self, event):
704 self.text.event_generate('<Meta-Delete>')
707 def del_word_right(self, event):
708 self.text.event_generate('<Meta-d>')
711 def find_event(self, event):
712 search.find(self.text)
715 def find_again_event(self, event):
716 search.find_again(self.text)
719 def find_selection_event(self, event):
720 search.find_selection(self.text)
723 def find_in_files_event(self, event):
724 grep.grep(self.text, self.io, self.flist)
727 def replace_event(self, event):
728 replace.replace(self.text)
731 def goto_line_event(self, event):
732 text = self.text
742 self.set_line_and_column()
745 def open_module(self):
754 name = self.text.get("sel.first", "sel.last").strip()
758 self.text, "Open Module",
763 if self.flist:
764 self.flist.open(file_path)
766 self.io.loadfile(file_path)
769 def open_module_event(self, event):
770 self.open_module()
773 def open_module_browser(self, event=None):
774 filename = self.io.filename
775 if not (self.__class__.__name__ == 'PyShellEditorWindow'
777 filename = self.open_module()
781 browser.ModuleBrowser(self.root, filename)
784 def open_path_browser(self, event=None):
786 pathbrowser.PathBrowser(self.root)
789 def open_turtle_demo(self, event = None):
798 def gotoline(self, lineno):
800 self.text.mark_set("insert", "%d.0" % lineno)
801 self.text.tag_remove("sel", "1.0", "end")
802 self.text.tag_add("sel", "insert", "insert +1l")
803 self.center()
805 def ispythonsource(self, filename):
811 line = self.text.get('1.0', '1.0 lineend')
814 def close_hook(self):
815 if self.flist:
816 self.flist.unregister_maybe_terminate(self)
817 self.flist = None
819 def set_close_hook(self, close_hook):
820 self.close_hook = close_hook
822 def filename_change_hook(self):
823 if self.flist:
824 self.flist.filename_changed_edit(self)
825 self.saved_change_hook()
826 self.top.update_windowlist_registry(self)
827 self.ResetColorizer()
829 def _addcolorizer(self):
830 if self.color:
832 if self.ispythonsource(self.io.filename):
833 self.color = self.ColorDelegator()
835 if self.color:
836 self.per.insertfilterafter(filter=self.color, after=self.undo)
838 def _rmcolorizer(self):
839 if not self.color:
841 self.color.removecolors()
842 self.per.removefilter(self.color)
843 self.color = None
845 def ResetColorizer(self):
847 # Called from self.filename_change_hook and from configdialog.py
848 self._rmcolorizer()
849 self._addcolorizer()
850 EditorWindow.color_config(self.text)
852 if self.code_context is not None:
853 self.code_context.update_highlight_colors()
855 if self.line_numbers is not None:
856 self.line_numbers.update_colors()
860 def colorize_syntax_error(self, text, pos):
863 if char and char in self.IDENTCHARS:
871 def update_cursor_blink(self):
876 self.text['insertofftime'] = 0
879 self.text['insertofftime'] = idleConf.blink_off_time
881 def ResetFont(self):
887 if self.code_context is not None:
888 self.code_context.update_font()
891 if self.line_numbers is not None:
892 self.line_numbers.update_font()
894 new_font = idleConf.GetFont(self.root, 'main', 'EditorWindow')
895 self.text['font'] = new_font
896 self.set_width()
898 def RemoveKeybindings(self):
904 self.mainmenu.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
906 self.text.event_delete(event, *keylist)
907 for extensionName in self.get_standard_extension_names():
911 self.text.event_delete(event, *keylist)
913 def ApplyKeybindings(self):
919 self.mainmenu.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
920 self.apply_bindings()
921 for extensionName in self.get_standard_extension_names():
924 self.apply_bindings(xkeydefs)
928 for menu in self.mainmenu.menudefs:
933 for menubarItem in self.menudict:
934 menu = self.menudict[menubarItem]
953 def set_notabs_indentwidth(self):
956 if not self.usetabs:
957 self.indentwidth = idleConf.GetOption('main', 'Indent','num-spaces',
960 def reset_help_menu_entries(self):
963 helpmenu = self.menudict['help']
966 if helpmenu_length > self.base_helpmenu_length:
967 helpmenu.delete((self.base_helpmenu_length + 1), helpmenu_length)
972 cmd = self._extra_help_callback(entry[1])
975 self.menudict['help'] = helpmenu
977 def _extra_help_callback(self, resource):
987 message=str(why), parent=self.text)
992 def update_recent_files_list(self, new_file=None):
996 file_path = self.recent_files_path
1020 if not getattr(self.root, "recentfiles_message", False):
1021 self.root.recentfiles_message = True
1026 parent=self.text)
1028 for instance in self.top.instance_dict:
1038 def __recent_file_callback(self, file_name):
1040 self.io.open(editFile=fn_closure)
1043 def saved_change_hook(self):
1044 short = self.short_title()
1045 long = self.long_title()
1055 if not self.get_saved():
1058 self.top.wm_title(title)
1059 self.top.wm_iconname(icon)
1061 def get_saved(self):
1062 return self.undo.get_saved()
1064 def set_saved(self, flag):
1065 self.undo.set_saved(flag)
1067 def reset_undo(self):
1068 self.undo.reset_undo()
1070 def short_title(self):
1071 filename = self.io.filename
1074 def long_title(self):
1075 return self.io.filename or ""
1077 def center_insert_event(self, event):
1078 self.center()
1081 def center(self, mark="insert"):
1082 text = self.text
1083 top, bot = self.getwindowlines()
1084 lineno = self.getlineno(mark)
1089 def getwindowlines(self):
1090 text = self.text
1091 top = self.getlineno("@0,0")
1092 bot = self.getlineno("@0,65535")
1099 def getlineno(self, mark="insert"):
1100 text = self.text
1103 def get_geometry(self):
1105 geom = self.top.wm_geometry()
1109 def close_event(self, event):
1110 self.close()
1113 def maybesave(self):
1114 if self.io:
1115 if not self.get_saved():
1116 if self.top.state()!='normal':
1117 self.top.deiconify()
1118 self.top.lower()
1119 self.top.lift()
1120 return self.io.maybesave()
1122 def close(self):
1124 reply = self.maybesave()
1126 self._close()
1131 def _close(self):
1132 if self.io.filename:
1133 self.update_recent_files_list(new_file=self.io.filename)
1134 window.unregister_callback(self.postwindowsmenu)
1135 self.unload_extensions()
1136 self.io.close()
1137 self.io = None
1138 self.undo = None
1139 if self.color:
1140 self.color.close()
1141 self.color = None
1142 self.text = None
1143 self.tkinter_vars = None
1144 self.per.close()
1145 self.per = None
1146 self.top.destroy()
1147 if self.close_hook:
1149 self.close_hook()
1151 def load_extensions(self):
1152 self.extensions = {}
1153 self.load_standard_extensions()
1155 def unload_extensions(self):
1156 for ins in list(self.extensions.values()):
1159 self.extensions = {}
1161 def load_standard_extensions(self):
1162 for name in self.get_standard_extension_names():
1164 self.load_extension(name)
1169 def get_standard_extension_names(self):
1176 def load_extension(self, name):
1177 fname = self.extfiles.get(name, name)
1189 self.fill_menus(cls.menudefs, keydefs)
1190 ins = cls(self)
1191 self.extensions[name] = ins
1193 self.apply_bindings(keydefs)
1202 self.text.bind(vevent, getattr(ins, methodname))
1204 def apply_bindings(self, keydefs=None):
1205 """Add events with keys to self.text."""
1207 keydefs = self.mainmenu.default_keydefs
1208 text = self.text
1214 def fill_menus(self, menudefs=None, keydefs=None):
1221 menudefs = self.mainmenu.menudefs
1223 keydefs = self.mainmenu.default_keydefs
1224 menudict = self.menudict
1225 text = self.text
1243 var = self.get_var_obj(eventname, BooleanVar)
1252 def getvar(self, name):
1253 var = self.get_var_obj(name)
1260 def setvar(self, name, value, vartype=None):
1261 var = self.get_var_obj(name, vartype)
1267 def get_var_obj(self, eventname, vartype=None):
1270 var = self.tkinter_vars.get(eventname)
1273 self.tkinter_vars[eventname] = var = vartype(self.text)
1285 def is_char_in_string(self, text_index):
1286 if self.color:
1289 return self.text.tag_prevrange("TODO", text_index) or \
1290 "STRING" in self.text.tag_names(text_index)
1297 def get_selection_indices(self):
1299 first = self.text.index("sel.first")
1300 last = self.text.index("sel.last")
1308 def get_tk_tabwidth(self):
1309 current = self.text['tabs'] or TK_TABWIDTH_DEFAULT
1314 def set_tk_tabwidth(self, newtabwidth):
1315 text = self.text
1316 if self.get_tk_tabwidth() != newtabwidth:
1325 def set_indentation_params(self, is_py_src, guess=True):
1327 i = self.guess_indent()
1329 self.indentwidth = i
1330 if self.indentwidth != self.tabwidth:
1331 self.usetabs = False
1332 self.set_tk_tabwidth(self.tabwidth)
1334 def smart_backspace_event(self, event):
1335 text = self.text
1336 first, last = self.get_selection_indices()
1357 tabwidth = self.tabwidth
1360 want = ((have - 1) // self.indentwidth) * self.indentwidth
1373 self.user_input_insert_tags)
1377 def smart_indent_event(self, event):
1384 text = self.text
1385 first, last = self.get_selection_indices()
1390 return self.fregion.indent_region_event(event)
1394 raw, effective = get_line_indent(prefix, self.tabwidth)
1397 self.reindent_to(effective + self.indentwidth)
1400 if self.usetabs:
1403 effective = len(prefix.expandtabs(self.tabwidth))
1404 n = self.indentwidth
1406 text.insert("insert", pad, self.user_input_insert_tags)
1412 def newline_and_indent_event(self, event):
1421 text = self.text
1422 first, last = self.get_selection_indices()
1438 self.user_input_insert_tags)
1455 text.insert("insert", '\n', self.user_input_insert_tags)
1460 y = pyparse.Parser(self.indentwidth, self.tabwidth)
1461 if not self.prompt_last_line:
1462 for context in self.num_context_lines:
1468 self._build_char_in_string_func(startatindex))
1491 text.insert("insert", indent, self.user_input_insert_tags)
1497 self.reindent_to(y.compute_bracket_indent())
1506 self.user_input_insert_tags)
1508 self.reindent_to(y.compute_backslash_indent())
1517 text.insert("insert", indent, self.user_input_insert_tags)
1519 self.smart_indent_event(event)
1521 self.smart_backspace_event(event)
1532 def _build_char_in_string_func(self, startindex):
1534 _icis=self.is_char_in_string):
1539 ## def change_tabwidth_event(self, event):
1540 ## new = self._asktabwidth()
1541 ## if new != self.tabwidth:
1542 ## self.tabwidth = new
1543 ## self.set_indentation_params(0, guess=0)
1548 def _make_blanks(self, n):
1549 if self.usetabs:
1550 ntabs, nspaces = divmod(n, self.tabwidth)
1558 def reindent_to(self, column):
1559 text = self.text
1564 text.insert("insert", self._make_blanks(column),
1565 self.user_input_insert_tags)
1573 def guess_indent(self):
1574 opener, indented = IndentSearcher(self.text).run()
1576 raw, indentsmall = get_line_indent(opener, self.tabwidth)
1577 raw, indentlarge = get_line_indent(indented, self.tabwidth)
1582 def toggle_line_numbers_event(self, event=None):
1583 if self.line_numbers is None:
1586 if self.line_numbers.is_shown:
1587 self.line_numbers.hide_sidebar()
1590 self.line_numbers.show_sidebar()
1592 self.update_menu_label(menu='options', index='*ine*umbers',
1614 def __init__(self, text):
1615 self.text = text
1616 self.i = self.finished = 0
1617 self.blkopenline = self.indentedline = None
1619 def readline(self):
1620 if self.finished:
1622 i = self.i = self.i + 1
1624 if self.text.compare(mark, ">=", "end"):
1626 return self.text.get(mark, mark + " lineend+1c")
1628 def tokeneater(self, type, token, start, end, line,
1633 if self.finished:
1636 self.blkopenline = line
1637 elif type == INDENT and self.blkopenline:
1638 self.indentedline = line
1639 self.finished = 1
1641 def run(self):
1647 tokens = tokenize.generate_tokens(self.readline)
1649 self.tokeneater(*token)
1653 return self.blkopenline, self.indentedline