]> granicus.if.org Git - python/commitdiff
Bruce Sherwood RFE/Patch
authorKurt B. Kaiser <kbk@shore.net>
Mon, 26 May 2003 06:23:10 +0000 (06:23 +0000)
committerKurt B. Kaiser <kbk@shore.net>
Mon, 26 May 2003 06:23:10 +0000 (06:23 +0000)
SF 661318

Adds autosave capability to IDLE and IDLE configuration dialog.

User can Run/F5 without explicit save dialog.

The default is to require the user to confirm the save.

M ScriptBinding.py
M config-main.def
M configDialog.py

Lib/idlelib/ScriptBinding.py
Lib/idlelib/config-main.def
Lib/idlelib/configDialog.py

index b6d9da3ab3f6d42573335882fcc1227676190579..00f533bf0df6b888758219cc9bc4bbc6c8419e76 100644 (file)
@@ -24,6 +24,8 @@ import tokenize
 import tkMessageBox
 import PyShell
 
+from configHandler import idleConf
+
 IDENTCHARS = string.ascii_letters + string.digits + "_"
 
 indent_message = """Error: Inconsistent indentation detected!
@@ -144,27 +146,37 @@ class ScriptBinding:
         The debugger requires a source file.  Make sure there is one, and that
         the current version of the source buffer has been saved.  If the user
         declines to save or cancels the Save As dialog, return None.
+
+        If the user has configured IDLE for Autosave, the file will be
+        silently saved if it already exists and is dirty.
+        
         """
+        filename = self.editwin.io.filename
         if not self.editwin.get_saved():
-            msg = """Source Must Be Saved
-     OK to Save?"""
-            mb = tkMessageBox.Message(
-                                title="Save Before Run or Check",
-                                message=msg,
-                                icon=tkMessageBox.QUESTION,
-                                type=tkMessageBox.OKCANCEL,
-                                default=tkMessageBox.OK,
-                                master=self.editwin.text)
-            reply = mb.show()
-            if reply == "ok":
+            autosave = idleConf.GetOption('main', 'General',
+                                          'autosave', type='bool')
+            if autosave and filename:
                 self.editwin.io.save(None)
             else:
-                return None
-        # filename is None if file doesn't exist
-        filename = self.editwin.io.filename
-        self.editwin.text.focus_set()
+                reply = self.ask_save_dialog()
+                self.editwin.text.focus_set()
+                if reply == "ok":
+                    self.editwin.io.save(None)
+                    filename = self.editwin.io.filename
+                else:
+                    filename = None
         return filename
 
+    def ask_save_dialog(self):
+        msg = "Source Must Be Saved\n" + 5*' ' + "OK to Save?"
+        mb = tkMessageBox.Message(title="Save Before Run or Check",
+                                  message=msg,
+                                  icon=tkMessageBox.QUESTION,
+                                  type=tkMessageBox.OKCANCEL,
+                                  default=tkMessageBox.OK,
+                                  master=self.editwin.text)
+        return mb.show()
+
     def errorbox(self, title, message):
         # XXX This should really be a function of EditorWindow...
         tkMessageBox.showerror(title, message, master=self.editwin.text)
index c0110480aba7322cb400bbe0837f07117d004c61..70b8c1ac3e847bb363b6b43654ec488b9f5d0a7a 100644 (file)
@@ -40,6 +40,7 @@
 
 [General]
 editor-on-startup= 0
+autosave= 0
 print-command-posix=lpr %s
 print-command-win=start /min notepad /p %s
 
@@ -49,7 +50,7 @@ height= 30
 font= courier
 font-size= 12
 font-bold= 0
-encoding=none
+encoding= none
 
 [Indent]
 use-spaces= 1
index 6cbc74f7865d7a28e4bdbab0dc1516b3b9101e00..bdf253bdc11e133685a8473a682d781fdfc433fc 100644 (file)
@@ -334,6 +334,7 @@ class ConfigDialog(Toplevel):
         self.winWidth=StringVar(self)
         self.winHeight=StringVar(self)
         self.startupEdit=IntVar(self)
