Commit 5018db76 authored by Andrew Svetlov's avatar Andrew Svetlov

Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu

 Patch by Todd Rovito.
parent 2c184c6d
...@@ -183,6 +183,15 @@ Edit context menu ...@@ -183,6 +183,15 @@ Edit context menu
* Right-click in Edit window (Control-click on OS X) * 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 Set Breakpoint
Sets a breakpoint. Breakpoints are only enabled when the debugger is open. Sets a breakpoint. Breakpoints are only enabled when the debugger is open.
...@@ -190,6 +199,9 @@ Clear Breakpoint ...@@ -190,6 +199,9 @@ Clear Breakpoint
Clears the breakpoint on that line. Clears the breakpoint on that line.
.. index:: .. index::
single: Cut
single: Copy
single: Paste
single: Set Breakpoint single: Set Breakpoint
single: Clear Breakpoint single: Clear Breakpoint
single: breakpoints single: breakpoints
...@@ -200,6 +212,15 @@ Shell context menu ...@@ -200,6 +212,15 @@ Shell context menu
* Right-click in Python Shell window (Control-click on OS X) * 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 Go to file/line
Same as in Debug menu. Same as in Debug menu.
......
...@@ -470,7 +470,6 @@ class EditorWindow(object): ...@@ -470,7 +470,6 @@ class EditorWindow(object):
rmenu = None rmenu = None
def right_menu_event(self, event): 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)) self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
if not self.rmenu: if not self.rmenu:
self.make_rmenu() self.make_rmenu()
...@@ -479,23 +478,52 @@ class EditorWindow(object): ...@@ -479,23 +478,52 @@ class EditorWindow(object):
iswin = sys.platform[:3] == 'win' iswin = sys.platform[:3] == 'win'
if iswin: if iswin:
self.text.config(cursor="arrow") 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) rmenu.tk_popup(event.x_root, event.y_root)
if iswin: if iswin:
self.text.config(cursor="ibeam") self.text.config(cursor="ibeam")
rmenu_specs = [ rmenu_specs = [
# ("Label", "<<virtual-event>>"), ... # ("Label", "<<virtual-event>>", "statefuncname"), ...
("Close", "<<close-window>>"), # Example ("Close", "<<close-window>>", None), # Example
] ]
def make_rmenu(self): def make_rmenu(self):
rmenu = Menu(self.text, tearoff=0) rmenu = Menu(self.text, tearoff=0)
for label, eventname in self.rmenu_specs: for label, eventname, _ in self.rmenu_specs:
if label is not None:
def command(text=self.text, eventname=eventname): def command(text=self.text, eventname=eventname):
text.event_generate(eventname) text.event_generate(eventname)
rmenu.add_command(label=label, command=command) rmenu.add_command(label=label, command=command)
else:
rmenu.add_separator()
self.rmenu = rmenu 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): def about_dialog(self, event=None):
aboutDialog.AboutDialog(self.top,'About IDLE') aboutDialog.AboutDialog(self.top,'About IDLE')
......
...@@ -57,7 +57,11 @@ class OutputWindow(EditorWindow): ...@@ -57,7 +57,11 @@ class OutputWindow(EditorWindow):
# Our own right-button menu # Our own right-button menu
rmenu_specs = [ 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 = [ file_line_pats = [
......
...@@ -122,8 +122,13 @@ class PyShellEditorWindow(EditorWindow): ...@@ -122,8 +122,13 @@ class PyShellEditorWindow(EditorWindow):
old_hook() old_hook()
self.io.set_filename_change_hook(filename_changed_hook) self.io.set_filename_change_hook(filename_changed_hook)
rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"), rmenu_specs = [
("Clear Breakpoint", "<<clear-breakpoint-here>>")] ("Cut", "<<cut>>", "rmenu_check_cut"),
("Copy", "<<copy>>", "rmenu_check_copy"),
("Paste", "<<paste>>", "rmenu_check_paste"),
("Set Breakpoint", "<<set-breakpoint-here>>", None),
("Clear Breakpoint", "<<clear-breakpoint-here>>", None)
]
def set_breakpoint(self, lineno): def set_breakpoint(self, lineno):
text = self.text text = self.text
...@@ -1261,6 +1266,19 @@ class PyShell(OutputWindow): ...@@ -1261,6 +1266,19 @@ class PyShell(OutputWindow):
if not use_subprocess: if not use_subprocess:
raise KeyboardInterrupt raise KeyboardInterrupt
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(PyShell, self).rmenu_check_cut()
def rmenu_check_paste(self):
if self.text.compare('insert', '<', 'iomark'):
return 'disabled'
return super(PyShell, self).rmenu_check_paste()
class PseudoFile(object): class PseudoFile(object):
def __init__(self, shell, tags, encoding=None): def __init__(self, shell, tags, encoding=None):
......
...@@ -120,13 +120,22 @@ Help Menu: ...@@ -120,13 +120,22 @@ Help Menu:
--- ---
(Additional Help Sources may be added here) (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) Set Breakpoint -- Sets a breakpoint (when debugger open)
Clear Breakpoint -- Clears the breakpoint on that line 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):
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 Go to file/line -- Same as in Debug menu
......
...@@ -130,6 +130,9 @@ Core and Builtins ...@@ -130,6 +130,9 @@ Core and Builtins
Library 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 - Issue #16230: Fix a crash in select.select() when one the lists changes
size while iterated on. Patch by Serhiy Storchaka. size while iterated on. Patch by Serhiy Storchaka.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment