annotate Lib/idlelib/EditorWindow.py @ 65035:87f4b32905df 2.7

Cosmetic fix to use print function.
author Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
date Fri, 01 Oct 2010 10:48:47 +0000
parents eb9fda90da6e
children 5f49d3cb194f
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
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
5 from Tkinter import *
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
6 import tkSimpleDialog
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
7 import tkMessageBox
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
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
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
10 from idlelib.MultiCall import MultiCallCreator
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
11 from idlelib import idlever
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
12 from idlelib import WindowList
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
13 from idlelib import SearchDialog
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
14 from idlelib import GrepDialog
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
15 from idlelib import ReplaceDialog
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
16 from idlelib import PyParse
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
17 from idlelib.configHandler import idleConf
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
18 from idlelib import aboutDialog, textView, configDialog
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
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
53327
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
24 def _sphinx_version():
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
25 "Format sys.version_info to produce the Sphinx version string used to install the chm docs"
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
26 major, minor, micro, level, serial = sys.version_info
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
27 release = '%s%s' % (major, minor)
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
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':
53327
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
33 release += '%s%s' % (level[0], serial)
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
34 return release
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
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__
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
51 return file, filename, descr
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
52
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
53 class EditorWindow(object):
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
54 from idlelib.Percolator import Percolator
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
55 from idlelib.ColorDelegator import ColorDelegator
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
56 from idlelib.UndoDelegator import UndoDelegator
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
57 from idlelib.IOBinding import IOBinding, filesystemencoding, encoding
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
58 from idlelib import Bindings
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
59 from Tkinter import Toplevel
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
60 from idlelib.MultiStatusBar import MultiStatusBar
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
62 help_url = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 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
65 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
66 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
67 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
68 # 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
69 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
70 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
71 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
72 else:
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
73 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
74 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
75 '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
76 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
77 chmfile = os.path.join(sys.prefix, 'Doc',
53327
2d09bcf70395 Produce correct version string to access the .chm
Kurt B. Kaiser <kbk@shore.net>
parents: 52447
diff changeset
78 '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
79 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
80 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
81 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
82 # 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
83 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
84 '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
85 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
86 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
87 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
88 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
89 # 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
90 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
91 else:
50932
cc078a575eed Use Georg's new permalinks to documentation by version number.
Raymond Hettinger <python@rcn.com>
parents: 47183
diff changeset
92 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
93 currentTheme=idleConf.CurrentTheme()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 self.flist = flist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 root = root or flist.root
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96 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
97 try:
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
98 sys.ps1
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
99 except AttributeError:
efde5ee88c9f EditorWindow failed when used stand-alone if sys.ps1 not set.
Kurt B. Kaiser <kbk@shore.net>
parents: 39146
diff changeset
100 sys.ps1 = '>>> '
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 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
102 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
103 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
104 self.tkinter_vars = flist.vars
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
105 #self.top.instance_dict makes flist.inversedict avalable to
22600
0c5c64b75d5d further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22363
diff changeset
106 #configDialog.py so it can access all EditorWindow instaces
39165
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
107 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
108 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
109 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
110 # values: Tkinter variable instances
39165
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
111 self.top.instance_dict = {}
0c00e2f509e0 - EditorWindow.test() was failing. Bug 1417598
Kurt B. Kaiser <kbk@shore.net>
parents: 39164
diff changeset
112 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
113 'recent-files.lst')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114 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
115 self.vbar = vbar = Scrollbar(text_frame, name='vbar')
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
116 self.width = idleConf.GetOption('main','EditorWindow','width')
52447
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
117 text_options = {
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
118 'name': 'text',
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
119 'padx': 5,
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
120 'wrap': 'none',
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
121 'width': self.width,
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
122 'height': idleConf.GetOption('main', 'EditorWindow', 'height')}
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
123 if TkVersion >= 8.5:
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
124 # Starting with tk 8.5 we have to set the new tabstyle option
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
125 # to 'wordprocessor' to achieve the same display of tabs as in
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
126 # older tk versions.
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
127 text_options['tabstyle'] = 'wordprocessor'
42e87ff9f65d Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle mixed space/tab properly. Issue 5120, patch by Guilherme Polo.
Kurt B. Kaiser <kbk@shore.net>
parents: 52013
diff changeset
128 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
129 self.top.focused_widget = self.text
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131 self.createmenubar()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 self.apply_bindings()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134 self.top.protocol("WM_DELETE_WINDOW", self.close)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135 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
136 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
137 # 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
138 text.bind('<<close-window>>', self.close_event)
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
139 text.bind("<<cut>>", self.cut)
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
140 text.bind("<<copy>>", self.copy)
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
141 text.bind("<<paste>>", self.paste)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142 text.bind("<<center-insert>>", self.center_insert_event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
143 text.bind("<<help>>", self.help_dialog)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 text.bind("<<python-docs>>", self.python_docs)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 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
146 text.bind("<<open-config-dialog>>", self.config_dialog)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
147 text.bind("<<open-module>>", self.open_module)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 text.bind("<<do-nothing>>", lambda event: "break")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
149 text.bind("<<select-all>>", self.select_all)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
150 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
151 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
152 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
153 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
154 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
155 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
156 text.bind("<<goto-line>>", self.goto_line_event)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
157 text.bind("<3>", self.right_menu_event)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
158 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
159 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
160 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
161 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
162 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
163 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
164 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
165 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
166 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
167 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
168 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
169 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
170 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
171 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
172 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
173 text.bind("<<beginning-of-line>>", self.home_callback)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
174
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
175 if flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
176 flist.inversedict[self] = key
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
177 if key:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
178 flist.dict[key] = self
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
179 text.bind("<<open-new-window>>", self.new_callback)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
180 text.bind("<<close-all-windows>>", self.flist.close_all_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
181 text.bind("<<open-class-browser>>", self.open_class_browser)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
182 text.bind("<<open-path-browser>>", self.open_path_browser)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
183
20304
e44cdef791ee merged status bar packing patch
Steven M. Gava <elguavas@python.net>
parents: 19170
diff changeset
184 self.set_status_bar()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
185 vbar['command'] = text.yview
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
186 vbar.pack(side=RIGHT, fill=Y)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
187 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
188 fontWeight = 'normal'
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
189 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
190 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
191 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
192 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
193 fontWeight))
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
194 text_frame.pack(side=LEFT, fill=BOTH, expand=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
195 text.pack(side=TOP, fill=BOTH, expand=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
196 text.focus_set()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
197
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
198 # 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
199 # dedent cmds, possibly mixed with spaces if
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
200 # indentwidth is not a multiple of tabwidth,
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
201 # which will cause Tabnanny to nag!
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
202 # false -> tab characters are converted to spaces by indent
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
203 # 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
204 # 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
205 # 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
206 # 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
207 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
208 self.usetabs = not usespaces
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
209
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
210 # 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
211 # 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
212 # 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
213 # 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
214 # 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
215 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
216
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
217 # 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
218 # 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
219 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
220 self.set_notabs_indentwidth()
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
221
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
222 # 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
223 # else searches for a popular (if, def, ...) Python stmt.
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
224 self.context_use_ps1 = False
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
225
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
226 # 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
227 # first start num_context_lines[0] lines back, then
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
228 # 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
229 # 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
230 # conceivable file).
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
231 # 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
232 self.num_context_lines = 50, 500, 5000000
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
233
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
234 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
235
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
236 self.undo = undo = self.UndoDelegator()
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
237 per.insertfilter(undo)
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
238 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
239 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
240 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
241
1723bcdc1e85 1. Prevent Undo before IOmark in PyShell.PyShell
Kurt B. Kaiser <kbk@shore.net>
parents: 24118
diff changeset
242 # IOBinding implements file I/O and printing functionality
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
243 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
244 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
245
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
246 # Create the recent files submenu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
247 self.recent_files_menu = Menu(self.menubar)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
248 self.menudict['file'].insert_cascade(3, label='Recent Files',
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
249 underline=0,
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
250 menu=self.recent_files_menu)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
251 self.update_recent_files_list()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
252
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
253 self.color = None # initialized below in self.ResetColorizer
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
254 if filename:
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
255 if os.path.exists(filename) and not os.path.isdir(filename):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
256 io.loadfile(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
257 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
258 io.set_filename(filename)
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
259 self.ResetColorizer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
260 self.saved_change_hook()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
261
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
262 self.set_indentation_params(self.ispythonsource(filename))
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
263
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
264 self.load_extensions()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
265
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
266 menu = self.menudict.get('windows')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
267 if menu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
268 end = menu.index("end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
269 if end is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
270 end = -1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
271 if end >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
272 menu.add_separator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
273 end = end + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
274 self.wmenu_end = end
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
275 WindowList.register_callback(self.postwindowsmenu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
276
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
277 # Some abstractions so IDLE extensions are cross-IDE
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
278 self.askyesno = tkMessageBox.askyesno
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
279 self.askinteger = tkSimpleDialog.askinteger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
280 self.showerror = tkMessageBox.showerror
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
281
35958
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
282 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
283 """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
284 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
285 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
286 else:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
287 try:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
288 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
289 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
290 # XXX
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
291 try:
1d8effde82f1 Patch #1162825: Support non-ASCII characters in IDLE window titles.
Martin v. Löwis <martin@v.loewis.de>
parents: 35903
diff changeset
292 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
293 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
294 # 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
295 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
296
29362
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
297 def new_callback(self, event):
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
298 dirname, basename = self.io.defaultfilename()
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
299 self.flist.new(dirname)
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
300 return "break"
f82b6d2b73f1 SF 748973 Guido van Rossum patch
Kurt B. Kaiser <kbk@shore.net>
parents: 27272
diff changeset
301
46582
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
302 def home_callback(self, event):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
303 if (event.state & 12) != 0 and event.keysym == "Home":
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
304 # state&1==shift, state&4==control, state&8==alt
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
305 return # <Modifier-Home>; fall back to class binding
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
306
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
307 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
308 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
309 self.text.compare("insert linestart", "<=", "iomark"):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
310 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
311 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
312 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
313 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
314 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
315 break
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
316 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
317 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
318
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
319 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
320
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
321 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
322 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
323
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
324 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
325
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
326 if (event.state&1) == 0:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
327 # shift not pressed
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
328 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
329 else:
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
330 if not self.text.index("sel.first"):
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
331 self.text.mark_set("anchor","insert")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
332
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
333 first = self.text.index(dest)
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
334 last = self.text.index("anchor")
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
335
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
336 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
337 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
338
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
339 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
340 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
341
ebc40e500869 Home / Control-A toggles between left margin and end of leading white
Kurt B. Kaiser <kbk@shore.net>
parents: 45367
diff changeset
342 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
343 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
344 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
345
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
346 def set_status_bar(self):
20304
e44cdef791ee merged status bar packing patch
Steven M. Gava <elguavas@python.net>
parents: 19170
diff changeset
347 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
348 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
349 # 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
350 # 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
351 self.status_bar.set_label('_padding1', ' ', side=RIGHT)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
352 self.status_bar.set_label('column', 'Col: ?', side=RIGHT)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
353 self.status_bar.set_label('line', 'Ln: ?', side=RIGHT)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
354 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
355 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
356 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
357 "<KeyRelease>", "<ButtonRelease>")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
358 self.text.after_idle(self.set_line_and_column)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
359
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
360 def set_line_and_column(self, event=None):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
361 line, column = self.text.index(INSERT).split('.')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
362 self.status_bar.set_label('column', 'Col: %s' % column)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
363 self.status_bar.set_label('line', 'Ln: %s' % line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
364
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
365 menu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
366 ("file", "_File"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
367 ("edit", "_Edit"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
368 ("format", "F_ormat"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
369 ("run", "_Run"),
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
370 ("options", "_Options"),
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
371 ("windows", "_Windows"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
372 ("help", "_Help"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
373 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
374
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
375 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
376 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
377 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
378
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
379
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
380 def createmenubar(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
381 mbar = self.menubar
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
382 self.menudict = menudict = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
383 for name, label in self.menu_specs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
384 underline, label = prepstr(label)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
385 menudict[name] = menu = Menu(mbar, name=name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
386 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
387
52013
39e9a20b7d7f Fixes issues 3883 and 5194
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 50932
diff changeset
388 if macosxSupport.runningAsOSXApp():
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
389 # 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
390 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
391 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
392
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
393 self.fill_menus()
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
394 self.base_helpmenu_length = self.menudict['help'].index(END)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
395 self.reset_help_menu_entries()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
396
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
397 def postwindowsmenu(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
398 # Only called when Windows menu exists
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
399 menu = self.menudict['windows']
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
400 end = menu.index("end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
401 if end is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
402 end = -1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
403 if end > self.wmenu_end:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
404 menu.delete(self.wmenu_end+1, end)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
405 WindowList.add_windows_to_menu(menu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
406
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
407 rmenu = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
408
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
409 def right_menu_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
410 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
411 self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
412 if not self.rmenu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
413 self.make_rmenu()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
414 rmenu = self.rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
415 self.event = event
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
416 iswin = sys.platform[:3] == 'win'
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
417 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
418 self.text.config(cursor="arrow")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
419 rmenu.tk_popup(event.x_root, event.y_root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
420 if iswin:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
421 self.text.config(cursor="ibeam")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
422
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
423 rmenu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
424 # ("Label", "<<virtual-event>>"), ...
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
425 ("Close", "<<close-window>>"), # Example
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
426 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
427
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
428 def make_rmenu(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
429 rmenu = Menu(self.text, tearoff=0)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
430 for label, eventname in self.rmenu_specs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
431 def command(text=self.text, eventname=eventname):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
432 text.event_generate(eventname)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
433 rmenu.add_command(label=label, command=command)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
434 self.rmenu = rmenu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
435
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
436 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
437 aboutDialog.AboutDialog(self.top,'About IDLE')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
438
21035
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
439 def config_dialog(self, event=None):
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20304
diff changeset
440 configDialog.ConfigDialog(self.top,'Settings')
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
441
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
442 def help_dialog(self, event=None):
18907
443a8622e851 A more lightweight (and read only) way to view help text
Steven M. Gava <elguavas@python.net>
parents: 18901
diff changeset
443 fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt')
43462
9ae4e8a53486 textView cleanup. Patch 1718043 Tal Einat.
Kurt B. Kaiser <kbk@shore.net>
parents: 43461
diff changeset
444 textView.view_file(self.top,'Help',fn)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
445
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
446 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
447 if sys.platform[:3] == 'win':
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
448 os.startfile(self.help_url)
23208
382e37ac374d tracking python idle changes:
Steven M. Gava <elguavas@python.net>
parents: 22602
diff changeset
449 else:
27196
d4c8af9119d1 1. Make finding Python help docs more robust, including the installed
Kurt B. Kaiser <kbk@shore.net>
parents: 27074
diff changeset
450 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
451 return "break"
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
452
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
453 def cut(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
454 self.text.event_generate("<<Cut>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
455 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
457 def copy(self,event):
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
458 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
459 # 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
460 return
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
461 self.text.event_generate("<<Copy>>")
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
462 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
463
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
464 def paste(self,event):
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
465 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
466 self.text.see("insert")
25456
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
467 return "break"
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
468
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
469 def select_all(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
470 self.text.tag_add("sel", "1.0", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
471 self.text.mark_set("insert", "1.0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
472 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
473 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
474
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
475 def remove_selection(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
476 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
477 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
478
27272
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
479 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
480 """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
481
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
482 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
483 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
484 selection.
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
485
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
486 """
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
487 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
488 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
489 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
490 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
491 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
492 try:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
493 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
494 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
495 except TclError:
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
496 pass
64d3fe904a0a Patch 611069 (Christos Georgiou) IDLE TODO:left/right when selected text
Kurt B. Kaiser <kbk@shore.net>
parents: 27245
diff changeset
497 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
498
34515
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
499 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
500 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
501 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
502
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
503 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
504 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
505 return "break"
e3074e94fb75 Add keybindings for del-word-left and del-word-right.
Kurt B. Kaiser <kbk@shore.net>
parents: 34443
diff changeset
506
21626
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
507 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
508 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
509 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
510
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
511 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
512 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
513 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
514
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
515 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
516 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
517 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
518
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
519 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
520 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
521 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
522
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
523 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
524 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
525 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
526
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
527 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
528 text = self.text
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
529 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
530 "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
531 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
532 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
533 if lineno <= 0:
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
534 text.bell()
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
535 return "break"
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
536 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
537 text.see("insert")
de1ebcef7d31 move core functionality of SearchBindings.py into EditorWindow.py proper
Steven M. Gava <elguavas@python.net>
parents: 21620
diff changeset
538
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
539 def open_module(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
540 # XXX Shouldn't this be in IOBinding or in FileList?
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
541 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
542 name = self.text.get("sel.first", "sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
543 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
544 name = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
545 else:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
546 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
547 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
548 "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
549 "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
550 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
551 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
552 name = name.strip()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
553 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
554 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
555 # XXX Ought to insert current file's directory in front of path
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
556 try:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
557 (f, file, (suffix, mode, type)) = _find_module(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
558 except (NameError, ImportError), msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
559 tkMessageBox.showerror("Import error", str(msg), parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
560 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
561 if type != imp.PY_SOURCE:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
562 tkMessageBox.showerror("Unsupported type",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
563 "%s is not a source module" % name, parent=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
564 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
565 if f:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
566 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
567 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
568 self.flist.open(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
569 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
570 self.io.loadfile(file)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
571
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
572 def open_class_browser(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
573 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
574 if not filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
575 tkMessageBox.showerror(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
576 "No filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
577 "This buffer has no associated filename",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
578 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
579 self.text.focus_set()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
580 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
581 head, tail = os.path.split(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
582 base, ext = os.path.splitext(tail)
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
583 from idlelib import ClassBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
584 ClassBrowser.ClassBrowser(self.flist, base, [head])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
585
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
586 def open_path_browser(self, event=None):
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 56436
diff changeset
587 from idlelib import PathBrowser
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
588 PathBrowser.PathBrowser(self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
589
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
590 def gotoline(self, lineno):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
591 if lineno is not None and lineno > 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
592 self.text.mark_set("insert", "%d.0" % lineno)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
593 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
594 self.text.tag_add("sel", "insert", "insert +1l")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
595 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
596
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
597 def ispythonsource(self, filename):
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
598 if not filename or os.path.isdir(filename):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
599 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
600 base, ext = os.path.splitext(os.path.basename(filename))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
601 if os.path.normcase(ext) in (".py", ".pyw"):
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
602 return True
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
603 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
604 f = open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
605 line = f.readline()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
606 f.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
607 except IOError:
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
608 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
609 return line.startswith('#!') and line.find('python') >= 0
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
610
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
611 def close_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
612 if self.flist:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
613 self.flist.unregister_maybe_terminate(self)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
614 self.flist = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
615
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
616 def set_close_hook(self, close_hook):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
617 self.close_hook = close_hook
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
618
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
619 def filename_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
620 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
621 self.flist.filename_changed_edit(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
622 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
623 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
624 self.ResetColorizer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
625
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
626 def _addcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
627 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
628 return
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
629 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
630 self.color = self.ColorDelegator()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
631 # can add more colorizers here...
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
632 if self.color:
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
633 self.per.removefilter(self.undo)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
634 self.per.insertfilter(self.color)
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
635 self.per.insertfilter(self.undo)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
636
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
637 def _rmcolorizer(self):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
638 if not self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
639 return
35064
173e90e0d2e3 1. Patch 1196895 Jeff Shute:
Kurt B. Kaiser <kbk@shore.net>
parents: 34520
diff changeset
640 self.color.removecolors()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
641 self.per.removefilter(self.color)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
642 self.color = None
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
643
22111
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 22051
diff changeset
644 def ResetColorizer(self):
45367
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
645 "Update the colour theme"
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
646 # 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
647 self._rmcolorizer()
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
648 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
649 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
650 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
651 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
652 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
653 self.text.config(
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
654 foreground=normal_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
655 background=normal_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
656 insertbackground=cursor_color,
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
657 selectforeground=select_colors['foreground'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
658 selectbackground=select_colors['background'],
166e3ba7de24 Configured selection highlighting colors were ignored; updating highlighting
Kurt B. Kaiser <kbk@shore.net>
parents: 43520
diff changeset
659 )
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
660
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
661 def ResetFont(self):
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
662 "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
663 # Called from configDialog.py
22238
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
664 fontWeight='normal'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
665 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
666 fontWeight='bold'
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
667 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
668 idleConf.GetOption('main','EditorWindow','font-size'),
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
669 fontWeight))
ae578c8c6ced further work on dynamic config changes;
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
670
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
671 def RemoveKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
672 "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
673 # 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
674 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
675 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
676 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
677 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
678 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
679 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
680 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
681 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
682
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
683 def ApplyKeybindings(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
684 "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
685 # 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
686 self.Bindings.default_keydefs = keydefs = idleConf.GetCurrentKeySet()
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
687 self.apply_bindings()
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
688 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
689 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
690 if xkeydefs:
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
691 self.apply_bindings(xkeydefs)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
692 #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
693 menuEventDict = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
694 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
695 menuEventDict[menu[0]] = {}
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
696 for item in menu[1]:
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
697 if item:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
698 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
699 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
700 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
701 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
702 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
703 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
704 accel = menu.entrycget(index, 'accelerator')
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
705 if accel:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
706 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
707 event = ''
56436
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
708 if menubarItem in menuEventDict:
684960fb1cbf replace has_key with 'in' operator
Benjamin Peterson <benjamin@python.org>
parents: 55638
diff changeset
709 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
710 event = menuEventDict[menubarItem][itemName]
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
711 if event:
35903
800f48a14a8a Following 'syntax' patch, accelerator keys in menus weren't being
Kurt B. Kaiser <kbk@shore.net>
parents: 35891
diff changeset
712 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
713 menu.entryconfig(index, accelerator=accel)
22363
6ac4150c4e88 further work on dynamic reconfiguration;
Steven M. Gava <elguavas@python.net>
parents: 22238
diff changeset
714
34520
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
715 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
716 "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
717 # 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
718 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
719 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
720 type='int')
5fd506516361 Removed ability to configure tabs indent from Options dialog. This 'feature'
Kurt B. Kaiser <kbk@shore.net>
parents: 34515
diff changeset
721
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
722 def reset_help_menu_entries(self):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
723 "Update the additional help entries on the Help menu"
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
724 help_list = idleConf.GetAllExtraHelpSourcesList()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
725 helpmenu = self.menudict['help']
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
726 # first delete the extra help entries, if any
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
727 helpmenu_length = helpmenu.index(END)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
728 if helpmenu_length > self.base_helpmenu_length:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
729 helpmenu.delete((self.base_helpmenu_length + 1), helpmenu_length)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
730 # then rebuild them
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
731 if help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
732 helpmenu.add_separator()
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
733 for entry in help_list:
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
734 cmd = self.__extra_help_callback(entry[1])
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
735 helpmenu.add_command(label=entry[0], command=cmd)
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
736 # and update the menu dictionary
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
737 self.menudict['help'] = helpmenu
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
738
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
739 def __extra_help_callback(self, helpfile):
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
740 "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
741 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
742 if not helpfile.startswith(('www', 'http')):
32681
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
743 url = os.path.normpath(helpfile)
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
744 if sys.platform[:3] == 'win':
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
745 os.startfile(helpfile)
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
746 else:
104a7fc06bdf Checking sys.platform for substring 'win' was breaking IDLE docs on Mac
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
747 webbrowser.open(helpfile)
27245
d3ab532b3b6d M Bindings.py
Kurt B. Kaiser <kbk@shore.net>
parents: 27208
diff changeset
748 return display_extra_help
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
749
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
750 def update_recent_files_list(self, new_file=None):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
751 "Load and update the recent files list and menus"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
752 rf_list = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
753 if os.path.exists(self.recent_files_path):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
754 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
755 try:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
756 rf_list = rf_list_file.readlines()
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
757 finally:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
758 rf_list_file.close()
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
759 if new_file:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
760 new_file = os.path.abspath(new_file) + '\n'
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
761 if new_file in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
762 rf_list.remove(new_file) # move to top
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
763 rf_list.insert(0, new_file)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
764 # clean and save the recent files list
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
765 bad_paths = []
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
766 for path in rf_list:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
767 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
768 bad_paths.append(path)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
769 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
770 ulchars = "1234567890ABCDEFGHIJK"
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
771 rf_list = rf_list[0:len(ulchars)]
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
772 rf_file = open(self.recent_files_path, 'w')
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
773 try:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
774 rf_file.writelines(rf_list)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
775 finally:
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
776 rf_file.close()
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
777 # for each edit window instance, construct the recent files menu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
778 for instance in self.top.instance_dict.keys():
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
779 menu = instance.recent_files_menu
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
780 menu.delete(1, END) # clear, and rebuild:
55638
a0f80dc09dfe Issue #3344: Replace itertools.count by enumerate.
Guilherme Polo <ggpolo@gmail.com>
parents: 54739
diff changeset
781 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
782 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
783 # 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
784 ufile_name = self._filename_to_unicode(file_name)
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
785 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
786 menu.add_command(label=ulchars[i] + " " + ufile_name,
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
787 command=callback,
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
788 underline=0)
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
789
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
790 def __recent_file_callback(self, file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
791 def open_recent_file(fn_closure=file_name):
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
792 self.io.open(editFile=fn_closure)
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
793 return open_recent_file
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
794
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
795 def saved_change_hook(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
796 short = self.short_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
797 long = self.long_title()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
798 if short and long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
799 title = short + " - " + long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
800 elif short:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
801 title = short
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
802 elif long:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
803 title = long
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
804 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
805 title = "Untitled"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
806 icon = short or long or title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
807 if not self.get_saved():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
808 title = "*%s*" % title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
809 icon = "*%s" % icon
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
810 self.top.wm_title(title)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
811 self.top.wm_iconname(icon)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
812
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
813 def get_saved(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
814 return self.undo.get_saved()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
815
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
816 def set_saved(self, flag):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
817 self.undo.set_saved(flag)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
818
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
819 def reset_undo(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
820 self.undo.reset_undo()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
821
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
822 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
823 filename = self.io.filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
824 if filename:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
825 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
826 # 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
827 return self._filename_to_unicode(filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
828
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
829 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
830 # 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
831 return self._filename_to_unicode(self.io.filename or "")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
832
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
833 def center_insert_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
834 self.center()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
835
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
836 def center(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
837 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
838 top, bot = self.getwindowlines()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
839 lineno = self.getlineno(mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
840 height = bot - top
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
841 newtop = max(1, lineno - height//2)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
842 text.yview(float(newtop))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
843
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
844 def getwindowlines(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
845 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
846 top = self.getlineno("@0,0")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
847 bot = self.getlineno("@0,65535")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
848 if top == bot and text.winfo_height() == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
849 # Geometry manager hasn't run yet
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
850 height = int(text['height'])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
851 bot = top + height - 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
852 return top, bot
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
853
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
854 def getlineno(self, mark="insert"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
855 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
856 return int(float(text.index(mark)))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
857
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
858 def get_geometry(self):
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
859 "Return (width, height, x, y)"
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
860 geom = self.top.wm_geometry()
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
861 m = re.match(r"(\d+)x(\d+)\+(-?\d+)\+(-?\d+)", geom)
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
862 tuple = (map(int, m.groups()))
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
863 return tuple
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26959
diff changeset
864
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
865 def close_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
866 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
867
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
868 def maybesave(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
869 if self.io:
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
870 if not self.get_saved():
26959
b8c72e86a12d Whitespace Normalization
Kurt B. Kaiser <kbk@shore.net>
parents: 26828
diff changeset
871 if self.top.state()!='normal':
22051
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
872 self.top.deiconify()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
873 self.top.lower()
e31ad4dd30d9 bugfix for the problem where EditorWindow instances
Steven M. Gava <elguavas@python.net>
parents: 21976
diff changeset
874 self.top.lift()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
875 return self.io.maybesave()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
876
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
877 def close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
878 reply = self.maybesave()
40599
21119db5e096 - idle: Honor the "Cancel" action in the save dialog (Debian bug #299092).
Matthias Klose <doko@ubuntu.com>
parents: 40383
diff changeset
879 if str(reply) != "cancel":
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
880 self._close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
881 return reply
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
882
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
883 def _close(self):
22602
f3a913e64eb8 further work on new config system;
Steven M. Gava <elguavas@python.net>
parents: 22600
diff changeset
884 if self.io.filename:
31895
c56ea60cb3bf M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 31625
diff changeset
885 self.update_recent_files_list(new_file=self.io.filename)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
886 WindowList.unregister_callback(self.postwindowsmenu)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
887 self.unload_extensions()
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
888 self.io.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
889 self.io = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
890 self.undo = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
891 if self.color:
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
892 self.color.close(False)
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
893 self.color = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
894 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
895 self.tkinter_vars = None
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
896 self.per.close()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
897 self.per = None
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
898 self.top.destroy()
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
899 if self.close_hook:
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
900 # unless override: unregister from flist, terminate if last window
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
901 self.close_hook()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
902
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
903 def load_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
904 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
905 self.load_standard_extensions()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
906
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
907 def unload_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
908 for ins in self.extensions.values():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
909 if hasattr(ins, "close"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
910 ins.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
911 self.extensions = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
912
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
913 def load_standard_extensions(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
914 for name in self.get_standard_extension_names():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
915 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
916 self.load_extension(name)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
917 except:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
918 print "Failed to load extension", repr(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
919 import traceback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
920 traceback.print_exc()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
921
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
922 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
923 return idleConf.GetExtensions(editor_only=True)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
924
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
925 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
926 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
927 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
928 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
929 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
930 return
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
931 cls = getattr(mod, name)
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
932 keydefs = idleConf.GetExtensionBindings(name)
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
933 if hasattr(cls, "menudefs"):
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31946
diff changeset
934 self.fill_menus(cls.menudefs, keydefs)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
935 ins = cls(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
936 self.extensions[name] = ins
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
937 if keydefs:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
938 self.apply_bindings(keydefs)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
939 for vevent in keydefs.keys():
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
940 methodname = vevent.replace("-", "_")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
941 while methodname[:1] == '<':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
942 methodname = methodname[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
943 while methodname[-1:] == '>':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
944 methodname = methodname[:-1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
945 methodname = methodname + "_event"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
946 if hasattr(ins, methodname):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
947 self.text.bind(vevent, getattr(ins, methodname))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
948
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
949 def apply_bindings(self, keydefs=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
950 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
951 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
952 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
953 text.keydefs = keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
954 for event, keylist in keydefs.items():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
955 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
956 text.event_add(event, *keylist)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
957
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
958 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
959 """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
960
edd7c0146ac8 Clear associated breakpoints when closing an edit window.
Kurt B. Kaiser <kbk@shore.net>
parents: 23784
diff changeset
961 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
962 """
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
963 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
964 menudefs = self.Bindings.menudefs
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
965 if keydefs is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
966 keydefs = self.Bindings.default_keydefs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
967 menudict = self.menudict
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
968 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
969 for mname, entrylist in menudefs:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
970 menu = menudict.get(mname)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
971 if not menu:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
972 continue
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
973 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
974 if not entry:
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
975 menu.add_separator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
976 else:
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
977 label, eventname = entry
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
978 checkbutton = (label[:1] == '!')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
979 if checkbutton:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
980 label = label[1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
981 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
982 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
983 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
984 text.event_generate(eventname)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
985 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
986 var = self.get_var_obj(eventname, BooleanVar)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
987 menu.add_checkbutton(label=label, underline=underline,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
988 command=command, accelerator=accelerator,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
989 variable=var)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
990 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
991 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
992 command=command,
41eb24b747c0 Fix Bug 612886 copy/paste menu items fail
Kurt B. Kaiser <kbk@shore.net>
parents: 25286
diff changeset
993 accelerator=accelerator)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
994
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
995 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
996 var = self.get_var_obj(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
997 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
998 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
999 return value
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1000 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1001 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1002
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1003 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
1004 var = self.get_var_obj(name, vartype)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1005 if var:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1006 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
1007 else:
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1008 raise NameError, name
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1009
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1010 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
1011 var = self.tkinter_vars.get(name)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1012 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
1013 # 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
1014 self.tkinter_vars[name] = var = vartype(self.text)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1015 return var
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1016
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1017 # Tk implementations of "virtual text methods" -- each platform
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1018 # reusing IDLE's support code needs to define these for its GUI's
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1019 # flavor of widget.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1020
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1021 # Is character at text_index in a Python string? Return 0 for
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1022 # "guaranteed no", true for anything else. This info is expensive
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1023 # to compute ab initio, but is probably already known by the
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1024 # platform's colorizer.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1025
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1026 def is_char_in_string(self, text_index):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1027 if self.color:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1028 # Return true iff colorizer hasn't (re)gotten this far
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1029 # yet, or the character is tagged as being in a string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1030 return self.text.tag_prevrange("TODO", text_index) or \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1031 "STRING" in self.text.tag_names(text_index)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1032 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1033 # The colorizer is missing: assume the worst
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1034 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1035
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1036 # If a selection is defined in the text widget, return (start,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1037 # end) as Tkinter text indices, otherwise return (None, None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1038 def get_selection_indices(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1039 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1040 first = self.text.index("sel.first")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1041 last = self.text.index("sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1042 return first, last
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1043 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1044 return None, None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1045
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1046 # Return the text widget's current view of what a tab stop means
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1047 # (equivalent width in spaces).
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1048
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1049 def get_tabwidth(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1050 current = self.text['tabs'] or TK_TABWIDTH_DEFAULT
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1051 return int(current)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1052
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1053 # Set the text widget's current view of what a tab stop means.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1054
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1055 def set_tabwidth(self, newtabwidth):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1056 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1057 if self.get_tabwidth() != newtabwidth:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1058 pixels = text.tk.call("font", "measure", text["font"],
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1059 "-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
1060 "n" * newtabwidth)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1061 text.configure(tabs=pixels)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1062
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1063 # 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
1064 # 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
1065 # indentwidth != tabwidth set usetabs false.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1066 # 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
1067 # character means.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1068
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1069 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
1070 if guess and ispythonsource:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1071 i = self.guess_indent()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1072 if 2 <= i <= 8:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1073 self.indentwidth = i
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1074 if self.indentwidth != self.tabwidth:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1075 self.usetabs = False
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1076 self.set_tabwidth(self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1077
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1078 def smart_backspace_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1079 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1080 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1081 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1082 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1083 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1084 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1085 # 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
1086 # preceding virtual tab stop.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1087 chars = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1088 if chars == '':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1089 if text.compare("insert", ">", "1.0"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1090 # easy: delete preceding newline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1091 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1092 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1093 text.bell() # at start of buffer
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1094 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1095 if chars[-1] not in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1096 # easy: delete preceding real char
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1097 text.delete("insert-1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1098 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1099 # 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
1100 # 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
1101 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
1102 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1103 assert have > 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1104 want = ((have - 1) // self.indentwidth) * self.indentwidth
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1105 # Debug prompt is multilined....
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1106 last_line_of_prompt = sys.ps1.split('\n')[-1]
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1107 ncharsdeleted = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1108 while 1:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1109 if chars == last_line_of_prompt:
26678
78d872cd064c In Shell:
Kurt B. Kaiser <kbk@shore.net>
parents: 26667
diff changeset
1110 break
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1111 chars = chars[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1112 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
1113 have = len(chars.expandtabs(tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1114 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
1115 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1116 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1117 text.delete("insert-%dc" % ncharsdeleted, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1118 if have < want:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1119 text.insert("insert", ' ' * (want - have))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1120 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1121 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1122
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1123 def smart_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1124 # if intraline selection:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1125 # delete it
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1126 # elif multiline selection:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1127 # do indent-region
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1128 # else:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1129 # indent one level
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1130 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1131 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1132 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1133 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1134 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1135 if index2line(first) != index2line(last):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1136 return self.indent_region_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1137 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1138 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1139 prefix = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1140 raw, effective = classifyws(prefix, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1141 if raw == len(prefix):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1142 # only whitespace to the left
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1143 self.reindent_to(effective + self.indentwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1144 else:
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1145 # 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
1146 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1147 pad = '\t'
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1148 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
1149 effective = len(prefix.expandtabs(self.tabwidth))
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1150 n = self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1151 pad = ' ' * (n - effective % n)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1152 text.insert("insert", pad)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1153 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1154 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1155 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1156 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1157
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1158 def newline_and_indent_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1159 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1160 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1161 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1162 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1163 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1164 text.delete(first, last)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1165 text.mark_set("insert", first)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1166 line = text.get("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1167 i, n = 0, len(line)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1168 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
1169 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1170 if i == n:
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1171 # 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
1172 # 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
1173 text.insert("insert linestart", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1174 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1175 indent = line[:i]
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1176 # 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
1177 i = 0
26827
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1178 last_line_of_prompt = sys.ps1.split('\n')[-1]
13d59dbfb8d4 M EditorWindow.py
Kurt B. Kaiser <kbk@shore.net>
parents: 26734
diff changeset
1179 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
1180 line = line[:-1]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1181 i = i+1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1182 if i:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1183 text.delete("insert - %d chars" % i, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1184 # strip whitespace after insert point
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1185 while text.get("insert") in " \t":
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1186 text.delete("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1187 # start new line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1188 text.insert("insert", '\n')
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1189
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1190 # adjust indentation for continuations and block
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1191 # 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
1192 lno = index2line(text.index('insert'))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1193 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
1194 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
1195 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
1196 startat = max(lno - context, 1)
60146
eb9fda90da6e #7092: silence some py3k warnings
Florent Xicluna <florent.xicluna@gmail.com>
parents: 60144
diff changeset
1197 startatindex = repr(startat) + ".0"
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1198 rawtext = text.get(startatindex, "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1199 y.set_str(rawtext)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1200 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
1201 self.context_use_ps1,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1202 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
1203 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
1204 break
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1205 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
1206 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1207 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
1208 if r:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1209 startatindex = r[1]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1210 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1211 startatindex = "1.0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1212 rawtext = text.get(startatindex, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1213 y.set_str(rawtext)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1214 y.set_lo(0)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents: 35876
diff changeset
1215
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1216 c = y.get_continuation_type()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1217 if c != PyParse.C_NONE:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1218 # 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
1219 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
1220 # 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
1221 pass
f334efe76f6a Better indentation after first line of string continuation.
Kurt B. Kaiser <kbk@shore.net>
parents: 35065
diff changeset
1222 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
1223 # 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
1224 # just mimic the current indent
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1225 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1226 elif c == PyParse.C_BRACKET:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1227 # 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
1228 # last open bracket structure; else indent one
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1229 # 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
1230 # last open bracket
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1231 self.reindent_to(y.compute_bracket_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1232 elif c == PyParse.C_BACKSLASH:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1233 # 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
1234 # 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
1235 # 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
1236 # 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
1237 # non-whitespace on initial line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1238 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
1239 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1240 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1241 self.reindent_to(y.compute_backslash_indent())
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1242 else:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1243 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
1244 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1245
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1246 # 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
1247 # indentation of initial line of closest preceding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1248 # interesting stmt.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1249 indent = y.get_base_indent_string()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1250 text.insert("insert", indent)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1251 if y.is_block_opener():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1252 self.smart_indent_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1253 elif indent and y.is_block_closer():
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1254 self.smart_backspace_event(event)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1255 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1256 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1257 text.see("insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1258 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1259
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1260 # 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
1261 # 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
1262 # 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
1263 # offset.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1264
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1265 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
1266 def inner(offset, _startindex=startindex,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1267 _icis=self.is_char_in_string):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1268 return _icis(_startindex + "+%dc" % offset)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1269 return inner
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1270
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1271 def indent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1272 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1273 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1274 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1275 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1276 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1277 effective = effective + self.indentwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1278 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
1279 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1280 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1281
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1282 def dedent_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1283 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1284 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1285 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1286 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1287 raw, effective = classifyws(line, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1288 effective = max(effective - self.indentwidth, 0)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1289 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
1290 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1291 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1292
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1293 def comment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1294 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1295 for pos in range(len(lines) - 1):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1296 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1297 lines[pos] = '##' + line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1298 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1299
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1300 def uncomment_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1301 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1302 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1303 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1304 if not line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1305 continue
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1306 if line[:2] == '##':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1307 line = line[2:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1308 elif line[:1] == '#':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1309 line = line[1:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1310 lines[pos] = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1311 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1312
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1313 def tabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1314 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1315 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1316 for pos in range(len(lines)):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1317 line = lines[pos]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1318 if line:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1319 raw, effective = classifyws(line, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1320 ntabs, nspaces = divmod(effective, tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1321 lines[pos] = '\t' * ntabs + ' ' * nspaces + line[raw:]
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1322 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1323
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1324 def untabify_region_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1325 head, tail, chars, lines = self.get_region()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1326 tabwidth = self._asktabwidth()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1327 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
1328 lines[pos] = lines[pos].expandtabs(tabwidth)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1329 self.set_region(head, tail, chars, lines)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1330
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1331 def toggle_tabs_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1332 if self.askyesno(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1333 "Toggle tabs",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1334 "Turn tabs " + ("on", "off")[self.usetabs] +
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1335 "?\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
1336 ("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
1337 "\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
1338 parent=self.text):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1339 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
1340 # 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
1341 # 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
1342 self.indentwidth = 8
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1343 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1344
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1345 # 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
1346 ## def change_tabwidth_event(self, event):
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1347 ## new = self._asktabwidth()
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1348 ## if new != self.tabwidth:
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1349 ## self.tabwidth = new
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1350 ## self.set_indentation_params(0, guess=0)
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1351 ## return "break"
25258
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 change_indentwidth_event(self, event):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1354 new = self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1355 "Indent width",
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1356 "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
1357 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1358 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1359 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1360 maxvalue=16)
34443
cd6b54ba272f 1. Polish tabbing code.
Kurt B. Kaiser <kbk@shore.net>
parents: 34439
diff changeset
1361 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
1362 self.indentwidth = new
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1363 return "break"
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1364
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1365 def get_region(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1366 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1367 first, last = self.get_selection_indices()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1368 if first and last:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1369 head = text.index(first + " linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1370 tail = text.index(last + "-1c lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1371 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1372 head = text.index("insert linestart")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1373 tail = text.index("insert lineend +1c")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1374 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
1375 lines = chars.split("\n")
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1376 return head, tail, chars, lines
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1377
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1378 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
1379 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
1380 newchars = "\n".join(lines)
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1381 if newchars == chars:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1382 text.bell()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1383 return
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1384 text.tag_remove("sel", "1.0", "end")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1385 text.mark_set("insert", head)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1386 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1387 text.delete(head, tail)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1388 text.insert(head, newchars)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1389 text.undo_block_stop()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1390 text.tag_add("sel", head, "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1391
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1392 # 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
1393
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1394 def _make_blanks(self, n):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1395 if self.usetabs:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1396 ntabs, nspaces = divmod(n, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1397 return '\t' * ntabs + ' ' * nspaces
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1398 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1399 return ' ' * n
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1400
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1401 # 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
1402 # 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
1403
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1404 def reindent_to(self, column):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1405 text = self.text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1406 text.undo_block_start()
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1407 if text.compare("insert linestart", "!=", "insert"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1408 text.delete("insert linestart", "insert")
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1409 if column:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1410 text.insert("insert", self._make_blanks(column))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1411 text.undo_block_stop()
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 _asktabwidth(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1414 return self.askinteger(
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1415 "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
1416 "Columns per tab? (2-16)",
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1417 parent=self.text,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1418 initialvalue=self.indentwidth,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1419 minvalue=2,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1420 maxvalue=16) or self.tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1421
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1422 # Guess indentwidth from text content.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1423 # 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
1424 # 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
1425 # blocks are found).
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1426
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1427 def guess_indent(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1428 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
1429 if opener and indented:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1430 raw, indentsmall = classifyws(opener, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1431 raw, indentlarge = classifyws(indented, self.tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1432 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1433 indentsmall = indentlarge = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1434 return indentlarge - indentsmall
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1435
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1436 # "line.col" -> line, as an int
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1437 def index2line(index):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1438 return int(float(index))
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1439
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1440 # Look at the leading whitespace in s.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1441 # Return pair (# of leading ws characters,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1442 # effective # of leading blanks after expanding
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1443 # tabs to width tabwidth)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1444
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1445 def classifyws(s, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1446 raw = effective = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1447 for ch in s:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1448 if ch == ' ':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1449 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1450 effective = effective + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1451 elif ch == '\t':
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1452 raw = raw + 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1453 effective = (effective // tabwidth + 1) * tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1454 else:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1455 break
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1456 return raw, effective
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1457
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1458 import tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1459 _tokenize = tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1460 del tokenize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1461
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
1462 class IndentSearcher(object):
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1463
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1464 # .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
1465 # 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
1466 # (line containing block opener, line containing stmt)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1467 # Either or both may be None.
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1468
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1469 def __init__(self, text, tabwidth):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1470 self.text = text
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1471 self.tabwidth = tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1472 self.i = self.finished = 0
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1473 self.blkopenline = self.indentedline = None
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1474
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1475 def readline(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1476 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1477 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1478 i = self.i = self.i + 1
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30527
diff changeset
1479 mark = repr(i) + ".0"
25258
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1480 if self.text.compare(mark, ">=", "end"):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1481 return ""
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1482 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
1483
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1484 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
1485 INDENT=_tokenize.INDENT,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1486 NAME=_tokenize.NAME,
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1487 OPENERS=('class', 'def', 'for', 'if', 'try', 'while')):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1488 if self.finished:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1489 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1490 elif type == NAME and token in OPENERS:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1491 self.blkopenline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1492 elif type == INDENT and self.blkopenline:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1493 self.indentedline = line
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1494 self.finished = 1
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1495
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1496 def run(self):
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1497 save_tabsize = _tokenize.tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1498 _tokenize.tabsize = self.tabwidth
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1499 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1500 try:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1501 _tokenize.tokenize(self.readline, self.tokeneater)
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1502 except _tokenize.TokenError:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1503 # 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
1504 # spurious errors
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1505 pass
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1506 finally:
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1507 _tokenize.tabsize = save_tabsize
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1508 return self.blkopenline, self.indentedline
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1509
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1510 ### end autoindent code ###
0ec4753ccb0f MERGE DS_RPC_BRANCH into MAIN
Kurt B. Kaiser <kbk@shore.net>
parents: 24183
diff changeset
1511
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1512 def prepstr(s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1513 # Helper to extract the underscore from a string, e.g.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1514 # prepstr("Co_py") returns (2, "Copy").
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1515 i = s.find('_')
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1516 if i >= 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1517 s = s[:i] + s[i+1:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1518 return i, s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1519
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1520
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1521 keynames = {
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1522 'bracketleft': '[',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1523 'bracketright': ']',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1524 'slash': '/',
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1525 }
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1526
31946
5465a2cb0aea 1. Polish variables in EditorWindow extension loading and Tkinter variable code.
Kurt B. Kaiser <kbk@shore.net>
parents: 31895
diff changeset
1527 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
1528 keylist = keydefs.get(eventname)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1529 if not keylist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1530 return ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1531 s = keylist[0]
25286
b64fc6a1049e Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 25279
diff changeset
1532 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
1533 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
1534 s = re.sub("Key-", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1535 s = re.sub("Cancel","Ctrl-Break",s) # dscherer@cmu.edu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1536 s = re.sub("Control-", "Ctrl-", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1537 s = re.sub("-", "+", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1538 s = re.sub("><", " ", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1539 s = re.sub("<", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1540 s = re.sub(">", "", s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1541 return s
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1542
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1543
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1544 def fixwordbreaks(root):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1545 # Make sure that Tk's double-click and next/previous word
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1546 # operations use our definition of a word (i.e. an identifier)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1547 tk = root.tk
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1548 tk.call('tcl_wordBreakAfter', 'a b', 0) # make sure word.tcl is loaded
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1549 tk.call('set', 'tcl_wordchars', '[a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1550 tk.call('set', 'tcl_nonwordchars', '[^a-zA-Z0-9_]')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1551
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1552
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1553 def test():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1554 root = Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1555 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1556 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1557 if sys.argv[1:]:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1558 filename = sys.argv[1]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1559 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1560 filename = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1561 edit = EditorWindow(root=root, filename=filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1562 edit.set_close_hook(root.quit)
43461
1b1a5652fed8 Clean up EditorWindow close.
Kurt B. Kaiser <kbk@shore.net>
parents: 40599
diff changeset
1563 edit.text.bind("<<close-all-windows>>", edit.close_event)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1564 root.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1565 root.destroy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1566
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1567 if __name__ == '__main__':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1568 test()