annotate Lib/idlelib/EditorWindow.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 3108331c88ec
children 639dd6e62de4
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.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
474 self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
475 if not self.rmenu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
476 self.make_rmenu()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
477 rmenu = self.rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
478 self.event = event
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
479 iswin = sys.platform[:3] == 'win'
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
480 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
481 self.text.config(cursor="arrow")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
482 rmenu.tk_popup(event.x_root, event.y_root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
483 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
484 self.text.config(cursor="ibeam")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
485
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
486 rmenu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
487 # ("Label", "<<virtual-event>>"), ...
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
488 ("Close", "<<close-window>>"), # Example
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
489 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
490
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
491 def make_rmenu(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
492 rmenu = Menu(self.text, tearoff=0)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
493 for label, eventname in self.rmenu_specs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
494 def command(text=self.text, eventname=eventname):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
495 text.event_generate(eventname)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
496 rmenu.add_command(label=label, command=command)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
497 self.rmenu = rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
498
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
499 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
500 aboutDialog.AboutDialog(self.top,'About IDLE')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
501
21035
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
502 def config_dialog(self, event=None):
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
503 configDialog.ConfigDialog(self.top,'Settings')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
504
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
505 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
506 if self.root:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
507 parent = self.root
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
508 else:
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
509 parent = self.top
5452c881bd2d Issue 964437 Make IDLE help window non-modal.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74418
diff changeset
510 helpDialog.display(parent, near=self.top)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
511
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
512 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
513 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
514 try:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
515 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
516 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
517 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
518 message=str(why), parent=self.text)
23208
382e37ac374d tracking python idle changes:
Steven M. Gava <elguavas@python.net>
parents: 22602
diff changeset
519 else:
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
520 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
521 return "break"
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
522
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
523 def cut(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
524 self.text.event_generate("<<Cut>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
525 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
526
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
527 def copy(self,event):
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
528 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
529 # 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
530 return
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
531 self.text.event_generate("<<Copy>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
532 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
533
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
534 def paste(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
535 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
536 self.text.see("insert")
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
537 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
538
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
539 def select_all(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
540 self.text.tag_add("sel", "1.0", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
541 self.text.mark_set("insert", "1.0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
542 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
543 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
544
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
545 def remove_selection(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
546 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
547 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
548
27272
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
549 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
550 """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
551
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
552 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
553 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
554 selection.
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
555
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
556 """
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
557 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
558 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
559 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
560 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
561 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
562 try:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
563 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
564 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
565 except TclError:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
566 pass
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
567 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
568
34515
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
569 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
570 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
571 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
572
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
573 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
574 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
575 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
576
21626
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
577 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
578 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
579 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
580
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
581 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
582 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
583 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
584
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
585 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
586 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
587 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
588
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
589 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
590 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
591 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
592
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
593 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
594 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
595 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
596
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
597 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
598 text = self.text
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
599 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
600 "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
601 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
602 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
603 if lineno <= 0:
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
604 text.bell()
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
605 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
606 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
607 text.see("insert")
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
608
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
609 def open_module(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
610 # XXX Shouldn't this be in IOBinding or in FileList?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
611 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
612 name = self.text.get("sel.first", "sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
613 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
614 name = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
615 else:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
616 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
617 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
618 "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
619 "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
620 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
621 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
622 name = name.strip()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
623 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
624 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
625 # XXX Ought to insert current file's directory in front of path
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
626 try:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
627 (f, file, (suffix, mode, type)) = _find_module(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
628 except (NameError, ImportError), msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
629 tkMessageBox.showerror("Import error", str(msg), parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
630 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
631 if type != imp.PY_SOURCE:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
632 tkMessageBox.showerror("Unsupported type",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
633 "%s is not a source module" % name, parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
634 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
635 if f:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
636 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
637 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
638 self.flist.open(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
639 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
640 self.io.loadfile(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
641
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
642 def open_class_browser(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
643 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
644 if not filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
645 tkMessageBox.showerror(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
646 "No filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
647 "This buffer has no associated filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
648 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
649 self.text.focus_set()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
650 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
651 head, tail = os.path.split(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
652 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
653 from idlelib import ClassBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
654 ClassBrowser.ClassBrowser(self.flist, base, [head])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
655
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
656 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
657 from idlelib import PathBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
658 PathBrowser.PathBrowser(self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
659
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
660 def gotoline(self, lineno):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
661 if lineno is not None and lineno > 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
662 self.text.mark_set("insert", "%d.0" % lineno)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
663 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
664 self.text.tag_add("sel", "insert", "insert +1l")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
665 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
666
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
667 def ispythonsource(self, filename):
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
668 if not filename or os.path.isdir(filename):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
669 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
670 base, ext = os.path.splitext(os.path.basename(filename))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
671 if os.path.normcase(ext) in (".py", ".pyw"):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
672 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
673 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
674 f = open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
675 line = f.readline()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
676 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
677 except IOError:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
678 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
679 return line.startswith('#!') and line.find('python') >= 0
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
680
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
681 def close_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
682 if self.flist:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
683 self.flist.unregister_maybe_terminate(self)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
684 self.flist = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
685
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
686 def set_close_hook(self, close_hook):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
687 self.close_hook = close_hook
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
688
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
689 def filename_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
690 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
691 self.flist.filename_changed_edit(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
692 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
693 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
694 self.ResetColorizer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
695
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
696 def _addcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
697 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
698 return
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
699 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
700 self.color = self.ColorDelegator()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
701 # can add more colorizers here...
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
702 if self.color:
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
703 self.per.removefilter(self.undo)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
704 self.per.insertfilter(self.color)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
705 self.per.insertfilter(self.undo)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
706
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
707 def _rmcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
708 if not self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
709 return
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
710 self.color.removecolors()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
711 self.per.removefilter(self.color)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
712 self.color = None
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
713
22111
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 22051
diff changeset
714 def ResetColorizer(self):
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
715 "Update the colour theme"
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
716 # 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
717 self._rmcolorizer()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
718 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
719 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
720 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
721 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
722 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
723 self.text.config(
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
724 foreground=normal_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
725 background=normal_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
726 insertbackground=cursor_color,
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
727 selectforeground=select_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
728 selectbackground=select_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
729 )
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
730
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
731 def ResetFont(self):
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
732 "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
733 # Called from configDialog.py
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
734 fontWeight='normal'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
735 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
736 fontWeight='bold'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
737 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
738 idleConf.GetOption('main','EditorWindow','font-size'),
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
739 fontWeight))
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
740
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
741 def RemoveKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
742 "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
743 # 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
744 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
745 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
746 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
747 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
748 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
749 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
750 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
751 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
752
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
753 def ApplyKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
754 "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
755 # 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
756 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
757 self.apply_bindings()
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
758 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
759 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
760 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
761 self.apply_bindings(xkeydefs)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
762 #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
763 menuEventDict = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
764 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
765 menuEventDict[menu[0]] = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
766 for item in menu[1]:
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
767 if item:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
768 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
769 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
770 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
771 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
772 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
773 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
774 accel = menu.entrycget(index, 'accelerator')
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
775 if accel:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
776 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
777 event = ''
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
778 if menubarItem in menuEventDict:
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
779 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
780 event = menuEventDict[menubarItem][itemName]
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
781 if event:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
782 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
783 menu.entryconfig(index, accelerator=accel)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
784
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
785 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
786 "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
787 # 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
788 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
789 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
790 type='int')
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
791
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
792 def reset_help_menu_entries(self):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
793 "Update the additional help entries on the Help menu"
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
794 help_list = idleConf.GetAllExtraHelpSourcesList()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
795 helpmenu = self.menudict['help']
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
796 # first delete the extra help entries, if any
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
797 helpmenu_length = helpmenu.index(END)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
798 if helpmenu_length > self.base_helpmenu_length:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
799 helpmenu.delete((self.base_helpmenu_length + 1), helpmenu_length)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
800 # then rebuild them
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
801 if help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
802 helpmenu.add_separator()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
803 for entry in help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
804 cmd = self.__extra_help_callback(entry[1])
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
805 helpmenu.add_command(label=entry[0], command=cmd)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
806 # and update the menu dictionary
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
807 self.menudict['help'] = helpmenu
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
808
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
809 def __extra_help_callback(self, helpfile):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
810 "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
811 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
812 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
813 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
814 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
815 try:
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
816 os.startfile(helpfile)
500eb3d0897f Issue 6285: catch missing IDLE help file. Backport from 3.2.
Terry Reedy <tjreedy@udel.edu>
parents: 67023
diff changeset
817 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
818 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
819 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
820 else:
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
821 webbrowser.open(helpfile)
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
822 return display_extra_help
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
823
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
824 def update_recent_files_list(self, new_file=None):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
825 "Load and update the recent files list and menus"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
826 rf_list = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
827 if os.path.exists(self.recent_files_path):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
828 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
829 try:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
830 rf_list = rf_list_file.readlines()
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
831 finally:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
832 rf_list_file.close()
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
833 if new_file:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
834 new_file = os.path.abspath(new_file) + '\n'
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
835 if new_file in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
836 rf_list.remove(new_file) # move to top
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
837 rf_list.insert(0, new_file)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
838 # clean and save the recent files list
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
839 bad_paths = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
840 for path in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
841 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
842 bad_paths.append(path)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
843 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
844 ulchars = "1234567890ABCDEFGHIJK"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
845 rf_list = rf_list[0:len(ulchars)]
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
846 try:
73967
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
847 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
848 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
849 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
850 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
851 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
852 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
853 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
854 % str(err),
7857d1f4ce79 Issue #4625: If IDLE cannot write to its recent file or breakpoint
Ned Deily <nad@acm.org>
parents: 69310
diff changeset
855 parent=self.text)
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
856 # for each edit window instance, construct the recent files menu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
857 for instance in self.top.instance_dict.keys():
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
858 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
859 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
860 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
861 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
862 # 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
863 ufile_name = self._filename_to_unicode(file_name)
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
864 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
865 menu.add_command(label=ulchars[i] + " " + ufile_name,
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
866 command=callback,
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
867 underline=0)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
868
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
869 def __recent_file_callback(self, file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
870 def open_recent_file(fn_closure=file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
871 self.io.open(editFile=fn_closure)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
872 return open_recent_file
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
873
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
874 def saved_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
875 short = self.short_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
876 long = self.long_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
877 if short and long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
878 title = short + " - " + long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
879 elif short:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
880 title = short
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
881 elif long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
882 title = long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
883 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
884 title = "Untitled"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
885 icon = short or long or title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
886 if not self.get_saved():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
887 title = "*%s*" % title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
888 icon = "*%s" % icon
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
889 self.top.wm_title(title)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
890 self.top.wm_iconname(icon)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
891
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
892 def get_saved(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
893 return self.undo.get_saved()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
894
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
895 def set_saved(self, flag):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
896 self.undo.set_saved(flag)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
897
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
898 def reset_undo(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
899 self.undo.reset_undo()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
900
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
901 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
902 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
903 if filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
904 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
905 # 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
906 return self._filename_to_unicode(filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
907
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
908 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
909 # 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
910 return self._filename_to_unicode(self.io.filename or "")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
911
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
912 def center_insert_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
913 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
914
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
915 def center(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
916 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
917 top, bot = self.getwindowlines()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
918 lineno = self.getlineno(mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
919 height = bot - top
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
920 newtop = max(1, lineno - height//2)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
921 text.yview(float(newtop))
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 getwindowlines(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
924 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
925 top = self.getlineno("@0,0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
926 bot = self.getlineno("@0,65535")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
927 if top == bot and text.winfo_height() == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
928 # Geometry manager hasn't run yet
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
929 height = int(text['height'])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
930 bot = top + height - 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
931 return top, bot
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
932
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
933 def getlineno(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
934 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
935 return int(float(text.index(mark)))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
936
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
937 def get_geometry(self):
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
938 "Return (width, height, x, y)"
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
939 geom = self.top.wm_geometry()
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
940 m = re.match(r"(\d+)x(\d+)\+(-?\d+)\+(-?\d+)", geom)
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
941 tuple = (map(int, m.groups()))
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
942 return tuple
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
943
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
944 def close_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
945 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
946
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
947 def maybesave(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
948 if self.io:
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
949 if not self.get_saved():
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
950 if self.top.state()!='normal':
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
951 self.top.deiconify()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
952 self.top.lower()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
953 self.top.lift()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
954 return self.io.maybesave()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
955
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
956 def close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
957 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
958 if str(reply) != "cancel":
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
959 self._close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
960 return reply
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
961
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
962 def _close(self):
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
963 if self.io.filename:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
964 self.update_recent_files_list(new_file=self.io.filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
965 WindowList.unregister_callback(self.postwindowsmenu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
966 self.unload_extensions()
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
967 self.io.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
968 self.io = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
969 self.undo = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
970 if self.color:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
971 self.color.close(False)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
972 self.color = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
973 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
974 self.tkinter_vars = None
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
975 self.per.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
976 self.per = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
977 self.top.destroy()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
978 if self.close_hook:
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
979 # unless override: unregister from flist, terminate if last window
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
980 self.close_hook()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
981
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
982 def load_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
983 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
984 self.load_standard_extensions()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
985
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
986 def unload_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
987 for ins in self.extensions.values():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
988 if hasattr(ins, "close"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
989 ins.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
990 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
991
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
992 def load_standard_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
993 for name in self.get_standard_extension_names():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
994 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
995 self.load_extension(name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
996 except:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
997 print "Failed to load extension", repr(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
998 import traceback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
999 traceback.print_exc()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1000
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1001 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
1002 return idleConf.GetExtensions(editor_only=True)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1003
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1004 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
1005 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
1006 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
1007 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
1008 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
1009 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1010 cls = getattr(mod, name)
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1011 keydefs = idleConf.GetExtensionBindings(name)
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1012 if hasattr(cls, "menudefs"):
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
1013 self.fill_menus(cls.menudefs, keydefs)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1014 ins = cls(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1015 self.extensions[name] = ins
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1016 if keydefs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1017 self.apply_bindings(keydefs)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1018 for vevent in keydefs.keys():
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1019 methodname = vevent.replace("-", "_")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1020 while methodname[:1] == '<':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1021 methodname = methodname[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1022 while methodname[-1:] == '>':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1023 methodname = methodname[:-1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1024 methodname = methodname + "_event"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1025 if hasattr(ins, methodname):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1026 self.text.bind(vevent, getattr(ins, methodname))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1027
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1028 def apply_bindings(self, keydefs=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1029 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1030 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1031 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1032 text.keydefs = keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1033 for event, keylist in keydefs.items():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1034 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
1035 text.event_add(event, *keylist)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1036
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1037 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
1038 """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
1039
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
1040 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
1041 """
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1042 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
1043 menudefs = self.Bindings.menudefs
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1044 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1045 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1046 menudict = self.menudict
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1047 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
1048 for mname, entrylist in menudefs:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1049 menu = menudict.get(mname)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1050 if not menu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1051 continue
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1052 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
1053 if not entry:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1054 menu.add_separator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1055 else:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1056 label, eventname = entry
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1057 checkbutton = (label[:1] == '!')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1058 if checkbutton:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1059 label = label[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1060 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
1061 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
1062 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
1063 text.event_generate(eventname)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1064 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
1065 var = self.get_var_obj(eventname, BooleanVar)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1066 menu.add_checkbutton(label=label, underline=underline,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1067 command=command, accelerator=accelerator,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1068 variable=var)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1069 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1070 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
1071 command=command,
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
1072 accelerator=accelerator)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1073
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1074 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
1075 var = self.get_var_obj(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1076 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
1077 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
1078 return value
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1079 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1080 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1081
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1082 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
1083 var = self.get_var_obj(name, vartype)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1084 if var:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1085 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
1086 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1087 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1088
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1089 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
1090 var = self.tkinter_vars.get(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1091 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
1092 # 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
1093 self.tkinter_vars[name] = var = vartype(self.text)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1094 return var
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1095
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1096 # Tk implementations of "virtual text methods" -- each platform
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1097 # reusing IDLE's support code needs to define these for its GUI's
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1098 # flavor of widget.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1099
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1100 # Is character at text_index in a Python string? Return 0 for
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1101 # "guaranteed no", true for anything else. This info is expensive
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1102 # to compute ab initio, but is probably already known by the
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1103 # platform's colorizer.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1104
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1105 def is_char_in_string(self, text_index):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1106 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1107 # Return true iff colorizer hasn't (re)gotten this far
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1108 # yet, or the character is tagged as being in a string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1109 return self.text.tag_prevrange("TODO", text_index) or \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1110 "STRING" in self.text.tag_names(text_index)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1111 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1112 # The colorizer is missing: assume the worst
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1113 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1114
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1115 # If a selection is defined in the text widget, return (start,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1116 # end) as Tkinter text indices, otherwise return (None, None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1117 def get_selection_indices(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1118 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1119 first = self.text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1120 last = self.text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1121 return first, last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1122 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1123 return None, None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1124
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1125 # Return the text widget's current view of what a tab stop means
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1126 # (equivalent width in spaces).
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1127
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1128 def get_tabwidth(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1129 current = self.text['tabs'] or TK_TABWIDTH_DEFAULT
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1130 return int(current)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1131
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1132 # Set the text widget's current view of what a tab stop means.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1133
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1134 def set_tabwidth(self, newtabwidth):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1135 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1136 if self.get_tabwidth() != newtabwidth:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1137 pixels = text.tk.call("font", "measure", text["font"],
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1138 "-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
1139 "n" * newtabwidth)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1140 text.configure(tabs=pixels)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1141
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1142 # 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
1143 # 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
1144 # indentwidth != tabwidth set usetabs false.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1145 # 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
1146 # character means.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1147
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1148 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
1149 if guess and ispythonsource:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1150 i = self.guess_indent()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1151 if 2 <= i <= 8:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1152 self.indentwidth = i
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1153 if self.indentwidth != self.tabwidth:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1154 self.usetabs = False
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1155 self.set_tabwidth(self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1156
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1157 def smart_backspace_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1158 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1159 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1160 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1161 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1162 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1163 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1164 # 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
1165 # preceding virtual tab stop.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1166 chars = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1167 if chars == '':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1168 if text.compare("insert", ">", "1.0"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1169 # easy: delete preceding newline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1170 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1171 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1172 text.bell() # at start of buffer
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1173 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1174 if chars[-1] not in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1175 # easy: delete preceding real char
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1176 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1177 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1178 # 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
1179 # 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
1180 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
1181 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1182 assert have > 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1183 want = ((have - 1) // self.indentwidth) * self.indentwidth
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1184 # 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
1185 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
1186 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
1187 else:
95b704cb7f7c #13039 allow proper deletion of '>>> ' in IDLE editor windows.
Terry Jan Reedy <tjreedy@udel.edu>
parents: 73967
diff changeset
1188 last_line_of_prompt = ''
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1189 ncharsdeleted = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1190 while 1:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1191 if chars == last_line_of_prompt:
26678
78d872cd064c In Shell:
Kurt B. Kaiser <kbk@shore.net>
parents: 26667
diff changeset
1192 break
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1193 chars = chars[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1194 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
1195 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1196 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
1197 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1198 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1199 text.delete("insert-%dc" % ncharsdeleted, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1200 if have < want:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1201 text.insert("insert", ' ' * (want - have))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1202 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1203 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1204
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1205 def smart_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1206 # if intraline selection:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1207 # delete it
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1208 # elif multiline selection:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1209 # do indent-region
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1210 # else:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1211 # indent one level
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1212 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1213 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1214 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1215 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1216 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1217 if index2line(first) != index2line(last):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1218 return self.indent_region_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1219 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1220 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1221 prefix = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1222 raw, effective = classifyws(prefix, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1223 if raw == len(prefix):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1224 # only whitespace to the left
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1225 self.reindent_to(effective + self.indentwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1226 else:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1227 # 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
1228 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1229 pad = '\t'
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1230 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
1231 effective = len(prefix.expandtabs(self.tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1232 n = self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1233 pad = ' ' * (n - effective % n)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1234 text.insert("insert", pad)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1235 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1236 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1237 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1238 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1239
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1240 def newline_and_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1241 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1242 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1243 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1244 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1245 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1246 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1247 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1248 line = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1249 i, n = 0, len(line)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1250 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
1251 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1252 if i == n:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1253 # 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
1254 # 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
1255 text.insert("insert linestart", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1256 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1257 indent = line[:i]
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1258 # 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
1259 i = 0
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1260 last_line_of_prompt = sys.ps1.split('\n')[-1]
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1261 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
1262 line = line[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1263 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1264 if i:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1265 text.delete("insert - %d chars" % i, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1266 # strip whitespace after insert point
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1267 while text.get("insert") in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1268 text.delete("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1269 # start new line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1270 text.insert("insert", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1271
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1272 # adjust indentation for continuations and block
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1273 # 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
1274 lno = index2line(text.index('insert'))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1275 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
1276 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
1277 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
1278 startat = max(lno - context, 1)
63585
df378e44ba9a Merged revisions 79576-79578 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 53415
diff changeset
1279 startatindex = repr(startat) + ".0"
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1280 rawtext = text.get(startatindex, "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1281 y.set_str(rawtext)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1282 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
1283 self.context_use_ps1,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1284 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
1285 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
1286 break
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1287 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
1288 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1289 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
1290 if r:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1291 startatindex = r[1]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1292 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1293 startatindex = "1.0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1294 rawtext = text.get(startatindex, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1295 y.set_str(rawtext)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1296 y.set_lo(0)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1297
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1298 c = y.get_continuation_type()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1299 if c != PyParse.C_NONE:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1300 # 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
1301 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
1302 # 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
1303 pass
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1304 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
1305 # 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
1306 # just mimic the current indent
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1307 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1308 elif c == PyParse.C_BRACKET:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1309 # 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
1310 # last open bracket structure; else indent one
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1311 # 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
1312 # last open bracket
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1313 self.reindent_to(y.compute_bracket_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1314 elif c == PyParse.C_BACKSLASH:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1315 # 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
1316 # 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
1317 # 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
1318 # 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
1319 # non-whitespace on initial line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1320 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
1321 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1322 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1323 self.reindent_to(y.compute_backslash_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1324 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1325 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
1326 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1327
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1328 # 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
1329 # indentation of initial line of closest preceding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1330 # interesting stmt.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1331 indent = y.get_base_indent_string()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1332 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1333 if y.is_block_opener():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1334 self.smart_indent_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1335 elif indent and y.is_block_closer():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1336 self.smart_backspace_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1337 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1338 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1339 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1340 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1341
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1342 # 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
1343 # 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
1344 # 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
1345 # offset.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1346
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1347 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
1348 def inner(offset, _startindex=startindex,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1349 _icis=self.is_char_in_string):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1350 return _icis(_startindex + "+%dc" % offset)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1351 return inner
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1352
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1353 def indent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1354 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1355 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1356 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1357 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1358 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1359 effective = effective + self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1360 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
1361 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1362 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1363
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1364 def dedent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1365 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1366 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1367 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1368 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1369 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1370 effective = max(effective - self.indentwidth, 0)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1371 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
1372 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1373 return "break"
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 comment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1376 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1377 for pos in range(len(lines) - 1):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1378 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1379 lines[pos] = '##' + line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1380 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1381
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1382 def uncomment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1383 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1384 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1385 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1386 if not line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1387 continue
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1388 if line[:2] == '##':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1389 line = line[2:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1390 elif line[:1] == '#':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1391 line = line[1:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1392 lines[pos] = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1393 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1394
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1395 def tabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1396 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1397 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1398 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1399 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1400 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1401 raw, effective = classifyws(line, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1402 ntabs, nspaces = divmod(effective, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1403 lines[pos] = '\t' * ntabs + ' ' * nspaces + line[raw:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1404 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1405
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1406 def untabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1407 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1408 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1409 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
1410 lines[pos] = lines[pos].expandtabs(tabwidth)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1411 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1412
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1413 def toggle_tabs_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1414 if self.askyesno(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1415 "Toggle tabs",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1416 "Turn tabs " + ("on", "off")[self.usetabs] +
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1417 "?\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
1418 ("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
1419 "\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
1420 parent=self.text):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1421 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
1422 # 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
1423 # 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
1424 self.indentwidth = 8
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1425 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1426
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1427 # 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
1428 ## def change_tabwidth_event(self, event):
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1429 ## new = self._asktabwidth()
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1430 ## if new != self.tabwidth:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1431 ## self.tabwidth = new
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1432 ## self.set_indentation_params(0, guess=0)
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1433 ## return "break"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1434
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1435 def change_indentwidth_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1436 new = self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1437 "Indent width",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1438 "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
1439 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1440 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1441 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1442 maxvalue=16)
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1443 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
1444 self.indentwidth = new
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1445 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1446
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1447 def get_region(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1448 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1449 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1450 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1451 head = text.index(first + " linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1452 tail = text.index(last + "-1c lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1453 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1454 head = text.index("insert linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1455 tail = text.index("insert lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1456 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
1457 lines = chars.split("\n")
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1458 return head, tail, chars, lines
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1459
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1460 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
1461 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
1462 newchars = "\n".join(lines)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1463 if newchars == chars:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1464 text.bell()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1465 return
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1466 text.tag_remove("sel", "1.0", "end")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1467 text.mark_set("insert", head)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1468 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1469 text.delete(head, tail)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1470 text.insert(head, newchars)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1471 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1472 text.tag_add("sel", head, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1473
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1474 # 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
1475
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1476 def _make_blanks(self, n):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1477 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1478 ntabs, nspaces = divmod(n, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1479 return '\t' * ntabs + ' ' * nspaces
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1480 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1481 return ' ' * n
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1482
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1483 # 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
1484 # 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
1485
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1486 def reindent_to(self, column):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1487 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1488 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1489 if text.compare("insert linestart", "!=", "insert"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1490 text.delete("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1491 if column:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1492 text.insert("insert", self._make_blanks(column))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1493 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1494
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1495 def _asktabwidth(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1496 return self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1497 "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
1498 "Columns per tab? (2-16)",
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1499 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1500 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1501 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1502 maxvalue=16) or self.tabwidth
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 # Guess indentwidth from text content.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1505 # 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
1506 # 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
1507 # blocks are found).
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1508
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1509 def guess_indent(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1510 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
1511 if opener and indented:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1512 raw, indentsmall = classifyws(opener, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1513 raw, indentlarge = classifyws(indented, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1514 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1515 indentsmall = indentlarge = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1516 return indentlarge - indentsmall
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1517
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1518 # "line.col" -> line, as an int
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1519 def index2line(index):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1520 return int(float(index))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1521
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1522 # Look at the leading whitespace in s.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1523 # Return pair (# of leading ws characters,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1524 # effective # of leading blanks after expanding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1525 # tabs to width tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1526
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1527 def classifyws(s, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1528 raw = effective = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1529 for ch in s:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1530 if ch == ' ':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1531 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1532 effective = effective + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1533 elif ch == '\t':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1534 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1535 effective = (effective // tabwidth + 1) * tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1536 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1537 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1538 return raw, effective
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1539
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1540 import tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1541 _tokenize = tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1542 del tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1543
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
1544 class IndentSearcher(object):
25258
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 # .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
1547 # 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
1548 # (line containing block opener, line containing stmt)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1549 # Either or both may be None.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1550
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1551 def __init__(self, text, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1552 self.text = text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1553 self.tabwidth = tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1554 self.i = self.finished = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1555 self.blkopenline = self.indentedline = None
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1556
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1557 def readline(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1558 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1559 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1560 i = self.i = self.i + 1
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1561 mark = repr(i) + ".0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1562 if self.text.compare(mark, ">=", "end"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1563 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1564 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
1565
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1566 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
1567 INDENT=_tokenize.INDENT,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1568 NAME=_tokenize.NAME,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1569 OPENERS=('class', 'def', 'for', 'if', 'try', 'while')):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1570 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1571 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1572 elif type == NAME and token in OPENERS:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1573 self.blkopenline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1574 elif type == INDENT and self.blkopenline:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1575 self.indentedline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1576 self.finished = 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1577
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1578 def run(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1579 save_tabsize = _tokenize.tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1580 _tokenize.tabsize = self.tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1581 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1582 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1583 _tokenize.tokenize(self.readline, self.tokeneater)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1584 except _tokenize.TokenError:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1585 # 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
1586 # spurious errors
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1587 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1588 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1589 _tokenize.tabsize = save_tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1590 return self.blkopenline, self.indentedline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1591
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1592 ### end autoindent code ###
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1593
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1594 def prepstr(s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1595 # Helper to extract the underscore from a string, e.g.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1596 # prepstr("Co_py") returns (2, "Copy").
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1597 i = s.find('_')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1598 if i >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1599 s = s[:i] + s[i+1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1600 return i, s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1601
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1602
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1603 keynames = {
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1604 'bracketleft': '[',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1605 'bracketright': ']',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1606 'slash': '/',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1607 }
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1608
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1609 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
1610 keylist = keydefs.get(eventname)
67826
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1611 # 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
1612 # if not keylist:
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1613 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
1614 "<<open-module>>",
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1615 "<<goto-line>>",
18207b9d9a60 Merged revisions 88232 via svnmerge from
Ned Deily <nad@acm.org>
parents: 67670
diff changeset
1616 "<<change-indentwidth>>"}):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1617 return ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1618 s = keylist[0]
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1619 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
1620 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
1621 s = re.sub("Key-", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1622 s = re.sub("Cancel","Ctrl-Break",s) # dscherer@cmu.edu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1623 s = re.sub("Control-", "Ctrl-", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1624 s = re.sub("-", "+", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1625 s = re.sub("><", " ", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1626 s = re.sub("<", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1627 s = re.sub(">", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1628 return 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 def fixwordbreaks(root):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1632 # Make sure that Tk's double-click and next/previous word
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1633 # operations use our definition of a word (i.e. an identifier)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1634 tk = root.tk
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1635 tk.call('tcl_wordBreakAfter', 'a b', 0) # make sure word.tcl is loaded
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1636 tk.call('set', 'tcl_wordchars', '[a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1637 tk.call('set', 'tcl_nonwordchars', '[^a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1638
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1639
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1640 def test():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1641 root = Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1642 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1643 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1644 if sys.argv[1:]:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1645 filename = sys.argv[1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1646 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1647 filename = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1648 edit = EditorWindow(root=root, filename=filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1649 edit.set_close_hook(root.quit)
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1650 edit.text.bind("<<close-all-windows>>", edit.close_event)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1651 root.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1652 root.destroy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1653
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1654 if __name__ == '__main__':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1655 test()