annotate Lib/idlelib/EditorWindow.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 639dd6e62de4
children 133f87a7dbf5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1 import sys
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2 import os
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 import re
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4 import imp
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 from Tkinter import *
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 import tkSimpleDialog
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7 import tkMessageBox
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
8 import webbrowser
18582
28818766a64c py-cvs-2000_07_13 (Rev 1.38) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18537
diff changeset
9
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
10 from idlelib.MultiCall import MultiCallCreator
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
11 from idlelib import idlever
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
12 from idlelib import WindowList
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
13 from idlelib import SearchDialog
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
14 from idlelib import GrepDialog
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
15 from idlelib import ReplaceDialog
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
16 from idlelib import PyParse
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
17 from idlelib.configHandler import idleConf
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
18 from idlelib import aboutDialog, textView, configDialog
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
19 from idlelib import macosxSupport
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 # The default tab setting for a Text widget, in average-width characters.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 TK_TABWIDTH_DEFAULT = 8
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23
53412
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
24 def _sphinx_version():
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
25 "Format sys.version_info to produce the Sphinx version string used to install the chm docs"
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
26 major, minor, micro, level, serial = sys.version_info
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
27 release = '%s%s' % (major, minor)
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
28 if micro:
54739
912423135483 special case release candidates
Benjamin Peterson <benjamin@python.org>
parents: 53327
diff changeset
29 release += '%s' % (micro,)
912423135483 special case release candidates
Benjamin Peterson <benjamin@python.org>
parents: 53327
diff changeset
30 if level == 'candidate':
912423135483 special case release candidates
Benjamin Peterson <benjamin@python.org>
parents: 53327
diff changeset
31 release += 'rc%s' % (serial,)
912423135483 special case release candidates
Benjamin Peterson <benjamin@python.org>
parents: 53327
diff changeset
32 elif level != 'final':
53412
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
33 release += '%s%s' % (level[0], serial)
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
34 return release
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
35
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
36 def _find_module(fullname, path=None):
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
37 """Version of imp.find_module() that handles hierarchical module names"""
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
38
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
39 file = None
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
40 for tgt in fullname.split('.'):
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
41 if file is not None:
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
42 file.close() # close intermediate files
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
43 (file, filename, descr) = imp.find_module(tgt, path)
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
44 if descr[2] == imp.PY_SOURCE:
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
45 break # find but not load the source file
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
46 module = imp.load_module(tgt, file, filename, descr)
27208
b0d528327c4c SF bug #652933 (for IdleFork): Open Module "math" Fails (Hettinger)
Kurt B. Kaiser <kbk@shore.net>
parents: 27196
diff changeset
47 try:
b0d528327c4c SF bug #652933 (for IdleFork): Open Module "math" Fails (Hettinger)
Kurt B. Kaiser <kbk@shore.net>
parents: 27196
diff changeset
48 path = module.__path__
b0d528327c4c SF bug #652933 (for IdleFork): Open Module "math" Fails (Hettinger)
Kurt B. Kaiser <kbk@shore.net>
parents: 27196
diff changeset
49 except AttributeError:
b0d528327c4c SF bug #652933 (for IdleFork): Open Module "math" Fails (Hettinger)
Kurt B. Kaiser <kbk@shore.net>
parents: 27196
diff changeset
50 raise ImportError, 'No source for module ' + module.__name__
69310
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
51 if descr[2] != imp.PY_SOURCE:
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
52 # If all of the above fails and didn't raise an exception,fallback
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
53 # to a straight import which can find __init__.py in a package.
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
54 m = __import__(fullname)
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
55 try:
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
56 filename = m.__file__
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
57 except AttributeError:
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
58 pass
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
59 else:
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
60 file = None
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
61 base, ext = os.path.splitext(filename)
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
62 if ext == '.pyc':
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
63 ext = '.py'
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
64 filename = base + ext
e391f7005b0f Issue 11718: Teach IDLE's open module dialog to find packages.
Raymond Hettinger <python@rcn.com>
parents: 68937
diff changeset
65 descr = filename, None, imp.PY_SOURCE
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
66 return file, filename, descr
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
67
74799
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
68
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
69 class HelpDialog(object):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
70
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
71 def __init__(self):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
72 self.parent = None # parent of help window
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
73 self.dlg = None # the help window iteself
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
74
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
75 def display(self, parent, near=None):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
76 """ Display the help dialog.
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
77
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
78 parent - parent widget for the help window
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
79
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
80 near - a Toplevel widget (e.g. EditorWindow or PyShell)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
81 to use as a reference for placing the help window
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
82 """
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
83 if self.dlg is None:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
84 self.show_dialog(parent)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
85 if near:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
86 self.nearwindow(near)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
87
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
88 def show_dialog(self, parent):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
89 self.parent = parent
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
90 fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt')
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
91 self.dlg = dlg = textView.view_file(parent,'Help',fn, modal=False)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
92 dlg.bind('<Destroy>', self.destroy, '+')
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
93
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
94 def nearwindow(self, near):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
95 # Place the help dialog near the window specified by parent.
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
96 # Note - this may not reposition the window in Metacity
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
97 # if "/apps/metacity/general/disable_workarounds" is enabled
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
98 dlg = self.dlg
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
99 geom = (near.winfo_rootx() + 10, near.winfo_rooty() + 10)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
100 dlg.withdraw()
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
101 dlg.geometry("=+%d+%d" % geom)
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
102 dlg.deiconify()
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
103 dlg.lift()
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
104
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
105 def destroy(self, ev=None):
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
106 self.dlg = None
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
107 self.parent = None
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
108
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
109 helpDialog = HelpDialog() # singleton instance
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
110
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
111
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 33218
diff changeset
112 class EditorWindow(object):
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
113 from idlelib.Percolator import Percolator
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
114 from idlelib.ColorDelegator import ColorDelegator
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
115 from idlelib.UndoDelegator import UndoDelegator
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
116 from idlelib.IOBinding import IOBinding, filesystemencoding, encoding
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
117 from idlelib import Bindings
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 from Tkinter import Toplevel
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
119 from idlelib.MultiStatusBar import MultiStatusBar
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
121 help_url = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123 def __init__(self, flist=None, filename=None, key=None, root=None):
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
124 if EditorWindow.help_url is None:
30527
fbad3efa40bb Let IDLE use the HTMLHelp docs on Windows, if found.
Thomas Heller <theller@ctypes.org>
parents: 29794
diff changeset
125 dochome = os.path.join(sys.prefix, 'Doc', 'index.html')
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
126 if sys.platform.count('linux'):
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
127 # look for html docs in a couple of standard places
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
128 pyver = 'python-docs-' + '%s.%s.%s' % sys.version_info[:3]
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
129 if os.path.isdir('/var/www/html/python/'): # "python2" rpm
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
130 dochome = '/var/www/html/python/index.html'
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
131 else:
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
132 basepath = '/usr/share/doc/' # standard location
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
133 dochome = os.path.join(basepath, pyver,
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
134 'Doc', 'index.html')
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
135 elif sys.platform[:3] == 'win':
32777
13d20322787d EditorWindow.py was not finding the .chm help file on Windows. Typo
Kurt B. Kaiser <kbk@shore.net>
parents: 32681
diff changeset
136 chmfile = os.path.join(sys.prefix, 'Doc',
53412
4af06b2bc3cc Merged revisions 71812 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 52014
diff changeset
137 'Python%s.chm' % _sphinx_version())
30527
fbad3efa40bb Let IDLE use the HTMLHelp docs on Windows, if found.
Thomas Heller <theller@ctypes.org>
parents: 29794
diff changeset
138 if os.path.isfile(chmfile):
fbad3efa40bb Let IDLE use the HTMLHelp docs on Windows, if found.
Thomas Heller <theller@ctypes.org>
parents: 29794
diff changeset
139 dochome = chmfile
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
140 elif macosxSupport.runningAsOSXApp():
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
141 # documentation is stored inside the python framework
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
142 dochome = os.path.join(sys.prefix,
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
143 'Resources/English.lproj/Documentation/index.html')
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
144 dochome = os.path.normpath(dochome)
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
145 if os.path.isfile(dochome):
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
146 EditorWindow.help_url = dochome
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
147 if sys.platform == 'darwin':
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
148 # Safari requires real file:-URLs
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
149 EditorWindow.help_url = 'file://' + EditorWindow.help_url
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
150 else:
53413
c6bf52e153b4 Merged revisions 68801 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53412
diff changeset
151 EditorWindow.help_url = "http://docs.python.org/%d.%d" % sys.version_info[:2]
21620
7246fe5e5a28 moving to new config system
Steven M. Gava <elguavas@python.net>
parents: 21035
diff changeset
152 currentTheme=idleConf.CurrentTheme()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
153 self.flist = flist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
154 root = root or flist.root
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
155 self.root = root
39164
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
156 try:
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
157 sys.ps1
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
158 except AttributeError:
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
159 sys.ps1 = '>>> '
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
160 self.menubar = Menu(root)
33218
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 32777
diff changeset
161 self.top = top = WindowList.ListedToplevel(root, menu=self.menubar)
22600
0c5c64b75d5d further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22363
diff changeset
162 if flist:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
163 self.tkinter_vars = flist.vars
68503
ee5350f1d0c2 #11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68256
diff changeset
164 #self.top.instance_dict makes flist.inversedict available to
ee5350f1d0c2 #11515: fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68256
diff changeset
165 #configDialog.py so it can access all EditorWindow instances
39165
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
166 self.top.instance_dict = flist.inversedict
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
167 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
168 self.tkinter_vars = {} # keys: Tkinter event names
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
169 # values: Tkinter variable instances
39165
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
170 self.top.instance_dict = {}
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
171 self.recent_files_path = os.path.join(idleConf.GetUserCfgDir(),
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
172 'recent-files.lst')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
173 self.text_frame = text_frame = Frame(top)
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39421
diff changeset
174 self.vbar = vbar = Scrollbar(text_frame, name='vbar')
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
175 self.width = idleConf.GetOption('main','EditorWindow','width')
53415
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
176 text_options = {
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
177 'name': 'text',
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
178 'padx': 5,
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
179 'wrap': 'none',
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
180 'width': self.width,
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
181 'height': idleConf.GetOption('main', 'EditorWindow', 'height')}
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
182 if TkVersion >= 8.5:
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
183 # Starting with tk 8.5 we have to set the new tabstyle option
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
184 # to 'wordprocessor' to achieve the same display of tabs as in
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
185 # older tk versions.
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
186 text_options['tabstyle'] = 'wordprocessor'
7cd23b2eaa93 Merged revisions 70723 via svnmerge from
Kurt B. Kaiser <kbk@shore.net>
parents: 53413
diff changeset
187 self.text = text = MultiCallCreator(Text)(text_frame, **text_options)
33218
066c7890cd61 1. If user passes a non-existant filename on the commandline, just open
Kurt B. Kaiser <kbk@shore.net>
parents: 32777
diff changeset
188 self.top.focused_widget = self.text
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
189
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
190 self.createmenubar()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
191 self.apply_bindings()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
192
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
193 self.top.protocol("WM_DELETE_WINDOW", self.close)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
194 self.top.bind("<<close-window>>", self.close_event)
39146
9d18d968a58b Without this patch CMD-W won't close EditorWindows on MacOS X. This solves
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38744
diff changeset
195 if macosxSupport.runningAsOSXApp():
9d18d968a58b Without this patch CMD-W won't close EditorWindows on MacOS X. This solves
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38744
diff changeset
196 # Command-W on editorwindows doesn't work without this.
39182
1490529e74ce Fix bug #1517990: IDLE keybindings on OSX
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 39165
diff changeset
197 text.bind('<<close-window>>', self.close_event)
67023
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
198 # Some OS X systems have only one mouse button,
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
199 # so use control-click for pulldown menus there.
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
200 # (Note, AquaTk defines <2> as the right button if
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
201 # present and the Tk Text widget already binds <2>.)
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
202 text.bind("<Control-Button-1>",self.right_menu_event)
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
203 else:
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
204 # Elsewhere, use right-click for pulldown menus.
5f49d3cb194f Merged revisions 87374 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 60146
diff changeset
205 text.bind("<3>",self.right_menu_event)
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
206 text.bind("<<cut>>", self.cut)
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
207 text.bind("<<copy>>", self.copy)
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
208 text.bind("<<paste>>", self.paste)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
209 text.bind("<<center-insert>>", self.center_insert_event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
210 text.bind("<<help>>", self.help_dialog)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
211 text.bind("<<python-docs>>", self.python_docs)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
212 text.bind("<<about-idle>>", self.about_dialog)
21035
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
213 text.bind("<<open-config-dialog>>", self.config_dialog)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
214 text.bind("<<open-module>>", self.open_module)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
215 text.bind("<<do-nothing>>", lambda event: "break")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
216 text.bind("<<select-all>>", self.select_all)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
217 text.bind("<<remove-selection>>", self.remove_selection)
21626
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
218 text.bind("<<find>>", self.find_event)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
219 text.bind("<<find-again>>", self.find_again_event)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
220 text.bind("<<find-in-files>>", self.find_in_files_event)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
221 text.bind("<<find-selection>>", self.find_selection_event)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
222 text.bind("<<replace>>", self.replace_event)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
223 text.bind("<<goto-line>>", self.goto_line_event)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
224 text.bind("<<smart-backspace>>",self.smart_backspace_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
225 text.bind("<<newline-and-indent>>",self.newline_and_indent_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
226 text.bind("<<smart-indent>>",self.smart_indent_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
227 text.bind("<<indent-region>>",self.indent_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
228 text.bind("<<dedent-region>>",self.dedent_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
229 text.bind("<<comment-region>>",self.comment_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
230 text.bind("<<uncomment-region>>",self.uncomment_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
231 text.bind("<<tabify-region>>",self.tabify_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
232 text.bind("<<untabify-region>>",self.untabify_region_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
233 text.bind("<<toggle-tabs>>",self.toggle_tabs_event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
234 text.bind("<<change-indentwidth>>",self.change_indentwidth_event)
27272
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
235 text.bind("<Left>", self.move_at_edge_if_selection(0))
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
236 text.bind("<Right>", self.move_at_edge_if_selection(1))
34515
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
237 text.bind("<<del-word-left>>", self.del_word_left)
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
238 text.bind("<<del-word-right>>", self.del_word_right)
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
239 text.bind("<<beginning-of-line>>", self.home_callback)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
240
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
241 if flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
242 flist.inversedict[self] = key
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
243 if key:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
244 flist.dict[key] = self
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
245 text.bind("<<open-new-window>>", self.new_callback)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
246 text.bind("<<close-all-windows>>", self.flist.close_all_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
247 text.bind("<<open-class-browser>>", self.open_class_browser)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
248 text.bind("<<open-path-browser>>", self.open_path_browser)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
249
20304
e44cdef791ee merged status bar packing patch
Steven M. Gava <elguavas@python.net>
parents: 19170
diff changeset
250 self.set_status_bar()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
251 vbar['command'] = text.yview
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
252 vbar.pack(side=RIGHT, fill=Y)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
253 text['yscrollcommand'] = vbar.set
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
254 fontWeight = 'normal'
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
255 if idleConf.GetOption('main', 'EditorWindow', 'font-bold', type='bool'):
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
256 fontWeight='bold'
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
257 text.config(font=(idleConf.GetOption('main', 'EditorWindow', 'font'),
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
258 idleConf.GetOption('main', 'EditorWindow', 'font-size'),
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
259 fontWeight))
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
260 text_frame.pack(side=LEFT, fill=BOTH, expand=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
261 text.pack(side=TOP, fill=BOTH, expand=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
262 text.focus_set()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
263
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
264 # usetabs true -> literal tab characters are used by indent and
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
265 # dedent cmds, possibly mixed with spaces if
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
266 # indentwidth is not a multiple of tabwidth,
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
267 # which will cause Tabnanny to nag!
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
268 # false -> tab characters are converted to spaces by indent
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
269 # and dedent cmds, and ditto TAB keystrokes
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
270 # Although use-spaces=0 can be configured manually in config-main.def,
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
271 # configuration of tabs v. spaces is not supported in the configuration
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
272 # dialog. IDLE promotes the preferred Python indentation: use spaces!
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
273 usespaces = idleConf.GetOption('main', 'Indent', 'use-spaces', type='bool')
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
274 self.usetabs = not usespaces
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
275
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
276 # tabwidth is the display width of a literal tab character.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
277 # CAUTION: telling Tk to use anything other than its default
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
278 # tab setting causes it to use an entirely different tabbing algorithm,
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
279 # treating tab stops as fixed distances from the left margin.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
280 # Nobody expects this, so for now tabwidth should never be changed.
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
281 self.tabwidth = 8 # must remain 8 until Tk is fixed.
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
282
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
283 # indentwidth is the number of screen characters per indent level.
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
284 # The recommended Python indentation is four spaces.
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
285 self.indentwidth = self.tabwidth
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
286 self.set_notabs_indentwidth()
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
287
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
288 # If context_use_ps1 is true, parsing searches back for a ps1 line;
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
289 # else searches for a popular (if, def, ...) Python stmt.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
290 self.context_use_ps1 = False
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
291
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
292 # When searching backwards for a reliable place to begin parsing,
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
293 # first start num_context_lines[0] lines back, then
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
294 # num_context_lines[1] lines back if that didn't work, and so on.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
295 # The last value should be huge (larger than the # of lines in a
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
296 # conceivable file).
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
297 # Making the initial values larger slows things down more often.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
298 self.num_context_lines = 50, 500, 5000000
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
299
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
300 self.per = per = self.Percolator(text)
24183
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
301
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
302 self.undo = undo = self.UndoDelegator()
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
303 per.insertfilter(undo)
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
304 text.undo_block_start = undo.undo_block_start
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
305 text.undo_block_stop = undo.undo_block_stop
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
306 undo.set_saved_change_hook(self.saved_change_hook)
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
307
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
308 # IOBinding implements file I/O and printing functionality
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
309 self.io = io = self.IOBinding(self)
24183
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
310 io.set_filename_change_hook(self.filename_change_hook)
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
311
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
312 # Create the recent files submenu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
313 self.recent_files_menu = Menu(self.menubar)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
314 self.menudict['file'].insert_cascade(3, label='Recent Files',
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
315 underline=0,
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
316 menu=self.recent_files_menu)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
317 self.update_recent_files_list()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
318
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
319 self.color = None # initialized below in self.ResetColorizer
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
320 if filename:
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
321 if os.path.exists(filename) and not os.path.isdir(filename):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
322 io.loadfile(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
323 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
324 io.set_filename(filename)
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
325 self.ResetColorizer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
326 self.saved_change_hook()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
327
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
328 self.set_indentation_params(self.ispythonsource(filename))
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
329
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
330 self.load_extensions()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
331
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
332 menu = self.menudict.get('windows')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
333 if menu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
334 end = menu.index("end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
335 if end is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
336 end = -1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
337 if end >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
338 menu.add_separator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
339 end = end + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
340 self.wmenu_end = end
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
341 WindowList.register_callback(self.postwindowsmenu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
342
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
343 # Some abstractions so IDLE extensions are cross-IDE
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
344 self.askyesno = tkMessageBox.askyesno
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
345 self.askinteger = tkSimpleDialog.askinteger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
346 self.showerror = tkMessageBox.showerror
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
347
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
348 def _filename_to_unicode(self, filename):
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
349 """convert filename to unicode in order to display it in Tk"""
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
350 if isinstance(filename, unicode) or not filename:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
351 return filename
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
352 else:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
353 try:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
354 return filename.decode(self.filesystemencoding)
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
355 except UnicodeDecodeError:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
356 # XXX
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
357 try:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
358 return filename.decode(self.encoding)
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
359 except UnicodeDecodeError:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
360 # byte-to-byte conversion
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
361 return filename.decode('iso8859-1')
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
362
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
363 def new_callback(self, event):
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
364 dirname, basename = self.io.defaultfilename()
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
365 self.flist.new(dirname)
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
366 return "break"
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
367
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
368 def home_callback(self, event):
68639
664a129c01f7 <Home> toggle non-functional when NumLock set.
Kurt B. Kaiser <kbk@shore.net>
parents: 68503
diff changeset
369 if (event.state & 4) != 0 and event.keysym == "Home":
664a129c01f7 <Home> toggle non-functional when NumLock set.
Kurt B. Kaiser <kbk@shore.net>
parents: 68503
diff changeset
370 # state&4==Control. If <Control-Home>, use the Tk binding.
664a129c01f7 <Home> toggle non-functional when NumLock set.
Kurt B. Kaiser <kbk@shore.net>
parents: 68503
diff changeset
371 return
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
372 if self.text.index("iomark") and \
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
373 self.text.compare("iomark", "<=", "insert lineend") and \
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
374 self.text.compare("insert linestart", "<=", "iomark"):
68937
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
375 # In Shell on input line, go to just after prompt
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
376 insertpt = int(self.text.index("iomark").split(".")[1])
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
377 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
378 line = self.text.get("insert linestart", "insert lineend")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
379 for insertpt in xrange(len(line)):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
380 if line[insertpt] not in (' ','\t'):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
381 break
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
382 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
383 insertpt=len(line)
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
384 lineat = int(self.text.index("insert").split('.')[1])
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
385 if insertpt == lineat:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
386 insertpt = 0
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
387 dest = "insert linestart+"+str(insertpt)+"c"
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
388 if (event.state&1) == 0:
68937
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
389 # shift was not pressed
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
390 self.text.tag_remove("sel", "1.0", "end")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
391 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
392 if not self.text.index("sel.first"):
68937
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
393 self.text.mark_set("my_anchor", "insert") # there was no previous selection
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
394 else:
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
395 if self.text.compare(self.text.index("sel.first"), "<", self.text.index("insert")):
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
396 self.text.mark_set("my_anchor", "sel.first") # extend back
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
397 else:
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
398 self.text.mark_set("my_anchor", "sel.last") # extend forward
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
399 first = self.text.index(dest)
68937
500e48708470 <Home> toggle failing on Tk 8.5, causing IDLE exits. Issue 3851.
Kurt B. Kaiser <kbk@shore.net>
parents: 68639
diff changeset
400 last = self.text.index("my_anchor")
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
401 if self.text.compare(first,">",last):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
402 first,last = last,first
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
403 self.text.tag_remove("sel", "1.0", "end")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
404 self.text.tag_add("sel", first, last)
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
405 self.text.mark_set("insert", dest)
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
406 self.text.see("insert")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
407 return "break"
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
408
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
409 def set_status_bar(self):
20304
e44cdef791ee merged status bar packing patch
Steven M. Gava <elguavas@python.net>
parents: 19170
diff changeset
410 self.status_bar = self.MultiStatusBar(self.top)
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
411 if macosxSupport.runningAsOSXApp():
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
412 # Insert some padding to avoid obscuring some of the statusbar
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
413 # by the resize widget.
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
414 self.status_bar.set_label('_padding1', ' ', side=RIGHT)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
415 self.status_bar.set_label('column', 'Col: ?', side=RIGHT)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
416 self.status_bar.set_label('line', 'Ln: ?', side=RIGHT)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
417 self.status_bar.pack(side=BOTTOM, fill=X)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
418 self.text.bind("<<set-line-and-column>>", self.set_line_and_column)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
419 self.text.event_add("<<set-line-and-column>>",
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
420 "<KeyRelease>", "<ButtonRelease>")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
421 self.text.after_idle(self.set_line_and_column)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
422
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
423 def set_line_and_column(self, event=None):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
424 line, column = self.text.index(INSERT).split('.')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
425 self.status_bar.set_label('column', 'Col: %s' % column)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
426 self.status_bar.set_label('line', 'Ln: %s' % line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
427
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
428 menu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
429 ("file", "_File"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
430 ("edit", "_Edit"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
431 ("format", "F_ormat"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
432 ("run", "_Run"),
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
433 ("options", "_Options"),
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
434 ("windows", "_Windows"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
435 ("help", "_Help"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
436 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
437
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
438 if macosxSupport.runningAsOSXApp():
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
439 del menu_specs[-3]
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
440 menu_specs[-2] = ("windows", "_Window")
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
441
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
442
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
443 def createmenubar(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
444 mbar = self.menubar
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
445 self.menudict = menudict = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
446 for name, label in self.menu_specs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
447 underline, label = prepstr(label)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
448 menudict[name] = menu = Menu(mbar, name=name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
449 mbar.add_cascade(label=label, menu=menu, underline=underline)
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
450
67670
2d42f64b28fd Merged revisions 87394 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67242
diff changeset
451 if macosxSupport.isCarbonAquaTk(self.root):
38744
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
452 # Insert the application menu
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
453 menudict['application'] = menu = Menu(mbar, name='apple')
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
454 mbar.add_cascade(label='IDLE', menu=menu)
1b3b6b1982aa This patch improves the L&F of IDLE on OSX. The changes are conditionalized on
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38704
diff changeset
455
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
456 self.fill_menus()
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
457 self.base_helpmenu_length = self.menudict['help'].index(END)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
458 self.reset_help_menu_entries()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
459
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
460 def postwindowsmenu(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
461 # Only called when Windows menu exists
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
462 menu = self.menudict['windows']
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
463 end = menu.index("end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
464 if end is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
465 end = -1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
466 if end > self.wmenu_end:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
467 menu.delete(self.wmenu_end+1, end)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
468 WindowList.add_windows_to_menu(menu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
469
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
470 rmenu = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
471
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
472 def right_menu_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
473 self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
474 if not self.rmenu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
475 self.make_rmenu()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
476 rmenu = self.rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
477 self.event = event
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
478 iswin = sys.platform[:3] == 'win'
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
479 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
480 self.text.config(cursor="arrow")
80172
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
481
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
482 for label, eventname, verify_state in self.rmenu_specs:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
483 if verify_state is None:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
484 continue
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
485 state = getattr(self, verify_state)()
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
486 rmenu.entryconfigure(label, state=state)
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
487
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
488 rmenu.tk_popup(event.x_root, event.y_root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
489 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
490 self.text.config(cursor="ibeam")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
491
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
492 rmenu_specs = [
80172
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
493 # ("Label", "<<virtual-event>>", "statefuncname"), ...
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
494 ("Close", "<<close-window>>", None), # Example
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
495 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
496
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
497 def make_rmenu(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
498 rmenu = Menu(self.text, tearoff=0)
80172
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
499 for label, eventname, _ in self.rmenu_specs:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
500 if label is not None:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
501 def command(text=self.text, eventname=eventname):
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
502 text.event_generate(eventname)
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
503 rmenu.add_command(label=label, command=command)
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
504 else:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
505 rmenu.add_separator()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
506 self.rmenu = rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
507
80172
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
508 def rmenu_check_cut(self):
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
509 return self.rmenu_check_copy()
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
510
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
511 def rmenu_check_copy(self):
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
512 try:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
513 indx = self.text.index('sel.first')
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
514 except TclError:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
515 return 'disabled'
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
516 else:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
517 return 'normal' if indx else 'disabled'
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
518
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
519 def rmenu_check_paste(self):
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
520 try:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
521 self.text.tk.call('tk::GetSelection', self.text, 'CLIPBOARD')
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
522 except TclError:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
523 return 'disabled'
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
524 else:
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
525 return 'normal'
639dd6e62de4 Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 77233
diff changeset
526
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
527 def about_dialog(self, event=None):
29421
2ba5ec6b3cda 1. Remove the Readme entry on the Help Menu, now in About dialog.
Kurt B. Kaiser <kbk@shore.net>
parents: 29368
diff changeset
528 aboutDialog.AboutDialog(self.top,'About IDLE')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
529
21035
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
530 def config_dialog(self, event=None):
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
531 configDialog.ConfigDialog(self.top,'Settings')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
532
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
533 def help_dialog(self, event=None):
74799
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
534 if self.root:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
535 parent = self.root
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
536 else:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
537 parent = self.top
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
538 helpDialog.display(parent, near=self.top)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
539
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
540 def python_docs(self, event=None):
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
541 if sys.platform[:3] == 'win':
67242
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
542 try:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
543 os.startfile(self.help_url)
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
544 except WindowsError as why:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
545 tkMessageBox.showerror(title='Document Start Failure',
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
546 message=str(why), parent=self.text)
23208
382e37ac374d tracking python idle changes:
Steven M. Gava <elguavas@python.net>
parents: 22602
diff changeset
547 else:
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
548 webbrowser.open(self.help_url)
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
549 return "break"
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
550
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
551 def cut(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
552 self.text.event_generate("<<Cut>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
553 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
554
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
555 def copy(self,event):
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
556 if not self.text.tag_ranges("sel"):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
557 # There is no selection, so do nothing and maybe interrupt.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
558 return
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
559 self.text.event_generate("<<Copy>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
560 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
561
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
562 def paste(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
563 self.text.event_generate("<<Paste>>")
43520
1d52e783842d show paste if > 80 columns. Patch 1659326 Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents: 43462
diff changeset
564 self.text.see("insert")
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
565 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
566
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
567 def select_all(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
568 self.text.tag_add("sel", "1.0", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
569 self.text.mark_set("insert", "1.0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
570 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
571 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
572
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
573 def remove_selection(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
574 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
575 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
576
27272
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
577 def move_at_edge_if_selection(self, edge_index):
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
578 """Cursor move begins at start or end of selection
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
579
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
580 When a left/right cursor key is pressed create and return to Tkinter a
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
581 function which causes a cursor move from the associated edge of the
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
582 selection.
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
583
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
584 """
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
585 self_text_index = self.text.index
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
586 self_text_mark_set = self.text.mark_set
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
587 edges_table = ("sel.first+1c", "sel.last-1c")
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
588 def move_at_edge(event):
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
589 if (event.state & 5) == 0: # no shift(==1) or control(==4) pressed
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
590 try:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
591 self_text_index("sel.first")
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
592 self_text_mark_set("insert", edges_table[edge_index])
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
593 except TclError:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
594 pass
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
595 return move_at_edge
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
596
34515
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
597 def del_word_left(self, event):
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
598 self.text.event_generate('<Meta-Delete>')
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
599 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
600
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
601 def del_word_right(self, event):
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
602 self.text.event_generate('<Meta-d>')
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
603 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
604
21626
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
605 def find_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
606 SearchDialog.find(self.text)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
607 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
608
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
609 def find_again_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
610 SearchDialog.find_again(self.text)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
611 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
612
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
613 def find_selection_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
614 SearchDialog.find_selection(self.text)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
615 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
616
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
617 def find_in_files_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
618 GrepDialog.grep(self.text, self.io, self.flist)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
619 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
620
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
621 def replace_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
622 ReplaceDialog.replace(self.text)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
623 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
624
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
625 def goto_line_event(self, event):
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
626 text = self.text
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
627 lineno = tkSimpleDialog.askinteger("Goto",
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
628 "Go to line number:",parent=text)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
629 if lineno is None:
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
630 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
631 if lineno <= 0:
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
632 text.bell()
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
633 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
634 text.mark_set("insert", "%d.0" % lineno)
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
635 text.see("insert")
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
636
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
637 def open_module(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
638 # XXX Shouldn't this be in IOBinding or in FileList?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
639 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
640 name = self.text.get("sel.first", "sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
641 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
642 name = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
643 else:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
644 name = name.strip()
29364
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
645 name = tkSimpleDialog.askstring("Module",
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
646 "Enter the name of a Python module\n"
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
647 "to search on sys.path and open:",
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
648 parent=self.text, initialvalue=name)
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
649 if name:
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
650 name = name.strip()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
651 if not name:
29364
e0f071b476fd Change to <<open-module>>: always pop up the dialog, using the current
Guido van Rossum <guido@python.org>
parents: 29362
diff changeset
652 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
653 # XXX Ought to insert current file's directory in front of path
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
654 try:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
655 (f, file, (suffix, mode, type)) = _find_module(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
656 except (NameError, ImportError), msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
657 tkMessageBox.showerror("Import error", str(msg), parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
658 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
659 if type != imp.PY_SOURCE:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
660 tkMessageBox.showerror("Unsupported type",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
661 "%s is not a source module" % name, parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
662 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
663 if f:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
664 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
665 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
666 self.flist.open(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
667 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
668 self.io.loadfile(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
669
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
670 def open_class_browser(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
671 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
672 if not filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
673 tkMessageBox.showerror(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
674 "No filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
675 "This buffer has no associated filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
676 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
677 self.text.focus_set()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
678 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
679 head, tail = os.path.split(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
680 base, ext = os.path.splitext(tail)
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
681 from idlelib import ClassBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
682 ClassBrowser.ClassBrowser(self.flist, base, [head])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
683
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
684 def open_path_browser(self, event=None):
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
685 from idlelib import PathBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
686 PathBrowser.PathBrowser(self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
687
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
688 def gotoline(self, lineno):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
689 if lineno is not None and lineno > 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
690 self.text.mark_set("insert", "%d.0" % lineno)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
691 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
692 self.text.tag_add("sel", "insert", "insert +1l")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
693 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
694
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
695 def ispythonsource(self, filename):
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
696 if not filename or os.path.isdir(filename):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
697 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
698 base, ext = os.path.splitext(os.path.basename(filename))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
699 if os.path.normcase(ext) in (".py", ".pyw"):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
700 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
701 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
702 f = open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
703 line = f.readline()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
704 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
705 except IOError:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
706 return False
26733
709f90541585 "'foo' in str" not implemented in Python 2.2, only single character lookup
Kurt B. Kaiser <kbk@shore.net>
parents: 26678
diff changeset
707 return line.startswith('#!') and line.find('python') >= 0
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
708
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
709 def close_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
710 if self.flist:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
711 self.flist.unregister_maybe_terminate(self)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
712 self.flist = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
713
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
714 def set_close_hook(self, close_hook):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
715 self.close_hook = close_hook
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
716
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
717 def filename_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
718 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
719 self.flist.filename_changed_edit(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
720 self.saved_change_hook()
29367
ca20c3cbc956 1. Update WindowList registry when filename changes so that
Kurt B. Kaiser <kbk@shore.net>
parents: 29364
diff changeset
721 self.top.update_windowlist_registry(self)
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
722 self.ResetColorizer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
723
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
724 def _addcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
725 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
726 return
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
727 if self.ispythonsource(self.io.filename):
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
728 self.color = self.ColorDelegator()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
729 # can add more colorizers here...
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
730 if self.color:
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
731 self.per.removefilter(self.undo)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
732 self.per.insertfilter(self.color)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
733 self.per.insertfilter(self.undo)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
734
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
735 def _rmcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
736 if not self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
737 return
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
738 self.color.removecolors()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
739 self.per.removefilter(self.color)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
740 self.color = None
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
741
22111
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 22051
diff changeset
742 def ResetColorizer(self):
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
743 "Update the colour theme"
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
744 # Called from self.filename_change_hook and from configDialog.py
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
745 self._rmcolorizer()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
746 self._addcolorizer()
31625
1b02c77cdcfe Add a highlight theme for builtin keywords. Python Patch 805830 Nigel Rowe
Kurt B. Kaiser <kbk@shore.net>
parents: 31515
diff changeset
747 theme = idleConf.GetOption('main','Theme','name')
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
748 normal_colors = idleConf.GetHighlight(theme, 'normal')
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
749 cursor_color = idleConf.GetHighlight(theme, 'cursor', fgBg='fg')
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
750 select_colors = idleConf.GetHighlight(theme, 'hilite')
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
751 self.text.config(
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
752 foreground=normal_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
753 background=normal_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
754 insertbackground=cursor_color,
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
755 selectforeground=select_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
756 selectbackground=select_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
757 )
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
758
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
759 def ResetFont(self):
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
760 "Update the text widgets' font if it is changed"
23969
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
761 # Called from configDialog.py
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
762 fontWeight='normal'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
763 if idleConf.GetOption('main','EditorWindow','font-bold',type='bool'):
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
764 fontWeight='bold'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
765 self.text.config(font=(idleConf.GetOption('main','EditorWindow','font'),
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
766 idleConf.GetOption('main','EditorWindow','font-size'),
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
767 fontWeight))
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
768
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
769 def RemoveKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
770 "Remove the keybindings before they are changed."
23969
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
771 # Called from configDialog.py
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
772 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
773 for event, keylist in keydefs.items():
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
774 self.text.event_delete(event, *keylist)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
775 for extensionName in self.get_standard_extension_names():
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
776 xkeydefs = idleConf.GetExtensionBindings(extensionName)
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
777 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
778 for event, keylist in xkeydefs.items():
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
779 self.text.event_delete(event, *keylist)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
780
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
781 def ApplyKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
782 "Update the keybindings after they are changed"
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
783 # Called from configDialog.py
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
784 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
785 self.apply_bindings()
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
786 for extensionName in self.get_standard_extension_names():
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
787 xkeydefs = idleConf.GetExtensionBindings(extensionName)
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
788 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
789 self.apply_bindings(xkeydefs)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
790 #update menu accelerators
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
791 menuEventDict = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
792 for menu in self.Bindings.menudefs:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
793 menuEventDict[menu[0]] = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
794 for item in menu[1]:
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
795 if item:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
796 menuEventDict[menu[0]][prepstr(item[0])[1]] = item[1]
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
797 for menubarItem in self.menudict.keys():
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
798 menu = self.menudict[menubarItem]
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
799 end = menu.index(END) + 1
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
800 for index in range(0, end):
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
801 if menu.type(index) == 'command':
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
802 accel = menu.entrycget(index, 'accelerator')
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
803 if accel:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
804 itemName = menu.entrycget(index, 'label')
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
805 event = ''
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
806 if menubarItem in menuEventDict:
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
807 if itemName in menuEventDict[menubarItem]:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
808 event = menuEventDict[menubarItem][itemName]
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
809 if event:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
810 accel = get_accelerator(keydefs, event)
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
811 menu.entryconfig(index, accelerator=accel)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
812
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
813 def set_notabs_indentwidth(self):
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
814 "Update the indentwidth if changed and not using tabs in this window"
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
815 # Called from configDialog.py
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
816 if not self.usetabs:
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
817 self.indentwidth = idleConf.GetOption('main', 'Indent','num-spaces',
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
818 type='int')
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
819
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
820 def reset_help_menu_entries(self):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
821 "Update the additional help entries on the Help menu"
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
822 help_list = idleConf.GetAllExtraHelpSourcesList()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
823 helpmenu = self.menudict['help']
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
824 # first delete the extra help entries, if any
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
825 helpmenu_length = helpmenu.index(END)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
826 if helpmenu_length > self.base_helpmenu_length:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
827 helpmenu.delete((self.base_helpmenu_length + 1), helpmenu_length)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
828 # then rebuild them
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
829 if help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
830 helpmenu.add_separator()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
831 for entry in help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
832 cmd = self.__extra_help_callback(entry[1])
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
833 helpmenu.add_command(label=entry[0], command=cmd)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
834 # and update the menu dictionary
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
835 self.menudict['help'] = helpmenu
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
836
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
837 def __extra_help_callback(self, helpfile):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
838 "Create a callback with the helpfile value frozen at definition time"
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
839 def display_extra_help(helpfile=helpfile):
38704
ba6eebf7c719 Make use of new str.startswith/endswith semantics.
Georg Brandl <georg@python.org>
parents: 35958
diff changeset
840 if not helpfile.startswith(('www', 'http')):
67242
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
841 helpfile = os.path.normpath(helpfile)
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
842 if sys.platform[:3] == 'win':
67242
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
843 try:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
844 os.startfile(helpfile)
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
845 except WindowsError as why:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
846 tkMessageBox.showerror(title='Document Start Failure',
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
847 message=str(why), parent=self.text)
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
848 else:
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
849 webbrowser.open(helpfile)
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
850 return display_extra_help
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
851
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
852 def update_recent_files_list(self, new_file=None):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
853 "Load and update the recent files list and menus"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
854 rf_list = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
855 if os.path.exists(self.recent_files_path):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
856 rf_list_file = open(self.recent_files_path,'r')
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
857 try:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
858 rf_list = rf_list_file.readlines()
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
859 finally:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
860 rf_list_file.close()
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
861 if new_file:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
862 new_file = os.path.abspath(new_file) + '\n'
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
863 if new_file in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
864 rf_list.remove(new_file) # move to top
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
865 rf_list.insert(0, new_file)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
866 # clean and save the recent files list
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
867 bad_paths = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
868 for path in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
869 if '\0' in path or not os.path.exists(path[0:-1]):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
870 bad_paths.append(path)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
871 rf_list = [path for path in rf_list if path not in bad_paths]
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
872 ulchars = "1234567890ABCDEFGHIJK"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
873 rf_list = rf_list[0:len(ulchars)]
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
874 try:
73967
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
875 with open(self.recent_files_path, 'w') as rf_file:
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
876 rf_file.writelines(rf_list)
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
877 except IOError as err:
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
878 if not getattr(self.root, "recentfilelist_error_displayed", False):
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
879 self.root.recentfilelist_error_displayed = True
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
880 tkMessageBox.showerror(title='IDLE Error',
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
881 message='Unable to update Recent Files list:\n%s'
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
882 % str(err),
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
883 parent=self.text)
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
884 # for each edit window instance, construct the recent files menu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
885 for instance in self.top.instance_dict.keys():
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
886 menu = instance.recent_files_menu
77233
3108331c88ec Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu.
Ned Deily <nad@acm.org>
parents: 74799
diff changeset
887 menu.delete(0, END) # clear, and rebuild:
55638
a0f80dc09dfe Issue #3344: Replace itertools.count by enumerate.
Guilherme Polo <ggpolo@gmail.com>
parents: 54739
diff changeset
888 for i, file_name in enumerate(rf_list):
a0f80dc09dfe Issue #3344: Replace itertools.count by enumerate.
Guilherme Polo <ggpolo@gmail.com>
parents: 54739
diff changeset
889 file_name = file_name.rstrip() # zap \n
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
890 # make unicode string to display non-ASCII chars correctly
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
891 ufile_name = self._filename_to_unicode(file_name)
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
892 callback = instance.__recent_file_callback(file_name)
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
893 menu.add_command(label=ulchars[i] + " " + ufile_name,
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
894 command=callback,
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
895 underline=0)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
896
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
897 def __recent_file_callback(self, file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
898 def open_recent_file(fn_closure=file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
899 self.io.open(editFile=fn_closure)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
900 return open_recent_file
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
901
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
902 def saved_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
903 short = self.short_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
904 long = self.long_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
905 if short and long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
906 title = short + " - " + long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
907 elif short:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
908 title = short
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
909 elif long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
910 title = long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
911 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
912 title = "Untitled"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
913 icon = short or long or title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
914 if not self.get_saved():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
915 title = "*%s*" % title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
916 icon = "*%s" % icon
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
917 self.top.wm_title(title)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
918 self.top.wm_iconname(icon)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
919
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
920 def get_saved(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
921 return self.undo.get_saved()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
922
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
923 def set_saved(self, flag):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
924 self.undo.set_saved(flag)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
925
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
926 def reset_undo(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
927 self.undo.reset_undo()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
928
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
929 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
930 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
931 if filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
932 filename = os.path.basename(filename)
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
933 # return unicode string to display non-ASCII chars correctly
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
934 return self._filename_to_unicode(filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
935
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
936 def long_title(self):
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
937 # return unicode string to display non-ASCII chars correctly
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
938 return self._filename_to_unicode(self.io.filename or "")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
939
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
940 def center_insert_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
941 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
942
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
943 def center(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
944 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
945 top, bot = self.getwindowlines()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
946 lineno = self.getlineno(mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
947 height = bot - top
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
948 newtop = max(1, lineno - height//2)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
949 text.yview(float(newtop))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
950
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
951 def getwindowlines(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
952 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
953 top = self.getlineno("@0,0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
954 bot = self.getlineno("@0,65535")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
955 if top == bot and text.winfo_height() == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
956 # Geometry manager hasn't run yet
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
957 height = int(text['height'])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
958 bot = top + height - 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
959 return top, bot
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
960
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
961 def getlineno(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
962 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
963 return int(float(text.index(mark)))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
964
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
965 def get_geometry(self):
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
966 "Return (width, height, x, y)"
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
967 geom = self.top.wm_geometry()
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
968 m = re.match(r"(\d+)x(\d+)\+(-?\d+)\+(-?\d+)", geom)
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
969 tuple = (map(int, m.groups()))
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
970 return tuple
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
971
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
972 def close_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
973 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
974
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
975 def maybesave(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
976 if self.io:
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
977 if not self.get_saved():
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
978 if self.top.state()!='normal':
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
979 self.top.deiconify()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
980 self.top.lower()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
981 self.top.lift()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
982 return self.io.maybesave()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
983
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
984 def close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
985 reply = self.maybesave()
40598
43c75e540e92 - idle: Honor the "Cancel" action in the save dialog (Debian bug #299092).
Matthias Klose <doko@ubuntu.com>
parents: 39421
diff changeset
986 if str(reply) != "cancel":
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
987 self._close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
988 return reply
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
989
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
990 def _close(self):
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
991 if self.io.filename:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
992 self.update_recent_files_list(new_file=self.io.filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
993 WindowList.unregister_callback(self.postwindowsmenu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
994 self.unload_extensions()
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
995 self.io.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
996 self.io = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
997 self.undo = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
998 if self.color:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
999 self.color.close(False)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1000 self.color = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1001 self.text = None
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1002 self.tkinter_vars = None
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1003 self.per.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1004 self.per = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1005 self.top.destroy()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1006 if self.close_hook:
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1007 # unless override: unregister from flist, terminate if last window
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1008 self.close_hook()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1009
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1010 def load_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1011 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1012 self.load_standard_extensions()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1013
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1014 def unload_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1015 for ins in self.extensions.values():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1016 if hasattr(ins, "close"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1017 ins.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1018 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1019
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1020 def load_standard_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1021 for name in self.get_standard_extension_names():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1022 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1023 self.load_extension(name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1024 except:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1025 print "Failed to load extension", repr(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1026 import traceback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1027 traceback.print_exc()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1028
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1029 def get_standard_extension_names(self):
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1030 return idleConf.GetExtensions(editor_only=True)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1031
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1032 def load_extension(self, name):
34439
775a72b9d52c If an extension can't be loaded, print warning and skip it instead of
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
1033 try:
775a72b9d52c If an extension can't be loaded, print warning and skip it instead of
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
1034 mod = __import__(name, globals(), locals(), [])
775a72b9d52c If an extension can't be loaded, print warning and skip it instead of
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
1035 except ImportError:
775a72b9d52c If an extension can't be loaded, print warning and skip it instead of
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
1036 print "\nFailed to import extension: ", name
775a72b9d52c If an extension can't be loaded, print warning and skip it instead of
Kurt B. Kaiser <kbk@shore.net>
parents: 34212
diff changeset
1037 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1038 cls = getattr(mod, name)
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1039 keydefs = idleConf.GetExtensionBindings(name)
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1040 if hasattr(cls, "menudefs"):
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1041 self.fill_menus(cls.menudefs, keydefs)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1042 ins = cls(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1043 self.extensions[name] = ins
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1044 if keydefs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1045 self.apply_bindings(keydefs)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1046 for vevent in keydefs.keys():
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1047 methodname = vevent.replace("-", "_")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1048 while methodname[:1] == '<':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1049 methodname = methodname[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1050 while methodname[-1:] == '>':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1051 methodname = methodname[:-1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1052 methodname = methodname + "_event"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1053 if hasattr(ins, methodname):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1054 self.text.bind(vevent, getattr(ins, methodname))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1055
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1056 def apply_bindings(self, keydefs=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1057 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1058 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1059 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1060 text.keydefs = keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1061 for event, keylist in keydefs.items():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1062 if keylist:
29794
94e5d1b8f696 SF patch #768187: replace apply(f, args, kwds) with f(*args, **kwds)
Raymond Hettinger <python@rcn.com>
parents: 29421
diff changeset
1063 text.event_add(event, *keylist)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1064
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1065 def fill_menus(self, menudefs=None, keydefs=None):
23969
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
1066 """Add appropriate entries to the menus and submenus
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
1067
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
1068 Menus that are absent or None in self.menudict are ignored.
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
1069 """
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1070 if menudefs is None:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1071 menudefs = self.Bindings.menudefs
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1072 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1073 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1074 menudict = self.menudict
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1075 text = self.text
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1076 for mname, entrylist in menudefs:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1077 menu = menudict.get(mname)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1078 if not menu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1079 continue
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1080 for entry in entrylist:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1081 if not entry:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1082 menu.add_separator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1083 else:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1084 label, eventname = entry
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1085 checkbutton = (label[:1] == '!')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1086 if checkbutton:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1087 label = label[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1088 underline, label = prepstr(label)
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1089 accelerator = get_accelerator(keydefs, eventname)
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1090 def command(text=text, eventname=eventname):
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1091 text.event_generate(eventname)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1092 if checkbutton:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1093 var = self.get_var_obj(eventname, BooleanVar)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1094 menu.add_checkbutton(label=label, underline=underline,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1095 command=command, accelerator=accelerator,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1096 variable=var)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1097 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1098 menu.add_command(label=label, underline=underline,
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
1099 command=command,
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
1100 accelerator=accelerator)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1101
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1102 def getvar(self, name):
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1103 var = self.get_var_obj(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1104 if var:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1105 value = var.get()
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1106 return value
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1107 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1108 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1109
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1110 def setvar(self, name, value, vartype=None):
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1111 var = self.get_var_obj(name, vartype)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1112 if var:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1113 var.set(value)
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1114 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1115 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1116
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1117 def get_var_obj(self, name, vartype=None):
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1118 var = self.tkinter_vars.get(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1119 if not var and vartype:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1120 # create a Tkinter variable object with self.text as master:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1121 self.tkinter_vars[name] = var = vartype(self.text)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1122 return var
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1123
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1124 # Tk implementations of "virtual text methods" -- each platform
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1125 # reusing IDLE's support code needs to define these for its GUI's
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1126 # flavor of widget.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1127
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1128 # Is character at text_index in a Python string? Return 0 for
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1129 # "guaranteed no", true for anything else. This info is expensive
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1130 # to compute ab initio, but is probably already known by the
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1131 # platform's colorizer.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1132
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1133 def is_char_in_string(self, text_index):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1134 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1135 # Return true iff colorizer hasn't (re)gotten this far
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1136 # yet, or the character is tagged as being in a string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1137 return self.text.tag_prevrange("TODO", text_index) or \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1138 "STRING" in self.text.tag_names(text_index)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1139 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1140 # The colorizer is missing: assume the worst
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1141 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1142
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1143 # If a selection is defined in the text widget, return (start,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1144 # end) as Tkinter text indices, otherwise return (None, None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1145 def get_selection_indices(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1146 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1147 first = self.text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1148 last = self.text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1149 return first, last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1150 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1151 return None, None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1152
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1153 # Return the text widget's current view of what a tab stop means
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1154 # (equivalent width in spaces).
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1155
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1156 def get_tabwidth(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1157 current = self.text['tabs'] or TK_TABWIDTH_DEFAULT
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1158 return int(current)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1159
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1160 # Set the text widget's current view of what a tab stop means.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1161
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1162 def set_tabwidth(self, newtabwidth):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1163 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1164 if self.get_tabwidth() != newtabwidth:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1165 pixels = text.tk.call("font", "measure", text["font"],
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1166 "-displayof", text.master,
18537
3fcf98ca6c4a py-cvs-rel2_1 (Rev 1.33 - 1.37) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
1167 "n" * newtabwidth)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1168 text.configure(tabs=pixels)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1169
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1170 # If ispythonsource and guess are true, guess a good value for
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1171 # indentwidth based on file content (if possible), and if
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1172 # indentwidth != tabwidth set usetabs false.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1173 # In any case, adjust the Text widget's view of what a tab
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1174 # character means.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1175
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1176 def set_indentation_params(self, ispythonsource, guess=True):
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1177 if guess and ispythonsource:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1178 i = self.guess_indent()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1179 if 2 <= i <= 8:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1180 self.indentwidth = i
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1181 if self.indentwidth != self.tabwidth:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1182 self.usetabs = False
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1183 self.set_tabwidth(self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1184
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1185 def smart_backspace_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1186 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1187 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1188 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1189 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1190 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1191 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1192 # Delete whitespace left, until hitting a real char or closest
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1193 # preceding virtual tab stop.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1194 chars = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1195 if chars == '':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1196 if text.compare("insert", ">", "1.0"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1197 # easy: delete preceding newline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1198 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1199 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1200 text.bell() # at start of buffer
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1201 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1202 if chars[-1] not in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1203 # easy: delete preceding real char
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1204 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1205 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1206 # Ick. It may require *inserting* spaces if we back up over a
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1207 # tab character! This is written to be clear, not fast.
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1208 tabwidth = self.tabwidth
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1209 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1210 assert have > 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1211 want = ((have - 1) // self.indentwidth) * self.indentwidth
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1212 # Debug prompt is multilined....
74418
95b704cb7f7c #13039 allow proper deletion of '>>> ' in IDLE editor windows.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 73967
diff changeset
1213 if self.context_use_ps1:
95b704cb7f7c #13039 allow proper deletion of '>>> ' in IDLE editor windows.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 73967
diff changeset
1214 last_line_of_prompt = sys.ps1.split('\n')[-1]
95b704cb7f7c #13039 allow proper deletion of '>>> ' in IDLE editor windows.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 73967
diff changeset
1215 else:
95b704cb7f7c #13039 allow proper deletion of '>>> ' in IDLE editor windows.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 73967
diff changeset
1216 last_line_of_prompt = ''
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1217 ncharsdeleted = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1218 while 1:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1219 if chars == last_line_of_prompt:
26678
78d872cd064c In Shell:
Kurt B. Kaiser <kbk@shore.net>
parents: 26667
diff changeset
1220 break
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1221 chars = chars[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1222 ncharsdeleted = ncharsdeleted + 1
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1223 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1224 if have <= want or chars[-1] not in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1225 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1226 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1227 text.delete("insert-%dc" % ncharsdeleted, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1228 if have < want:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1229 text.insert("insert", ' ' * (want - have))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1230 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1231 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1232
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1233 def smart_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1234 # if intraline selection:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1235 # delete it
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1236 # elif multiline selection:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1237 # do indent-region
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1238 # else:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1239 # indent one level
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1240 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1241 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1242 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1243 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1244 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1245 if index2line(first) != index2line(last):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1246 return self.indent_region_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1247 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1248 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1249 prefix = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1250 raw, effective = classifyws(prefix, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1251 if raw == len(prefix):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1252 # only whitespace to the left
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1253 self.reindent_to(effective + self.indentwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1254 else:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1255 # tab to the next 'stop' within or to right of line's text:
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1256 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1257 pad = '\t'
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1258 else:
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1259 effective = len(prefix.expandtabs(self.tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1260 n = self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1261 pad = ' ' * (n - effective % n)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1262 text.insert("insert", pad)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1263 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1264 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1265 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1266 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1267
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1268 def newline_and_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1269 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1270 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1271 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1272 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1273 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1274 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1275 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1276 line = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1277 i, n = 0, len(line)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1278 while i < n and line[i] in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1279 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1280 if i == n:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1281 # the cursor is in or at leading indentation in a continuation
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1282 # line; just inject an empty line at the start
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1283 text.insert("insert linestart", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1284 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1285 indent = line[:i]
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1286 # strip whitespace before insert point unless it's in the prompt
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1287 i = 0
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1288 last_line_of_prompt = sys.ps1.split('\n')[-1]
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1289 while line and line[-1] in " \t" and line != last_line_of_prompt:
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1290 line = line[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1291 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1292 if i:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1293 text.delete("insert - %d chars" % i, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1294 # strip whitespace after insert point
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1295 while text.get("insert") in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1296 text.delete("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1297 # start new line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1298 text.insert("insert", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1299
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1300 # adjust indentation for continuations and block
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1301 # open/close first need to find the last stmt
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1302 lno = index2line(text.index('insert'))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1303 y = PyParse.Parser(self.indentwidth, self.tabwidth)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1304 if not self.context_use_ps1:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1305 for context in self.num_context_lines:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1306 startat = max(lno - context, 1)
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
1307 startatindex = repr(startat) + ".0"
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1308 rawtext = text.get(startatindex, "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1309 y.set_str(rawtext)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1310 bod = y.find_good_parse_start(
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1311 self.context_use_ps1,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1312 self._build_char_in_string_func(startatindex))
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1313 if bod is not None or startat == 1:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1314 break
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1315 y.set_lo(bod or 0)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1316 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1317 r = text.tag_prevrange("console", "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1318 if r:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1319 startatindex = r[1]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1320 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1321 startatindex = "1.0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1322 rawtext = text.get(startatindex, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1323 y.set_str(rawtext)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1324 y.set_lo(0)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1325
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1326 c = y.get_continuation_type()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1327 if c != PyParse.C_NONE:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1328 # The current stmt hasn't ended yet.
35876
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1329 if c == PyParse.C_STRING_FIRST_LINE:
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1330 # after the first line of a string; do not indent at all
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1331 pass
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1332 elif c == PyParse.C_STRING_NEXT_LINES:
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1333 # inside a string which started before this line;
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1334 # just mimic the current indent
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1335 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1336 elif c == PyParse.C_BRACKET:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1337 # line up with the first (if any) element of the
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1338 # last open bracket structure; else indent one
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1339 # level beyond the indent of the line with the
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1340 # last open bracket
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1341 self.reindent_to(y.compute_bracket_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1342 elif c == PyParse.C_BACKSLASH:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1343 # if more than one line in this stmt already, just
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1344 # mimic the current indent; else if initial line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1345 # has a start on an assignment stmt, indent to
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1346 # beyond leftmost =; else to beyond first chunk of
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1347 # non-whitespace on initial line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1348 if y.get_num_lines_in_stmt() > 1:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1349 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1350 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1351 self.reindent_to(y.compute_backslash_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1352 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1353 assert 0, "bogus continuation type %r" % (c,)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1354 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1355
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1356 # This line starts a brand new stmt; indent relative to
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1357 # indentation of initial line of closest preceding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1358 # interesting stmt.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1359 indent = y.get_base_indent_string()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1360 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1361 if y.is_block_opener():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1362 self.smart_indent_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1363 elif indent and y.is_block_closer():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1364 self.smart_backspace_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1365 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1366 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1367 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1368 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1369
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1370 # Our editwin provides a is_char_in_string function that works
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1371 # with a Tk text index, but PyParse only knows about offsets into
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1372 # a string. This builds a function for PyParse that accepts an
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1373 # offset.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1374
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1375 def _build_char_in_string_func(self, startindex):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1376 def inner(offset, _startindex=startindex,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1377 _icis=self.is_char_in_string):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1378 return _icis(_startindex + "+%dc" % offset)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1379 return inner
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1380
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1381 def indent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1382 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1383 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1384 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1385 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1386 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1387 effective = effective + self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1388 lines[pos] = self._make_blanks(effective) + line[raw:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1389 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1390 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1391
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1392 def dedent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1393 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1394 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1395 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1396 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1397 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1398 effective = max(effective - self.indentwidth, 0)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1399 lines[pos] = self._make_blanks(effective) + line[raw:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1400 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1401 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1402
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1403 def comment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1404 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1405 for pos in range(len(lines) - 1):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1406 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1407 lines[pos] = '##' + line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1408 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1409
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1410 def uncomment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1411 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1412 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1413 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1414 if not line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1415 continue
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1416 if line[:2] == '##':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1417 line = line[2:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1418 elif line[:1] == '#':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1419 line = line[1:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1420 lines[pos] = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1421 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1422
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1423 def tabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1424 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1425 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1426 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1427 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1428 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1429 raw, effective = classifyws(line, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1430 ntabs, nspaces = divmod(effective, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1431 lines[pos] = '\t' * ntabs + ' ' * nspaces + line[raw:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1432 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1433
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1434 def untabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1435 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1436 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1437 for pos in range(len(lines)):
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1438 lines[pos] = lines[pos].expandtabs(tabwidth)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1439 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1440
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1441 def toggle_tabs_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1442 if self.askyesno(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1443 "Toggle tabs",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1444 "Turn tabs " + ("on", "off")[self.usetabs] +
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1445 "?\nIndent width " +
39421
156b28f0f2d3 ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
Kurt B. Kaiser <kbk@shore.net>
parents: 39182
diff changeset
1446 ("will be", "remains at")[self.usetabs] + " 8." +
156b28f0f2d3 ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
Kurt B. Kaiser <kbk@shore.net>
parents: 39182
diff changeset
1447 "\n Note: a tab is always 8 columns",
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1448 parent=self.text):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1449 self.usetabs = not self.usetabs
39421
156b28f0f2d3 ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
Kurt B. Kaiser <kbk@shore.net>
parents: 39182
diff changeset
1450 # Try to prevent inconsistent indentation.
156b28f0f2d3 ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
Kurt B. Kaiser <kbk@shore.net>
parents: 39182
diff changeset
1451 # User must change indent width manually after using tabs.
156b28f0f2d3 ToggleTab dialog was setting indent to 8 even if cancelled (since 1.2a1).
Kurt B. Kaiser <kbk@shore.net>
parents: 39182
diff changeset
1452 self.indentwidth = 8
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1453 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1454
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1455 # XXX this isn't bound to anything -- see tabwidth comments
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1456 ## def change_tabwidth_event(self, event):
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1457 ## new = self._asktabwidth()
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1458 ## if new != self.tabwidth:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1459 ## self.tabwidth = new
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1460 ## self.set_indentation_params(0, guess=0)
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1461 ## return "break"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1462
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1463 def change_indentwidth_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1464 new = self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1465 "Indent width",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1466 "New indent width (2-16)\n(Always use 8 when using tabs)",
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1467 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1468 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1469 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1470 maxvalue=16)
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1471 if new and new != self.indentwidth and not self.usetabs:
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1472 self.indentwidth = new
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1473 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1474
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1475 def get_region(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1476 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1477 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1478 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1479 head = text.index(first + " linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1480 tail = text.index(last + "-1c lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1481 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1482 head = text.index("insert linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1483 tail = text.index("insert lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1484 chars = text.get(head, tail)
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1485 lines = chars.split("\n")
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1486 return head, tail, chars, lines
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1487
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1488 def set_region(self, head, tail, chars, lines):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1489 text = self.text
25279
4692c487ee91 Merge Py Idle's changes to AutoIndent.py into EditorWindow.py since
Kurt B. Kaiser <kbk@shore.net>
parents: 25259
diff changeset
1490 newchars = "\n".join(lines)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1491 if newchars == chars:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1492 text.bell()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1493 return
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1494 text.tag_remove("sel", "1.0", "end")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1495 text.mark_set("insert", head)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1496 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1497 text.delete(head, tail)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1498 text.insert(head, newchars)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1499 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1500 text.tag_add("sel", head, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1501
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1502 # Make string that displays as n leading blanks.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1503
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1504 def _make_blanks(self, n):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1505 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1506 ntabs, nspaces = divmod(n, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1507 return '\t' * ntabs + ' ' * nspaces
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1508 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1509 return ' ' * n
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1510
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1511 # Delete from beginning of line to insert point, then reinsert
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1512 # column logical (meaning use tabs if appropriate) spaces.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1513
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1514 def reindent_to(self, column):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1515 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1516 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1517 if text.compare("insert linestart", "!=", "insert"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1518 text.delete("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1519 if column:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1520 text.insert("insert", self._make_blanks(column))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1521 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1522
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1523 def _asktabwidth(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1524 return self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1525 "Tab width",
35065
aa1c5366607d 1. Clarify "tab/space" Error Dialog and "Tab Width" Dialog associated with
Kurt B. Kaiser <kbk@shore.net>
parents: 35064
diff changeset
1526 "Columns per tab? (2-16)",
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1527 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1528 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1529 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1530 maxvalue=16) or self.tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1531
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1532 # Guess indentwidth from text content.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1533 # Return guessed indentwidth. This should not be believed unless
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1534 # it's in a reasonable range (e.g., it will be 0 if no indented
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1535 # blocks are found).
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1536
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1537 def guess_indent(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1538 opener, indented = IndentSearcher(self.text, self.tabwidth).run()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1539 if opener and indented:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1540 raw, indentsmall = classifyws(opener, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1541 raw, indentlarge = classifyws(indented, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1542 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1543 indentsmall = indentlarge = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1544 return indentlarge - indentsmall
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1545
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1546 # "line.col" -> line, as an int
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1547 def index2line(index):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1548 return int(float(index))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1549
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1550 # Look at the leading whitespace in s.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1551 # Return pair (# of leading ws characters,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1552 # effective # of leading blanks after expanding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1553 # tabs to width tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1554
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1555 def classifyws(s, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1556 raw = effective = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1557 for ch in s:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1558 if ch == ' ':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1559 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1560 effective = effective + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1561 elif ch == '\t':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1562 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1563 effective = (effective // tabwidth + 1) * tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1564 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1565 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1566 return raw, effective
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1567
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1568 import tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1569 _tokenize = tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1570 del tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1571
34212
1e8b033f91dc The remote procedure call module rpc.py can now access data attributes of
Kurt B. Kaiser <kbk@shore.net>
parents: 33218
diff changeset
1572 class IndentSearcher(object):
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1573
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1574 # .run() chews over the Text widget, looking for a block opener
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1575 # and the stmt following it. Returns a pair,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1576 # (line containing block opener, line containing stmt)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1577 # Either or both may be None.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1578
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1579 def __init__(self, text, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1580 self.text = text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1581 self.tabwidth = tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1582 self.i = self.finished = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1583 self.blkopenline = self.indentedline = None
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1584
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1585 def readline(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1586 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1587 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1588 i = self.i = self.i + 1
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1589 mark = repr(i) + ".0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1590 if self.text.compare(mark, ">=", "end"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1591 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1592 return self.text.get(mark, mark + " lineend+1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1593
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1594 def tokeneater(self, type, token, start, end, line,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1595 INDENT=_tokenize.INDENT,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1596 NAME=_tokenize.NAME,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1597 OPENERS=('class', 'def', 'for', 'if', 'try', 'while')):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1598 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1599 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1600 elif type == NAME and token in OPENERS:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1601 self.blkopenline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1602 elif type == INDENT and self.blkopenline:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1603 self.indentedline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1604 self.finished = 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1605
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1606 def run(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1607 save_tabsize = _tokenize.tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1608 _tokenize.tabsize = self.tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1609 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1610 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1611 _tokenize.tokenize(self.readline, self.tokeneater)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1612 except _tokenize.TokenError:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1613 # since we cut off the tokenizer early, we can trigger
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1614 # spurious errors
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1615 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1616 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1617 _tokenize.tabsize = save_tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1618 return self.blkopenline, self.indentedline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1619
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1620 ### end autoindent code ###
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1621
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1622 def prepstr(s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1623 # Helper to extract the underscore from a string, e.g.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1624 # prepstr("Co_py") returns (2, "Copy").
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1625 i = s.find('_')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1626 if i >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1627 s = s[:i] + s[i+1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1628 return i, s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1629
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1630
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1631 keynames = {
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1632 'bracketleft': '[',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1633 'bracketright': ']',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1634 'slash': '/',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1635 }
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1636
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1637 def get_accelerator(keydefs, eventname):
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1638 keylist = keydefs.get(eventname)
67826
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1639 # issue10940: temporary workaround to prevent hang with OS X Cocoa Tk 8.5
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1640 # if not keylist:
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1641 if (not keylist) or (macosxSupport.runningAsOSXApp() and eventname in {
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1642 "<<open-module>>",
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1643 "<<goto-line>>",
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1644 "<<change-indentwidth>>"}):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1645 return ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1646 s = keylist[0]
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1647 s = re.sub(r"-[a-z]\b", lambda m: m.group().upper(), s)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1648 s = re.sub(r"\b\w+\b", lambda m: keynames.get(m.group(), m.group()), s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1649 s = re.sub("Key-", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1650 s = re.sub("Cancel","Ctrl-Break",s) # dscherer@cmu.edu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1651 s = re.sub("Control-", "Ctrl-", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1652 s = re.sub("-", "+", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1653 s = re.sub("><", " ", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1654 s = re.sub("<", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1655 s = re.sub(">", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1656 return s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1657
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1658
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1659 def fixwordbreaks(root):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1660 # Make sure that Tk's double-click and next/previous word
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1661 # operations use our definition of a word (i.e. an identifier)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1662 tk = root.tk
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1663 tk.call('tcl_wordBreakAfter', 'a b', 0) # make sure word.tcl is loaded
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1664 tk.call('set', 'tcl_wordchars', '[a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1665 tk.call('set', 'tcl_nonwordchars', '[^a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1666
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1667
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1668 def test():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1669 root = Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1670 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1671 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1672 if sys.argv[1:]:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1673 filename = sys.argv[1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1674 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1675 filename = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1676 edit = EditorWindow(root=root, filename=filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1677 edit.set_close_hook(root.quit)
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1678 edit.text.bind("<<close-all-windows>>", edit.close_event)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1679 root.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1680 root.destroy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1681
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1682 if __name__ == '__main__':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1683 test()