+        self.autoSave=IntVar(self)
         self.encoding=StringVar(self)
         self.userHelpBrowser=BooleanVar(self)
         self.helpBrowser=StringVar(self)
@@ -342,16 +343,24 @@ class ConfigDialog(Toplevel):
         frame=self.tabPages.pages['General']['page']
         #body section frames
         frameRun=Frame(frame,borderwidth=2,relief=GROOVE)
+        frameSave=Frame(frame,borderwidth=2,relief=GROOVE)
         frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
         frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
         frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
         #frameRun
         labelRunTitle=Label(frameRun,text='Startup Preferences')
-        labelRunChoiceTitle=Label(frameRun,text='On Startup : ')
+        labelRunChoiceTitle=Label(frameRun,text='At Startup')
         radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
             value=1,command=self.SetKeysType,text="Open Edit Window")
         radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
             value=0,command=self.SetKeysType,text='Open Shell Window')
+        #frameSave
+        labelSaveTitle=Label(frameSave,text='Autosave Preference')
+        labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5)  ')
+        radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
+            value=0,command=self.SetKeysType,text="Prompt to Save")
+        radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
+            value=1,command=self.SetKeysType,text='No Prompt')
         #frameWinSize
         labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
                 '  (in characters)')
@@ -370,7 +379,7 @@ class ConfigDialog(Toplevel):
         radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
             value="none",text="None")
         #frameHelp
-        labelHelpTitle=Label(frameHelp,text='Help Options')
+        ##labelHelpTitle=Label(frameHelp,text='Help Options')
         frameHelpList=Frame(frameHelp)
         frameHelpListButtons=Frame(frameHelpList)
         labelHelpListTitle=Label(frameHelpList,text='Additional Help Sources:')
@@ -396,14 +405,20 @@ class ConfigDialog(Toplevel):
         #widget packing
         #body
         frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
+        frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
         frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
-       frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
+        frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
         frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
         #frameRun
         labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
         labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
-        radioStartupEdit.pack(side=LEFT,anchor=W,padx=5,pady=5)
-        radioStartupShell.pack(side=LEFT,anchor=W,padx=5,pady=5)
+        radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
+        radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
+        #frameSave
+        labelSaveTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
+        labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
+        radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
+        radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
         #frameWinSize
         labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
         entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
@@ -416,7 +431,7 @@ class ConfigDialog(Toplevel):
         radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
         radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
         #frameHelp
-        labelHelpTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
+        ##labelHelpTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
         frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
         frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
         labelHelpListTitle.pack(side=TOP,anchor=W)
@@ -448,6 +463,7 @@ class ConfigDialog(Toplevel):
         self.winWidth.trace_variable('w',self.VarChanged_winWidth)
         self.winHeight.trace_variable('w',self.VarChanged_winHeight)
         self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
+        self.autoSave.trace_variable('w',self.VarChanged_autoSave)
         self.encoding.trace_variable('w',self.VarChanged_encoding)
 
     def VarChanged_fontSize(self,*params):
@@ -542,6 +558,10 @@ class ConfigDialog(Toplevel):
         value=self.startupEdit.get()
         self.AddChangedItem('main','General','editor-on-startup',value)
 
+    def VarChanged_autoSave(self,*params):
+        value=self.autoSave.get()
+        self.AddChangedItem('main','General','autosave',value)
+
     def VarChanged_encoding(self,*params):
         value=self.encoding.get()
         self.AddChangedItem('main','EditorWindow','encoding',value)
@@ -1038,11 +1058,15 @@ class ConfigDialog(Toplevel):
         #startup state
         self.startupEdit.set(idleConf.GetOption('main','General',
                 'editor-on-startup',default=1,type='bool'))
+        #autosave state
+        self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
+                                             default=0, type='bool'))
         #initial window size
         self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
         self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
         # default source encoding
-        self.encoding.set(idleConf.GetOption('main','EditorWindow','encoding'))
+        self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
+                                             'encoding', default='none'))
         # additional help sources
         self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
         for helpItem in self.userHelpList: