diff options
Diffstat (limited to 'Lib/idlelib')
-rw-r--r-- | Lib/idlelib/config-extensions.def | 34 | ||||
-rw-r--r-- | Lib/idlelib/config-highlight.def | 56 | ||||
-rw-r--r-- | Lib/idlelib/config-keys.def | 58 | ||||
-rw-r--r-- | Lib/idlelib/config-main.def | 63 | ||||
-rw-r--r-- | Lib/idlelib/configDialog.py | 132 | ||||
-rw-r--r-- | Lib/idlelib/configHandler.py | 173 |
6 files changed, 468 insertions, 48 deletions
diff --git a/Lib/idlelib/config-extensions.def b/Lib/idlelib/config-extensions.def new file mode 100644 index 0000000..d1c1ee2 --- /dev/null +++ b/Lib/idlelib/config-extensions.def @@ -0,0 +1,34 @@ +# IDLE reads several config files to determine user preferences. This +# file is the default config file for idle extensions settings. + +[SearchBinding] +enable=1 + +[AutoIndent] +enable=1 + +[AutoExpand] +enable=1 + +[FormatParagraph] +enable=1 + +[ZoomHeight] +enable=1 + +#[ScriptBinding] # disabled in favor of ExecBinding +#enable=0 + +[ExecBinding] +enable=1 + +[CallTips] +enable=1 + +[ParenMatch] +enable=0 +style= expression +flash-delay= 500 +bell= 1 +hilite-foreground= black +hilite-background= #43cd80 diff --git a/Lib/idlelib/config-highlight.def b/Lib/idlelib/config-highlight.def new file mode 100644 index 0000000..a2d3b56 --- /dev/null +++ b/Lib/idlelib/config-highlight.def @@ -0,0 +1,56 @@ +# IDLE reads several config files to determine user preferences. This +# file is the default config file for idle highlight theme settings. + +[IDLE Classic Old - plain fonts] +normal-foreground= black +normal-background= white +normal-fontStyle= normal +keyword-foreground= #ff7700 +keyword-fontStyle= normal +comment-foreground= #dd0000 +comment-fontStyle= normal +string-foreground= #00aa00 +string-fontStyle= normal +definition-foreground= #0000ff +definition-fontStyle= normal +hilite-foreground= #000068 +hilite-background= #006868 +hilite-fontStyle= normal +break-foreground= #ff7777 +break-fontStyle= normal +hit-background= #000000 +hit-foreground= #ffffff +hit-fontStyle= normal +cursor-background= black +error-background= #ff7777 +#shell window +stdout-foreground= blue +stdout-fontStyle= normal +stderr-foreground= red +stderr-fontStyle= normal +console-foreground= #770000 +console-fontStyle= normal + +[IDLE Classic New] +normal-foreground= black +normal-background= white +normal-fontStyle= normal +keyword-foreground= #ff7700 +keyword-fontStyle= bold +comment-foreground= #dd0000 +comment-fontStyle= italic +string-foreground= #00aa00 +string-fontStyle= normal +definition-foreground= #0000ff +definition-fontStyle= bold +hilite-foreground= #000068 +hilite-background= #006868 +break-foreground= #ff7777 +hit-background= #000000 +hit-foreground= #ffffff +cursor-background= black +error-background= #ff7777 +#shell window +stdout-foreground= blue +stderr-foreground= red +console-foreground= #770000 diff --git a/Lib/idlelib/config-keys.def b/Lib/idlelib/config-keys.def new file mode 100644 index 0000000..cae0301 --- /dev/null +++ b/Lib/idlelib/config-keys.def @@ -0,0 +1,58 @@ +# IDLE reads several config files to determine user preferences. This +# file is the default config file for idle key binding settings. + +[IDLE Classic - windows] +Copy= '<Control-c> <Control-C>' +Cut= '<Control-x> <Control-X>' +Paste= '<Control-v> <Control-V>' +beginning-of-line= '<Control-a> <Home>' +center-insert= '<Control-l>' +close-all-windows= '<Control-q>' +close-window= '<Alt-F4>' +dump-undo-state= '<Control-backslash>' +end-of-file= '<Control-d>' +python-docs= '<F1>' +history-next= '<Alt-n>' +history-previous= '<Alt-p>' +interrupt-execution= '<Control-c>' +open-class-browser= '<Alt-c>' +open-module= '<Alt-m>' +open-new-window= '<Control-n>' +open-window-from-file= '<Control-o>' +plain-newline-and-indent= '<Control-j>' +redo= '<Control-y>' +remove-selection= '<Escape>' +save-copy-of-window-as-file= '<Alt-Shift-s>' +save-window-as-file= '<Alt-s>' +save-window= '<Control-s>' +select-all= '<Alt-a>' +toggle-auto-coloring= '<Control-slash>' +undo= '<Control-z>' + +[IDLE Classic - posix] +Copy= '<Alt-w> <Meta-w>' +Cut= '<Control-w>' +Paste= '<Control-y>' +beginning-of-line= '<Control-a> <Home>' +center-insert= '<Control-l>' +close-all-windows= '<Control-x><Control-c>' +close-window= '<Control-x><Control-0> <Control-x><Key-0>' +do-nothing= '<Control-x>' +dump-undo-state= '<Control-backslash>' +end-of-file= '<Control-d>' +help= '<F1>' +history-next= '<Alt-n> <Meta-n>' +history-previous= '<Alt-p> <Meta-p>' +interrupt-execution= '<Control-c>' +open-class-browser= '<Control-x><Control-b>' +open-module= '<Control-x><Control-m>' +open-new-window= '<Control-x><Control-n>' +open-window-from-file= '<Control-x><Control-f>' +plain-newline-and-indent= '<Control-j>' +redo= '<Alt-z> <Meta-z>' +save-copy-of-window-as-file= '<Control-x><w>' +save-window-as-file= '<Control-x><Control-w>' +save-window= '<Control-x><Control-s>' +select-all= '<Alt-a> <Meta-a>' +toggle-auto-coloring= '<Control-slash>' +undo= '<Control-z>' diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def new file mode 100644 index 0000000..47a2e52 --- /dev/null +++ b/Lib/idlelib/config-main.def @@ -0,0 +1,63 @@ +# IDLE reads several config files to determine user preferences. This +# file is the default config file for general idle settings. +# +# When IDLE starts, it will look in +# the following two sets of files, in order: +# +# default configuration +# --------------------- +# config-main.def the default general config file +# config-extensions.def the default extension config file +# config-highlight.def the default highlighting config file +# config-keys.def the default keybinding config file +# +# user configuration +# ------------------- +# ~/.idlerc/idle-main.cfg the user general config file +# ~/.idlerc/idle-extensions.cfg the user extension config file +# ~/.idlerc/idle-highlight.cfg the user highlighting config file +# ~/.idlerc/idle-keys.cfg the user keybinding config file +# XXX what about Windows? +# +# Any options the user saves through the config dialog will be saved to +# the relevant user config file. Reverting any general setting to the +# default causes that entry to be wiped from the user file and re-read +# from the default file. User highlighting themes or keybinding sets are +# retained unless specifically deleted within the config dialog. Choosing +# one of the default themes or keysets just applies the relevant settings +# from the default file. + +[General] +run-in-separate-process= 1 + +[EditorWindow] +width= 80 +height= 24 +font= courier +font-size= 12 + +[Indent] +use-spaces= 1 +num-spaces= 4 +tab-cols= 4 + +[Theme] +user= 0 +name= "IDLE Classic New" + +[Keys] +user= 0 +name= "IDLE Classic - windows" + +[RecentFiles] +1= +2= +3= +4= +5= +6= +7= +8= +9= +10= + diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py index 4fb90e9..5b3c47d 100644 --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -10,7 +10,7 @@ configuration dialog from Tkinter import * import tkMessageBox, tkColorChooser, tkFont -import IdleConf +from configHandler import idleConf class ConfigDialog(Toplevel): """ @@ -24,10 +24,7 @@ class ConfigDialog(Toplevel): self.configure(borderwidth=5) self.geometry("+%d+%d" % (parent.winfo_rootx()+20, parent.winfo_rooty()+30)) - self.LoadConfig() - #elguavas - config placeholders til config stuff completed - self.bg=self.cget('bg') - self.fg=None + #self.LoadConfig() self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) @@ -45,19 +42,9 @@ class ConfigDialog(Toplevel): self.bind('<Alt-h>',self.ChangePageBinding) self.bind('<Alt-k>',self.ChangePageBinding) self.bind('<Alt-g>',self.ChangePageBinding) + #self.LoadOptMenuHighlightTarget() self.wait_window() - def LoadConfig(self): - #self.configParser=IdleConf.idleconf - #self.loadedConfig={} - #self.workingConfig={} - #for key in .keys(): - #print self.configParser.getsection('Colors').options() - self.workingTestColours={ - 'Foo-Bg': '#ffffff', - 'Foo-Fg': '#000000', - 'Bar-Bg': '#777777'} - def Cancel(self): self.destroy() @@ -134,17 +121,7 @@ class ConfigDialog(Toplevel): self.frameHighlightSample.update() #redraw after dialog self.labelTestSample.update() - def __LoadFontList(self): - fonts=list(tkFont.families(self)) - fonts.sort() - for font in fonts: - self.listFontName.insert(END,font) - currentFontIndex=fonts.index('courier') - self.listFontName.see(currentFontIndex) - self.listFontName.select_set(currentFontIndex) - self.fontSize.set('12') - - def __SetFontSample(self,event): + def SetFontSample(self,event): self.newFont.config(size=self.fontSize.get(),weight=NORMAL, family=self.listFontName.get(self.listFontName.curselection()[0])) @@ -167,13 +144,14 @@ class ConfigDialog(Toplevel): pageButtonNames=('Fonts/Tabs','Highlighting','Keys','General') self.pageButtons=[] buttonValue=0 + buttonSelColour=framePageButtons.cget('bg') for name in pageButtonNames: buttonFrame=Frame(framePageButtons,borderwidth=2,relief=RIDGE) buttonFrame.pack(side=LEFT) button = Radiobutton(buttonFrame,command=self.ChangePage, value=buttonValue,padx=5,pady=5,takefocus=FALSE,underline=0, indicatoron=FALSE,highlightthickness=0,variable=self.pageNum, - selectcolor=self.bg,borderwidth=0,text=name) + selectcolor=buttonSelColour,borderwidth=0,text=name) button.pack() button.lift() self.pageButtons.append(button) @@ -216,21 +194,20 @@ class ConfigDialog(Toplevel): text='Font :') self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE, exportselection=FALSE) - self.listFontName.bind('<<ListboxSelect>>',self.__SetFontSample) + self.listFontName.bind('<<ListboxSelect>>',self.SetFontSample) scrollFont=Scrollbar(frameFontName) - self.__LoadFontList() + self.LoadFontList() scrollFont.config(command=self.listFontName.yview) self.listFontName.config(yscrollcommand=scrollFont.set) labelFontSizeTitle=Label(frameFontSize,text='Size :') sizes=('10','11','12','13','14','16','18','20','22') args=(frameFontSize,self.fontSize)+sizes - keyArgs={'command':self.__SetFontSample} + keyArgs={'command':self.SetFontSample} optFontSize=apply(OptionMenu,args,keyArgs) - #optFontSize.bind('<<MenuSelect>>',self.__SetFontSample) - frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1, - bg=self.workingTestColours['Foo-Bg']) - self.labelFontSample=Label(frameFontSample,bg=self.workingTestColours['Foo-Bg'], - fg='#000000',text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]', + #optFontSize.bind('<<MenuSelect>>',self.SetFontSample) + frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1) + self.labelFontSample=Label(frameFontSample, + text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]', justify=LEFT,font=self.newFont) #frameIndent labelIndentTitle=Label(frameIndent,text='Set Indentation Defaults') @@ -299,18 +276,16 @@ class ConfigDialog(Toplevel): frameCustom=Frame(frame,borderwidth=2,relief=GROOVE) frameTheme=Frame(frame,borderwidth=2,relief=GROOVE) #frameCustom - frameTarget=Frame(frameCustom) - self.frameHighlightSample=Frame(frameCustom,relief=SOLID,borderwidth=1, - bg=self.workingTestColours['Foo-Bg'],cursor='hand2') + self.frameHighlightTarget=Frame(frameCustom) + self.frameHighlightSample=Frame(frameCustom,relief=SOLID, + borderwidth=1,cursor='hand2') frameSet=Frame(frameCustom) - self.frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1, - bg=self.workingTestColours['Foo-Bg']) + self.frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1) frameFontSet=Frame(frameSet) labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting') - labelTargetTitle=Label(frameTarget,text='for : ') - optMenuTarget=OptionMenu(frameTarget, + labelTargetTitle=Label(self.frameHighlightTarget,text='for : ') + self.optMenuHighlightTarget=OptionMenu(self.frameHighlightTarget, self.highlightTarget,'normal text background','test target interface item 2') - self.highlightTarget.set('normal text background') buttonSetColour=Button(self.frameColourSet,text='Set Colour', command=self.GetColour) labelFontTitle=Label(frameFontSet,text='Set Font Style') @@ -322,8 +297,7 @@ class ConfigDialog(Toplevel): text='#when finished, this\n#sample area will\n#be interactive\n'+ 'def Ahem(foo,bar):\n '+ '"""'+'doc hazard'+'"""'+ - '\n test=foo\n text=bar\n return', - bg=self.workingTestColours['Foo-Bg']) + '\n test=foo\n text=bar\n return') buttonSaveCustomTheme=Button(frameCustom, text='Save as a Custom Theme') #frameTheme @@ -350,13 +324,13 @@ class ConfigDialog(Toplevel): frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y) #frameCustom labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) - frameTarget.pack(side=TOP,padx=5,pady=5,fill=X) + self.frameHighlightTarget.pack(side=TOP,padx=5,pady=5,fill=X) self.frameHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH) frameSet.pack(side=TOP,fill=X) self.frameColourSet.pack(side=LEFT,padx=5,pady=5,fill=BOTH) frameFontSet.pack(side=RIGHT,padx=5,pady=5,anchor=W) labelTargetTitle.pack(side=LEFT,anchor=E) - optMenuTarget.pack(side=RIGHT,anchor=W,expand=TRUE,fill=X) + self.optMenuHighlightTarget.pack(side=RIGHT,anchor=W,expand=TRUE,fill=X) buttonSetColour.pack(expand=TRUE,fill=BOTH,padx=10,pady=10) labelFontTitle.pack(side=TOP,anchor=W) checkFontBold.pack(side=LEFT,anchor=W,pady=2) @@ -529,6 +503,68 @@ class ConfigDialog(Toplevel): return frame + def LoadFontList(self): + fonts=list(tkFont.families(self)) + fonts.sort() + for font in fonts: + self.listFontName.insert(END,font) + currentFontIndex=fonts.index('courier') + self.listFontName.see(currentFontIndex) + self.listFontName.select_set(currentFontIndex) + self.fontSize.set('12') + + #def LoadOptionMenu(self, optMenu, optList, optVar, optVal=None, + # command=None): + def LoadOptionMenu(self, optMenu, optVar, optVal=None, command=None): + """ + Load the relevant list of values into an OptionMenu and set + selected value if required. + """ + params={'cfg':None, + 'section':None, + 'optList':None, + 'optVar':None, + 'optVal':None, + 'command':None} + if optMenu == self.optMenuHighlightTarget: + params['cfg']=idleConf.userCfg['highlight'] +# if +# params['section']=idleconf.userCfg['main'].GetDef('EditorWindow', +# 'theme') +# +# params['optVar']=self.HighlightTarget +# params['optList']=idleconf.defaultCfg['main'].options(params.Section) +# else: # a default theme +# pass + #params.optList=idleConf + + + #if not params.optVar.get(): #no value set yet (initial load) + # params.optVal= + + #if params.section: #we're asking to load a list of option names + # optList=params.cfg + #elif optMenu == xx: + #else: + + #if self.HighlightTarget.get(): #if there was a value set (reload) + # params.optVal=self.HighlightTarget.get() + #else: #no value set yet (initial load) + #if not params.optVar.get(): #no value set yet (initial load) + + menu=optMenu['menu'] + print menu + menu.delete(0,END) + for item in optList: + menu.add_command(label=item,command=command) + if optVal: + optVar.set(optVal) + elif optList: + optVar.set(optList[0]) + + def SaveConfigs(self): + pass + if __name__ == '__main__': #test the dialog root=Tk() diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py new file mode 100644 index 0000000..86bc004 --- /dev/null +++ b/Lib/idlelib/configHandler.py @@ -0,0 +1,173 @@ +##---------------------------------------------------------------------------## +## +## idle - configuration data handler, based on and replacing IdleConfig.py +## elguavas +## +##---------------------------------------------------------------------------## +"""Provides access to configuration information""" + +import os +import sys +from ConfigParser import ConfigParser, NoOptionError, NoSectionError + +class IdleConfParser(ConfigParser): + """ + A ConfigParser specialised for idle configuration file handling + """ + def __init__(self, cfgFile, cfgDefaults=None): + """ + cfgFile - string, fully specified configuration file name + """ + self.file=cfgFile + ConfigParser.__init__(self,defaults=cfgDefaults) + + def GetInt(self, section, option): + """ + Get an option value as an integer + """ + return self.Get(section, option, type='int') + + def GetBool(self, section, option): + """ + Get an option value as a boolean + """ + return self.Get(section, option, type='bool') + + def Get(self, section, option, raw=0, vars=None, default=None, + type=None): + """ + Get an option value for given section/option or return default. + If type is specified, return as type. + """ + if type=='bool': getVal=self.getbool + elif type=='int': getVal=self.getint + else: getVal=self.get + if self.has_option(section,option): + return getVal(section, option, raw, vars) + else: + return default + + def GetSectionList(self): + # only provided for consistency + return self.sections() + + def GetOptionList(self,section): + """ + Get an option list for given section + """ + if self.has_section: + return self.options(section) + else: #return a default value + return [] + + def GetHighlight(self, theme, element): + fore = self.Get(theme, element + "-foreground") + back = self.Get(theme, element + "-background") + style = self.Ge(theme, element + "-fontStyle", default='') + return {"fg": fore, + "bg": back, + "fStyle": style} + + def Load(self): + """ + Load the configuration file from disk + """ + self.read(self.file) + +class IdleUserConfParser(IdleConfParser): + """ + IdleConfigParser specialised for user configuration handling + """ + def Save(self): + """ + write loaded user configuration file back to disk + """ + # this is a user config, it can be written to disk + self.write() + +class IdleConf: + """ + holds config parsers for all idle config files: + default config files + (idle install dir)/config-main.def + (idle install dir)/config-extensions.def + (idle install dir)/config-highlight.def + (idle install dir)/config-keys.def + user config files + (user home dir)/.idlerc/idle-main.cfg + (user home dir)/.idlerc/idle-extensions.cfg + (user home dir)/.idlerc/idle-highlight.cfg + (user home dir)/.idlerc/idle-keys.cfg + """ + def __init__(self): + self.defaultCfg={} + self.userCfg={} + self.cfg={} + self.CreateConfigHandlers() + self.LoadCfgFiles() + #self.LoadCfg() + + def CreateConfigHandlers(self): + """ + set up a dictionary config parsers for default and user + configurations respectively + """ + #build idle install path + if __name__ != '__main__': # we were imported + idledir=os.path.dirname(__file__) + else: # we were exec'ed (for testing only) + idledir=os.path.abspath(sys.path[0]) + #print idledir + try: #build user home path + userdir = os.environ['HOME'] #real home directory + except KeyError: + userdir = os.getcwd() #hack for os'es without real homedirs + userdir=os.path.join(userdir,'.idlerc') + #print userdir + if not os.path.exists(userdir): + os.mkdir(userdir) + configTypes=('main','extensions','highlight','keys') + defCfgFiles={} + usrCfgFiles={} + for cfgType in configTypes: #build config file names + defCfgFiles[cfgType]=os.path.join(idledir,'config-'+cfgType+'.def') + usrCfgFiles[cfgType]=os.path.join(userdir,'idle-'+cfgType+'.cfg') + for cfgType in configTypes: #create config parsers + self.defaultCfg[cfgType]=IdleConfParser(defCfgFiles[cfgType]) + self.userCfg[cfgType]=IdleUserConfParser(usrCfgFiles[cfgType]) + + def LoadCfgFiles(self): + """ + load all configuration files. + """ + for key in self.defaultCfg.keys(): + self.defaultCfg[key].Load() + self.userCfg[key].Load() #same keys + + def SaveUserCfgFiles(self): + """ + write all loaded user configuration files back to disk + """ + for key in self.userCfg.keys(): + self.userCfg[key].Save() + +idleConf=IdleConf() + +### module test +if __name__ == '__main__': + def dumpCfg(cfg): + print '\n',cfg,'\n' + for key in cfg.keys(): + sections=cfg[key].sections() + print key + print sections + for section in sections: + options=cfg[key].options(section) + print section + print options + for option in options: + print option, '=', cfg[key].Get(section,option) + dumpCfg(idleConf.defaultCfg) + dumpCfg(idleConf.userCfg) + print idleConf.userCfg['main'].Get('Theme','name') + #print idleConf.userCfg['highlight'].GetDefHighlight('Foo','normal') |