@@ -464,7 +464,6 @@ def postwindowsmenu(self):
464464 rmenu = None
465465
466466 def right_menu_event (self , event ):
467- self .text .tag_remove ("sel" , "1.0" , "end" )
468467 self .text .mark_set ("insert" , "@%d,%d" % (event .x , event .y ))
469468 if not self .rmenu :
470469 self .make_rmenu ()
@@ -473,23 +472,53 @@ def right_menu_event(self, event):
473472 iswin = sys .platform [:3 ] == 'win'
474473 if iswin :
475474 self .text .config (cursor = "arrow" )
475+
476+ for label , eventname , verify_state in self .rmenu_specs :
477+ if verify_state is None :
478+ continue
479+ state = getattr (self , verify_state )()
480+ rmenu .entryconfigure (label , state = state )
481+
482+
476483 rmenu .tk_popup (event .x_root , event .y_root )
477484 if iswin :
478485 self .text .config (cursor = "ibeam" )
479486
480487 rmenu_specs = [
481- # ("Label", "<<virtual-event>>"), ...
482- ("Close" , "<<close-window>>" ), # Example
488+ # ("Label", "<<virtual-event>>", "statefuncname" ), ...
489+ ("Close" , "<<close-window>>" , None ), # Example
483490 ]
484491
485492 def make_rmenu (self ):
486493 rmenu = Menu (self .text , tearoff = 0 )
487- for label , eventname in self .rmenu_specs :
488- def command (text = self .text , eventname = eventname ):
489- text .event_generate (eventname )
490- rmenu .add_command (label = label , command = command )
494+ for label , eventname , _ in self .rmenu_specs :
495+ if label is not None :
496+ def command (text = self .text , eventname = eventname ):
497+ text .event_generate (eventname )
498+ rmenu .add_command (label = label , command = command )
499+ else :
500+ rmenu .add_separator ()
491501 self .rmenu = rmenu
492502
503+ def rmenu_check_cut (self ):
504+ return self .rmenu_check_copy ()
505+
506+ def rmenu_check_copy (self ):
507+ try :
508+ indx = self .text .index ('sel.first' )
509+ except TclError :
510+ return 'disabled'
511+ else :
512+ return 'normal' if indx else 'disabled'
513+
514+ def rmenu_check_paste (self ):
515+ try :
516+ self .text .tk .call ('tk::GetSelection' , self .text , 'CLIPBOARD' )
517+ except TclError :
518+ return 'disabled'
519+ else :
520+ return 'normal'
521+
493522 def about_dialog (self , event = None ):
494523 aboutDialog .AboutDialog (self .top ,'About IDLE' )
495524
0 commit comments