summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Svetlov <andrew.svetlov@gmail.com>2012-11-01 20:44:45 (GMT)
committerAndrew Svetlov <andrew.svetlov@gmail.com>2012-11-01 20:44:45 (GMT)
commitd98ee9781b6d1a2fc890253814cdcb05588321d7 (patch)
treea187e0aa8c8549671e3f668aca120fca367902f8
parente0614327ffbae71ba71202015f23047b0c523c72 (diff)
parente2af5098295c97aae8802d8dc7c332bd75e6ab89 (diff)
downloadcpython-d98ee9781b6d1a2fc890253814cdcb05588321d7.zip
cpython-d98ee9781b6d1a2fc890253814cdcb05588321d7.tar.gz
cpython-d98ee9781b6d1a2fc890253814cdcb05588321d7.tar.bz2
Merge issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Patch by Todd Rovito.
-rw-r--r--Doc/library/idle.rst21
-rw-r--r--Lib/idlelib/EditorWindow.py43
-rw-r--r--Lib/idlelib/OutputWindow.py6
-rw-r--r--Lib/idlelib/PyShell.py23
-rw-r--r--Lib/idlelib/help.txt15
-rw-r--r--Misc/NEWS3
6 files changed, 98 insertions, 13 deletions
diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst
index 5f28a99..b40e470 100644
--- a/Doc/library/idle.rst
+++ b/Doc/library/idle.rst
@@ -183,6 +183,15 @@ Edit context menu
* Right-click in Edit window (Control-click on OS X)
+Cut
+ Copy selection into system-wide clipboard; then delete selection
+
+Copy
+ Copy selection into system-wide clipboard
+
+Paste
+ Insert system-wide clipboard into window
+
Set Breakpoint
Sets a breakpoint. Breakpoints are only enabled when the debugger is open.
@@ -190,6 +199,9 @@ Clear Breakpoint
Clears the breakpoint on that line.
.. index::
+ single: Cut
+ single: Copy
+ single: Paste
single: Set Breakpoint
single: Clear Breakpoint
single: breakpoints
@@ -200,6 +212,15 @@ Shell context menu
* Right-click in Python Shell window (Control-click on OS X)
+Cut
+ Copy selection into system-wide clipboard; then delete selection
+
+Copy
+ Copy selection into system-wide clipboard
+
+Paste
+ Insert system-wide clipboard into window
+
Go to file/line
Same as in Debug menu.
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 6bdcecc..e74b619 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -464,7 +464,6 @@ class EditorWindow(object):
rmenu = None
def right_menu_event(self, event):
- self.text.tag_remove("sel", "1.0", "end")
self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
if not self.rmenu:
self.make_rmenu()
@@ -473,23 +472,53 @@ class EditorWindow(object):
iswin = sys.platform[:3] == 'win'
if iswin:
self.text.config(cursor="arrow")
+
+ for label, eventname, verify_state in self.rmenu_specs:
+ if verify_state is None:
+ continue
+ state = getattr(self, verify_state)()
+ rmenu.entryconfigure(label, state=state)
+
+
rmenu.tk_popup(event.x_root, event.y_root)
if iswin:
self.text.config(cursor="ibeam")
rmenu_specs = [
- # ("Label", "<<virtual-event>>"), ...
- ("Close", "<<close-window>>"), # Example
+ # ("Label", "<<virtual-event>>", "statefuncname"), ...
+ ("Close", "<<close-window>>", None), # Example
]
def make_rmenu(self):
rmenu = Menu(self.text, tearoff=0)
- for label, eventname in self.rmenu_specs:
- def command(text=self.text, eventname=eventname):
- text.event_generate(eventname)
- rmenu.add_command(label=label, command=command)
+ for label, eventname, _ in self.rmenu_specs:
+ if label is not None:
+ def command(text=self.text, eventname=eventname):
+ text.event_generate(eventname)
+ rmenu.add_command(label=label, command=command)
+ else:
+ rmenu.add_separator()
self.rmenu = rmenu
+ def rmenu_check_cut(self):
+ return self.rmenu_check_copy()
+
+ def rmenu_check_copy(self):
+ try:
+ indx = self.text.index('sel.first')
+ except TclError:
+ return 'disabled'
+ else:
+ return 'normal' if indx else 'disabled'
+
+ def rmenu_check_paste(self):
+ try:
+ self.text.tk.call('tk::GetSelection', self.text, 'CLIPBOARD')
+ except TclError:
+ return 'disabled'
+ else:
+ return 'normal'
+
def about_dialog(self, event=None):
aboutDialog.AboutDialog(self.top,'About IDLE')
diff --git a/Lib/idlelib/OutputWindow.py b/Lib/idlelib/OutputWindow.py
index cba9013..745ccd2 100644
--- a/Lib/idlelib/OutputWindow.py
+++ b/Lib/idlelib/OutputWindow.py
@@ -52,7 +52,11 @@ class OutputWindow(EditorWindow):
# Our own right-button menu
rmenu_specs = [
- ("Go to file/line", "<<goto-file-line>>"),
+ ("Cut", "<<cut>>", "rmenu_check_cut"),
+ ("Copy", "<<copy>>", "rmenu_check_copy"),
+ ("Paste", "<<paste>>", "rmenu_check_paste"),
+ (None, None, None),
+ ("Go to file/line", "<<goto-file-line>>", None),
]
file_line_pats = [
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 142c924..bff52a9 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -117,8 +117,14 @@ class PyShellEditorWindow(EditorWindow):
old_hook()
self.io.set_filename_change_hook(filename_changed_hook)
- rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"),
- ("Clear Breakpoint", "<<clear-breakpoint-here>>")]
+ rmenu_specs = [
+ ("Cut", "<<cut>>", "rmenu_check_cut"),
+ ("Copy", "<<copy>>", "rmenu_check_copy"),
+ ("Paste", "<<paste>>", "rmenu_check_paste"),
+ (None, None, None),
+ ("Set Breakpoint", "<<set-breakpoint-here>>", None),
+ ("Clear Breakpoint", "<<clear-breakpoint-here>>", None)
+ ]
def set_breakpoint(self, lineno):
text = self.text
@@ -1259,6 +1265,19 @@ class PyShell(OutputWindow):
raise KeyboardInterrupt
return count
+ def rmenu_check_cut(self):
+ try:
+ if self.text.compare('sel.first', '<', 'iomark'):
+ return 'disabled'
+ except TclError: # no selection, so the index 'sel.first' doesn't exist
+ return 'disabled'
+ return super().rmenu_check_cut()
+
+ def rmenu_check_paste(self):
+ if self.text.compare('insert','<','iomark'):
+ return 'disabled'
+ return super().rmenu_check_paste()
+
class PseudoFile(object):
def __init__(self, shell, tags, encoding=None):
diff --git a/Lib/idlelib/help.txt b/Lib/idlelib/help.txt
index ba2daf1..ef90a3a 100644
--- a/Lib/idlelib/help.txt
+++ b/Lib/idlelib/help.txt
@@ -120,14 +120,23 @@ Help Menu:
---
(Additional Help Sources may be added here)
-Edit context menu (Right-click / Control-click in Edit window):
+Edit context menu (Right-click / Control-click on OS X in Edit window):
+ Cut -- Copy a selection into system-wide clipboard,
+ then delete the selection
+ Copy -- Copy selection into system-wide clipboard
+ Paste -- Insert system-wide clipboard into window
Set Breakpoint -- Sets a breakpoint (when debugger open)
Clear Breakpoint -- Clears the breakpoint on that line
-Shell context menu (Right-click / Control-click in Shell window):
+Shell context menu (Right-click / Control-click on OS X in Shell window):
- Go to file/line -- Same as in Debug menu
+ Cut -- Copy a selection into system-wide clipboard,
+ then delete the selection
+ Copy -- Copy selection into system-wide clipboard
+ Paste -- Insert system-wide clipboard into window
+ ---
+ Go to file/line -- Same as in Debug menu
** TIPS **
diff --git a/Misc/NEWS b/Misc/NEWS
index 6e869b6..755e3d1 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -85,6 +85,9 @@ Core and Builtins
Library
-------
+- Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
+ Patch by Todd Rovito.
+
- Issue #16230: Fix a crash in select.select() when one the lists changes
size while iterated on. Patch by Serhiy Storchaka.